@seamapi/types 1.312.2 → 1.313.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seamapi/types",
3
- "version": "1.312.2",
3
+ "version": "1.313.0",
4
4
  "description": "TypeScript types for the Seam API.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -1,28 +1,16 @@
1
1
  import { z } from 'zod'
2
2
 
3
3
  export const common_event = z.object({
4
- event_id: z.string().uuid().describe(`
5
- ---
6
- title: Event ID
7
- ---
8
- The ID of the event.
9
- `),
10
- workspace_id: z.string().uuid().describe(`
11
- ---
12
- title: Workspace ID
13
- ---
14
- The ID of the workspace.
15
- `),
16
- created_at: z.string().datetime().describe(`
17
- ---
18
- title: Created At
19
- ---
20
- The time when the event was created.
21
- `),
22
- occurred_at: z.string().datetime().describe(`
23
- ---
24
- title: Occurred At
25
- ---
26
- The time when the event occurred.
27
- `),
4
+ event_id: z.string().uuid().describe('ID of the event.'),
5
+ workspace_id: z
6
+ .string()
7
+ .uuid()
8
+ .describe(
9
+ 'ID of the [workspace](https://docs.seam.co/latest/core-concepts/workspaces).',
10
+ ),
11
+ created_at: z
12
+ .string()
13
+ .datetime()
14
+ .describe('Time at which the event was created.'),
15
+ occurred_at: z.string().datetime().describe('Time when the event occurred.'),
28
16
  })
@@ -4,58 +4,38 @@ import { climate_setting } from '../thermostats/climate-preset.js'
4
4
  import { common_event } from './common.js'
5
5
 
6
6
  const device_event = common_event.extend({
7
- device_id: z.string().uuid().describe(`
8
- ---
9
- title: Device ID
10
- ---
11
- ID of the device.
12
- `),
13
- connected_account_id: z.string().uuid().describe(`
14
- ---
15
- title: Connected Account ID
16
- ---
17
- ID of the connected account.
18
- `),
7
+ device_id: z.string().uuid().describe('ID of the device.'),
8
+ connected_account_id: z
9
+ .string()
10
+ .uuid()
11
+ .describe(
12
+ 'ID of the [connected account](https://docs.seam.co/latest/core-concepts/connected-accounts).',
13
+ ),
19
14
  })
20
15
 
21
- const battery_level = z.number().min(0).max(1).describe(`
22
- ---
23
- title: Battery Level
24
- ---
25
- Fractional number 0 to 1.0 indicating amount of battery in device, as reported by device.
26
- `)
27
-
28
- const device_battery_status = z.enum(['critical', 'low', 'good', 'full'])
29
- .describe(`
30
- ---
31
- title: Battery Status
32
- ---
33
- Enum representing the battery status calculated from numeric battery_level value, one of 'critical' | 'low' | 'good' | 'full'
34
- `)
35
-
36
- const disconnection_error_code = z.enum([
37
- 'account_disconnected',
38
- 'hub_disconnected',
39
- 'device_disconnected',
40
- ]).describe(`
41
- ---
42
- title: Event Error Code
43
- ---
44
- The error code associated with the event, if any.
45
- `)
46
-
47
- export const lock_method = z.enum([
48
- 'keycode',
49
- 'manual',
50
- 'automatic',
51
- 'unknown',
52
- 'seamapi',
53
- ]).describe(`
54
- ---
55
- title: Lock Lock/Unlock Method
56
- ---
57
- Method by which a lock device was locked or unlocked. When the method is \`keycode\`, the \`access_code_id\` will reference the Seam access code which was used, if reported by the device.
58
- `)
16
+ const battery_level = z
17
+ .number()
18
+ .min(0)
19
+ .max(1)
20
+ .describe(
21
+ 'Number in the range 0 to 1.0 indicating the amount of battery in the device, as reported by the device.',
22
+ )
23
+
24
+ const device_battery_status = z
25
+ .enum(['critical', 'low', 'good', 'full'])
26
+ .describe(
27
+ 'Battery status of the device, calculated from the numeric `battery_level` value.',
28
+ )
29
+
30
+ const disconnection_error_code = z
31
+ .enum(['account_disconnected', 'hub_disconnected', 'device_disconnected'])
32
+ .describe('Error code associated with the disconnection event, if any.')
33
+
34
+ export const lock_method = z
35
+ .enum(['keycode', 'manual', 'automatic', 'unknown', 'seamapi'])
36
+ .describe(
37
+ 'Method by which a lock device was locked or unlocked. When the method is `keycode`, the `access_code_id` indicates the [access code](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes) that was used, if reported by the device.',
38
+ )
59
39
  export type LockMethod = z.infer<typeof lock_method>
