@camstack/addon-provider-homeassistant 1.2.152 → 1.2.154

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.
@@ -7480,7 +7480,7 @@ function errMsg(err) {
7480
7480
  return String(err);
7481
7481
  }
7482
7482
  //#endregion
7483
- //#region ../types/dist/composition-D7ULvLdD.mjs
7483
+ //#region ../types/dist/composition-Bzr7GwgP.mjs
7484
7484
  /**
7485
7485
  * The ffmpeg build every CamStack node downloads, per platform and arch.
7486
7486
  *
@@ -7568,6 +7568,8 @@ var SOURCE_CAP_ACTIVE_FIELD = {
7568
7568
  vibration: "detected",
7569
7569
  tamper: "tampered"
7570
7570
  };
7571
+ /** Cap names whose presence in a device's bindings qualify it as a source. */
7572
+ var SOURCE_CAPS = Object.keys(SOURCE_CAP_ACTIVE_FIELD);
7571
7573
  /**
7572
7574
  * Error types for the safe expression engine. Two distinct classes so callers
7573
7575
  * can tell a compile-time (grammar) failure from a runtime (evaluation)
@@ -12230,7 +12232,7 @@ var BrokerStatusEnum = _enum([
12230
12232
  "unreachable",
12231
12233
  "error"
12232
12234
  ]);
12233
- var BrokerInfoSchema$1 = object({
12235
+ var BrokerInfoSchema = object({
12234
12236
  /** Stable broker id. Persisted; survives addon restarts. */
12235
12237
  id: string(),
12236
12238
  /** Addon id of the provider that OWNS this broker.
@@ -12373,8 +12375,8 @@ var brokerCapability = {
12373
12375
  kind: "poll"
12374
12376
  },
12375
12377
  methods: {
12376
- list: method(ListInputSchema, array(BrokerInfoSchema$1)),
12377
- get: method(GetInputSchema, BrokerInfoSchema$1.nullable()),
12378
+ list: method(ListInputSchema, array(BrokerInfoSchema)),
12379
+ get: method(GetInputSchema, BrokerInfoSchema.nullable()),
12378
12380
  /** Enumerate which addon provides which broker kind(s) for the
12379
12381
  * unified create picker. The auto-mount fans this array across
12380
12382
  * every registered `broker` provider (array-output method), so the
@@ -17823,7 +17825,7 @@ var BrokerStatusSchema$1 = _enum([
17823
17825
  "unreachable",
17824
17826
  "tls-error"
17825
17827
  ]);
17826
- var BrokerInfoSchema = object({
17828
+ var BrokerInfoSchema$1 = object({
17827
17829
  id: string(),
17828
17830
  name: string(),
17829
17831
  url: string(),
@@ -17886,7 +17888,7 @@ var StatusSchema = object({
17886
17888
  brokerCount: number(),
17887
17889
  embeddedRunning: boolean()
17888
17890
  });
17889
- method(_void(), array(BrokerInfoSchema)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17891
+ method(_void(), array(BrokerInfoSchema$1)), method(IdInputSchema, BrokerConnectionDetailsSchema, { auth: "admin" }), method(AddBrokerInputSchema, AddBrokerResultSchema, {
17890
17892
  kind: "mutation",
17891
17893
  auth: "admin"
17892
17894
  }), method(IdInputSchema, _void(), {
@@ -20114,78 +20116,16 @@ var NcRuleInputSchema = object({
20114
20116
  */
20115
20117
  confirm: NcConfirmSchema.optional(),
20116
20118
  /**
20117
- * WAIT for face/plate recognition before saying anything.
20118
- *
20119
- * A notification's TEXT is frozen at enqueue and its media is re-resolved at
20120
- * send; the identity is neither. A face is confirmed after `confirmFrames`
20121
- * agreeing observations — p50 **11.4 s** after the track was first seen,
20122
- * measured on this hub — and an `immediate` rule enqueues on the first object
20123
- * event, seconds before that. So "Gianluca è arrivato" is unsayable on the
20124
- * immediate path, and no amount of media re-resolution fixes a sentence.
20125
- *
20126
- * Only two honest answers exist, and this flag picks between them. It has
20127
- * effect ONLY on a rule that declares a recognition scope
20128
- * ({@link NcConditions.identities} or {@link NcConditions.plates}) — on any
20129
- * other rule there is nothing to wait for and the flag is inert.
20130
- *
20131
- * | value | what happens |
20132
- * | --- | --- |
20133
- * | `true` | the rule stops firing on the object event and fires at TRACK CLOSE instead, once, with the name — later, and complete |
20134
- * | absent / `false` | it fires at once WITHOUT the name, and if recognition lands before the track closes a SECOND, "…is Gianluca" notification follows (one per track, per rule, per target) |
20135
- *
20136
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
20137
- * on the addon cap path, and absent has to keep meaning exactly what every
20138
- * rule authored before this field meant.
20139
- *
20140
- * The cost of `true` is stated here because the editor states it too: a rule
20141
- * that waits also inherits track-close SEMANTICS — its `zones` condition
20142
- * tests every zone the track visited and a `crossing` condition can no longer
20143
- * be satisfied, because a closed track carries no crossing.
20144
- */
20145
- waitForEnhancement: boolean().optional(),
20146
- /**
20147
- * GROUP a burst of subjects into ONE notification that grows.
20148
- *
20149
- * Seconds of quiet after the last matching subject before the burst is
20150
- * considered over. While it is open, the first subject enqueues immediately —
20151
- * **exactly as today, with no added latency** — and every real growth (a new
20152
- * subject, or a name confirmed on one already in it) REPLACES that
20153
- * notification with an updated one naming everybody. The push carries the
20154
- * group's own coalescing tag, so the phone replaces rather than stacks.
20155
- *
20156
- * `0` / absent = off, and off is today's behaviour byte for byte.
20157
- *
20158
- * ### Why an idle cutoff and not a window
20159
- *
20160
- * The measured seven-person arrival on device 590 spans 110 s with every
20161
- * internal gap under 30 s. A 12 s fixed window cuts it into three groups; an
20162
- * idle cutoff holds it as one and ends it when the arrival actually ends.
20163
- * 30 s is a widely shipped value for the same decision.
20164
- *
20165
- * ### What it replaces
20166
- *
20167
- * The blind cooldown, which collapses a burst by DISCARDING it. Measured on
20168
- * device 615 / *Persona su Uscio* over six days: 116 qualifying tracks → 74
20169
- * notifications, **44 (37.9%) suppressed outright**, 23 of them overlapping a
20170
- * track that did fire and 7 carrying a confirmed identity nobody heard about.
20171
- * A group collapses the same volume by MERGING, so the cooldown becomes a
20172
- * budget over GROUPS — which is what it always meant — and a growth is never
20173
- * throttled by the window its own first member spent.
20174
- *
20175
- * ### Interaction with {@link waitForEnhancement}
20176
- *
20177
- * They compose, and the order matters. `waitForEnhancement` defers the rule to
20178
- * TRACK CLOSE, so with both set the group is opened by the first member to
20179
- * CLOSE — already carrying its name — and grows as later members close. That
20180
- * is later, and complete. With grouping alone the group opens on the first
20181
- * object event and picks up names as they are confirmed, through the growth
20182
- * path. Neither combination fires twice for one subject.
20183
- *
20184
- * `.optional()` and deliberately NOT `.default()`: a Zod default does not run
20185
- * on the addon cap path, so absent must keep meaning what it meant before this
20186
- * field existed.
20119
+ * IMMEDIATE GROUPED (D692): the first matching subject opens a window of this many
20120
+ * seconds; the rule sends ONE message when the window closes — early, once every
20121
+ * subject in it is final, never before {@link NC_GROUPING_MIN_SEC} — naming everybody
20122
+ * the rule matched, with one mosaic tile per subject.
20123
+ * Absent = plain immediate (one message per track, at the first match).
20124
+ * Only an `immediate` DETECTION rule may carry it (`ruleGroupingApplies`, enforced on
20125
+ * save by the hub's grouping guard). `.optional()`, never `.default()`: the addon cap
20126
+ * path does not run Zod defaults.
20187
20127
  */
20188
- groupIdleSec: number().int().min(0).max(600).optional()
20128
+ groupingSec: number().int().min(5).max(60).optional()
20189
20129
  });
20190
20130
  /**
20191
20131
  * Partial patch for `updateRule` — any subset of the input fields, plus the
@@ -20233,9 +20173,10 @@ var NcRuleClearableKeySchema = _enum([
20233
20173
  "targetUsers",
20234
20174
  "snoozeOptions",
20235
20175
  "snoozeAllowGlobal",
20236
- "waitForEnhancement",
20237
20176
  "actions",
20238
20177
  "confirm",
20178
+ "groupingSec",
20179
+ "waitForEnhancement",
20239
20180
  "groupIdleSec"
20240
20181
  ]);
20241
20182
  var NcRuleUpdateInputSchema = object({
@@ -20257,9 +20198,25 @@ var NcRuleSchema = NcRuleInputSchema.extend({
20257
20198
  */
