@camstack/addon-provider-reolink 1.2.25 → 1.2.27

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.
Files changed (3) hide show
  1. package/dist/addon.js +1919 -26
  2. package/dist/addon.mjs +1919 -26
  3. package/package.json +1 -1
package/dist/addon.js CHANGED
@@ -3024,6 +3024,9 @@ function handlePipeResult(left, next, ctx) {
3024
3024
  fallback: left.fallback
3025
3025
  }, ctx);
3026
3026
  }
3027
+ var $ZodPreprocess = /*@__PURE__*/ $constructor("$ZodPreprocess", (inst, def) => {
3028
+ $ZodPipe.init(inst, def);
3029
+ });
3027
3030
  var $ZodReadonly = /*@__PURE__*/ $constructor("$ZodReadonly", (inst, def) => {
3028
3031
  $ZodType.init(inst, def);
3029
3032
  defineLazy(inst._zod, "propValues", () => def.innerType._zod.propValues);
@@ -5209,6 +5212,10 @@ function pipe(in_, out) {
5209
5212
  out
5210
5213
  });
5211
5214
  }
5215
+ var ZodPreprocess = /*@__PURE__*/ $constructor("ZodPreprocess", (inst, def) => {
5216
+ ZodPipe.init(inst, def);
5217
+ $ZodPreprocess.init(inst, def);
5218
+ });
5212
5219
  var ZodReadonly$16 = /*@__PURE__*/ $constructor("ZodReadonly", (inst, def) => {
5213
5220
  $ZodReadonly.init(inst, def);
5214
5221
  ZodType$16.init(inst, def);
@@ -5267,6 +5274,13 @@ function _instanceof(cls, params = {}) {
5267
5274
  };
5268
5275
  return inst;
5269
5276
  }
5277
+ function preprocess(fn, schema) {
5278
+ return new ZodPreprocess({
5279
+ type: "pipe",
5280
+ in: transform(fn),
5281
+ out: schema
5282
+ });
5283
+ }
5270
5284
  //#endregion
5271
5285
  //#region ../../node_modules/zod/v4/classic/compat.js
5272
5286
  /** @deprecated Use the raw string literal codes instead, e.g. "invalid_type". */
@@ -13427,11 +13441,33 @@ var NotificationFormatSchema = _enum([
13427
13441
  * Named by INTENT, never by glyph. "check" would tie the vocabulary to one
13428
13442
  * renderer's icon set; "acknowledge" survives an adapter that draws it
13429
13443
  * differently.
13444
+ *
13445
+ * ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
13446
+ *
13447
+ * These names are for US. **No adapter may forward one verbatim.** Each maps
13448
+ * the whole set onto its own renderer's vocabulary through a
13449
+ * `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
13450
+ * fallback, so adding a member here fails every adapter's build until someone
13451
+ * decides its glyph, which is the only place that decision can be made
13452
+ * honestly.
13453
+ *
13454
+ * This paragraph is the bug. Zentik declared `actionIcons: true` and passed
13455
+ * `disarm` straight through; iOS feeds that string to
13456
+ * `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
13457
+ * and every snooze and alarm button arrived BLANK. A pass-through is not a
13458
+ * mapping, and "the field is documented" is not "the value renders".
13459
+ *
13460
+ * Adding a member is TRAIN-BOUND. The enum lives in the published
13461
+ * `@camstack/server` closure and the cap seam validates against the HUB's copy,
13462
+ * so an addon that emits a token the running hub does not know does not lose an
13463
+ * icon — its whole `send` fails Zod validation and the notification never
13464
+ * arrives. Never emit a new token from an addon before the train carrying it.
13430
13465
  */
13431
13466
  var NotificationActionIconSchema = _enum([
13432
13467
  "acknowledge",
13433
13468
  "dismiss",
13434
13469
  "silence",
13470
+ "snooze",
13435
13471
  "view",
13436
13472
  "play",
13437
13473
  "open",
@@ -13439,9 +13475,13 @@ var NotificationActionIconSchema = _enum([
13439
13475
  "lock",
13440
13476
  "unlock",
13441
13477
  "arm",
13478
+ "arm-home",
13479
+ "arm-away",
13480
+ "arm-night",
13442
13481
  "disarm",
13443
13482
  "light",
13444
- "alert"
13483
+ "alert",
13484
+ "camera"
13445
13485
  ]);
13446
13486
  /** A single tap-through action button. */
13447
13487
  var NotificationActionSchema = object({
@@ -13641,6 +13681,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
13641
13681
  targetId: string(),
13642
13682
  enabled: boolean()
13643
13683
  }), _void(), { kind: "mutation" });
13684
+ new Set([
13685
+ {
13686
+ id: "person",
13687
+ name: "Person"
13688
+ },
13689
+ {
13690
+ id: "vehicle",
13691
+ name: "Vehicle"
13692
+ },
13693
+ {
13694
+ id: "animal",
13695
+ name: "Animal"
13696
+ },
13697
+ {
13698
+ id: "package",
13699
+ name: "Package"
13700
+ }
13701
+ ].map((l) => l.id));
13644
13702
  var COCO_TO_MACRO = {
13645
13703
  mapping: {
13646
13704
  person: "person",
@@ -14476,6 +14534,8 @@ var NcSystemEventKindSchema = _enum([
14476
14534
  "alarm-triggered",
14477
14535
  "alarm-armed",
14478
14536
  "alarm-disarmed",
14537
+ "alarm-arming",
14538
+ "alarm-arm-refused",
14479
14539
  "camera-online",
14480
14540
  "camera-offline",
14481
14541
  "camera-disabled",
@@ -15684,7 +15744,87 @@ var MethodAccessSchema = _enum([
15684
15744
  var AllowedProviderSchema = union([literal("*"), array(string())]);
15685
15745
  var AllowedDevicesSchema = record(string(), union([literal("*"), array(string())]));
15686
15746
  var CapScopeSchema = _enum(["device", "system"]);
15687
- var TokenScopeSchema = discriminatedUnion("type", [
15747
+ /**
15748
+ * DeviceSelector (scope model v3 — 2026-08-12).
15749
+ *
15750
+ * A `device` grant no longer carries a frozen list of deviceIds. It carries
15751
+ * a SELECTOR the matcher resolves against the live fleet, so the grant can be
15752
+ * DYNAMIC: a `types:['camera']` selector automatically covers a camera added
15753
+ * AFTER the grant was minted — no re-grant, no re-login.
15754
+ *
15755
+ * - `all` — every device in the deployment. The broad viewer/operator
15756
+ * lever without a `category` grant (a `category` grant also covers device
15757
+ * caps that carry no deviceId; `all` is specifically the device set).
15758
+ * - `ids` — an explicit deviceId list. This is what a v2 `device:[…]`
15759
+ * grant migrates to (see {@link TokenScopeSchema}); STATIC — a new camera
15760
+ * is NOT covered until the grant is edited.
15761
+ * - `types` — every device of a `DeviceType` (e.g. every `camera`).
15762
+ * DYNAMIC. A device that changes type, or a new device of the type,
15763
+ * re-resolves on the next request.
15764
+ * - `locations` — every device whose operator-assigned `location` label is
15765
+ * in the set (e.g. "Garden", "Front door"). DYNAMIC. A device with a
15766
+ * null/unset location matches NO `locations` selector.
15767
+ */
15768
+ var DeviceSelectorSchema = discriminatedUnion("kind", [
15769
+ object({ kind: literal("all") }),
15770
+ object({
15771
+ kind: literal("ids"),
15772
+ ids: array(number().int()).min(1)
15773
+ }),
15774
+ object({
15775
+ kind: literal("types"),
15776
+ types: array(_enum(DeviceType)).min(1)
15777
+ }),
15778
+ object({
15779
+ kind: literal("locations"),
15780
+ locations: array(string().min(1)).min(1)
15781
+ })
15782
+ ]);
15783
+ var DeviceTokenScopeSchema = object({
15784
+ type: literal("device"),
15785
+ /** The device SET this grant covers — resolved against the live fleet. */
15786
+ selector: DeviceSelectorSchema,
15787
+ access: array(MethodAccessSchema).min(1),
15788
+ /**
15789
+ * Whether a grant on a PARENT device transparently covers its accessory
15790
+ * CHILDREN (siren / floodlight / PIR) via the persisted-parentage walk.
15791
+ * Direction is parent → children ONLY.
15792
+ *
15793
+ * Absent → the matcher DERIVES it from the access flavour: `view`
15794
+ * inherits (a camera viewer sees the camera's accessories), `create` /
15795
+ * `delete` do NOT (actuating/removing a child is an explicit act the
15796
+ * operator must grant on the child, not inherit from the parent). Set it
15797
+ * explicitly to override that default per grant.
15798
+ */
15799
+ includeLinked: boolean().optional()
15800
+ });
15801
+ /**
15802
+ * v2 → v3 lazy migration. A pre-v3 `device` grant carried
15803
+ * `targets: string[]` (stringified deviceIds); it rewrites to the equivalent
15804
+ * `selector: {kind:'ids', ids}`. Applied as a `preprocess` so it runs on
15805
+ * EVERY parse path — stored records AND the JWT-carried scope arrays
15806
+ * normalised at the request boundary ({@link normalizeTokenScopes} in
15807
+ * `device-selector.ts`). Chosen over a one-time DB migration because a
15808
+ * migration cannot reach a JWT already in a client's hands; parse-time
15809
+ * migration covers both without a flag day. No cast — the raw object is read
15810
+ * through `Reflect.get` (its static type is `unknown`).
15811
+ */
15812
+ function migrateLegacyTokenScope(raw) {
15813
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw)) return raw;
15814
+ if (Reflect.get(raw, "type") !== "device") return raw;
15815
+ if (Reflect.get(raw, "selector") !== void 0) return raw;
15816
+ const targets = Reflect.get(raw, "targets");
15817
+ if (!Array.isArray(targets)) return raw;
15818
+ return {
15819
+ type: "device",
15820
+ selector: {
15821
+ kind: "ids",
15822
+ ids: targets.map((t) => typeof t === "string" ? Number(t) : t).filter((n) => typeof n === "number" && Number.isInteger(n))
15823
+ },
15824
+ access: Reflect.get(raw, "access")
15825
+ };
15826
+ }
15827
+ var TokenScopeSchema = preprocess(migrateLegacyTokenScope, discriminatedUnion("type", [
15688
15828
  object({
15689
15829
  type: literal("category"),
15690
15830
  target: CapScopeSchema,
@@ -15700,18 +15840,8 @@ var TokenScopeSchema = discriminatedUnion("type", [
15700
15840
  target: string(),
15701
15841
  access: array(MethodAccessSchema).min(1)
15702
15842
  }),
15703
- object({
15704
- type: literal("device"),
15705
- /**
15706
- * One or more deviceIds (serialised as strings for wire-format
15707
- * consistency with the rest of the union). Matcher accepts if
15708
- * `input.deviceId` ∈ `targets`. Array shape avoids the row-explosion
15709
- * of one scope-per-device when granting access to a set of cameras.
15710
- */
15711
- targets: array(string()).min(1),
15712
- access: array(MethodAccessSchema).min(1)
15713
- })
15714
- ]);
15843
+ DeviceTokenScopeSchema
15844
+ ]));
15715
15845
  object({
15716
15846
  id: string(),
15717
15847
  username: string(),
@@ -17748,10 +17878,26 @@ var detectionFpsField = {
17748
17878
  default: 10,
17749
17879
  step: 1
17750
17880
  };
17881
+ /**
17882
+ * The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
17883
+ *
17884
+ * The recheck is now on by default (a parked car is invisible to occupancy
17885
+ * rules until the stationary registry has been rebuilt by motion, which after a
17886
+ * restart may be never on a quiet camera). Each cycle re-subscribes a detection
17887
+ * session — an RTSP re-dial — so the switch is only affordable at a WIDE
17888
+ * interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
17889
+ * 30 s. A parked car is therefore counted within 5 minutes of a restart.
17890
+ *
17891
+ * Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
17892
+ * the host validates `attachCamera` against ITS copy of this schema, so a
17893
+ * runner asked for 600 would be rejected by the hub until a `@camstack/server`
17894
+ * carrying the wider bound is installed everywhere. 300 is the widest value
17895
+ * that ships with an addon deploy.
17896
+ */
17751
17897
  var occupancyRecheckSecField = {
17752
17898
  min: 0,
17753
17899
  max: 300,
17754
- default: 30,
17900
+ default: 300,
17755
17901
  step: 5
17756
17902
  };
17757
17903
  var occupancyRecheckFramesField = {
@@ -17949,15 +18095,21 @@ var RunnerCameraConfigSchema = object({
17949
18095
  */
17950
18096
  onboardMotionDrivesAnalyzer: boolean().default(true),
17951
18097
  /**
17952
- * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
17953
- * never arms the periodic recheck timer, regardless of `occupancyRecheckSec`
17954
- * this is off by default because the recheck re-subscribes a detection session
17955
- * every N seconds while `watching`, a major source of pull-decoder re-dial
17956
- * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
18098
+ * Master toggle for the occupancy re-check. When `false` the runner never arms
18099
+ * the periodic recheck timer, regardless of `occupancyRecheckSec`; the
17957
18100
  * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
17958
18101
  * (and only render) when this is enabled.
18102
+ *
18103
+ * DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
18104
+ * recheck re-subscribes a detection session every N seconds while `watching`
18105
+ * — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
18106
+ * pull-decoder churn source. What that bought was a blind spot: a STATIONARY
18107
+ * object is counted only while the stationary registry holds it, and the
18108
+ * registry rebuilds from motion, so after a restart a parked car was invisible
18109
+ * to every occupancy rule until something moved in front of it. The churn is
18110
+ * now paid on the interval instead — see `occupancyRecheckSecField`.
17959
18111
  */
17960
- occupancyRecheckEnabled: boolean().default(false),
18112
+ occupancyRecheckEnabled: boolean().default(true),
17961
18113
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
17962
18114
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
17963
18115
  /**
@@ -23111,7 +23263,41 @@ var intercomCapability = {
23111
23263
  status: {
23112
23264
  schema: IntercomStatusSchema,
23113
23265
  kind: "command-driven"
23114
- }
23266
+ },
23267
+ /**
23268
+ * Runtime-state slice — mirrored by the kernel.
23269
+ *
23270
+ * The cap declared `status` and nothing else, so the only two sources an
23271
+ * exporter has for a value — the `device.state-changed` slice event and the
23272
+ * `deviceState.getAllSnapshots` snapshot, both built from runtime state —
23273
+ * carried nothing for `intercom`. A talk-back entity in Home Assistant would
23274
+ * have been published and never received a value, which is the defect the
23275
+ * export's two classification tables exist to prevent (177 of them, once), so
23276
+ * `intercom` was excluded rather than exported.
23277
+ *
23278
+ * The shape is the status shape: there is exactly one truth about talk-back
23279
+ * and duplicating it into a second schema is how two halves of one capability
23280
+ * come to disagree. Providers write it through
23281
+ * `this.runtimeState.setCapState('intercom', …)` at the four points that open
23282
+ * and close a session, and seed it at registration so the slice exists before
23283
+ * the first session rather than after it.
23284
+ *
23285
+ * **Bound, named rather than hidden:** `talking` mirrors the provider's own
23286
+ * session handle, so a session torn down by a transport death that never
23287
+ * reaches `stopSession` / `endTalkSession` leaves it latched until the next
23288
+ * session or the next restart. That is why the slice is `session` and not
23289
+ * `restored` — a restart must never restore "talking".
23290
+ */
23291
+ runtimeState: IntercomStatusSchema,
23292
+ /**
23293
+ * Runtime-state durability: **session** — `talking` describes a live audio
23294
+ * session, which by definition does not survive the process that held it.
23295
+ * Restoring it would publish a camera as talking to nobody.
23296
+ *
23297
+ * See `RuntimeStateDurability`. Enforced by
23298
+ * `scripts/check-runtime-state-durability.ts`.
23299
+ */
23300
+ durability: "session"
23115
23301
  };
23116
23302
  /**
23117
23303
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
@@ -25896,7 +26082,7 @@ method(object({
25896
26082
  toMs: number()
25897
26083
  }), RecordingAvailabilitySchema, {
25898
26084
  kind: "query",
25899
- auth: "admin"
26085
+ auth: "protected"
25900
26086
  }), method(object({
25901
26087
  deviceId: number(),
25902
26088
  fromMs: number(),
@@ -25904,14 +26090,14 @@ method(object({
25904
26090
  tzOffsetMinutes: number()
25905
26091
  }), RecordingDaysSchema, {
25906
26092
  kind: "query",
25907
- auth: "admin"
26093
+ auth: "protected"
25908
26094
  }), method(object({
25909
26095
  deviceId: number(),
25910
26096
  fromMs: number(),
25911
26097
  toMs: number()
25912
26098
  }), RecordingManifestSchema, {
25913
26099
  kind: "query",
25914
- auth: "admin"
26100
+ auth: "protected"
25915
26101
  }), method(object({}), RecordingStorageUsageSchema, {
25916
26102
  kind: "query",
25917
26103
  auth: "admin"
@@ -28387,6 +28573,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
28387
28573
  humiditySensor: humiditySensorCapability,
28388
28574
  image: imageCapability,
28389
28575
  imageSettings: imageSettingsCapability,
28576
+ intercom: intercomCapability,
28390
28577
  lawnMowerControl: lawnMowerControlCapability,
28391
28578
  lockControl: lockControlCapability,
28392
28579
  mediaPlayer: mediaPlayerCapability,
@@ -34808,6 +34995,1678 @@ Object.freeze({
34808
34995
  access: "create"
34809
34996
  }
34810
34997
  });
34998
+ Object.freeze({
34999
+ "accessories.setChildHidden": [{
35000
+ name: "childDeviceId",
35001
+ form: "single",
35002
+ optional: false
35003
+ }, {
35004
+ name: "deviceId",
35005
+ form: "single",
35006
+ optional: false
35007
+ }],
35008
+ "addonSettings.getDeviceSettings": [{
35009
+ name: "deviceId",
35010
+ form: "single",
35011
+ optional: false
35012
+ }],
35013
+ "addonSettings.updateDeviceSettings": [{
35014
+ name: "deviceId",
35015
+ form: "single",
35016
+ optional: false
35017
+ }],
35018
+ "alarmPanel.arm": [{
35019
+ name: "deviceId",
35020
+ form: "single",
35021
+ optional: false
35022
+ }],
35023
+ "alarmPanel.disarm": [{
35024
+ name: "deviceId",
35025
+ form: "single",
35026
+ optional: false
35027
+ }],
35028
+ "alarmPanel.trigger": [{
35029
+ name: "deviceId",
35030
+ form: "single",
35031
+ optional: false
35032
+ }],
35033
+ "audioAnalysis.resolveDeviceSettings": [{
35034
+ name: "deviceId",
35035
+ form: "single",
35036
+ optional: false
35037
+ }],
35038
+ "audioAnalyzer.classify": [{
35039
+ name: "deviceId",
35040
+ form: "single",
35041
+ optional: true
35042
+ }],
35043
+ "audioMetrics.getCurrentSnapshot": [{
35044
+ name: "deviceId",
35045
+ form: "single",
35046
+ optional: false
35047
+ }],
35048
+ "audioMetrics.getHistory": [{
35049
+ name: "deviceId",
35050
+ form: "single",
35051
+ optional: false
35052
+ }],
35053
+ "automationControl.disable": [{
35054
+ name: "deviceId",
35055
+ form: "single",
35056
+ optional: false
35057
+ }],
35058
+ "automationControl.enable": [{
35059
+ name: "deviceId",
35060
+ form: "single",
35061
+ optional: false
35062
+ }],
35063
+ "automationControl.trigger": [{
35064
+ name: "deviceId",
35065
+ form: "single",
35066
+ optional: false
35067
+ }],
35068
+ "battery.wakeForStream": [{
35069
+ name: "deviceId",
35070
+ form: "single",
35071
+ optional: false
35072
+ }],
35073
+ "brightness.setBrightness": [{
35074
+ name: "deviceId",
35075
+ form: "single",
35076
+ optional: false
35077
+ }],
35078
+ "button.press": [{
35079
+ name: "deviceId",
35080
+ form: "single",
35081
+ optional: false
35082
+ }],
35083
+ "cameraCredentials.getCredentials": [{
35084
+ name: "deviceId",
35085
+ form: "single",
35086
+ optional: false
35087
+ }],
35088
+ "cameraStreams.getBrokerStreams": [{
35089
+ name: "deviceId",
35090
+ form: "single",
35091
+ optional: false
35092
+ }],
35093
+ "cameraStreams.getCameraStreams": [{
35094
+ name: "deviceId",
35095
+ form: "single",
35096
+ optional: false
35097
+ }],
35098
+ "cameraStreams.getProfileRtspEntries": [{
35099
+ name: "deviceId",
35100
+ form: "single",
35101
+ optional: false
35102
+ }],
35103
+ "cameraStreams.getRtspEntries": [{
35104
+ name: "deviceId",
35105
+ form: "single",
35106
+ optional: false
35107
+ }],
35108
+ "cameraStreams.pickStream": [{
35109
+ name: "deviceId",
35110
+ form: "single",
35111
+ optional: false
35112
+ }],
35113
+ "climateControl.setFanMode": [{
35114
+ name: "deviceId",
35115
+ form: "single",
35116
+ optional: false
35117
+ }],
35118
+ "climateControl.setMode": [{
35119
+ name: "deviceId",
35120
+ form: "single",
35121
+ optional: false
35122
+ }],
35123
+ "climateControl.setPreset": [{
35124
+ name: "deviceId",
35125
+ form: "single",
35126
+ optional: false
35127
+ }],
35128
+ "climateControl.setSwingHorizontal": [{
35129
+ name: "deviceId",
35130
+ form: "single",
35131
+ optional: false
35132
+ }],
35133
+ "climateControl.setSwingVertical": [{
35134
+ name: "deviceId",
35135
+ form: "single",
35136
+ optional: false
35137
+ }],
35138
+ "climateControl.setTarget": [{
35139
+ name: "deviceId",
35140
+ form: "single",
35141
+ optional: false
35142
+ }],
35143
+ "climateControl.setTargetHumidity": [{
35144
+ name: "deviceId",
35145
+ form: "single",
35146
+ optional: false
35147
+ }],
35148
+ "climateControl.setTargetRange": [{
35149
+ name: "deviceId",
35150
+ form: "single",
35151
+ optional: false
35152
+ }],
35153
+ "color.setColor": [{
35154
+ name: "deviceId",
35155
+ form: "single",
35156
+ optional: false
35157
+ }],
35158
+ "consumables.reset": [{
35159
+ name: "deviceId",
35160
+ form: "single",
35161
+ optional: false
35162
+ }],
35163
+ "control.setValue": [{
35164
+ name: "deviceId",
35165
+ form: "single",
35166
+ optional: false
35167
+ }],
35168
+ "cover.close": [{
35169
+ name: "deviceId",
35170
+ form: "single",
35171
+ optional: false
35172
+ }],
35173
+ "cover.open": [{
35174
+ name: "deviceId",
35175
+ form: "single",
35176
+ optional: false
35177
+ }],
35178
+ "cover.setPosition": [{
35179
+ name: "deviceId",
35180
+ form: "single",
35181
+ optional: false
35182
+ }],
35183
+ "cover.setTiltPosition": [{
35184
+ name: "deviceId",
35185
+ form: "single",
35186
+ optional: false
35187
+ }],
35188
+ "cover.stop": [{
35189
+ name: "deviceId",
35190
+ form: "single",
35191
+ optional: false
35192
+ }],
35193
+ "dayNight.getOptions": [{
35194
+ name: "deviceId",
35195
+ form: "single",
35196
+ optional: false
35197
+ }],
35198
+ "dayNight.setSettings": [{
35199
+ name: "deviceId",
35200
+ form: "single",
35201
+ optional: false
35202
+ }],
35203
+ "decoder.createSession": [{
35204
+ name: "deviceId",
35205
+ form: "single",
35206
+ optional: true
35207
+ }],
35208
+ "deviceAdoption.release": [{
35209
+ name: "camDeviceId",
35210
+ form: "single",
35211
+ optional: false
35212
+ }],
35213
+ "deviceAdoption.resync": [{
35214
+ name: "camDeviceId",
35215
+ form: "single",
35216
+ optional: false
35217
+ }],
35218
+ "deviceDiscovery.adoptDevice": [{
35219
+ name: "deviceId",
35220
+ form: "single",
35221
+ optional: false
35222
+ }],
35223
+ "deviceDiscovery.listDiscovered": [{
35224
+ name: "deviceId",
35225
+ form: "single",
35226
+ optional: false
35227
+ }],
35228
+ "deviceDiscovery.refreshDiscovery": [{
35229
+ name: "deviceId",
35230
+ form: "single",
35231
+ optional: false
35232
+ }],
35233
+ "deviceDiscovery.releaseDevice": [{
35234
+ name: "childDeviceId",
35235
+ form: "single",
35236
+ optional: false
35237
+ }, {
35238
+ name: "deviceId",
35239
+ form: "single",
35240
+ optional: false
35241
+ }],
35242
+ "deviceManager.adoptionRelease": [{
35243
+ name: "camDeviceId",
35244
+ form: "single",
35245
+ optional: false
35246
+ }],
35247
+ "deviceManager.adoptionResync": [{
35248
+ name: "camDeviceId",
35249
+ form: "single",
35250
+ optional: false
35251
+ }],
35252
+ "deviceManager.applyInitialMeta": [{
35253
+ name: "deviceId",
35254
+ form: "single",
35255
+ optional: false
35256
+ }, {
35257
+ name: "linkDeviceId",
35258
+ form: "single",
35259
+ optional: true
35260
+ }],
35261
+ "deviceManager.disable": [{
35262
+ name: "deviceId",
35263
+ form: "single",
35264
+ optional: false
35265
+ }],
35266
+ "deviceManager.enable": [{
35267
+ name: "deviceId",
35268
+ form: "single",
35269
+ optional: false
35270
+ }],
35271
+ "deviceManager.getBindings": [{
35272
+ name: "deviceId",
35273
+ form: "single",
35274
+ optional: false
35275
+ }],
35276
+ "deviceManager.getChildren": [{
35277
+ name: "parentDeviceId",
35278
+ form: "single",
35279
+ optional: false
35280
+ }],
35281
+ "deviceManager.getConfigSchema": [{
35282
+ name: "deviceId",
35283
+ form: "single",
35284
+ optional: false
35285
+ }],
35286
+ "deviceManager.getDevice": [{
35287
+ name: "deviceId",
35288
+ form: "single",
35289
+ optional: false
35290
+ }],
35291
+ "deviceManager.getDeviceAggregate": [{
35292
+ name: "deviceId",
35293
+ form: "single",
35294
+ optional: false
35295
+ }],
35296
+ "deviceManager.getDeviceLiveInfoAggregate": [{
35297
+ name: "deviceId",
35298
+ form: "single",
35299
+ optional: false
35300
+ }],
35301
+ "deviceManager.getDeviceSettingsAggregate": [{
35302
+ name: "deviceId",
35303
+ form: "single",
35304
+ optional: false
35305
+ }],
35306
+ "deviceManager.getDeviceStatusAggregate": [{
35307
+ name: "deviceId",
35308
+ form: "single",
35309
+ optional: false
35310
+ }],
35311
+ "deviceManager.getDeviceStatusAggregateBatch": [{
35312
+ name: "deviceIds",
35313
+ form: "array",
35314
+ optional: false
35315
+ }],
35316
+ "deviceManager.getLinkedDevices": [{
35317
+ name: "deviceId",
35318
+ form: "single",
35319
+ optional: false
35320
+ }],
35321
+ "deviceManager.getSettingsSchema": [{
35322
+ name: "deviceId",
35323
+ form: "single",
35324
+ optional: false
35325
+ }],
35326
+ "deviceManager.getStreamProfileMap": [{
35327
+ name: "deviceId",
35328
+ form: "single",
35329
+ optional: false
35330
+ }],
35331
+ "deviceManager.getStreamSources": [{
35332
+ name: "deviceId",
35333
+ form: "single",
35334
+ optional: false
35335
+ }],
35336
+ "deviceManager.getWireableFields": [{
35337
+ name: "deviceId",
35338
+ form: "single",
35339
+ optional: false
35340
+ }],
35341
+ "deviceManager.loadConfig": [{
35342
+ name: "deviceId",
35343
+ form: "single",
35344
+ optional: false
35345
+ }],
35346
+ "deviceManager.loadMeta": [{
35347
+ name: "deviceId",
35348
+ form: "single",
35349
+ optional: false
35350
+ }],
35351
+ "deviceManager.loadRuntimeState": [{
35352
+ name: "deviceId",
35353
+ form: "single",
35354
+ optional: false
35355
+ }],
35356
+ "deviceManager.persistConfig": [{
35357
+ name: "deviceId",
35358
+ form: "single",
35359
+ optional: false
35360
+ }],
35361
+ "deviceManager.probeStreams": [{
35362
+ name: "deviceId",
35363
+ form: "single",
35364
+ optional: false
35365
+ }],
35366
+ "deviceManager.registerDevice": [{
35367
+ name: "parentDeviceId",
35368
+ form: "single",
35369
+ optional: true
35370
+ }],
35371
+ "deviceManager.remove": [{
35372
+ name: "deviceId",
35373
+ form: "single",
35374
+ optional: false
35375
+ }],
35376
+ "deviceManager.removeDevice": [{
35377
+ name: "deviceId",
35378
+ form: "single",
35379
+ optional: false
35380
+ }],
35381
+ "deviceManager.runDeviceAction": [{
35382
+ name: "deviceId",
35383
+ form: "single",
35384
+ optional: false
35385
+ }],
35386
+ "deviceManager.setChildLayout": [{
35387
+ name: "deviceId",
35388
+ form: "single",
35389
+ optional: false
35390
+ }],
35391
+ "deviceManager.setDisabled": [{
35392
+ name: "deviceId",
35393
+ form: "single",
35394
+ optional: false
35395
+ }],
35396
+ "deviceManager.setDisplay": [{
35397
+ name: "deviceId",
35398
+ form: "single",
35399
+ optional: false
35400
+ }],
35401
+ "deviceManager.setIntegrationId": [{
35402
+ name: "deviceId",
35403
+ form: "single",
35404
+ optional: false
35405
+ }],
35406
+ "deviceManager.setLinkDeviceId": [{
35407
+ name: "deviceId",
35408
+ form: "single",
35409
+ optional: false
35410
+ }, {
35411
+ name: "linkDeviceId",
35412
+ form: "single",
35413
+ optional: true
35414
+ }],
35415
+ "deviceManager.setLocation": [{
35416
+ name: "deviceId",
35417
+ form: "single",
35418
+ optional: false
35419
+ }],
35420
+ "deviceManager.setMetadata": [{
35421
+ name: "deviceId",
35422
+ form: "single",
35423
+ optional: false
35424
+ }],
35425
+ "deviceManager.setName": [{
35426
+ name: "deviceId",
35427
+ form: "single",
35428
+ optional: false
35429
+ }],
35430
+ "deviceManager.setPrimaryChildEntityId": [{
35431
+ name: "deviceId",
35432
+ form: "single",
35433
+ optional: false
35434
+ }],
35435
+ "deviceManager.setRole": [{
35436
+ name: "deviceId",
35437
+ form: "single",
35438
+ optional: false
35439
+ }],
35440
+ "deviceManager.setStreamProfileMap": [{
35441
+ name: "deviceId",
35442
+ form: "single",
35443
+ optional: false
35444
+ }],
35445
+ "deviceManager.setType": [{
35446
+ name: "deviceId",
35447
+ form: "single",
35448
+ optional: false
35449
+ }],
35450
+ "deviceManager.setWrapperActive": [{
35451
+ name: "deviceId",
35452
+ form: "single",
35453
+ optional: false
35454
+ }],
35455
+ "deviceManager.testField": [{
35456
+ name: "deviceId",
35457
+ form: "single",
35458
+ optional: false
35459
+ }],
35460
+ "deviceManager.updateConfig": [{
35461
+ name: "deviceId",
35462
+ form: "single",
35463
+ optional: false
35464
+ }],
35465
+ "deviceManager.updateDeviceField": [{
35466
+ name: "deviceId",
35467
+ form: "single",
35468
+ optional: false
35469
+ }],
35470
+ "deviceManager.updateDeviceFieldsBatch": [{
35471
+ name: "deviceId",
35472
+ form: "single",
35473
+ optional: false
35474
+ }],
35475
+ "deviceOps.getConfigEntries": [{
35476
+ name: "deviceId",
35477
+ form: "single",
35478
+ optional: false
35479
+ }],
35480
+ "deviceOps.getRawState": [{
35481
+ name: "deviceId",
35482
+ form: "single",
35483
+ optional: false
35484
+ }],
35485
+ "deviceOps.getSettingsSchema": [{
35486
+ name: "deviceId",
35487
+ form: "single",
35488
+ optional: false
35489
+ }],
35490
+ "deviceOps.getStreamSources": [{
35491
+ name: "deviceId",
35492
+ form: "single",
35493
+ optional: false
35494
+ }],
35495
+ "deviceOps.removeDevice": [{
35496
+ name: "deviceId",
35497
+ form: "single",
35498
+ optional: false
35499
+ }],
35500
+ "deviceOps.runAction": [{
35501
+ name: "deviceId",
35502
+ form: "single",
35503
+ optional: false
35504
+ }],
35505
+ "deviceOps.setConfig": [{
35506
+ name: "deviceId",
35507
+ form: "single",
35508
+ optional: false
35509
+ }],
35510
+ "deviceState.getCapSlice": [{
35511
+ name: "deviceId",
35512
+ form: "single",
35513
+ optional: false
35514
+ }],
35515
+ "deviceState.getSnapshot": [{
35516
+ name: "deviceId",
35517
+ form: "single",
35518
+ optional: false
35519
+ }],
35520
+ "deviceState.setCapSlice": [{
35521
+ name: "deviceId",
35522
+ form: "single",
35523
+ optional: false
35524
+ }],
35525
+ "events.getEventClipUrl": [{
35526
+ name: "deviceId",
35527
+ form: "single",
35528
+ optional: false
35529
+ }],
35530
+ "events.getEvents": [{
35531
+ name: "deviceId",
35532
+ form: "single",
35533
+ optional: false
35534
+ }],
35535
+ "events.getEventThumbnail": [{
35536
+ name: "deviceId",
35537
+ form: "single",
35538
+ optional: false
35539
+ }],
35540
+ "faceGallery.getFaceByTrack": [{
35541
+ name: "deviceId",
35542
+ form: "single",
35543
+ optional: false
35544
+ }],
35545
+ "faceGallery.listRecentFaces": [{
35546
+ name: "deviceId",
35547
+ form: "single",
35548
+ optional: true
35549
+ }],
35550
+ "fanControl.setDirection": [{
35551
+ name: "deviceId",
35552
+ form: "single",
35553
+ optional: false
35554
+ }],
35555
+ "fanControl.setOscillating": [{
35556
+ name: "deviceId",
35557
+ form: "single",
35558
+ optional: false
35559
+ }],
35560
+ "fanControl.setPercentage": [{
35561
+ name: "deviceId",
35562
+ form: "single",
35563
+ optional: false
35564
+ }],
35565
+ "fanControl.setPreset": [{
35566
+ name: "deviceId",
35567
+ form: "single",
35568
+ optional: false
35569
+ }],
35570
+ "humidifier.setMode": [{
35571
+ name: "deviceId",
35572
+ form: "single",
35573
+ optional: false
35574
+ }],
35575
+ "humidifier.setOn": [{
35576
+ name: "deviceId",
35577
+ form: "single",
35578
+ optional: false
35579
+ }],
35580
+ "humidifier.setTargetHumidity": [{
35581
+ name: "deviceId",
35582
+ form: "single",
35583
+ optional: false
35584
+ }],
35585
+ "imageSettings.getOptions": [{
35586
+ name: "deviceId",
35587
+ form: "single",
35588
+ optional: false
35589
+ }],
35590
+ "imageSettings.setSettings": [{
35591
+ name: "deviceId",
35592
+ form: "single",
35593
+ optional: false
35594
+ }],
35595
+ "intercom.endTalkSession": [{
35596
+ name: "deviceId",
35597
+ form: "single",
35598
+ optional: false
35599
+ }],
35600
+ "intercom.handleAnswer": [{
35601
+ name: "deviceId",
35602
+ form: "single",
35603
+ optional: false
35604
+ }],
35605
+ "intercom.pushTalkAudio": [{
35606
+ name: "deviceId",
35607
+ form: "single",
35608
+ optional: false
35609
+ }],
35610
+ "intercom.startSession": [{
35611
+ name: "deviceId",
35612
+ form: "single",
35613
+ optional: false
35614
+ }],
35615
+ "intercom.startTalkSession": [{
35616
+ name: "deviceId",
35617
+ form: "single",
35618
+ optional: false
35619
+ }],
35620
+ "intercom.stopSession": [{
35621
+ name: "deviceId",
35622
+ form: "single",
35623
+ optional: false
35624
+ }],
35625
+ "lawnMowerControl.dock": [{
35626
+ name: "deviceId",
35627
+ form: "single",
35628
+ optional: false
35629
+ }],
35630
+ "lawnMowerControl.pause": [{
35631
+ name: "deviceId",
35632
+ form: "single",
35633
+ optional: false
35634
+ }],
35635
+ "lawnMowerControl.startMowing": [{
35636
+ name: "deviceId",
35637
+ form: "single",
35638
+ optional: false
35639
+ }],
35640
+ "lockControl.lock": [{
35641
+ name: "deviceId",
35642
+ form: "single",
35643
+ optional: false
35644
+ }],
35645
+ "lockControl.open": [{
35646
+ name: "deviceId",
35647
+ form: "single",
35648
+ optional: false
35649
+ }],
35650
+ "lockControl.unlock": [{
35651
+ name: "deviceId",
35652
+ form: "single",
35653
+ optional: false
35654
+ }],
35655
+ "mediaPlayer.next": [{
35656
+ name: "deviceId",
35657
+ form: "single",
35658
+ optional: false
35659
+ }],
35660
+ "mediaPlayer.pause": [{
35661
+ name: "deviceId",
35662
+ form: "single",
35663
+ optional: false
35664
+ }],
35665
+ "mediaPlayer.play": [{
35666
+ name: "deviceId",
35667
+ form: "single",
35668
+ optional: false
35669
+ }],
35670
+ "mediaPlayer.playMedia": [{
35671
+ name: "deviceId",
35672
+ form: "single",
35673
+ optional: false
35674
+ }],
35675
+ "mediaPlayer.previous": [{
35676
+ name: "deviceId",
35677
+ form: "single",
35678
+ optional: false
35679
+ }],
35680
+ "mediaPlayer.seek": [{
35681
+ name: "deviceId",
35682
+ form: "single",
35683
+ optional: false
35684
+ }],
35685
+ "mediaPlayer.selectSource": [{
35686
+ name: "deviceId",
35687
+ form: "single",
35688
+ optional: false
35689
+ }],
35690
+ "mediaPlayer.setMute": [{
35691
+ name: "deviceId",
35692
+ form: "single",
35693
+ optional: false
35694
+ }],
35695
+ "mediaPlayer.setRepeat": [{
35696
+ name: "deviceId",
35697
+ form: "single",
35698
+ optional: false
35699
+ }],
35700
+ "mediaPlayer.setShuffle": [{
35701
+ name: "deviceId",
35702
+ form: "single",
35703
+ optional: false
35704
+ }],
35705
+ "mediaPlayer.setVolume": [{
35706
+ name: "deviceId",
35707
+ form: "single",
35708
+ optional: false
35709
+ }],
35710
+ "mediaPlayer.stop": [{
35711
+ name: "deviceId",
35712
+ form: "single",
35713
+ optional: false
35714
+ }],
35715
+ "motion.isDetected": [{
35716
+ name: "deviceId",
35717
+ form: "single",
35718
+ optional: false
35719
+ }],
35720
+ "motionDetection.analyze": [{
35721
+ name: "deviceId",
35722
+ form: "single",
35723
+ optional: false
35724
+ }],
35725
+ "motionDetection.removeCamera": [{
35726
+ name: "deviceId",
35727
+ form: "single",
35728
+ optional: false
35729
+ }],
35730
+ "motionTrigger.setMotionTrigger": [{
35731
+ name: "deviceId",
35732
+ form: "single",
35733
+ optional: false
35734
+ }],
35735
+ "motionZones.getOptions": [{
35736
+ name: "deviceId",
35737
+ form: "single",
35738
+ optional: false
35739
+ }],
35740
+ "motionZones.setZone": [{
35741
+ name: "deviceId",
35742
+ form: "single",
35743
+ optional: false
35744
+ }],
35745
+ "nativeObjectDetection.setEnabled": [{
35746
+ name: "deviceId",
35747
+ form: "single",
35748
+ optional: false
35749
+ }],
35750
+ "networkQuality.getDeviceStats": [{
35751
+ name: "deviceId",
35752
+ form: "single",
35753
+ optional: false
35754
+ }],
35755
+ "networkQuality.reportClientStats": [{
35756
+ name: "deviceId",
35757
+ form: "single",
35758
+ optional: false
35759
+ }],
35760
+ "notificationRules.setDeviceMuted": [{
35761
+ name: "deviceId",
35762
+ form: "single",
35763
+ optional: false
35764
+ }],
35765
+ "notifier.cancel": [{
35766
+ name: "deviceId",
35767
+ form: "single",
35768
+ optional: false
35769
+ }],
35770
+ "notifier.send": [{
35771
+ name: "deviceId",
35772
+ form: "single",
35773
+ optional: false
35774
+ }],
35775
+ "osd.setOverlay": [{
35776
+ name: "deviceId",
35777
+ form: "single",
35778
+ optional: false
35779
+ }],
35780
+ "osdManager.clearSlotBinding": [{
35781
+ name: "deviceId",
35782
+ form: "single",
35783
+ optional: false
35784
+ }],
35785
+ "osdManager.copyDeviceConfiguration": [{
35786
+ name: "sourceDeviceId",
35787
+ form: "single",
35788
+ optional: false
35789
+ }, {
35790
+ name: "targetDeviceId",
35791
+ form: "single",
35792
+ optional: false
35793
+ }],
35794
+ "osdManager.getDeviceOsd": [{
35795
+ name: "deviceId",
35796
+ form: "single",
35797
+ optional: false
35798
+ }],
35799
+ "osdManager.getSourceCatalog": [{
35800
+ name: "deviceId",
35801
+ form: "single",
35802
+ optional: false
35803
+ }],
35804
+ "osdManager.previewSlot": [{
35805
+ name: "deviceId",
35806
+ form: "single",
35807
+ optional: false
35808
+ }],
35809
+ "osdManager.renderDevice": [{
35810
+ name: "deviceId",
35811
+ form: "single",
35812
+ optional: false
35813
+ }],
35814
+ "osdManager.setSlotBinding": [{
35815
+ name: "deviceId",
35816
+ form: "single",
35817
+ optional: false
35818
+ }],
35819
+ "petFeeder.callPet": [{
35820
+ name: "deviceId",
35821
+ form: "single",
35822
+ optional: false
35823
+ }],
35824
+ "petFeeder.cancelFeed": [{
35825
+ name: "deviceId",
35826
+ form: "single",
35827
+ optional: false
35828
+ }],
35829
+ "petFeeder.feed": [{
35830
+ name: "deviceId",
35831
+ form: "single",
35832
+ optional: false
35833
+ }],
35834
+ "petFeeder.markFoodReplenished": [{
35835
+ name: "deviceId",
35836
+ form: "single",
35837
+ optional: false
35838
+ }],
35839
+ "petFeeder.playSound": [{
35840
+ name: "deviceId",
35841
+ form: "single",
35842
+ optional: false
35843
+ }],
35844
+ "petFeeder.resetDesiccant": [{
35845
+ name: "deviceId",
35846
+ form: "single",
35847
+ optional: false
35848
+ }],
35849
+ "petFeeder.setChildLock": [{
35850
+ name: "deviceId",
35851
+ form: "single",
35852
+ optional: false
35853
+ }],
35854
+ "petFeeder.setFeedSound": [{
35855
+ name: "deviceId",
35856
+ form: "single",
35857
+ optional: false
35858
+ }],
35859
+ "petFeeder.setIndicatorLight": [{
35860
+ name: "deviceId",
35861
+ form: "single",
35862
+ optional: false
35863
+ }],
35864
+ "petFeeder.setVolume": [{
35865
+ name: "deviceId",
35866
+ form: "single",
35867
+ optional: false
35868
+ }],
35869
+ "pipelineAnalytics.clearTracks": [{
35870
+ name: "deviceId",
35871
+ form: "single",
35872
+ optional: false
35873
+ }],
35874
+ "pipelineAnalytics.completeRetrainTrack": [{
35875
+ name: "deviceId",
35876
+ form: "single",
35877
+ optional: false
35878
+ }],
35879
+ "pipelineAnalytics.deleteDeviceEvents": [{
35880
+ name: "deviceId",
35881
+ form: "single",
35882
+ optional: false
35883
+ }],
35884
+ "pipelineAnalytics.deleteTracks": [{
35885
+ name: "deviceId",
35886
+ form: "single",
35887
+ optional: false
35888
+ }],
35889
+ "pipelineAnalytics.deselectRetrainFrame": [{
35890
+ name: "deviceId",
35891
+ form: "single",
35892
+ optional: false
35893
+ }],
35894
+ "pipelineAnalytics.getActiveTracks": [{
35895
+ name: "deviceId",
35896
+ form: "single",
35897
+ optional: false
35898
+ }],
35899
+ "pipelineAnalytics.getAudioEvents": [{
35900
+ name: "deviceId",
35901
+ form: "single",
35902
+ optional: false
35903
+ }],
35904
+ "pipelineAnalytics.getEventDensity": [{
35905
+ name: "deviceId",
35906
+ form: "single",
35907
+ optional: false
35908
+ }],
35909
+ "pipelineAnalytics.getKeyEvents": [{
35910
+ name: "deviceId",
35911
+ form: "single",
35912
+ optional: false
35913
+ }],
35914
+ "pipelineAnalytics.getMotionEvents": [{
35915
+ name: "deviceId",
35916
+ form: "single",
35917
+ optional: false
35918
+ }],
35919
+ "pipelineAnalytics.getObjectEvents": [{
35920
+ name: "deviceId",
35921
+ form: "single",
35922
+ optional: false
35923
+ }],
35924
+ "pipelineAnalytics.getRetrainExportUrl": [{
35925
+ name: "deviceIds",
35926
+ form: "array",
35927
+ optional: true
35928
+ }],
35929
+ "pipelineAnalytics.getSensorEvents": [{
35930
+ name: "deviceId",
35931
+ form: "single",
35932
+ optional: false
35933
+ }],
35934
+ "pipelineAnalytics.getTrack": [{
35935
+ name: "deviceId",
35936
+ form: "single",
35937
+ optional: false
35938
+ }],
35939
+ "pipelineAnalytics.getTrainingExportSummary": [{
35940
+ name: "deviceIds",
35941
+ form: "array",
35942
+ optional: true
35943
+ }],
35944
+ "pipelineAnalytics.getTrainingExportUrl": [{
35945
+ name: "deviceIds",
35946
+ form: "array",
35947
+ optional: true
35948
+ }],
35949
+ "pipelineAnalytics.listEventKinds": [{
35950
+ name: "deviceId",
35951
+ form: "single",
35952
+ optional: false
35953
+ }],
35954
+ "pipelineAnalytics.listEventKindsBatch": [{
35955
+ name: "deviceIds",
35956
+ form: "array",
35957
+ optional: false
35958
+ }],
35959
+ "pipelineAnalytics.listOpsLog": [{
35960
+ name: "deviceId",
35961
+ form: "single",
35962
+ optional: true
35963
+ }],
35964
+ "pipelineAnalytics.listRecentTracks": [{
35965
+ name: "deviceIds",
35966
+ form: "array",
35967
+ optional: false
35968
+ }],
35969
+ "pipelineAnalytics.listRetrainStaging": [{
35970
+ name: "deviceIds",
35971
+ form: "array",
35972
+ optional: true
35973
+ }],
35974
+ "pipelineAnalytics.listTracks": [{
35975
+ name: "deviceId",
35976
+ form: "single",
35977
+ optional: false
35978
+ }],
35979
+ "pipelineAnalytics.proposeRetrainAnnotations": [{
35980
+ name: "deviceId",
35981
+ form: "single",
35982
+ optional: false
35983
+ }],
35984
+ "pipelineAnalytics.pruneEventsBefore": [{
35985
+ name: "deviceId",
35986
+ form: "single",
35987
+ optional: false
35988
+ }],
35989
+ "pipelineAnalytics.pruneTracksBefore": [{
35990
+ name: "deviceId",
35991
+ form: "single",
35992
+ optional: false
35993
+ }],
35994
+ "pipelineAnalytics.rebuildObjectEmbeddings": [{
35995
+ name: "deviceId",
35996
+ form: "single",
35997
+ optional: true
35998
+ }],
35999
+ "pipelineAnalytics.restageRetrainTrack": [{
36000
+ name: "deviceId",
36001
+ form: "single",
36002
+ optional: false
36003
+ }],
36004
+ "pipelineAnalytics.saveRetrainAnnotations": [{
36005
+ name: "deviceId",
36006
+ form: "single",
36007
+ optional: false
36008
+ }],
36009
+ "pipelineAnalytics.searchObjectEvents": [{
36010
+ name: "deviceId",
36011
+ form: "single",
36012
+ optional: true
36013
+ }],
36014
+ "pipelineAnalytics.selectRetrainFrames": [{
36015
+ name: "deviceId",
36016
+ form: "single",
36017
+ optional: false
36018
+ }],
36019
+ "pipelineAnalytics.setTrackFlags": [{
36020
+ name: "deviceId",
36021
+ form: "single",
36022
+ optional: false
36023
+ }],
36024
+ "pipelineAnalytics.wipeAllAnalytics": [{
36025
+ name: "deviceId",
36026
+ form: "single",
36027
+ optional: false
36028
+ }],
36029
+ "pipelineExecutor.runPipeline": [{
36030
+ name: "deviceId",
36031
+ form: "single",
36032
+ optional: true
36033
+ }],
36034
+ "pipelineExecutor.runPipelineBatch": [{
36035
+ name: "deviceId",
36036
+ form: "single",
36037
+ optional: true
36038
+ }],
36039
+ "pipelineOrchestrator.assignAudio": [{
36040
+ name: "deviceId",
36041
+ form: "single",
36042
+ optional: false
36043
+ }],
36044
+ "pipelineOrchestrator.assignPipeline": [{
36045
+ name: "deviceId",
36046
+ form: "single",
36047
+ optional: false
36048
+ }],
36049
+ "pipelineOrchestrator.getAudioAssignment": [{
36050
+ name: "deviceId",
36051
+ form: "single",
36052
+ optional: false
36053
+ }],
36054
+ "pipelineOrchestrator.getCameraMetrics": [{
36055
+ name: "deviceId",
36056
+ form: "single",
36057
+ optional: false
36058
+ }],
36059
+ "pipelineOrchestrator.getCameraSettings": [{
36060
+ name: "deviceId",
36061
+ form: "single",
36062
+ optional: false
36063
+ }],
36064
+ "pipelineOrchestrator.getCameraStatus": [{
36065
+ name: "deviceId",
36066
+ form: "single",
36067
+ optional: false
36068
+ }],
36069
+ "pipelineOrchestrator.getCameraStatuses": [{
36070
+ name: "deviceIds",
36071
+ form: "array",
36072
+ optional: true
36073
+ }],
36074
+ "pipelineOrchestrator.getCameraStepOverrides": [{
36075
+ name: "deviceId",
36076
+ form: "single",
36077
+ optional: false
36078
+ }],
36079
+ "pipelineOrchestrator.getCameraSwitches": [{
36080
+ name: "deviceId",
36081
+ form: "single",
36082
+ optional: false
36083
+ }],
36084
+ "pipelineOrchestrator.getPipelineAssignment": [{
36085
+ name: "deviceId",
36086
+ form: "single",
36087
+ optional: false
36088
+ }],
36089
+ "pipelineOrchestrator.getPipelineDevicePin": [{
36090
+ name: "deviceId",
36091
+ form: "single",
36092
+ optional: false
36093
+ }],
36094
+ "pipelineOrchestrator.resolvePipeline": [{
36095
+ name: "deviceId",
36096
+ form: "single",
36097
+ optional: false
36098
+ }],
36099
+ "pipelineOrchestrator.setCameraPipelineForAgent": [{
36100
+ name: "deviceId",
36101
+ form: "single",
36102
+ optional: false
36103
+ }],
36104
+ "pipelineOrchestrator.setCameraStepOverride": [{
36105
+ name: "deviceId",
36106
+ form: "single",
36107
+ optional: false
36108
+ }],
36109
+ "pipelineOrchestrator.setCameraStepToggle": [{
36110
+ name: "deviceId",
36111
+ form: "single",
36112
+ optional: false
36113
+ }],
36114
+ "pipelineOrchestrator.setCameraSwitch": [{
36115
+ name: "deviceId",
36116
+ form: "single",
36117
+ optional: false
36118
+ }],
36119
+ "pipelineOrchestrator.setPipelineDevicePin": [{
36120
+ name: "deviceId",
36121
+ form: "single",
36122
+ optional: false
36123
+ }],
36124
+ "pipelineOrchestrator.unassignAudio": [{
36125
+ name: "deviceId",
36126
+ form: "single",
36127
+ optional: false
36128
+ }],
36129
+ "pipelineOrchestrator.unassignPipeline": [{
36130
+ name: "deviceId",
36131
+ form: "single",
36132
+ optional: false
36133
+ }],
36134
+ "pipelineRunner.attachCamera": [{
36135
+ name: "deviceId",
36136
+ form: "single",
36137
+ optional: false
36138
+ }],
36139
+ "pipelineRunner.detachCamera": [{
36140
+ name: "deviceId",
36141
+ form: "single",
36142
+ optional: false
36143
+ }],
36144
+ "pipelineRunner.getCameraMetrics": [{
36145
+ name: "deviceId",
36146
+ form: "single",
36147
+ optional: false
36148
+ }],
36149
+ "pipelineRunner.reportMotion": [{
36150
+ name: "deviceId",
36151
+ form: "single",
36152
+ optional: false
36153
+ }],
36154
+ "pipelineRunner.runDetailSubtree": [{
36155
+ name: "deviceId",
36156
+ form: "single",
36157
+ optional: false
36158
+ }],
36159
+ "pipelineRunner.runStatelessStep": [{
36160
+ name: "sourceDeviceId",
36161
+ form: "single",
36162
+ optional: false
36163
+ }],
36164
+ "plateGallery.getPlateByTrack": [{
36165
+ name: "deviceId",
36166
+ form: "single",
36167
+ optional: false
36168
+ }],
36169
+ "plateGallery.listPlates": [{
36170
+ name: "deviceId",
36171
+ form: "single",
36172
+ optional: true
36173
+ }],
36174
+ "privacyMask.getOptions": [{
36175
+ name: "deviceId",
36176
+ form: "single",
36177
+ optional: false
36178
+ }],
36179
+ "privacyMask.setAudioEnabled": [{
36180
+ name: "deviceId",
36181
+ form: "single",
36182
+ optional: false
36183
+ }],
36184
+ "privacyMask.setMask": [{
36185
+ name: "deviceId",
36186
+ form: "single",
36187
+ optional: false
36188
+ }],
36189
+ "ptz.continuousMove": [{
36190
+ name: "deviceId",
36191
+ form: "single",
36192
+ optional: false
36193
+ }],
36194
+ "ptz.deletePreset": [{
36195
+ name: "deviceId",
36196
+ form: "single",
36197
+ optional: false
36198
+ }],
36199
+ "ptz.getOptions": [{
36200
+ name: "deviceId",
36201
+ form: "single",
36202
+ optional: false
36203
+ }],
36204
+ "ptz.getPosition": [{
36205
+ name: "deviceId",
36206
+ form: "single",
36207
+ optional: false
36208
+ }],
36209
+ "ptz.getPresets": [{
36210
+ name: "deviceId",
36211
+ form: "single",
36212
+ optional: false
36213
+ }],
36214
+ "ptz.goHome": [{
36215
+ name: "deviceId",
36216
+ form: "single",
36217
+ optional: false
36218
+ }],
36219
+ "ptz.goToPreset": [{
36220
+ name: "deviceId",
36221
+ form: "single",
36222
+ optional: false
36223
+ }],
36224
+ "ptz.move": [{
36225
+ name: "deviceId",
36226
+ form: "single",
36227
+ optional: false
36228
+ }],
36229
+ "ptz.savePreset": [{
36230
+ name: "deviceId",
36231
+ form: "single",
36232
+ optional: false
36233
+ }],
36234
+ "ptz.setAutofocus": [{
36235
+ name: "deviceId",
36236
+ form: "single",
36237
+ optional: false
36238
+ }],
36239
+ "ptz.stop": [{
36240
+ name: "deviceId",
36241
+ form: "single",
36242
+ optional: false
36243
+ }],
36244
+ "ptzAutotrack.getSettings": [{
36245
+ name: "deviceId",
36246
+ form: "single",
36247
+ optional: false
36248
+ }],
36249
+ "ptzAutotrack.getStatus": [{
36250
+ name: "deviceId",
36251
+ form: "single",
36252
+ optional: false
36253
+ }],
36254
+ "ptzAutotrack.setEnabled": [{
36255
+ name: "deviceId",
36256
+ form: "single",
36257
+ optional: false
36258
+ }],
36259
+ "ptzAutotrack.setSettings": [{
36260
+ name: "deviceId",
36261
+ form: "single",
36262
+ optional: false
36263
+ }],
36264
+ "reboot.reboot": [{
36265
+ name: "deviceId",
36266
+ form: "single",
36267
+ optional: false
36268
+ }],
36269
+ "recording.deleteFootprint": [{
36270
+ name: "deviceId",
36271
+ form: "single",
36272
+ optional: false
36273
+ }],
36274
+ "recording.getAvailability": [{
36275
+ name: "deviceId",
36276
+ form: "single",
36277
+ optional: false
36278
+ }],
36279
+ "recording.getDaysWithRecordings": [{
36280
+ name: "deviceId",
36281
+ form: "single",
36282
+ optional: false
36283
+ }],
36284
+ "recording.getDeviceConfig": [{
36285
+ name: "deviceId",
36286
+ form: "single",
36287
+ optional: false
36288
+ }],
36289
+ "recording.getPlaybackManifest": [{
36290
+ name: "deviceId",
36291
+ form: "single",
36292
+ optional: false
36293
+ }],
36294
+ "recording.listOpsLog": [{
36295
+ name: "deviceId",
36296
+ form: "single",
36297
+ optional: true
36298
+ }],
36299
+ "recording.locateSegment": [{
36300
+ name: "deviceId",
36301
+ form: "single",
36302
+ optional: false
36303
+ }],
36304
+ "recording.pruneFootage": [{
36305
+ name: "deviceId",
36306
+ form: "single",
36307
+ optional: false
36308
+ }],
36309
+ "recording.readGopBytes": [{
36310
+ name: "deviceId",
36311
+ form: "single",
36312
+ optional: false
36313
+ }],
36314
+ "recording.readSegmentBytes": [{
36315
+ name: "deviceId",
36316
+ form: "single",
36317
+ optional: false
36318
+ }],
36319
+ "recording.relocateFootage": [{
36320
+ name: "deviceId",
36321
+ form: "single",
36322
+ optional: true
36323
+ }],
36324
+ "recording.renderClip": [{
36325
+ name: "deviceId",
36326
+ form: "single",
36327
+ optional: false
36328
+ }],
36329
+ "recording.renderGif": [{
36330
+ name: "deviceId",
36331
+ form: "single",
36332
+ optional: false
36333
+ }],
36334
+ "recording.rescanStorage": [{
36335
+ name: "deviceId",
36336
+ form: "single",
36337
+ optional: false
36338
+ }],
36339
+ "recording.setDeviceConfig": [{
36340
+ name: "deviceId",
36341
+ form: "single",
36342
+ optional: false
36343
+ }],
36344
+ "recording.startStorageMigrationMove": [{
36345
+ name: "deviceId",
36346
+ form: "single",
36347
+ optional: true
36348
+ }],
36349
+ "recordingExport.createExport": [{
36350
+ name: "deviceId",
36351
+ form: "single",
36352
+ optional: false
36353
+ }],
36354
+ "recordingExport.listExports": [{
36355
+ name: "deviceId",
36356
+ form: "single",
36357
+ optional: true
36358
+ }],
36359
+ "sceneMonitor.captureReference": [{
36360
+ name: "deviceId",
36361
+ form: "single",
36362
+ optional: false
36363
+ }],
36364
+ "sceneMonitor.createScene": [{
36365
+ name: "deviceId",
36366
+ form: "single",
36367
+ optional: false
36368
+ }],
36369
+ "sceneMonitor.deleteReference": [{
36370
+ name: "deviceId",
36371
+ form: "single",
36372
+ optional: false
36373
+ }],
36374
+ "sceneMonitor.deleteScene": [{
36375
+ name: "deviceId",
36376
+ form: "single",
36377
+ optional: false
36378
+ }],
36379
+ "sceneMonitor.listScenes": [{
36380
+ name: "deviceId",
36381
+ form: "single",
36382
+ optional: false
36383
+ }],
36384
+ "sceneMonitor.recheckNow": [{
36385
+ name: "deviceId",
36386
+ form: "single",
36387
+ optional: false
36388
+ }],
36389
+ "sceneMonitor.updateScene": [{
36390
+ name: "deviceId",
36391
+ form: "single",
36392
+ optional: false
36393
+ }],
36394
+ "scriptRunner.run": [{
36395
+ name: "deviceId",
36396
+ form: "single",
36397
+ optional: false
36398
+ }],
36399
+ "scriptRunner.stop": [{
36400
+ name: "deviceId",
36401
+ form: "single",
36402
+ optional: false
36403
+ }],
36404
+ "snapshot.getSnapshot": [{
36405
+ name: "deviceId",
36406
+ form: "single",
36407
+ optional: false
36408
+ }],
36409
+ "snapshot.getSnapshotOverview": [{
36410
+ name: "deviceIds",
36411
+ form: "array",
36412
+ optional: false
36413
+ }],
36414
+ "snapshot.invalidateCache": [{
36415
+ name: "deviceId",
36416
+ form: "single",
36417
+ optional: false
36418
+ }],
36419
+ "streamBroker.acquireEgressTranscode": [{
36420
+ name: "deviceId",
36421
+ form: "single",
36422
+ optional: false
36423
+ }],
36424
+ "streamBroker.assignProfile": [{
36425
+ name: "deviceId",
36426
+ form: "single",
36427
+ optional: false
36428
+ }],
36429
+ "streamBroker.getDeviceAudioMute": [{
36430
+ name: "deviceId",
36431
+ form: "single",
36432
+ optional: false
36433
+ }],
36434
+ "streamBroker.getStreamWithCodec": [{
36435
+ name: "deviceId",
36436
+ form: "single",
36437
+ optional: false
36438
+ }],
36439
+ "streamBroker.produceEventMedia": [{
36440
+ name: "deviceId",
36441
+ form: "single",
36442
+ optional: false
36443
+ }],
36444
+ "streamBroker.publishCameraStream": [{
36445
+ name: "deviceId",
36446
+ form: "single",
36447
+ optional: false
36448
+ }],
36449
+ "streamBroker.renderPreBufferClip": [{
36450
+ name: "deviceId",
36451
+ form: "single",
36452
+ optional: false
36453
+ }],
36454
+ "streamBroker.restartProfile": [{
36455
+ name: "deviceId",
36456
+ form: "single",
36457
+ optional: false
36458
+ }],
36459
+ "streamBroker.retractCameraStream": [{
36460
+ name: "deviceId",
36461
+ form: "single",
36462
+ optional: false
36463
+ }],
36464
+ "streamBroker.setDeviceAudioMute": [{
36465
+ name: "deviceId",
36466
+ form: "single",
36467
+ optional: false
36468
+ }],
36469
+ "streamBroker.unassignProfile": [{
36470
+ name: "deviceId",
36471
+ form: "single",
36472
+ optional: false
36473
+ }],
36474
+ "streamCatalog.getCatalog": [{
36475
+ name: "deviceId",
36476
+ form: "single",
36477
+ optional: false
36478
+ }],
36479
+ "streamParams.getConfigSchema": [{
36480
+ name: "deviceId",
36481
+ form: "single",
36482
+ optional: false
36483
+ }],
36484
+ "streamParams.getOptions": [{
36485
+ name: "deviceId",
36486
+ form: "single",
36487
+ optional: false
36488
+ }],
36489
+ "streamParams.setProfile": [{
36490
+ name: "deviceId",
36491
+ form: "single",
36492
+ optional: false
36493
+ }],
36494
+ "switch.setState": [{
36495
+ name: "deviceId",
36496
+ form: "single",
36497
+ optional: false
36498
+ }],
36499
+ "vacuumControl.locate": [{
36500
+ name: "deviceId",
36501
+ form: "single",
36502
+ optional: false
36503
+ }],
36504
+ "vacuumControl.pause": [{
36505
+ name: "deviceId",
36506
+ form: "single",
36507
+ optional: false
36508
+ }],
36509
+ "vacuumControl.returnToBase": [{
36510
+ name: "deviceId",
36511
+ form: "single",
36512
+ optional: false
36513
+ }],
36514
+ "vacuumControl.setFanSpeed": [{
36515
+ name: "deviceId",
36516
+ form: "single",
36517
+ optional: false
36518
+ }],
36519
+ "vacuumControl.start": [{
36520
+ name: "deviceId",
36521
+ form: "single",
36522
+ optional: false
36523
+ }],
36524
+ "vacuumControl.stop": [{
36525
+ name: "deviceId",
36526
+ form: "single",
36527
+ optional: false
36528
+ }],
36529
+ "valve.close": [{
36530
+ name: "deviceId",
36531
+ form: "single",
36532
+ optional: false
36533
+ }],
36534
+ "valve.open": [{
36535
+ name: "deviceId",
36536
+ form: "single",
36537
+ optional: false
36538
+ }],
36539
+ "valve.setPosition": [{
36540
+ name: "deviceId",
36541
+ form: "single",
36542
+ optional: false
36543
+ }],
36544
+ "valve.stop": [{
36545
+ name: "deviceId",
36546
+ form: "single",
36547
+ optional: false
36548
+ }],
36549
+ "videoclips.getClipPlayback": [{
36550
+ name: "deviceId",
36551
+ form: "single",
36552
+ optional: false
36553
+ }],
36554
+ "videoclips.listClips": [{
36555
+ name: "deviceId",
36556
+ form: "single",
36557
+ optional: false
36558
+ }],
36559
+ "waterHeater.setAway": [{
36560
+ name: "deviceId",
36561
+ form: "single",
36562
+ optional: false
36563
+ }],
36564
+ "waterHeater.setOperationMode": [{
36565
+ name: "deviceId",
36566
+ form: "single",
36567
+ optional: false
36568
+ }],
36569
+ "waterHeater.setTargetTemp": [{
36570
+ name: "deviceId",
36571
+ form: "single",
36572
+ optional: false
36573
+ }],
36574
+ "webrtcSession.addIceCandidate": [{
36575
+ name: "deviceId",
36576
+ form: "single",
36577
+ optional: false
36578
+ }],
36579
+ "webrtcSession.closeSession": [{
36580
+ name: "deviceId",
36581
+ form: "single",
36582
+ optional: false
36583
+ }],
36584
+ "webrtcSession.createSession": [{
36585
+ name: "deviceId",
36586
+ form: "single",
36587
+ optional: false
36588
+ }],
36589
+ "webrtcSession.getIceCandidates": [{
36590
+ name: "deviceId",
36591
+ form: "single",
36592
+ optional: false
36593
+ }],
36594
+ "webrtcSession.getSessionState": [{
36595
+ name: "deviceId",
36596
+ form: "single",
36597
+ optional: false
36598
+ }],
36599
+ "webrtcSession.handleAnswer": [{
36600
+ name: "deviceId",
36601
+ form: "single",
36602
+ optional: false
36603
+ }],
36604
+ "webrtcSession.handleOffer": [{
36605
+ name: "deviceId",
36606
+ form: "single",
36607
+ optional: false
36608
+ }],
36609
+ "webrtcSession.hasAdaptiveBitrate": [{
36610
+ name: "deviceId",
36611
+ form: "single",
36612
+ optional: false
36613
+ }],
36614
+ "webrtcSession.listStreams": [{
36615
+ name: "deviceId",
36616
+ form: "single",
36617
+ optional: false
36618
+ }],
36619
+ "zoneAnalytics.getCameraHistory": [{
36620
+ name: "deviceId",
36621
+ form: "single",
36622
+ optional: false
36623
+ }],
36624
+ "zoneAnalytics.getCurrentSnapshot": [{
36625
+ name: "deviceId",
36626
+ form: "single",
36627
+ optional: false
36628
+ }],
36629
+ "zoneAnalytics.getUnzonedHistory": [{
36630
+ name: "deviceId",
36631
+ form: "single",
36632
+ optional: false
36633
+ }],
36634
+ "zoneAnalytics.getZoneHistory": [{
36635
+ name: "deviceId",
36636
+ form: "single",
36637
+ optional: false
36638
+ }],
36639
+ "zoneRules.listRules": [{
36640
+ name: "deviceId",
36641
+ form: "single",
36642
+ optional: false
36643
+ }],
36644
+ "zoneRules.setRules": [{
36645
+ name: "deviceId",
36646
+ form: "single",
36647
+ optional: false
36648
+ }],
36649
+ "zones.addZone": [{
36650
+ name: "deviceId",
36651
+ form: "single",
36652
+ optional: false
36653
+ }],
36654
+ "zones.listZones": [{
36655
+ name: "deviceId",
36656
+ form: "single",
36657
+ optional: false
36658
+ }],
36659
+ "zones.removeZone": [{
36660
+ name: "deviceId",
36661
+ form: "single",
36662
+ optional: false
36663
+ }],
36664
+ "zones.updateZone": [{
36665
+ name: "deviceId",
36666
+ form: "single",
36667
+ optional: false
36668
+ }]
36669
+ });
34811
36670
  Object.freeze({
34812
36671
  "broker": "broker",
34813
36672
  "device-export": "device-export",
@@ -228750,6 +230609,29 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
228750
230609
  * UX without falsely claiming readiness when audio decode isn't
228751
230610
  * available.
228752
230611
  */
230612
+ /**
230613
+ * Mirror talk-back into the `intercom` runtime-state slice.
230614
+ *
230615
+ * The cap's `status` is command-driven and nothing reads it: every consumer
230616
+ * outside this process — the admin UI, the Home Assistant export — sees a
230617
+ * capability only through the runtime-state slice, via the
230618
+ * `device.state-changed` event or the `deviceState.getAllSnapshots`
230619
+ * snapshot. Without this write the `intercom` entity Home Assistant
230620
+ * publishes would exist and never receive a value, which is exactly the
230621
+ * defect that kept the capability out of the export.
230622
+ *
230623
+ * Called at the four points that open or close a session — and seeded at
230624
+ * registration, so the slice says `talking: false` from boot rather than
230625
+ * only after the first session.
230626
+ */
230627
+ publishIntercomState(talking) {
230628
+ const previous = this.getCapSlice(intercomCapability);
230629
+ this.setCapSlice(intercomCapability, {
230630
+ talking,
230631
+ lastSessionAt: talking ? Date.now() : previous?.lastSessionAt ?? null,
230632
+ ability: previous?.ability ?? null
230633
+ });
230634
+ }
228753
230635
  registerIntercomIfSupported() {
228754
230636
  if (this.intercomRegistered) return;
228755
230637
  const probe = this.getProbeFlags();
@@ -228784,7 +230666,14 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
228784
230666
  ...this.config.get("intercomMaxBacklogMs") !== void 0 ? { maxBacklogMs: this.config.get("intercomMaxBacklogMs") } : {},
228785
230667
  ...this.config.get("intercomGain") !== void 0 ? { outputGain: this.config.get("intercomGain") } : {}
228786
230668
  });
228787
- return this.intercomOrchestrator.start();
230669
+ try {
230670
+ const opened = await this.intercomOrchestrator.start();
230671
+ this.publishIntercomState(true);
230672
+ return opened;
230673
+ } catch (err) {
230674
+ this.publishIntercomState(false);
230675
+ throw err;
230676
+ }
228788
230677
  },
228789
230678
  handleAnswer: async ({ deviceId, sessionId, sdpAnswer }) => {
228790
230679
  if (deviceId !== this.id) return;
@@ -228795,6 +230684,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
228795
230684
  if (deviceId !== this.id) return;
228796
230685
  if (!this.intercomOrchestrator) return;
228797
230686
  await this.intercomOrchestrator.stop(sessionId);
230687
+ this.publishIntercomState(false);
228798
230688
  },
228799
230689
  startTalkSession: async ({ deviceId }) => {
228800
230690
  if (deviceId !== this.id) throw new Error(`ReolinkCamera: intercom deviceId mismatch, expected ${this.id}, got ${deviceId}`);
@@ -228825,6 +230715,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
228825
230715
  lastSequenceNumber: -1,
228826
230716
  opusDecode: null
228827
230717
  };
230718
+ this.publishIntercomState(true);
228828
230719
  this.ctx.logger.info("intercom talk session opened", {
228829
230720
  tags: { deviceId: this.id },
228830
230721
  meta: {
@@ -228952,6 +230843,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
228952
230843
  }
228953
230844
  });
228954
230845
  });
230846
+ this.publishIntercomState(false);
228955
230847
  this.ctx.logger.info("intercom talk session closed", {
228956
230848
  tags: { deviceId: this.id },
228957
230849
  meta: {
@@ -228961,6 +230853,7 @@ var ReolinkCamera = class ReolinkCamera extends BaseDevice {
228961
230853
  });
228962
230854
  }
228963
230855
  });
230856
+ this.publishIntercomState(false);
228964
230857
  this.ctx.logger.info("intercom cap registered (WebRTC + audio-codec wiring active)", { tags: { deviceId: this.id } });
228965
230858
  }
228966
230859
  /**