60
40
 
61
41
  export const device_connected_event = device_event
@@ -70,7 +50,7 @@ export const device_added_event = device_event
70
50
  .extend({
71
51
  event_type: z.literal('device.added'),
72
52
  })
73
- .describe('A device has been added or reconnected to Seam.')
53
+ .describe('A device was added or reconnected to Seam.')
74
54
 
75
55
  export type DeviceAddedEvent = z.infer<typeof device_added_event>
76
56
 
@@ -79,7 +59,7 @@ export const device_converted_to_unmanaged_event = device_event
79
59
  event_type: z.literal('device.converted_to_unmanaged'),
80
60
  })
81
61
  .describe(
82
- 'An unmanaged device was successfully converted to a managed device.',
62
+ 'An [unmanaged device](https://docs.seam.co/latest/core-concepts/devices/managed-and-unmanaged-devices) was successfully converted to a managed device.',
83
63
  )
84
64
 
85
65
  export type DeviceConvertedToUnmanagedEvent = z.infer<
@@ -91,7 +71,7 @@ export const unmanaged_device_converted_to_managed_event = device_event
91
71
  event_type: z.literal('device.unmanaged.converted_to_managed'),
92
72
  })
93
73
  .describe(
94
- 'A managed device was successfully converted to an unmanaged device.',
74
+ 'A managed device was successfully converted to an [unmanaged device](https://docs.seam.co/latest/core-concepts/devices/managed-and-unmanaged-devices).',
95
75
  )
96
76
 
97
77
  export type UnmanagedDeviceConvertedToManagedEvent = z.infer<
@@ -102,7 +82,9 @@ export const unmanaged_device_connected_event = device_event
102
82
  .extend({
103
83
  event_type: z.literal('device.unmanaged.connected'),
104
84
  })
105
- .describe('An unmanaged device was connected to Seam')
85
+ .describe(
86
+ 'An [unmanaged device](https://docs.seam.co/latest/core-concepts/devices/managed-and-unmanaged-devices) was connected to Seam.',
87
+ )
106
88
 
107
89
  export type UnmanagedDeviceConnectedEvent = z.infer<
108
90
  typeof unmanaged_device_connected_event
@@ -113,7 +95,7 @@ export const device_disconnected_event = device_event
113
95
  event_type: z.literal('device.disconnected'),
114
96
  error_code: disconnection_error_code,
115
97
  })
116
- .describe('A device was disconnected')
98
+ .describe('A device was disconnected from Seam.')
117
99
 
118
100
  export type DeviceDisconnectedEvent = z.infer<typeof device_disconnected_event>
119
101
 
@@ -122,7 +104,9 @@ export const unmanaged_device_disconnected_event = device_event
122
104
  event_type: z.literal('device.unmanaged.disconnected'),
123
105
  error_code: disconnection_error_code,
124
106
  })
125
- .describe('An unmanaged device was disconnected')
107
+ .describe(
108
+ 'An [unmanaged device](https://docs.seam.co/latest/core-concepts/devices/managed-and-unmanaged-devices) was disconnected from Seam.',
109
+ )
126
110
 
127
111
  export type UnmanagedDeviceDisconnectedEvent = z.infer<
128
112
  typeof unmanaged_device_disconnected_event
@@ -133,7 +117,7 @@ export const device_tampered_event = device_event
133
117
  event_type: z.literal('device.tampered'),
134
118
  })
135
119
  .describe(
136
- 'A device detected that it was tampered with, e.g., opened or moved.',
120
+ 'A device detected that it was tampered with, for example, opened or moved.',
137
121
  )
138
122
 
139
123
  export type DeviceTamperedEvent = z.infer<typeof device_tampered_event>
@@ -154,7 +138,7 @@ export const device_battery_status_changed_event = device_event
154
138
  battery_level,
155
139
  })