20258
20199
  disabledTargetIds: array(string()).default([])
20259
20200
  });
20201
+ /**
20202
+ * The state-summary SECTIONS (D647 / D698): the D637 kind groups that report a
20203
+ * still-true state. `backups-exports` and `alarm` are not sections — a completed
20204
+ * job is not an open state, and the alarm stays instant.
20205
+ */
20206
+ var NcStateSummarySectionIdSchema = _enum([
20207
+ "device-state",
20208
+ "streams",
20209
+ "battery",
20210
+ "consumables",
20211
+ "tanks",
20212
+ "detection-blind",
20213
+ "nodes",
20214
+ "addons",
20215
+ "updates"
20216
+ ]);
20260
20217
  /** One section of a previewed state summary. `unavailable` = its state could not be read. */
20261
20218
  var NcStateSummaryPreviewSectionSchema = object({
20262
- id: string(),
20219
+ id: NcStateSummarySectionIdSchema,
20263
20220
  status: _enum(["read", "unavailable"]),
20264
20221
  items: number().int().nonnegative(),
20265
20222
  reason: string().optional()
@@ -20269,7 +20226,7 @@ var NcStateSummaryPreviewSectionSchema = object({
20269
20226
  * a `rule` split (no `section`), one section's on a `section` split.
20270
20227
  */
20271
20228
  var NcStateSummaryPreviewRowSchema = object({
20272
- section: string().optional(),
20229
+ section: NcStateSummarySectionIdSchema.optional(),
20273
20230
  /** The section's name on a per-section row; every reported section's, joined, on a combined one. */
20274
20231
  title: string(),
20275
20232
  text: string(),
@@ -20730,14 +20687,52 @@ var NcAlarmNonBlockingEditSchema = object({
20730
20687
  nonBlocking: boolean()
20731
20688
  });
20732
20689
  /**
20690
+ * Controllable openings: opt IN to blocking (default is do not block). Contacts
20691
+ * keep using {@link NcAlarmNonBlockingEditSchema}.
20692
+ */
20693
+ var NcAlarmBlockingEditSchema = object({
20694
+ mode: AlarmArmModeSchema,
20695
+ deviceId: number().int().positive(),
20696
+ /** true = on the list (blocks when open); false = off the list (default). */
20697
+ blocking: boolean()
20698
+ });
20699
+ /**
20700
+ * Controllable openings: opt OUT of secure-on-arm (default is secure ON —
20701
+ * close / lock / turn off when this mode arms).
20702
+ */
20703
+ var NcAlarmSecureOnArmEditSchema = object({
20704
+ mode: AlarmArmModeSchema,
20705
+ deviceId: number().int().positive(),
20706
+ /** true = secure on arm (default); false = do not actuate on arm. */
20707
+ secureOnArm: boolean()
20708
+ });
20709
+ /**
20710
+ * One arm mode's device-id list (non-blocking, blocking, or secure-on-arm-off).
20711
+ */
20712
+ var NcAlarmModeDeviceListSchema = object({
20713
+ mode: AlarmArmModeSchema,
20714
+ deviceIds: array(number().int()).max(200)
20715
+ });
20716
+ /**
20717
+ * One arm mode's non-blocking list: devices that may be open when that mode
20718
+ * arms, without the arm being refused.
20719
+ */
20720
+ var NcAlarmNonBlockingSchema = NcAlarmModeDeviceListSchema;
20721
+ /** Controllable devices that DO block when open (opt-in; default empty). */
20722
+ var NcAlarmBlockingSchema = NcAlarmModeDeviceListSchema;
20723
+ /**
20724
+ * Controllable devices that do NOT secure on arm (opt-out; default empty =
20725
+ * every controllable secures).
20726
+ */
20727
+ var NcAlarmSecureOnArmOffSchema = NcAlarmModeDeviceListSchema;
20728
+ /**
20733
20729
  * The per-mode lists, at most one per mode. Two lists for one mode have no
20734
20730
  * meaning a reader could agree on (union? the last one?), so they are refused
20735
20731
  * at the boundary rather than interpreted.
20736
20732
  */
20737
- var NcAlarmNonBlockingListSchema = array(object({
20738
- mode: AlarmArmModeSchema,
20739
- deviceIds: array(number().int()).max(200)
20740
- })).max(8).refine(uniqueModes, { message: "nonBlocking: at most one list per arm mode" });
20733
+ var NcAlarmNonBlockingListSchema = array(NcAlarmNonBlockingSchema).max(8).refine(uniqueModes, { message: "nonBlocking: at most one list per arm mode" });
20734
+ var NcAlarmBlockingListSchema = array(NcAlarmBlockingSchema).max(8).refine(uniqueModes, { message: "blocking: at most one list per arm mode" });
20735
+ var NcAlarmSecureOnArmOffListSchema = array(NcAlarmSecureOnArmOffSchema).max(8).refine(uniqueModes, { message: "secureOnArmOff: at most one list per arm mode" });
20741
20736
  /**
20742
20737
  * The three durations — global, and per mode since D697 — the panel's state
20743
20738
  * machine runs on, who hears about its transitions, and which openings each mode tolerates.
@@ -20780,9 +20775,23 @@ var NcAlarmSettingsSchema = object({
20780
20775
  * arm (a window left ajar for the cat under `home`, say). At most one entry
20781
20776
  * per mode is meaningful. Defaulted to `[]` so a blob stored before D630
20782
20777
  * parses as "every opening blocks" — the behaviour it was written under.
20778
+ * Contacts use this list; controllable openings use {@link blocking} instead
20779
+ * (default: do not block).
20783
20780
  */
20784
20781
  nonBlocking: NcAlarmNonBlockingListSchema.default([]),
20785
20782
  /**
20783
+ * Per arm mode, controllable openings that DO refuse the arm when open.
20784
+ * Default `[]` = none block (secure-on-arm closes them instead). Absent on a
20785
+ * blob older than this field — read as empty.
20786
+ */
20787
+ blocking: NcAlarmBlockingListSchema.default([]),
20788
+ /**
20789
+ * Per arm mode, controllable openings that must NOT be actuated on arm.
20790
+ * Default `[]` = every controllable secures (close / lock / off). Absent on
20791
+ * an older blob — read as empty (secure ON).
20792
+ */
20793
+ secureOnArmOff: NcAlarmSecureOnArmOffListSchema.default([]),
20794
+ /**
20786
20795
  * Per arm mode, the delays that mode OVERRIDES (D697). A mode with no entry, or an entry
20787
20796
  * without a field, uses the global value above — so `[]`, the default, is exactly the
20788
20797
  * behaviour of a blob stored before this field existed. Read through `resolveModeDelays`.
@@ -20792,7 +20801,7 @@ var NcAlarmSettingsSchema = object({
20792
20801
  /**
20793
20802
  * Every field optional — a tab edits one control at a time.
20794
20803
  *
20795
- * `nonBlocking` and `modeDelays` are re-declared WITHOUT their defaults:
20804
+ * List fields and `modeDelays` are re-declared WITHOUT their defaults:
20796
20805
  * `.partial()` does not remove an inner `.default()`, so a patch that never
20797
20806
  * named the field would parse to `[]` and wipe every mode's list on an
20798
20807
  * unrelated edit (the same trap {@link NcRulePatchSchema} documents). Here
@@ -20800,11 +20809,15 @@ var NcAlarmSettingsSchema = object({
20800
20809
  */
20801
20810
  var NcAlarmSettingsPatchSchema = NcAlarmSettingsSchema.extend({
20802
20811
  nonBlocking: NcAlarmNonBlockingListSchema,
20812
+ blocking: NcAlarmBlockingListSchema,
20813
+ secureOnArmOff: NcAlarmSecureOnArmOffListSchema,
20803
20814
  /** Per-mode, per-field edits — NOT the whole list (see NcAlarmModeDelaysEditSchema). */
20804
20815
  modeDelays: NcAlarmModeDelaysEditListSchema,
20805
20816
  /** ONE membership change; the panel applies it to the list it holds at its turn. */
20806
- nonBlockingEdit: NcAlarmNonBlockingEditSchema
20807
- }).partial().refine((p) => p.nonBlocking === void 0 || p.nonBlockingEdit === void 0, { message: "nonBlocking and nonBlockingEdit are exclusive — send the whole lists or one edit" });
20817
+ nonBlockingEdit: NcAlarmNonBlockingEditSchema,
20818
+ blockingEdit: NcAlarmBlockingEditSchema,
20819
+ secureOnArmEdit: NcAlarmSecureOnArmEditSchema
20820
+ }).partial().refine((p) => p.nonBlocking === void 0 || p.nonBlockingEdit === void 0, { message: "nonBlocking and nonBlockingEdit are exclusive — send the whole lists or one edit" }).refine((p) => p.blocking === void 0 || p.blockingEdit === void 0, { message: "blocking and blockingEdit are exclusive — send the whole lists or one edit" }).refine((p) => p.secureOnArmOff === void 0 || p.secureOnArmEdit === void 0, { message: "secureOnArmOff and secureOnArmEdit are exclusive — send the whole lists or one edit" });
20808
20821
  /**
20809
20822
  * What one arm mode actually arms, DERIVED from the enabled rules gated on it.
20810
20823
  * Never authored, never stored — see `alarm-mode-coverage.ts` for why a stored
@@ -20919,7 +20932,13 @@ var NcAlarmSensorStateSchema = object({
20919
20932
  /** Why `unknown`: the read failed, or the slice holds no word its cap defines (a placeholder included). */
20920
20933
  unknownWhy: _enum(["read-failed", "unknown-word"]).nullable(),
20921
20934
  /** The device manager's liveness as the centre mirrors it; null = not known. */
20922
- online: boolean().nullable()
20935
+ online: boolean().nullable(),
20936
+ /**
20937
+ * True when the opening is a cover / lock / switch — the table shows the
20938
+ * Secure-on-arm switch and uses the controllable defaults. False for contacts
20939
+ * and for non-openings. Defaulted so an older hub answer still parses.
20940
+ */
20941
+ controllable: boolean().default(false)
20923
20942
  });
20924
20943
  var NcAlarmSensorsInputSchema = object({ deviceIds: array(number().int().positive()).max(500) });
20925
20944
  var NcAlarmSensorsSchema = object({
@@ -22802,6 +22821,7 @@ var KeyEventSchema = object({
22802
22821
  bestEventId: string(),
22803
22822
  /** Track lifetime in ms (lastSeen - firstSeen). */
22804
22823
  windowMs: number().optional(),
22824
+ audioLabels: array(TrackAudioLabelSchema).readonly().optional(),
22805
22825
  ...TrackFlagFields,
22806
22826
  ...TrackRetrainFields
22807
22827
  });
@@ -29437,6 +29457,74 @@ var buttonCapability = {
29437
29457
  }) }
29438
29458
  };
29439
29459
  /**
29460
+ * `calendar-source` — collection cap exposing per-provider calendars and
29461
+ * their events. Every addon that contributes calendars (Home Assistant,
29462
+ * a future Google Calendar addon, …) registers a provider here. The hub
29463
+ * singleton `calendars` walks the collection and merges the answers.
29464
+ *
29465
+ * Mirrors `addon-pages-source`: the public listing is a different shape
29466
+ * (source-stamped ids) and lives on the aggregator.
29467
+ */
29468
+ var CalendarSourceKindSchema = _enum(["ha", "addon"]);
29469
+ var CalendarInfoSchema = object({
29470
+ /** Provider-local id (e.g. HA `calendar.family`). The aggregator prefixes. */
29471
+ id: string().min(1),
29472
+ name: string().min(1),
29473
+ source: CalendarSourceKindSchema,
29474
+ enabled: boolean()
29475
+ });
29476
+ var CalendarEventSchema = object({
29477
+ id: string().min(1),
29478
+ calendarId: string().min(1),
29479
+ title: string(),
29480
+ startMs: number().int(),
29481
+ endMs: number().int(),
29482
+ allDay: boolean().optional(),
29483
+ description: string().optional(),
29484
+ location: string().optional()
29485
+ });
29486
+ var CalendarListEventsInputSchema = object({
29487
+ calendarIds: array(string().min(1)).max(64).optional(),
29488
+ startMs: number().int(),
29489
+ endMs: number().int()
29490
+ });
29491
+ var calendarSourceCapability = {
29492
+ name: "calendar-source",
29493
+ scope: "system",
29494
+ mode: "collection",
29495
+ internal: true,
29496
+ methods: {
29497
+ listCalendars: method(_void(), array(CalendarInfoSchema).readonly(), { auth: "admin" }),
29498
+ listEvents: method(CalendarListEventsInputSchema, array(CalendarEventSchema).readonly(), { auth: "admin" })
29499
+ }
29500
+ };
29501
+ /**
29502
+ * `calendars` — system-scoped singleton. Public surface admin-ui and the
29503
+ * notification-center calendar-events producer consume.
29504
+ *
29505
+ * Walks every `calendar-source` provider, stamps each calendar with a
29506
+ * cluster-stable id (`<sourceAddonId>:<localId>`) and the providing
29507
+ * addon's id, and fans `listEvents` out the same way. Home Assistant
29508
+ * import is a built-in refresh of the HA source rather than a second
29509
+ * registry — `importFromHomeAssistant` asks that source to re-discover.
29510
+ */
29511
+ var CalendarEntrySchema = CalendarInfoSchema.extend({
29512
+ /** Cluster-stable id: `<providerAddonId>:<localId>`. */
29513
+ id: string().min(1),
29514
+ /** The addon that registered the calendar-source provider. */
29515
+ providerAddonId: string().min(1).optional()
29516
+ });
29517
+ var CalendarImportResultSchema = object({
29518
+ imported: number().int().nonnegative(),
29519
+ /** Absent when no HA calendar-source provider was reachable. */
29520
+ providerAddonId: string().min(1).optional(),
29521
+ error: string().optional()
29522
+ });
29523
+ method(_void(), array(CalendarEntrySchema).readonly(), { auth: "admin" }), method(CalendarListEventsInputSchema, array(CalendarEventSchema).readonly(), { auth: "admin" }), method(_void(), CalendarImportResultSchema, {
29524
+ auth: "admin",
29525
+ kind: "mutation"
29526
+ });
29527
+ /**
29440
29528
  * camera-credentials — device-scoped cap exposing the camera's network
29441
29529
  * + auth surface in a vendor-neutral shape.
29442
29530
  *
@@ -33985,38 +34073,52 @@ DeviceType.Camera, method(object({
33985
34073
  deviceId: number(),
33986
34074
  status: OsdStatusSchema
33987
34075
  });
34076
+ _enum([
34077
+ "value",
34078
+ "unit",
34079
+ "full"
34080
+ ]);
34081
+ _enum([
34082
+ "value+unit",
34083
+ "value",
34084
+ "unit"
34085
+ ]);
34086
+ /**
34087
+ * How the operator reached the leaf device. `deviceId` is ALWAYS the
34088
+ * OSD-supported leaf that is read; `containerId` is set when the pick
34089
+ * went through a container (gateway) first.
34090
+ */
34091
+ var OsdTemplatePickSchema = object({
34092
+ containerId: number().int().optional(),
34093
+ deviceId: number().int()
34094
+ });
33988
34095
  /**
33989
- * `osd-manager` — the ORCHESTRATOR over the device-scope `osd` cap.
33990
- *
33991
- * The `osd` cap is the firmware contract: it probes a camera's overlay
33992
- * SLOTS and writes literal text into one. It has no idea WHERE that text
33993
- * comes from, and it must not — a driver that grew a "show the temperature
33994
- * here" feature would grow it once per vendor.
33995
- *
33996
- * This cap owns the other half: a per-(camera, slot) BINDING that says
33997
- * which value feeds the slot, how it is formatted, and under which
33998
- * conditions it is shown at all. One addon renders every binding on every
33999
- * camera, so a new source costs zero driver code.
34000
- *
34001
- * Three deliberate choices, each with a rejected alternative:
34002
- *
34003
- * 1. A source is `(capName, valuePath)` over the kernel's device
34004
- * runtime-state mirror — NOT a closed enum of source kinds. Every
34005
- * cap-keyed slice a device publishes is bindable the day the cap
34006
- * ships. The rejected alternative (one enum member per source, with
34007
- * a resolver branch each) is what makes "add the humidity too" a
34008
- * code change.
34009
- * 2. The display gate reuses `NcConditionsSchema` verbatim — the
34010
- * notification centre's condition vocabulary — rather than a parallel
34011
- * model. An operator who has learned one condition editor has learned
34012
- * both.
34013
- * 3. Because the renderer's facts are device STATE and not a detection
34014
- * record, only a SUBSET of that vocabulary can be answered here.
34015
- * `setSlotBinding` REJECTS the rest at write time (see
34016
- * `getConditionSupport`). It does not accept-then-fail-closed: a
34017
- * condition that can never be true renders a permanently blank
34018
- * overlay, and a blank overlay looks exactly like a broken camera.
34096
+ * One named binding inside a multi-device template: device path + unit
34097
+ * selection + precision. The parser expands `{alias}`, `{alias.value}`,
34098
+ * `{alias.unit}`, or `{alias.full}` from the same binding — there is no
34099
+ * per-binding format lock.
34019
34100
  */
34101
+ var OsdTemplateBindingSchema = object({
34102
+ /** Token stem in the parser, e.g. `t` → `{t}` / `{t.value}`. Unique within the template. */
34103
+ alias: string().min(1).max(32).regex(/^[A-Za-z][A-Za-z0-9_-]*$/, "alias must start with a letter"),
34104
+ pick: OsdTemplatePickSchema,
34105
+ capName: string().min(1).max(64),
34106
+ valuePath: string().min(1).max(64),
34107
+ /** Convert TO this unit at render (`tryConvertUnit`). Absent = source unit. */
34108
+ displayUnit: string().max(16).optional(),
34109
+ maxDecimals: number().int().min(0).max(4).default(1)
34110
+ });
34111
+ /**
34112
+ * A named template: bindings (alias → leaf field) + a parser that
34113
+ * references `{alias}` / `{alias.value}` / `{alias.unit}` / `{alias.full}`.
34114
+ */
34115
+ var OsdNamedTemplateSchema = object({
34116
+ id: string().min(1).max(64),
34117
+ name: string().min(1).max(64),
34118
+ bindings: array(OsdTemplateBindingSchema).max(32).default([]),
34119
+ /** Parser with alias placeholders, e.g. `{t.value} {t.unit} / {h}`. */
34120
+ parser: string().max(256).default("")
34121
+ });
34020
34122
  /** Where a slot's value comes from. */
34021
34123
  var OsdSourceSchema = discriminatedUnion("kind", [
34022
34124
  object({
@@ -34035,11 +34137,17 @@ var OsdSourceSchema = discriminatedUnion("kind", [
34035
34137
  deviceId: number().int().optional(),
34036
34138
  capName: string().min(1).max(64),
34037
34139
  /** Dot path inside the slice, e.g. `detected`, `value`, `mode`. */
34038
- valuePath: string().min(1).max(64)
34140
+ valuePath: string().min(1).max(64),
34141
+ /** Convert TO this unit at render. Absent = no conversion. */
34142
+ displayUnit: string().max(16).optional()
34039
34143
  }),
34040
34144
  object({
34041
34145
  kind: literal("latest-recognition"),
34042
34146
  recognition: _enum(["person", "plate"])
34147
+ }),
34148
+ object({
34149
+ kind: literal("template"),
34150
+ templateId: string().min(1).max(64)
34043
34151
  })
34044
34152
  ]);
34045
34153
  var OsdSlotBindingSchema = object({
@@ -34055,7 +34163,10 @@ var OsdSlotBindingSchema = object({
34055
34163
  * documented workaround for firmwares that reject `.` in overlay text.
34056
34164
  */
34057
34165
  maxDecimals: number().int().min(0).max(4).default(1),
34058
- /** Appended via `${unit}`. The state mirror does not carry units. */
34166
+ /**
34167
+ * Appended via `${unit}` when no unit conversion produces a label.
34168
+ * Prefer `source.displayUnit` for converted device-state values.
34169
+ */
34059
34170
  unitLabel: string().max(8).optional(),
34060
34171
  /** Raw value → display text, e.g. `{"true":"MOTION","false":""}`. */
34061
34172
  valueMap: record(string(), string()).optional(),
@@ -34164,6 +34275,12 @@ method(object({ deviceId: number().int() }), object({
34164
34275
  }), method(object({ deviceId: number().int() }), object({ results: array(OsdRenderResultSchema) }), {
34165
34276
  kind: "mutation",
34166
34277
  auth: "admin"
34278
+ }), method(object({}), object({ templates: array(OsdNamedTemplateSchema) }), { auth: "admin" }), method(object({ template: OsdNamedTemplateSchema }), object({ template: OsdNamedTemplateSchema }), {
34279
+ kind: "mutation",
34280
+ auth: "admin"
34281
+ }), method(object({ templateId: string().min(1).max(64) }), object({ success: literal(true) }), {
34282
+ kind: "mutation",
34283
+ auth: "admin"
34167
34284
  });
34168
34285
  /**
34169
34286
  * Feeder connectivity / power status — mirrors the HA petkit device-status
@@ -39287,6 +39404,7 @@ var zoneRulesCapability = {
39287
39404
  */
39288
39405
  durability: "restored"
39289
39406
  };
39407
+ SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
39290
39408
  /**
39291
39409
  * Accessory device helpers — shared across drivers.
39292
39410
  *
@@ -42957,6 +43075,36 @@ Object.freeze({
42957
43075
  addonId: null,
42958
43076
  access: "create"
42959
43077
  },
43078
+ "calendars.importFromHomeAssistant": {
43079
+ capName: "calendars",
43080
+ capScope: "system",
43081
+ addonId: null,
43082
+ access: "create"
43083
+ },
43084
+ "calendars.listCalendars": {
43085
+ capName: "calendars",
43086
+ capScope: "system",
43087
+ addonId: null,
43088
+ access: "view"
43089
+ },
43090
+ "calendars.listEvents": {
43091
+ capName: "calendars",
43092
+ capScope: "system",
43093
+ addonId: null,
43094
+ access: "view"
43095
+ },
43096
+ "calendarSource.listCalendars": {
43097
+ capName: "calendar-source",
43098
+ capScope: "system",
43099
+ addonId: null,
43100
+ access: "view"
43101
+ },
43102
+ "calendarSource.listEvents": {
43103
+ capName: "calendar-source",
43104
+ capScope: "system",
43105
+ addonId: null,
43106
+ access: "view"
43107
+ },
42960
43108
  "cameraCredentials.getCredentials": {
42961
43109
  capName: "camera-credentials",
42962
43110
  capScope: "device",
@@ -45951,6 +46099,12 @@ Object.freeze({
45951
46099
  addonId: null,
45952
46100
  access: "create"
45953
46101
  },
46102
+ "osdManager.deleteTemplate": {
46103
+ capName: "osd-manager",
46104
+ capScope: "system",
46105
+ addonId: null,
46106
+ access: "delete"
46107
+ },
45954
46108
  "osdManager.getConditionSupport": {
45955
46109
  capName: "osd-manager",
45956
46110
  capScope: "system",
@@ -45969,6 +46123,12 @@ Object.freeze({
45969
46123
  addonId: null,
45970
46124
  access: "view"
45971
46125
  },
46126
+ "osdManager.listTemplates": {
46127
+ capName: "osd-manager",
46128
+ capScope: "system",
46129
+ addonId: null,
46130
+ access: "view"
46131
+ },
45972
46132
  "osdManager.previewSlot": {
45973
46133
  capName: "osd-manager",
45974
46134
  capScope: "system",
@@ -45987,6 +46147,12 @@ Object.freeze({
45987
46147
  addonId: null,
45988
46148
  access: "create"
45989
46149
  },
46150
+ "osdManager.upsertTemplate": {
46151
+ capName: "osd-manager",
46152
+ capScope: "system",
46153
+ addonId: null,
46154
+ access: "create"
46155
+ },
45990
46156
  "petFeeder.callPet": {
45991
46157
  capName: "pet-feeder",
45992
46158
  capScope: "device",
@@ -49373,6 +49539,11 @@ Object.freeze({
49373
49539
  }
49374
49540
  });
49375
49541
  Object.freeze({
49542
+ "accessories.getStatus": [{
49543
+ name: "deviceId",
49544
+ form: "single",
49545
+ optional: false
49546
+ }],
49376
49547
  "accessories.setChildHidden": [{
49377
49548
  name: "childDeviceId",
49378
49549
  form: "single",
@@ -49392,6 +49563,11 @@ Object.freeze({
49392
49563
  form: "single",
49393
49564
  optional: false
49394
49565
  }],
49566
+ "airQualitySensor.getStatus": [{
49567
+ name: "deviceId",
49568
+ form: "single",
49569
+ optional: false
49570
+ }],
49395
49571
  "alarmPanel.arm": [{
49396
49572
  name: "deviceId",
49397
49573
  form: "single",
@@ -49402,11 +49578,36 @@ Object.freeze({
49402
49578
  form: "single",
49403
49579
  optional: false
49404
49580
  }],
49581
+ "alarmPanel.getStatus": [{
49582
+ name: "deviceId",
49583
+ form: "single",
49584
+ optional: false
49585
+ }],
49405
49586
  "alarmPanel.trigger": [{
49406
49587
  name: "deviceId",
49407
49588
  form: "single",
49408
49589
  optional: false
49409
49590
  }],
49591
+ "ambientLightSensor.getStatus": [{
49592
+ name: "deviceId",
49593
+ form: "single",
49594
+ optional: false
49595
+ }],
49596
+ "audioAnalysis.applyDeviceSettingsPatch": [{
49597
+ name: "deviceId",
49598
+ form: "single",
49599
+ optional: false
49600
+ }],
49601
+ "audioAnalysis.getDeviceLiveContribution": [{
49602
+ name: "deviceId",
49603
+ form: "single",
49604
+ optional: false
49605
+ }],
49606
+ "audioAnalysis.getDeviceSettingsContribution": [{
49607
+ name: "deviceId",
49608
+ form: "single",
49609
+ optional: false
49610
+ }],
49410
49611
  "audioAnalysis.resolveDeviceSettings": [{
49411
49612
  name: "deviceId",
49412
49613
  form: "single",
@@ -49447,16 +49648,36 @@ Object.freeze({
49447
49648
  form: "single",
49448
49649
  optional: false
49449
49650
  }],
49651
+ "automationControl.getStatus": [{
49652
+ name: "deviceId",
49653
+ form: "single",
49654
+ optional: false
49655
+ }],
49450
49656
  "automationControl.trigger": [{
49451
49657
  name: "deviceId",
49452
49658
  form: "single",
49453
49659
  optional: false
49454
49660
  }],
49661
+ "battery.getStatus": [{
49662
+ name: "deviceId",
49663
+ form: "single",
49664
+ optional: false
49665
+ }],
49455
49666
  "battery.wakeForStream": [{
49456
49667
  name: "deviceId",
49457
49668
  form: "single",
49458
49669
  optional: false
49459
49670
  }],
49671
+ "binary.getStatus": [{
49672
+ name: "deviceId",
49673
+ form: "single",
49674
+ optional: false
49675
+ }],
49676
+ "brightness.getStatus": [{
49677
+ name: "deviceId",
49678
+ form: "single",
49679
+ optional: false
49680
+ }],
49460
49681
  "brightness.setBrightness": [{
49461
49682
  name: "deviceId",
49462
49683
  form: "single",
@@ -49472,6 +49693,26 @@ Object.freeze({
49472
49693
  form: "single",
49473
49694
  optional: false
49474
49695
  }],
49696
+ "cameraCredentials.getStatus": [{
49697
+ name: "deviceId",
49698
+ form: "single",
49699
+ optional: false
49700
+ }],
49701
+ "cameraGridLayout.applyDeviceSettingsPatch": [{
49702
+ name: "deviceId",
49703
+ form: "single",
49704
+ optional: false
49705
+ }],
49706
+ "cameraGridLayout.getDeviceLiveContribution": [{
49707
+ name: "deviceId",
49708
+ form: "single",
49709
+ optional: false
49710
+ }],
49711
+ "cameraGridLayout.getDeviceSettingsContribution": [{
49712
+ name: "deviceId",
49713
+ form: "single",
49714
+ optional: false
49715
+ }],
49475
49716
  "cameraGridLayout.getLayout": [{
49476
49717
  name: "deviceId",
49477
49718
  form: "single",
@@ -49487,6 +49728,21 @@ Object.freeze({
49487
49728
  form: "single",
49488
49729
  optional: false
49489
49730
  }],
49731
+ "cameraPipelineConfig.applyDeviceSettingsPatch": [{
49732
+ name: "deviceId",
49733
+ form: "single",
49734
+ optional: false
49735
+ }],
49736
+ "cameraPipelineConfig.getDeviceLiveContribution": [{
49737
+ name: "deviceId",
49738
+ form: "single",
49739
+ optional: false
49740
+ }],
49741
+ "cameraPipelineConfig.getDeviceSettingsContribution": [{
49742
+ name: "deviceId",
49743
+ form: "single",
49744
+ optional: false
49745
+ }],
49490
49746
  "cameraStreams.getBrokerStreams": [{
49491
49747
  name: "deviceId",
49492
49748
  form: "single",
@@ -49512,6 +49768,16 @@ Object.freeze({
49512
49768
  form: "single",
49513
49769
  optional: false
49514
49770
  }],
49771
+ "carbonMonoxide.getStatus": [{
49772
+ name: "deviceId",
49773
+ form: "single",
49774
+ optional: false
49775
+ }],
49776
+ "climateControl.getStatus": [{
49777
+ name: "deviceId",
49778
+ form: "single",
49779
+ optional: false
49780
+ }],
49515
49781
  "climateControl.setFanMode": [{
49516
49782
  name: "deviceId",
49517
49783
  form: "single",
@@ -49552,16 +49818,41 @@ Object.freeze({
49552
49818
  form: "single",
49553
49819
  optional: false
49554
49820
  }],
49821
+ "color.getStatus": [{
49822
+ name: "deviceId",
49823
+ form: "single",
49824
+ optional: false
49825
+ }],
49555
49826
  "color.setColor": [{
49556
49827
  name: "deviceId",
49557
49828
  form: "single",
49558
49829
  optional: false
49559
49830
  }],
49831
+ "connectivity.getStatus": [{
49832
+ name: "deviceId",
49833
+ form: "single",
49834
+ optional: false
49835
+ }],
49836
+ "consumables.getStatus": [{
49837
+ name: "deviceId",
49838
+ form: "single",
49839
+ optional: false
49840
+ }],
49560
49841
  "consumables.reset": [{
49561
49842
  name: "deviceId",
49562
49843
  form: "single",
49563
49844
  optional: false
49564
49845
  }],
49846
+ "contact.getStatus": [{
49847
+ name: "deviceId",
49848
+ form: "single",
49849
+ optional: false
49850
+ }],
49851
+ "control.getStatus": [{
49852
+ name: "deviceId",
49853
+ form: "single",
49854
+ optional: false
49855
+ }],
49565
49856
  "control.setValue": [{
49566
49857
  name: "deviceId",
49567
49858
  form: "single",
@@ -49572,6 +49863,11 @@ Object.freeze({
49572
49863
  form: "single",
49573
49864
  optional: false
49574
49865
  }],
49866
+ "cover.getStatus": [{
49867
+ name: "deviceId",
49868
+ form: "single",
49869
+ optional: false
49870
+ }],
49575
49871
  "cover.open": [{
49576
49872
  name: "deviceId",
49577
49873
  form: "single",
@@ -49597,6 +49893,11 @@ Object.freeze({
49597
49893
  form: "single",
49598
49894
  optional: false
49599
49895
  }],
49896
+ "dayNight.getStatus": [{
49897
+ name: "deviceId",
49898
+ form: "single",
49899
+ optional: false
49900
+ }],
49600
49901
  "dayNight.setSettings": [{
49601
49902
  name: "deviceId",
49602
49903
  form: "single",
@@ -49607,11 +49908,31 @@ Object.freeze({
49607
49908
  form: "single",
49608
49909
  optional: true
49609
49910
  }],
49911
+ "detectionPipeline.applyDeviceSettingsPatch": [{
49912
+ name: "deviceId",
49913
+ form: "single",
49914
+ optional: false
49915
+ }],
49916
+ "detectionPipeline.getDeviceLiveContribution": [{
49917
+ name: "deviceId",
49918
+ form: "single",
49919
+ optional: false
49920
+ }],
49921
+ "detectionPipeline.getDeviceSettingsContribution": [{
49922
+ name: "deviceId",
49923
+ form: "single",
49924
+ optional: false
49925
+ }],
49610
49926
  "deviceAdminLink.getAdminLink": [{
49611
49927
  name: "deviceId",
49612
49928
  form: "single",
49613
49929
  optional: false
49614
49930
  }],
49931
+ "deviceAdoption.getStatus": [{
49932
+ name: "deviceId",
49933
+ form: "single",
49934
+ optional: false
49935
+ }],
49615
49936
  "deviceAdoption.release": [{
49616
49937
  name: "camDeviceId",
49617
49938
  form: "single",
@@ -49627,6 +49948,11 @@ Object.freeze({
49627
49948
  form: "single",
49628
49949
  optional: false
49629
49950
  }],
49951
+ "deviceDiscovery.getStatus": [{
49952
+ name: "deviceId",
49953
+ form: "single",
49954
+ optional: false
49955
+ }],
49630
49956
  "deviceDiscovery.listDiscovered": [{
49631
49957
  name: "deviceId",
49632
49958
  form: "single",
@@ -49646,6 +49972,21 @@ Object.freeze({
49646
49972
  form: "single",
49647
49973
  optional: false
49648
49974
  }],
49975
+ "deviceExport.applyDeviceSettingsPatch": [{
49976
+ name: "deviceId",
49977
+ form: "single",
49978
+ optional: false
49979
+ }],
49980
+ "deviceExport.getDeviceLiveContribution": [{
49981
+ name: "deviceId",
49982
+ form: "single",
49983
+ optional: false
49984
+ }],
49985
+ "deviceExport.getDeviceSettingsContribution": [{
49986
+ name: "deviceId",
49987
+ form: "single",
49988
+ optional: false
49989
+ }],
49649
49990
  "deviceExtension.listCandidates": [{
49650
49991
  name: "deviceId",
49651
49992
  form: "single",
@@ -49994,6 +50335,26 @@ Object.freeze({
49994
50335
  form: "single",
49995
50336
  optional: false
49996
50337
  }],
50338
+ "deviceStatus.getStatus": [{
50339
+ name: "deviceId",
50340
+ form: "single",
50341
+ optional: false
50342
+ }],
50343
+ "doorbell.getStatus": [{
50344
+ name: "deviceId",
50345
+ form: "single",
50346
+ optional: false
50347
+ }],
50348
+ "enumSensor.getStatus": [{
50349
+ name: "deviceId",
50350
+ form: "single",
50351
+ optional: false
50352
+ }],
50353
+ "eventEmitter.getStatus": [{
50354
+ name: "deviceId",
50355
+ form: "single",
50356
+ optional: false
50357
+ }],
49997
50358
  "faceGallery.getFaceByTrack": [{
49998
50359
  name: "deviceId",
49999
50360
  form: "single",
@@ -50008,6 +50369,11 @@ Object.freeze({
50008
50369
  form: "array",
50009
50370
  optional: true
50010
50371
  }],
50372
+ "fanControl.getStatus": [{
50373
+ name: "deviceId",
50374
+ form: "single",
50375
+ optional: false
50376
+ }],
50011
50377
  "fanControl.setDirection": [{
50012
50378
  name: "deviceId",
50013
50379
  form: "single",
@@ -50028,6 +50394,26 @@ Object.freeze({
50028
50394
  form: "single",
50029
50395
  optional: false
50030
50396
  }],
50397
+ "featureProbe.getStatus": [{
50398
+ name: "deviceId",
50399
+ form: "single",
50400
+ optional: false
50401
+ }],
50402
+ "flood.getStatus": [{
50403
+ name: "deviceId",
50404
+ form: "single",
50405
+ optional: false
50406
+ }],
50407
+ "gas.getStatus": [{
50408
+ name: "deviceId",
50409
+ form: "single",
50410
+ optional: false
50411
+ }],
50412
+ "humidifier.getStatus": [{
50413
+ name: "deviceId",
50414
+ form: "single",
50415
+ optional: false
50416
+ }],
50031
50417
  "humidifier.setMode": [{
50032
50418
  name: "deviceId",
50033
50419
  form: "single",
@@ -50043,11 +50429,26 @@ Object.freeze({
50043
50429
  form: "single",
50044
50430
  optional: false
50045
50431
  }],
50432
+ "humiditySensor.getStatus": [{
50433
+ name: "deviceId",
50434
+ form: "single",
50435
+ optional: false
50436
+ }],
50437
+ "image.getStatus": [{
50438
+ name: "deviceId",
50439
+ form: "single",
50440
+ optional: false
50441
+ }],
50046
50442
  "imageSettings.getOptions": [{
50047
50443
  name: "deviceId",
50048
50444
  form: "single",
50049
50445
  optional: false
50050
50446
  }],
50447
+ "imageSettings.getStatus": [{
50448
+ name: "deviceId",
50449
+ form: "single",
50450
+ optional: false
50451
+ }],
50051
50452
  "imageSettings.setSettings": [{
50052
50453
  name: "deviceId",
50053
50454
  form: "single",
@@ -50058,6 +50459,11 @@ Object.freeze({
50058
50459
  form: "single",
50059
50460
  optional: false
50060
50461
  }],
50462
+ "intercom.getStatus": [{
50463
+ name: "deviceId",
50464
+ form: "single",
50465
+ optional: false
50466
+ }],
50061
50467
  "intercom.handleAnswer": [{
50062
50468
  name: "deviceId",
50063
50469
  form: "single",
@@ -50088,6 +50494,11 @@ Object.freeze({
50088
50494
  form: "single",
50089
50495
  optional: false
50090
50496
  }],
50497
+ "lawnMowerControl.getStatus": [{
50498
+ name: "deviceId",
50499
+ form: "single",
50500
+ optional: false
50501
+ }],
50091
50502
  "lawnMowerControl.pause": [{
50092
50503
  name: "deviceId",
50093
50504
  form: "single",
@@ -50098,6 +50509,11 @@ Object.freeze({
50098
50509
  form: "single",
50099
50510
  optional: false
50100
50511
  }],
50512
+ "lockControl.getStatus": [{
50513
+ name: "deviceId",
50514
+ form: "single",
50515
+ optional: false
50516
+ }],
50101
50517
  "lockControl.lock": [{
50102
50518
  name: "deviceId",
50103
50519
  form: "single",
@@ -50113,6 +50529,11 @@ Object.freeze({
50113
50529
  form: "single",
50114
50530
  optional: false
50115
50531
  }],
50532
+ "mediaPlayer.getStatus": [{
50533
+ name: "deviceId",
50534
+ form: "single",
50535
+ optional: false
50536
+ }],
50116
50537
  "mediaPlayer.next": [{
50117
50538
  name: "deviceId",
50118
50539
  form: "single",
@@ -50173,6 +50594,11 @@ Object.freeze({
50173
50594
  form: "single",
50174
50595
  optional: false
50175
50596
  }],
50597
+ "motion.getStatus": [{
50598
+ name: "deviceId",
50599
+ form: "single",
50600
+ optional: false
50601
+ }],
50176
50602
  "motion.isDetected": [{
50177
50603
  name: "deviceId",
50178
50604
  form: "single",
@@ -50183,11 +50609,31 @@ Object.freeze({
50183
50609
  form: "single",
50184
50610
  optional: false
50185
50611
  }],
50612
+ "motionDetection.applyDeviceSettingsPatch": [{
50613
+ name: "deviceId",
50614
+ form: "single",
50615
+ optional: false
50616
+ }],
50617
+ "motionDetection.getDeviceLiveContribution": [{
50618
+ name: "deviceId",
50619
+ form: "single",
50620
+ optional: false
50621
+ }],
50622
+ "motionDetection.getDeviceSettingsContribution": [{
50623
+ name: "deviceId",
50624
+ form: "single",
50625
+ optional: false
50626
+ }],
50186
50627
  "motionDetection.removeCamera": [{
50187
50628
  name: "deviceId",
50188
50629
  form: "single",
50189
50630
  optional: false
50190
50631
  }],
50632
+ "motionTrigger.getStatus": [{
50633
+ name: "deviceId",
50634
+ form: "single",
50635
+ optional: false
50636
+ }],
50191
50637
  "motionTrigger.setMotionTrigger": [{
50192
50638
  name: "deviceId",
50193
50639
  form: "single",
@@ -50198,6 +50644,11 @@ Object.freeze({
50198
50644
  form: "single",
50199
50645
  optional: false
50200
50646
  }],
50647
+ "motionZones.getStatus": [{
50648
+ name: "deviceId",
50649
+ form: "single",
50650
+ optional: false
50651
+ }],
50201
50652
  "motionZones.setZone": [{
50202
50653
  name: "deviceId",
50203
50654
  form: "single",
@@ -50208,6 +50659,11 @@ Object.freeze({
50208
50659
  form: "single",
50209
50660
  optional: false
50210
50661
  }],
50662
+ "nativeObjectDetection.getStatus": [{
50663
+ name: "deviceId",
50664
+ form: "single",
50665
+ optional: false
50666
+ }],
50211
50667
  "nativeObjectDetection.setEnabled": [{
50212
50668
  name: "deviceId",
50213
50669
  form: "single",
@@ -50223,6 +50679,11 @@ Object.freeze({
50223
50679
  form: "single",
50224
50680
  optional: false
50225
50681
  }],
50682
+ "navigation.getStatus": [{
50683
+ name: "deviceId",
50684
+ form: "single",
50685
+ optional: false
50686
+ }],
50226
50687
  "navigation.goToPoint": [{
50227
50688
  name: "deviceId",
50228
50689
  form: "single",
@@ -50268,6 +50729,11 @@ Object.freeze({
50268
50729
  form: "single",
50269
50730
  optional: false
50270
50731
  }],
50732
+ "networkLink.getStatus": [{
50733
+ name: "deviceId",
50734
+ form: "single",
50735
+ optional: false
50736
+ }],
50271
50737
  "networkQuality.getDeviceStats": [{
50272
50738
  name: "deviceId",
50273
50739
  form: "single",
@@ -50293,11 +50759,26 @@ Object.freeze({
50293
50759
  form: "single",
50294
50760
  optional: false
50295
50761
  }],
50762
+ "notifier.getStatus": [{
50763
+ name: "deviceId",
50764
+ form: "single",
50765
+ optional: false
50766
+ }],
50296
50767
  "notifier.send": [{
50297
50768
  name: "deviceId",
50298
50769
  form: "single",
50299
50770
  optional: false
50300
50771
  }],
50772
+ "numericSensor.getStatus": [{
50773
+ name: "deviceId",
50774
+ form: "single",
50775
+ optional: false
50776
+ }],
50777
+ "osd.getStatus": [{
50778
+ name: "deviceId",
50779
+ form: "single",
50780
+ optional: false
50781
+ }],
50301
50782
  "osd.setOverlay": [{
50302
50783
  name: "deviceId",
50303
50784
  form: "single",
@@ -50357,6 +50838,11 @@ Object.freeze({
50357
50838
  form: "single",
50358
50839
  optional: false
50359
50840
  }],
50841
+ "petFeeder.getStatus": [{
50842
+ name: "deviceId",
50843
+ form: "single",
50844
+ optional: false
50845
+ }],
50360
50846
  "petFeeder.markFoodReplenished": [{
50361
50847
  name: "deviceId",
50362
50848
  form: "single",
@@ -50392,6 +50878,11 @@ Object.freeze({
50392
50878
  form: "single",
50393
50879
  optional: false
50394
50880
  }],
50881
+ "pipelineAnalytics.applyDeviceSettingsPatch": [{
50882
+ name: "deviceId",
50883
+ form: "single",
50884
+ optional: false
50885
+ }],
50395
50886
  "pipelineAnalytics.clearTrackRelation": [{
50396
50887
  name: "deviceId",
50397
50888
  form: "single",
@@ -50432,6 +50923,16 @@ Object.freeze({
50432
50923
  form: "single",
50433
50924
  optional: false
50434
50925
  }],
50926
+ "pipelineAnalytics.getDeviceLiveContribution": [{
50927
+ name: "deviceId",
50928
+ form: "single",
50929
+ optional: false
50930
+ }],
50931
+ "pipelineAnalytics.getDeviceSettingsContribution": [{
50932
+ name: "deviceId",
50933
+ form: "single",
50934
+ optional: false
50935
+ }],
50435
50936
  "pipelineAnalytics.getEventDensity": [{
50436
50937
  name: "deviceId",
50437
50938
  form: "single",
@@ -50647,6 +51148,11 @@ Object.freeze({
50647
51148
  form: "single",
50648
51149
  optional: true
50649
51150
  }],
51151
+ "pipelineOrchestrator.applyDeviceSettingsPatch": [{
51152
+ name: "deviceId",
51153
+ form: "single",
51154
+ optional: false
51155
+ }],
50650
51156
  "pipelineOrchestrator.assignAudio": [{
50651
51157
  name: "deviceId",
50652
51158
  form: "single",
@@ -50692,6 +51198,16 @@ Object.freeze({
50692
51198
  form: "single",
50693
51199
  optional: false
50694
51200
  }],
51201
+ "pipelineOrchestrator.getDeviceLiveContribution": [{
51202
+ name: "deviceId",
51203
+ form: "single",
51204
+ optional: false
51205
+ }],
51206
+ "pipelineOrchestrator.getDeviceSettingsContribution": [{
51207
+ name: "deviceId",
51208
+ form: "single",
51209
+ optional: false
51210
+ }],
50695
51211
  "pipelineOrchestrator.getPipelineAssignment": [{
50696
51212
  name: "deviceId",
50697
51213
  form: "single",
@@ -50812,11 +51328,31 @@ Object.freeze({
50812
51328
  form: "single",
50813
51329
  optional: true
50814
51330
  }],
51331
+ "powerMeter.getStatus": [{
51332
+ name: "deviceId",
51333
+ form: "single",
51334
+ optional: false
51335
+ }],
51336
+ "presence.getStatus": [{
51337
+ name: "deviceId",
51338
+ form: "single",
51339
+ optional: false
51340
+ }],
51341
+ "pressureSensor.getStatus": [{
51342
+ name: "deviceId",
51343
+ form: "single",
51344
+ optional: false
51345
+ }],
50815
51346
  "privacyMask.getOptions": [{
50816
51347
  name: "deviceId",
50817
51348
  form: "single",
50818
51349
  optional: false
50819
51350
  }],
51351
+ "privacyMask.getStatus": [{
51352
+ name: "deviceId",
51353
+ form: "single",
51354
+ optional: false
51355
+ }],
50820
51356
  "privacyMask.setAudioEnabled": [{
50821
51357
  name: "deviceId",
50822
51358
  form: "single",
@@ -50867,6 +51403,11 @@ Object.freeze({
50867
51403
  form: "single",
50868
51404
  optional: false
50869
51405
  }],
51406
+ "ptz.getStatus": [{
51407
+ name: "deviceId",
51408
+ form: "single",
51409
+ optional: false
51410
+ }],
50870
51411
  "ptz.goHome": [{
50871
51412
  name: "deviceId",
50872
51413
  form: "single",
@@ -50957,6 +51498,11 @@ Object.freeze({
50957
51498
  form: "single",
50958
51499
  optional: false
50959
51500
  }],
51501
+ "recordingArchive.applyDeviceSettingsPatch": [{
51502
+ name: "deviceId",
51503
+ form: "single",
51504
+ optional: false
51505
+ }],
50960
51506
  "recordingArchive.deleteFootprint": [{
50961
51507
  name: "deviceId",
50962
51508
  form: "single",
@@ -50977,6 +51523,21 @@ Object.freeze({
50977
51523
  form: "single",
50978
51524
  optional: false
50979
51525
  }],
51526
+ "recordingArchive.getDeviceLiveContribution": [{
51527
+ name: "deviceId",
51528
+ form: "single",
51529
+ optional: false
51530
+ }],
51531
+ "recordingArchive.getDeviceSettingsContribution": [{
51532
+ name: "deviceId",
51533
+ form: "single",
51534
+ optional: false
51535
+ }],
51536
+ "recordingArchive.getStatus": [{
51537
+ name: "deviceId",
51538
+ form: "single",
51539
+ optional: false
51540
+ }],
50980
51541
  "recordingArchive.listOpsLog": [{
50981
51542
  name: "deviceId",
50982
51543
  form: "single",
@@ -51062,6 +51623,11 @@ Object.freeze({
51062
51623
  form: "single",
51063
51624
  optional: false
51064
51625
  }],
51626
+ "recordingOnboard.getStatus": [{
51627
+ name: "deviceId",
51628
+ form: "single",
51629
+ optional: false
51630
+ }],
51065
51631
  "recordingOnboard.setSettings": [{
51066
51632
  name: "deviceId",
51067
51633
  form: "single",
@@ -51092,6 +51658,11 @@ Object.freeze({
51092
51658
  form: "single",
51093
51659
  optional: false
51094
51660
  }],
51661
+ "sceneMonitor.getStatus": [{
51662
+ name: "deviceId",
51663
+ form: "single",
51664
+ optional: false
51665
+ }],
51095
51666
  "sceneMonitor.listScenes": [{
51096
51667
  name: "deviceId",
51097
51668
  form: "single",
@@ -51117,6 +51688,11 @@ Object.freeze({
51117
51688
  form: "single",
51118
51689
  optional: false
51119
51690
  }],
51691
+ "scriptRunner.getStatus": [{
51692
+ name: "deviceId",
51693
+ form: "single",
51694
+ optional: false
51695
+ }],
51120
51696
  "scriptRunner.run": [{
51121
51697
  name: "deviceId",
51122
51698
  form: "single",
@@ -51127,11 +51703,31 @@ Object.freeze({
51127
51703
  form: "single",
51128
51704
  optional: false
51129
51705
  }],
51706
+ "smoke.getStatus": [{
51707
+ name: "deviceId",
51708
+ form: "single",
51709
+ optional: false
51710
+ }],
51711
+ "snapshot.applyDeviceSettingsPatch": [{
51712
+ name: "deviceId",
51713
+ form: "single",
51714
+ optional: false
51715
+ }],
51130
51716
  "snapshot.getDebugState": [{
51131
51717
  name: "deviceId",
51132
51718
  form: "single",
51133
51719
  optional: false
51134
51720
  }],
51721
+ "snapshot.getDeviceLiveContribution": [{
51722
+ name: "deviceId",
51723
+ form: "single",
51724
+ optional: false
51725
+ }],
51726
+ "snapshot.getDeviceSettingsContribution": [{
51727
+ name: "deviceId",
51728
+ form: "single",
51729
+ optional: false
51730
+ }],
51135
51731
  "snapshot.getSnapshot": [{
51136
51732
  name: "deviceId",
51137
51733
  form: "single",
@@ -51148,6 +51744,11 @@ Object.freeze({
51148
51744
  form: "array",
51149
51745
  optional: false
51150
51746
  }],
51747
+ "snapshot.getStatus": [{
51748
+ name: "deviceId",
51749
+ form: "single",
51750
+ optional: false
51751
+ }],
51151
51752
  "snapshot.invalidateCache": [{
51152
51753
  name: "deviceId",
51153
51754
  form: "single",
@@ -51158,6 +51759,11 @@ Object.freeze({
51158
51759
  form: "single",
51159
51760
  optional: false
51160
51761
  }],
51762
+ "streamBroker.applyDeviceSettingsPatch": [{
51763
+ name: "deviceId",
51764
+ form: "single",
51765
+ optional: false
51766
+ }],
51161
51767
  "streamBroker.assignProfile": [{
51162
51768
  name: "deviceId",
51163
51769
  form: "single",
@@ -51173,6 +51779,16 @@ Object.freeze({
51173
51779
  form: "single",
51174
51780
  optional: false
51175
51781
  }],
51782
+ "streamBroker.getDeviceLiveContribution": [{
51783
+ name: "deviceId",
51784
+ form: "single",
51785
+ optional: false
51786
+ }],
51787
+ "streamBroker.getDeviceSettingsContribution": [{
51788
+ name: "deviceId",
51789
+ form: "single",
51790
+ optional: false
51791
+ }],
51176
51792
  "streamBroker.getStreamWithCodec": [{
51177
51793
  name: "deviceId",
51178
51794
  form: "single",
@@ -51233,16 +51849,46 @@ Object.freeze({
51233
51849
  form: "single",
51234
51850
  optional: false
51235
51851
  }],
51852
+ "streamParams.getStatus": [{
51853
+ name: "deviceId",
51854
+ form: "single",
51855
+ optional: false
51856
+ }],
51236
51857
  "streamParams.setProfile": [{
51237
51858
  name: "deviceId",
51238
51859
  form: "single",
51239
51860
  optional: false
51240
51861
  }],
51862
+ "switch.getStatus": [{
51863
+ name: "deviceId",
51864
+ form: "single",
51865
+ optional: false
51866
+ }],
51241
51867
  "switch.setState": [{
51242
51868
  name: "deviceId",
51243
51869
  form: "single",
51244
51870
  optional: false
51245
51871
  }],
51872
+ "tamper.getStatus": [{
51873
+ name: "deviceId",
51874
+ form: "single",
51875
+ optional: false
51876
+ }],
51877
+ "temperatureSensor.getStatus": [{
51878
+ name: "deviceId",
51879
+ form: "single",
51880
+ optional: false
51881
+ }],
51882
+ "update.getStatus": [{
51883
+ name: "deviceId",
51884
+ form: "single",
51885
+ optional: false
51886
+ }],
51887
+ "vacuumControl.getStatus": [{
51888
+ name: "deviceId",
51889
+ form: "single",
51890
+ optional: false
51891
+ }],
51246
51892
  "vacuumControl.locate": [{
51247
51893
  name: "deviceId",
51248
51894
  form: "single",
@@ -51278,6 +51924,11 @@ Object.freeze({
51278
51924
  form: "single",
51279
51925
  optional: false
51280
51926
  }],
51927
+ "valve.getStatus": [{
51928
+ name: "deviceId",
51929
+ form: "single",
51930
+ optional: false
51931
+ }],
51281
51932
  "valve.open": [{
51282
51933
  name: "deviceId",
51283
51934
  form: "single",
@@ -51293,6 +51944,11 @@ Object.freeze({
51293
51944
  form: "single",
51294
51945
  optional: false
51295
51946
  }],
51947
+ "vibration.getStatus": [{
51948
+ name: "deviceId",
51949
+ form: "single",
51950
+ optional: false
51951
+ }],
51296
51952
  "videoclips.dialClipStream": [{
51297
51953
  name: "deviceId",
51298
51954
  form: "single",
@@ -51328,6 +51984,11 @@ Object.freeze({
51328
51984
  form: "single",
51329
51985
  optional: false
51330
51986
  }],
51987
+ "waterHeater.getStatus": [{
51988
+ name: "deviceId",
51989
+ form: "single",
51990
+ optional: false
51991
+ }],
51331
51992
  "waterHeater.setAway": [{
51332
51993
  name: "deviceId",
51333
51994
  form: "single",
@@ -51343,6 +52004,11 @@ Object.freeze({
51343
52004
  form: "single",
51344
52005
  optional: false
51345
52006
  }],
52007
+ "weather.getStatus": [{
52008
+ name: "deviceId",
52009
+ form: "single",
52010
+ optional: false
52011
+ }],
51346
52012
  "webrtcSession.addIceCandidate": [{
51347
52013
  name: "deviceId",
51348
52014
  form: "single",
@@ -52661,4 +53327,4 @@ function bestLocationMatch(externalName, existing, threshold = .8) {
52661
53327
  var MB = 1024 * 1024;
52662
53328
  1024 * MB, 3072 * MB;
52663
53329
  //#endregion
52664
- export { parseAdminBase as $, contactCapability as A, union as At, gasCapability as B, buildAddonRouteProvider as C, array as Ct, climateControlCapability as D, object as Dt, carbonMonoxideCapability as E, number as Et, deviceExportCapability as F, lockControlCapability as G, humiditySensorCapability as H, enumSensorCapability as I, normalizeUnit as J, mediaPlayerCapability as K, eventEmitterCapability as L, coverCapability as M, url as Mt, deviceAdminLinkCapability as N, EventCategory as Nt, colorCapability as O, record as Ot, deviceAdoptionCapability as P, oauthIntegrationCapability as Q, fanControlCapability as R, brokerCapability as S, _enum as St, buttonCapability as T, literal as Tt, imageCapability as U, humidifierCapability as V, lawnMowerControlCapability as W, notifierCapability as X, notificationOutputCapability as Y, numericSensorCapability as Z, automationControlCapability as _, DeviceType as _t, COCO_TO_MACRO as a, smokeCapability as at, binaryCapability as b, createEvent as bt, FanDirectionSchema as c, temperatureSensorCapability as ct, TargetSchema as d, valveCapability as dt, powerMeterCapability as et, accessoriesCapability as f, vibrationCapability as ft, ambientLightSensorCapability as g, DeviceRole as gt, alarmPanelCapability as h, DeviceFeature as ht, CAMERA_SWITCH_ORDER as i, scriptRunnerCapability as it, controlCapability as j, unknown as jt, connectivityCapability as k, string as kt, HvacModeSchema as l, updateCapability as lt, airQualitySensorCapability as m, weatherCapability as mt, BaseDevice as n, presenceCapability as nt, CameraSwitchIdSchema as o, switchCapability as ot, addonRoutesCapability as p, waterHeaterCapability as pt, motionCapability as q, BaseDeviceProvider as r, pressureSensorCapability as rt, EnumSensorDateTimeFormatSchema as s, tamperCapability as st, AlarmArmModeSchema as t, prepareNotification as tt, MediaPlayerRepeatSchema as u, vacuumControlCapability as ut, batteryCapability as v, errMsg as vt, buildDeviceAdminUrl as w, discriminatedUnion as wt, brightnessCapability as x, nodePin as xt, bestLocationMatch as y, BaseAddon as yt, floodCapability as z };
53330
+ export { oauthIntegrationCapability as $, connectivityCapability as A, string as At, floodCapability as B, buildAddonRouteProvider as C, _enum as Ct, carbonMonoxideCapability as D, number as Dt, calendarSourceCapability as E, literal as Et, deviceAdoptionCapability as F, lawnMowerControlCapability as G, humidifierCapability as H, deviceExportCapability as I, motionCapability as J, lockControlCapability as K, enumSensorCapability as L, controlCapability as M, unknown as Mt, coverCapability as N, url as Nt, climateControlCapability as O, object as Ot, deviceAdminLinkCapability as P, EventCategory as Pt, numericSensorCapability as Q, eventEmitterCapability as R, brokerCapability as S, nodePin as St, buttonCapability as T, discriminatedUnion as Tt, humiditySensorCapability as U, gasCapability as V, imageCapability as W, notificationOutputCapability as X, normalizeUnit as Y, notifierCapability as Z, automationControlCapability as _, DeviceRole as _t, COCO_TO_MACRO as a, scriptRunnerCapability as at, binaryCapability as b, BaseAddon as bt, FanDirectionSchema as c, tamperCapability as ct, TargetSchema as d, vacuumControlCapability as dt, parseAdminBase as et, accessoriesCapability as f, valveCapability as ft, ambientLightSensorCapability as g, DeviceFeature as gt, alarmPanelCapability as h, weatherCapability as ht, CAMERA_SWITCH_ORDER as i, pressureSensorCapability as it, contactCapability as j, union as jt, colorCapability as k, record as kt, HvacModeSchema as l, temperatureSensorCapability as lt, airQualitySensorCapability as m, waterHeaterCapability as mt, BaseDevice as n, prepareNotification as nt, CameraSwitchIdSchema as o, smokeCapability as ot, addonRoutesCapability as p, vibrationCapability as pt, mediaPlayerCapability as q, BaseDeviceProvider as r, presenceCapability as rt, EnumSensorDateTimeFormatSchema as s, switchCapability as st, AlarmArmModeSchema as t, powerMeterCapability as tt, MediaPlayerRepeatSchema as u, updateCapability as ut, batteryCapability as v, DeviceType as vt, buildDeviceAdminUrl as w, array as wt, brightnessCapability as x, createEvent as xt, bestLocationMatch as y, errMsg as yt, fanControlCapability as z };