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