156
140
  .describe(
157
- 'A device battery status changed since the last battery status changed event.',
141
+ 'A device battery status changed since the last `battery_status_changed` event.',
158
142
  )
159
143
 
160
144
  export type DeviceBatteryStatusChangedEvent = z.infer<
@@ -165,7 +149,9 @@ export const device_removed_event = device_event
165
149
  .extend({
166
150
  event_type: z.literal('device.removed'),
167
151
  })
168
- .describe('A device was removed externally from the connected account.')
152
+ .describe(
153
+ 'A device was removed externally from the [connected account](https://docs.seam.co/latest/core-concepts/connected-accounts).',
154
+ )
169
155
 
170
156
  export type DeviceRemovedEvent = z.infer<typeof device_removed_event>
171
157
 
@@ -173,7 +159,9 @@ export const device_deleted_event = device_event
173
159
  .extend({
174
160
  event_type: z.literal('device.deleted'),
175
161
  })
176
- .describe('A device was deleted.')
162
+ .describe(
163
+ 'A device was [deleted](https://docs.seam.co/latest/api/devices/delete).',
164
+ )
177
165
 
178
166
  export type DeviceDeletedEvent = z.infer<typeof device_deleted_event>
179
167
 
@@ -182,7 +170,7 @@ export const device_third_party_integration_detected_event = device_event
182
170
  event_type: z.literal('device.third_party_integration_detected'),
183
171
  })
184
172
  .describe(
185
- 'Seam detected a device is using a third party integration that will interfere with Seam device management.',
173
+ 'Seam detected that a device is using a third-party integration that will interfere with Seam device management.',
186
174
  )
187
175
 
188
176
  export type DeviceThirdPartyIntegrationDetectedEvent = z.infer<
@@ -197,7 +185,7 @@ export const device_third_party_integration_no_longer_detected_event =
197
185
  ),
198
186
  })
199
187
  .describe(
200
- 'Seam detected a device is no longer using a third party integration that was interfering with Seam device management.',
188
+ 'Seam detected that a device is no longer using a third-party integration that was interfering with Seam device management.',
201
189
  )
202
190
 
203
191
  export type DeviceThirdPartyIntegrationNoLongerDetectedEvent = z.infer<
@@ -238,7 +226,9 @@ export const device_connection_stabilized_event = device_event
238
226
  .extend({
239
227
  event_type: z.literal('device.connection_stabilized'),
240
228
  })
241
- .describe('Seam detected a previously flaky device connection stabilized.')
229
+ .describe(
230
+ 'Seam detected that a previously-flaky device connection stabilized.',
231
+ )
242
232
 
243
233
  export type DeviceConnectionStabilizedEvent = z.infer<
244
234
  typeof device_connection_stabilized_event
@@ -249,7 +239,7 @@ export const device_error_subscription_required_event = device_event
249
239
  event_type: z.literal('device.error.subscription_required'),
250
240
  })
251
241
  .describe(
252
- 'A third party subscription is required to use all device features.',
242
+ 'A third-party subscription is required to use all device features.',
253
243
  )
254
244
 
255
245
  export type DeviceErrorSubscriptionRequiredEvent = z.infer<
@@ -261,7 +251,7 @@ export const device_error_subscription_required_resolved_event = device_event
261
251
  event_type: z.literal('device.error.subscription_required.resolved'),
262
252
  })
263
253
  .describe(
264
- 'A third party subscription is active or no longer-required to use all device features.',
254
+ 'A third-party subscription is active or no longer required to use all device features.',
265
255
  )
266
256
 
267
257
  export type DeviceErrorSubscriptionRequiredResolvedEvent = z.infer<
@@ -272,7 +262,7 @@ export const device_accessory_keypad_connected_event = device_event
272
262
  .extend({
273
263
  event_type: z.literal('device.accessory_keypad_connected'),
274
264
  })
275
- .describe('A accessory keypad was connected to a device.')
265
+ .describe('An accessory keypad was connected to a device.')
276
266
 
277
267
  export type DeviceAccessoryKeypadConnectedEvent = z.infer<
278
268
  typeof device_accessory_keypad_connected_event
@@ -282,7 +272,7 @@ export const device_accessory_keypad_disconnected_event = device_event
282
272
  .extend({
283
273
  event_type: z.literal('device.accessory_keypad_disconnected'),
284
274
  })
285
- .describe('A accessory keypad was disconnected to a device.')
275
+ .describe('An accessory keypad was disconnected from a device.')
286
276
 
287
277
  export type DeviceAccessoryKeypadDisconnectedEvent = z.infer<
288
278
  typeof device_accessory_keypad_disconnected_event
@@ -291,26 +281,43 @@ export type DeviceAccessoryKeypadDisconnectedEvent = z.infer<
291
281
  export const noise_sensor_noise_threshold_triggered_event = device_event
292
282
  .extend({
293
283
  event_type: z.literal('noise_sensor.noise_threshold_triggered'),
294
- noise_level_decibels: z.number().optional(),
295
- noise_level_nrs: z.number().optional(),
296
- noise_threshold_id: z.string().uuid().optional(),
297
- noise_threshold_name: z.string().optional(),
284
+ noise_level_decibels: z
285
+ .number()
286
+ .optional()
287
+ .describe('Detected noise level in decibels.'),
288
+ noise_level_nrs: z
289
+ .number()
290
+ .optional()
291
+ .describe('Detected noise level in Noiseaware Noise Risk Score (NRS).'),
292
+ noise_threshold_id: z
293
+ .string()
294
+ .uuid()
295
+ .optional()
296
+ .describe(
297
+ 'ID of the [noise threshold](https://docs.seam.co/latest/capability-guides/noise-sensors#what-is-a-threshold) that was triggered.',
298
+ ),
299
+ noise_threshold_name: z
300
+ .string()
301
+ .optional()
302
+ .describe(
303
+ 'Name of the [noise threshold](https://docs.seam.co/latest/capability-guides/noise-sensors#what-is-a-threshold) that was triggered.',
304
+ ),
298
305
  // TODO: remove metadata from this event
299
306
  noiseaware_metadata: z.record(z.unknown()).optional().describe(`
300
307
  ---
301
308
  title: Noiseaware Metadata
302
309
  ---
303
- Metadata from the Noiseaware API.
310
+ Metadata from Noiseaware.
304
311
  `),
305
312
  minut_metadata: z.record(z.unknown()).optional().describe(`
306
313
  ---
307
314
  title: Minut Metadata
308
315
  ---
309
- Metadata from the Minut API.
316
+ Metadata from Minut.
310
317
  `),
311
318
  })
312
319
  .describe(
313
- 'Extended periods of noise or noise exceeding a threshold was detected.',
320
+ 'Extended periods of noise or noise exceeding a [threshold](https://docs.seam.co/latest/capability-guides/noise-sensors#what-is-a-threshold) were detected.',
314
321
  )
315
322
 
316
323
  export type NoiseSensorNoiseThresholdTriggeredEvent = z.infer<
@@ -320,9 +327,23 @@ export type NoiseSensorNoiseThresholdTriggeredEvent = z.infer<
320
327
  export const lock_locked_event = device_event
321
328
  .extend({
322
329
  event_type: z.literal('lock.locked'),
323
- access_code_id: z.string().uuid().optional(),
324
- action_attempt_id: z.string().uuid().optional(),
325
- method: lock_method,
330
+ access_code_id: z
331
+ .string()
332
+ .uuid()
333
+ .optional()
334
+ .describe(
335
+ 'ID of the [access code](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes) that was used to lock the device.',
336
+ ),
337
+ action_attempt_id: z
338
+ .string()
339
+ .uuid()
340
+ .optional()
341
+ .describe(
342
+ 'ID of the [action attempt](https://docs.seam.co/latest/core-concepts/action-attempts) associated with the lock action.',
343
+ ),
344
+ method: lock_method.describe(
345
+ 'Method by which a lock device was locked. When the method is `keycode`, the `access_code_id` indicates the [access code](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes) that was used, if reported by the device.',
346
+ ),
326
347
  })
327
348
  .describe('A lock was locked.')
328
349
 
@@ -331,9 +352,23 @@ export type LockLockedEvent = z.infer<typeof lock_locked_event>
331
352
  export const lock_unlocked_event = device_event
332
353
  .extend({
333
354
  event_type: z.literal('lock.unlocked'),
334
- access_code_id: z.string().uuid().optional(),
335
- action_attempt_id: z.string().uuid().optional(),
336
- method: lock_method,
355
+ access_code_id: z
356
+ .string()
357
+ .uuid()
358
+ .optional()
359
+ .describe(
360
+ 'ID of the [access code](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes) that was used to unlock the device.',
361
+ ),
362
+ action_attempt_id: z
363
+ .string()
364
+ .uuid()
365
+ .optional()
366
+ .describe(
367
+ 'ID of the [action attempt](https://docs.seam.co/latest/core-concepts/action-attempts) associated with the unlock action.',
368
+ ),
369
+ method: lock_method.describe(
370
+ 'Method by which a lock device was unlocked. When the method is `keycode`, the `access_code_id` indicates the [access code](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes) that was used, if reported by the device.',
371
+ ),
337
372
  })
338
373
  .describe('A lock was unlocked.')
339
374
 
@@ -342,7 +377,13 @@ export type LockUnlockedEvent = z.infer<typeof lock_unlocked_event>
342
377
  export const lock_access_denied_event = device_event
343
378
  .extend({
344
379
  event_type: z.literal('lock.access_denied'),
345
- access_code_id: z.string().uuid().optional(),
380
+ access_code_id: z
381
+ .string()
382
+ .uuid()
383
+ .optional()
384
+ .describe(
385
+ 'ID of the [access code](https://docs.seam.co/latest/capability-guides/smart-locks/access-codes) that was used in the unlock attempts.',
386
+ ),
346
387
  })
347
388
  .describe(
348
389
  'The lock denied access to a user after one or more consecutive invalid attempts to unlock the device.',
@@ -353,17 +394,37 @@ export type LockAccessDeniedEvent = z.infer<typeof lock_access_denied_event>
353
394
  export const thermostat_climate_preset_activated_event = device_event
354
395
  .extend({
355
396
  event_type: z.literal('thermostat.climate_preset_activated'),
356
- thermostat_schedule_id: z.string().uuid().nullable(),
357
- climate_preset_key: z.string(),
358
- is_fallback_climate_preset: z.boolean(),
397
+ thermostat_schedule_id: z
398
+ .string()
399
+ .uuid()
400
+ .nullable()
401
+ .describe(
402
+ 'ID of the [thermostat schedule](https://docs.seam.co/latest/capability-guides/thermostats/creating-and-managing-thermostat-schedules) that prompted the [climate preset](https://docs.seam.co/latest/capability-guides/thermostats/creating-and-managing-climate-presets) to be activated.',
403
+ ),
404
+ climate_preset_key: z
405
+ .string()
406
+ .describe(
407
+ 'Key of the [climate preset](https://docs.seam.co/latest/capability-guides/thermostats/creating-and-managing-climate-presets) that was activated.',
408
+ ),
409
+ is_fallback_climate_preset: z
410
+ .boolean()
411
+ .describe(
412
+ 'Indicates whether the [climate preset](https://docs.seam.co/latest/capability-guides/thermostats/creating-and-managing-climate-presets) that was activated is the [fallback climate preset](https://docs.seam.co/latest/capability-guides/thermostats/creating-and-managing-climate-presets/setting-the-fallback-climate-preset) for the thermostat.',
413
+ ),
359
414
  })
360
- .describe('A thermostat climate preset was activated.')
415
+ .describe(
416
+ 'A thermostat [climate preset](https://docs.seam.co/latest/capability-guides/thermostats/creating-and-managing-climate-presets) was activated.',
417
+ )
361
418
 
362
419
  export type ThermostatClimatePresetActivatedEvent = z.infer<
363
420
  typeof thermostat_climate_preset_activated_event
364
421
  >
365
422
 
366
- export const thermostat_manually_adjusted_method = z.enum(['seam', 'external'])
423
+ export const thermostat_manually_adjusted_method = z
424
+ .enum(['seam', 'external'])
425
+ .describe(
426
+ 'Method used to adjust the thermostat manually. `seam` indicates that the Seam API, Seam CLI, or Seam Console was used to adjust the thermostat.',
427
+ )
367
428
 
368
429
  export const thermostat_manually_adjusted_event = device_event
369
430
  .extend({
@@ -380,7 +441,7 @@ export const thermostat_manually_adjusted_event = device_event
380
441
  heating_set_point_fahrenheit: true,
381
442
  }),
382
443
  )
383
- .describe('A thermostat was manually adjusted.')
444
+ .describe('A thermostat was adjusted manually.')
384
445
 
385
446
  export type ThermostatManuallyAdjustedEvent = z.infer<
386
447
  typeof thermostat_manually_adjusted_event
@@ -389,14 +450,40 @@ export type ThermostatManuallyAdjustedEvent = z.infer<
389
450
  export const temperature_threshold_exceeded_event = device_event
390
451
  .extend({
391
452
  event_type: z.literal('thermostat.temperature_threshold_exceeded'),
392
- temperature_celsius: z.number(),
393
- temperature_fahrenheit: z.number(),
394
- upper_limit_celsius: z.number().nullable(),
395
- upper_limit_fahrenheit: z.number().nullable(),
396
- lower_limit_celsius: z.number().nullable(),
397
- lower_limit_fahrenheit: z.number().nullable(),
453
+ temperature_celsius: z
454
+ .number()
455
+ .describe('Temperature, in °C, reported by the thermostat.'),
456
+ temperature_fahrenheit: z
457
+ .number()
458
+ .describe('Temperature, in °F, reported by the thermostat.'),
459
+ upper_limit_celsius: z
460
+ .number()
461
+ .nullable()
462
+ .describe(
463
+ 'Upper temperature limit, in °C, defined by the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).',
464
+ ),
465
+ upper_limit_fahrenheit: z
466
+ .number()
467
+ .nullable()
468
+ .describe(
469
+ 'Upper temperature limit, in °F, defined by the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).',
470
+ ),
471
+ lower_limit_celsius: z
472
+ .number()
473
+ .nullable()
474
+ .describe(
475
+ 'Lower temperature limit, in °C, defined by the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).',
476
+ ),
477
+ lower_limit_fahrenheit: z
478
+ .number()
479
+ .nullable()
480
+ .describe(
481
+ 'Lower temperature limit, in °F, defined by the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).',
482
+ ),
398
483
  })
399
- .describe("A thermostat's temperature reading exceeded the set threshold.")
484
+ .describe(
485
+ "A thermostat's temperature reading exceeded the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).",
486
+ )
400
487
 
401
488
  export type TemperatureThresholdExceededEvent = z.infer<
402
489
  typeof temperature_threshold_exceeded_event
@@ -407,15 +494,39 @@ export const temperature_threshold_no_longer_exceeded_event = device_event
407
494
  event_type: z.literal(
408
495
  'thermostat.temperature_threshold_no_longer_exceeded',
409
496
  ),
410
- temperature_celsius: z.number(),
411
- temperature_fahrenheit: z.number(),
412
- upper_limit_celsius: z.number().nullable(),
413
- upper_limit_fahrenheit: z.number().nullable(),
414
- lower_limit_celsius: z.number().nullable(),
415
- lower_limit_fahrenheit: z.number().nullable(),
497
+ temperature_celsius: z
498
+ .number()
499
+ .describe('Temperature, in °C, reported by the thermostat.'),
500
+ temperature_fahrenheit: z
501
+ .number()
502
+ .describe('Temperature, in °F, reported by the thermostat.'),
503
+ upper_limit_celsius: z
504
+ .number()
505
+ .nullable()
506
+ .describe(
507
+ 'Upper temperature limit, in °C, defined by the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).',
508
+ ),
509
+ upper_limit_fahrenheit: z
510
+ .number()
511
+ .nullable()
512
+ .describe(
513
+ 'Upper temperature limit, in °F, defined by the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).',
514
+ ),
515
+ lower_limit_celsius: z
516
+ .number()
517
+ .nullable()
518
+ .describe(
519
+ 'Lower temperature limit, in °C, defined by the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).',
520
+ ),
521
+ lower_limit_fahrenheit: z
522
+ .number()
523
+ .nullable()
524
+ .describe(
525
+ 'Lower temperature limit, in °F, defined by the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).',
526
+ ),
416
527
  })
417
528
  .describe(
418
- "A thermostat's temperature reading is no longer exceeding the set threshold.",
529
+ "A thermostat's temperature reading no longer exceeds the set [threshold](https://docs.seam.co/latest/capability-guides/thermostats/setting-and-monitoring-temperature-thresholds).",
419
530
  )
420
531
 
421
532
  export type TemperatureThresholdNoLongerExceededEvent = z.infer<