@camstack/addon-model-studio 1.1.163 → 1.1.165

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 (19) hide show
  1. package/dist/{MotionZonesSettings-y2kbEGdP.mjs → MotionZonesSettings-B6DWvwTt.mjs} +2 -2
  2. package/dist/{PrivacyMaskSettings-4p2buawr.mjs → PrivacyMaskSettings-GC9AJ7u9.mjs} +4 -4
  3. package/dist/{SceneMonitorEditor-BXP48zw9.mjs → SceneMonitorEditor-CDRtXS44.mjs} +3 -3
  4. package/dist/_stub.js +78 -78
  5. package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-BbxlJyIJ.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_model_studio_page-C3EH8dXO.mjs} +3 -3
  6. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CrxDjxBh.mjs +26 -0
  7. package/dist/addon-model-studio.css +1 -1
  8. package/dist/{hostInit-CqiwgcWw.mjs → hostInit-D7wKaStx.mjs} +2 -2
  9. package/dist/model-studio.addon.js +2527 -3
  10. package/dist/model-studio.addon.mjs +2527 -3
  11. package/dist/{player-overlays-H3SbZZiB.mjs → player-overlays-C5aNbV6c.mjs} +1 -1
  12. package/dist/remoteEntry.js +1 -1
  13. package/dist/{responsive-6UoyAOwH.mjs → responsive-B6Yj9AVT.mjs} +1 -1
  14. package/dist/{scene-monitor-copy-BklNacbF.mjs → scene-monitor-copy-DoFpRkTB.mjs} +1 -1
  15. package/dist/{square-iuWo9Mh3.mjs → square-CbUN1Re_.mjs} +1 -1
  16. package/dist/{trash-2-MSpEpKeZ.mjs → trash-2-DalUiaTk.mjs} +1 -1
  17. package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CI7738Pr.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_model_studio_page__remoteEntry_js-CMIDBF8a.mjs} +1 -1
  18. package/package.json +1 -1
  19. package/dist/_virtual_mf___mfe_internal__addon_model_studio_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-D4KJgqEs.mjs +0 -26
@@ -5884,7 +5884,7 @@ var ZodIssueCode = {
5884
5884
  var ZodFirstPartyTypeKind;
5885
5885
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5886
5886
  //#endregion
5887
- //#region ../types/dist/sleep-BVhJDJka.mjs
5887
+ //#region ../types/dist/sleep-i3eUVc-d.mjs
5888
5888
  /**
5889
5889
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5890
5890
  * window to float samples (D455).
@@ -8372,10 +8372,20 @@ var CameraSwitchAuthoritySchema = discriminatedUnion("kind", [
8372
8372
  var CameraSwitchUnavailableReasonSchema = _enum([
8373
8373
  "no-provider",
8374
8374
  "source-unreachable",
8375
- "not-configured",
8376
8375
  "device-disabled"
8377
8376
  ]);
8378
8377
  /**
8378
+ * Something true about a switch that is nonetheless OFFERED.
8379
+ *
8380
+ * The distinction from {@link CameraSwitchUnavailableReasonSchema} is the
8381
+ * whole point: a reason replaces the control, a warning travels WITH it. The
8382
+ * privacy mask taught us the difference — greying the one button that starts
8383
+ * the feature teaches the operator the feature is broken, while a live toggle
8384
+ * that flips nothing teaches them the switch is broken. Neither is true; the
8385
+ * honest surface is a working toggle that says what is missing.
8386
+ */
8387
+ var CameraSwitchWarningSchema = _enum(["no-privacy-zones"]);
8388
+ /**
8379
8389
  * One switch, resolved for one camera.
8380
8390
  *
8381
8391
  * `label` and `costWhenOff` travel ON THE WIRE rather than being looked up
@@ -8394,6 +8404,11 @@ var CameraSwitchSchema = object({
8394
8404
  /** False = do not render a control. `unavailableReason` says why. */
8395
8405
  available: boolean(),
8396
8406
  unavailableReason: CameraSwitchUnavailableReasonSchema.optional(),
8407
+ /**
8408
+ * Present on an AVAILABLE switch only. Rendered beside the live control;
8409
+ * never a substitute for one.
8410
+ */
8411
+ warning: CameraSwitchWarningSchema.optional(),
8397
8412
  /** Current state. Meaningless when `available` is false — read it as `true`. */
8398
8413
  enabled: boolean(),
8399
8414
  authority: CameraSwitchAuthoritySchema
@@ -13915,6 +13930,97 @@ method(object({ integrationId: string() }), object({ filters: array(AdoptionFilt
13915
13930
  auth: "admin"
13916
13931
  });
13917
13932
  /**
13933
+ * device-admin-link — "this device has a management page of its own, and here
13934
+ * is its address".
13935
+ *
13936
+ * ## Why this is not a `deviceConfig` cap
13937
+ *
13938
+ * There is nothing to edit. A `deviceConfig` cap (D14) exists so the framework
13939
+ * can DERIVE a settings form from `getOptions` + `getStatus` and route a flat
13940
+ * patch back through a setter; it costs a `builderId` reducer in
13941
+ * `device-config-contribution.ts` and a `*-config-schema.ts` beside it, and it
13942
+ * renders a form section. This cap answers ONE question with ONE read and
13943
+ * renders a button. Nothing about it is a form, so it carries no `deviceConfig`
13944
+ * block, no `settings`, no `runtimeState` and no reducer — exactly like
13945
+ * `reboot`, the other pure-RPC device-native cap.
13946
+ *
13947
+ * ## Absent, and the difference between "no page" and "we cannot say"
13948
+ *
13949
+ * The two are answered at DIFFERENT layers, on purpose:
13950
+ *
13951
+ * - **"We cannot say"** → the provider never registers the cap for that
13952
+ * device. A VeSync humidifier, a Petkit feeder, a Dreame vacuum and a Dreo
13953
+ * fan are reached only through a vendor cloud; there is no address to hand
13954
+ * out and no page to open. A Tuya plug, a Wyze camera and a Gree air
13955
+ * conditioner DO have a LAN IP, and still have no HTTP management page
13956
+ * behind it. None of them register, so `deviceManager.getBindings` never
13957
+ * lists the cap and no surface asks.
13958
+ * - **"This device has no page, and I know that"** → the provider registers
13959
+ * and `getAdminLink` returns `null`. This is the answer for a device whose
13960
+ * sibling DOES have a page: a Reolink battery camera reached over UDP by
13961
+ * `uid` with a blank `host`, an Ecowitt gateway configured in `listener`
13962
+ * transport, a Home Assistant broker authenticated by supervisor token
13963
+ * (which carries no `baseUrl` at all).
13964
+ *
13965
+ * Both draw NOTHING. A button that opens a browser error is worse than no
13966
+ * button, and D62 is the same rule from the other side: an off switch is
13967
+ * reported off, never made to look broken. There is no third state where the
13968
+ * UI renders a disabled button "because the device might have a page".
13969
+ *
13970
+ * ## The URL never carries credentials
13971
+ *
13972
+ * Not in userinfo, not in a query string. Every provider builds through
13973
+ * `buildDeviceAdminUrl` (`device-admin-link-url.ts`), which takes host, port,
13974
+ * scheme and path as separate arguments — there is no parameter a secret could
13975
+ * arrive in — and re-checks its own output for the `scheme://user:pass@` shape
13976
+ * that `scripts/check-no-credential-urls-in-fixtures.ts` bans from recorded
13977
+ * output. `scripts/check-admin-link-builder-is-the-only-url-source.ts` is what
13978
+ * keeps providers from hand-rolling one anyway.
13979
+ *
13980
+ * This matters here more than anywhere else in the repo, because every provider
13981
+ * that knows a device's host knows its PASSWORD too: `{ host, port, username,
13982
+ * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
13983
+ * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
13984
+ * camera's own page will ask for its own login. That is correct, and pre-
13985
+ * filling it is the operator's business, not ours.
13986
+ *
13987
+ * ## It is a LAN fact
13988
+ *
13989
+ * The URL addresses the device where the NODE can see it. It is not proxied,
13990
+ * not made reachable from outside, and not sent anywhere. A surface renders it
13991
+ * as a link the operator's own browser follows, on the operator's own network,
13992
+ * or renders nothing.
13993
+ */
13994
+ /**
13995
+ * Whose page is it. The distinction is for the OPERATOR, who needs to know
13996
+ * before clicking whether he is about to land on a camera's own web server or
13997
+ * inside Home Assistant.
13998
+ */
13999
+ var AdminLinkTargetEnum = _enum(["device", "integration"]);
14000
+ var DeviceAdminLinkSchema = object({
14001
+ /**
14002
+ * Absolute `http(s)://` URL. Built by `buildDeviceAdminUrl` and therefore
14003
+ * free of userinfo and of any credential-shaped query key.
14004
+ */
14005
+ url: string(),
14006
+ /**
14007
+ * What the surface calls it — "Web UI", "Home Assistant", "UniFi controller".
14008
+ * The PROVIDER names it, because only the provider knows what the page is;
14009
+ * a UI that invented the label from the addon id would call the Home
14010
+ * Assistant device page "Provider Homeassistant".
14011
+ */
14012
+ label: string(),
14013
+ target: AdminLinkTargetEnum,
14014
+ /**
14015
+ * Host the URL points at, without scheme, port or path — for the tooltip, so
14016
+ * an operator can see WHERE the button goes before he follows it. Redundant
14017
+ * with `url` by construction; carried separately so no surface has to parse
14018
+ * a URL to show it.
14019
+ */
14020
+ host: string()
14021
+ });
14022
+ method(object({ deviceId: number().int().nonnegative() }), DeviceAdminLinkSchema.nullable(), { auth: "admin" });
14023
+ /**
13918
14024
  * `device-export` — collection cap for addons that export camstack
13919
14025
  * devices to external ecosystems (HomeAssistant via MQTT discovery,
13920
14026
  * HomeKit/HAP, Alexa Smart Home, …).
@@ -24885,6 +24991,82 @@ var ClipBytesSchema = object({
24885
24991
  */
24886
24992
  durationMs: number().positive().optional()
24887
24993
  });
24994
+ /**
24995
+ * Where a clip's STREAM can be dialled (D597) — the answer to
24996
+ * {@link videoclipsCapability.methods.dialClipStream}.
24997
+ *
24998
+ * `url` is plain `http://` on the provider's own token-gated listener, one
24999
+ * shot, short-lived. It is NOT the hub-proxied `/addon/<id>/clip-stream/…`
25000
+ * path: that plane takes only a user credential, which an addon does not
25001
+ * hold, and the framework offers no addon→addon byte transport — the one
25002
+ * precedent is the broker's own restream URLs (`getStreamWithCodec`), which
25003
+ * a consumer dials directly, and this is that precedent one addon over.
25004
+ */
25005
+ /**
25006
+ * The audio a clip stream can be asked for, and the audio it carries.
25007
+ *
25008
+ * The camera stores AAC and no WebRTC session speaks it, so a stream that
25009
+ * carries sound carries it TRANSCODED, muxed as a second track beside the
25010
+ * video by the one ffmpeg the provider already runs (D600). `opus` is
25011
+ * 48 kHz mono, `pcmu` is 8 kHz µ-law — the two codecs a broker session
25012
+ * negotiates — and `none` is a stream asked for, or served, without sound.
25013
+ */
25014
+ var ClipStreamAudioSchema = _enum([
25015
+ "opus",
25016
+ "pcmu",
25017
+ "none"
25018
+ ]);
25019
+ /**
25020
+ * Why a stream that was ASKED for sound is not carrying it (D600).
25021
+ *
25022
+ * Only ever set beside `servedAudio: 'none'` after a non-`none` ask. Absent
25023
+ * means the ask was honoured, or there was no ask.
25024
+ *
25025
+ * - `not-requested` — the caller asked for `none`.
25026
+ * - `unsupported-ask` — the provider cannot produce that codec.
25027
+ *
25028
+ * Whether the RECORDING has sound at all is not knowable here: the camera
25029
+ * declares no audio track before its first frame arrives. That answer is in
25030
+ * the stream itself — an fMP4 with no audio track — and the broker reads it
25031
+ * there. A dial that says `opus` promises the codec, never the content.
25032
+ */
25033
+ var ClipStreamAudioReasonSchema = _enum(["not-requested", "unsupported-ask"]);
25034
+ var ClipStreamDialSchema = object({
25035
+ url: string().min(1),
25036
+ /** After this the token is gone and the URL answers 404 `dial-expired`. */
25037
+ expiresAtMs: number(),
25038
+ /** What the stream IS — a consumer that cannot honour it must not dial. */
25039
+ transport: literal("forward-only"),
25040
+ /**
25041
+ * Which twin the stream ACTUALLY carries — not what was asked for.
25042
+ *
25043
+ * The stream serves every profile (D599), and a recording whose main twin
25044
+ * does not exist is streamed as its sub copy, which this field reports as
25045
+ * `low`. That is the whole reason the dial no longer refuses `high`:
25046
+ * stating what was served is what makes accepting honest, where a silent
25047
+ * substitution would be the 33x lie D576 forbids. Stated rather than
25048
+ * assumed, the way {@link ClipPlaybackSchema.served} is (D549 15).
25049
+ */
25050
+ served: CamProfileSchema,
25051
+ /**
25052
+ * Which audio the stream will ACTUALLY carry — `served`'s companion for
25053
+ * sound, and the same reasoning (D599, D600).
25054
+ *
25055
+ * The broker asks for the codec its WebRTC session negotiated, and the
25056
+ * provider either muxes that codec or carries none. Stating it is what
25057
+ * lets the broker wire the matching sink before the first byte, and what
25058
+ * keeps a session from being handed a codec it cannot send — the audio
25059
+ * shape of the substitution `served` exists to prevent.
25060
+ *
25061
+ * It is a promise about the CODEC, not about the content: a recording with
25062
+ * no microphone track answers `opus` here and then arrives with no audio
25063
+ * track at all. That second answer is in the stream, and the broker reads
25064
+ * it from the `moov`.
25065
+ */
25066
+ servedAudio: ClipStreamAudioSchema,
25067
+ /** Why `servedAudio` is `none` although sound was asked for. */
25068
+ audioReason: ClipStreamAudioReasonSchema.optional()
25069
+ });
24888
25070
  var ClipSourceAvailabilitySchema = object({
24889
25071
  state: _enum([
24890
25072
  "ok",
@@ -25004,6 +25186,23 @@ DeviceType.Camera, method(object({
25004
25186
  deviceId: number(),
25005
25187
  clipId: string().min(1),
25006
25188
  /**
25189
+ * WHICH provider holds the bytes — the `addonId` a
25190
+ * {@link ClipSourceSchema} row carries. **Required**, for the reason
25191
+ * `listClips` states one method above and for a second one this method
25192
+ * learned the hard way.
25193
+ *
25194
+ * The caller is the stream broker, and the broker lives in
25195
+ * `addon-pipeline` — the same addon that registers the RECORDER's
25196
+ * videoclips provider. With no provider named, the in-process
25197
+ * resolution handed it its own sibling, which implements this method
25198
+ * solely to explain that an analytics visit has no file behind it. So
25199
+ * every onboard clip answered with that sentence, a flash of video and
25200
+ * nothing more, while the SAME call from outside the addon reached the
25201
+ * right provider and returned the bytes (measured on 3628,
25202
+ * 2026-09-21).
25203
+ */
25204
+ provider: string().min(1),
25205
+ /**
25007
25206
  * Which twin to fetch, on the mapping D549 15 already fixed:
25008
25207
  * `low | mid` → the sub file, `high` → the main twin. `auto` is not
25009
25208
  * accepted here for the same reason it is not accepted by
@@ -25027,6 +25226,27 @@ DeviceType.Camera, method(object({
25027
25226
  }), ClipBytesSchema, {
25028
25227
  kind: "query",
25029
25228
  auth: "protected"
25229
+ }), optionalMethod(object({
25230
+ deviceId: number(),
25231
+ clipId: string().min(1),
25232
+ /** WHICH provider holds the camera — see `readClipBytes.provider`. */
25233
+ provider: string().min(1),
25234
+ /** Which twin — `high` → the main file, everything else the sub (D599). */
25235
+ profile: CamProfileSchema.optional(),
25236
+ /**
25237
+ * Which audio codec the caller's session negotiated, so the provider
25238
+ * can mux it (D600). The ask travels on the DIAL because the mux is
25239
+ * spawned once, before the first byte, and cannot gain a track later.
25240
+ *
25241
+ * ABSENT IS `none`, never a guess: a caller that does not state an
25242
+ * ask is served the video-only stream that shipped first, so a broker
25243
+ * older than this field keeps working unchanged (D382 — an unstated
25244
+ * ask is zero).
25245
+ */
25246
+ audio: ClipStreamAudioSchema.optional()
25247
+ }), ClipStreamDialSchema, {
25248
+ kind: "query",
25249
+ auth: "protected"
25030
25250
  });
25031
25251
  /**
25032
25252
  * Optional client-side hints sent at session creation to help the provider
@@ -26584,6 +26804,307 @@ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema)
26584
26804
  auth: "admin"
26585
26805
  });
26586
26806
  /**
26807
+ * Vendor-neutral **onboard** recording + storage cap — what the CAMERA
26808
+ * writes to the CAMERA's own card, on the camera's own schedule.
26809
+ *
26810
+ * This is NOT `recording.cap.ts`. That one is CamStack's recorder: our
26811
+ * footage ledger, our storage locations, our retention. This one has a
26812
+ * different authority — the camera's firmware — and per D62 it stores
26813
+ * nothing of its own. Every value here is read from the camera and every
26814
+ * write goes back to the camera; there is no CamStack-side mirror that
26815
+ * could disagree with the device.
26816
+ *
26817
+ * ## One shape, two firmwares
26818
+ *
26819
+ * Measured 2026-09-22 against the live fleet:
26820
+ *
26821
+ * | fact | Hikvision (ISAPI) | Reolink (Baichuan) |
26822
+ * | --- | --- | --- |
26823
+ * | storage | `ContentMgmt/Storage` `<hdd>` rows: status, capacity, freeSpace (MB) | `getHddInfoList` (cmd 102): `mount`, `format`, `capacity` GB + `capacityM` MB remainder |
26824
+ * | tracks | several (101 **and** 103 on both 1436 and 3833), each with its own schedule | one per channel |
26825
+ * | schedule | per track, 7 `ScheduleAction` blocks: DayOfWeek + TimeOfDay range + ONE `ActionRecordingMode` | per trigger type, a 168-char weekly HOUR mask |
26826
+ * | triggers | `CMR`, `MOTION` | `Normal`, `MD`, `people`, `vehicle`, `dog_cat`, `crossline`, `intrude`, `loitering` |
26827
+ * | pre-record | `PreRecordTimeSeconds` | `preRecordTime` |
26828
+ * | post-record | `PostRecordTimeSeconds` | `recordDelayTime` |
26829
+ * | overwrite | per track `LoopEnable` | `cycle`, with `cycleList` enumerating the accepted values |
26830
+ * | segment length | not exposed on V5.7.1 | `packageTime` (minutes) |
26831
+ *
26832
+ * The two schedule models look different and are the same thing in
26833
+ * different coordinates: both answer "for this trigger, during which
26834
+ * weekly windows does the camera record". {@link RecordWindow} is that
26835
+ * question in one shape — Hikvision's ranges map straight onto it,
26836
+ * Reolink's mask expands into hour-aligned windows.
26837
+ *
26838
+ * ## Union, not intersection
26839
+ *
26840
+ * **The same fields exist on every camera.** What differs per device is
26841
+ * which VALUES that device accepts, and that is what {@link
26842
+ * RecordingOnboardOptions} reports — a `{ readable, writable, reason }`
26843
+ * per field plus the schedule's own limits. A control a camera cannot
26844
+ * honour is rendered DISABLED WITH ITS REASON, never missing and never
26845
+ * dead: disabled must not look like broken.
26846
+ *
26847
+ * ## Refusal by name
26848
+ *
26849
+ * A write a camera cannot honour is refused with a sentence the operator
26850
+ * can read — never accepted and dropped. Both providers refuse through
26851
+ * {@link describeOnboardRefusal}, so the vocabulary is one function and
26852
+ * one test, not two hand-written vendor opinions.
26853
+ *
26854
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
26855
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
26856
+ * injected from `status`) reports the live values, and a single
26857
+ * `setSettings` mutation applies a partial change. No hand-written
26858
+ * settings-contribution methods.
26859
+ */
26860
+ /**
26861
+ * What makes the camera start recording during a window.
26862
+ *
26863
+ * The union of both vendors' vocabularies. `continuous` is Hikvision's
26864
+ * `CMR` and Reolink's `Normal`; `motion` is `MOTION` / `MD`. The
26865
+ * object-class triggers are Reolink-only today and the smart-event ones
26866
+ * (`lineCrossing`, `intrusion`, `loitering`) are Reolink-only on the
26867
+ * firmwares measured — a camera that cannot record on a trigger simply
26868
+ * does not list it in `options.schedule.triggers`, and a window naming
26869
+ * it is REFUSED, not dropped.
26870
+ */
26871
+ var RecordTriggerSchema = _enum([
26872
+ "continuous",
26873
+ "motion",
26874
+ "person",
26875
+ "vehicle",
26876
+ "animal",
26877
+ "lineCrossing",
26878
+ "intrusion",
26879
+ "loitering",
26880
+ "alarmInput"
26881
+ ]);
26882
+ /**
26883
+ * One weekly recording window: "on `day`, from `startMinute` to
26884
+ * `endMinute`, record on `trigger`".
26885
+ *
26886
+ * `day` is 0 = Monday … 6 = Sunday (ISO order, which is also the order
26887
+ * both firmwares enumerate). Minutes are local camera time since
26888
+ * midnight; `endMinute` may be 1440, meaning end of day — that is
26889
+ * Hikvision's literal `24:00` and Reolink's 24th mask slot, and
26890
+ * collapsing it to 0 would turn a whole-day window into an empty one.
26891
+ */
26892
+ var RecordWindowSchema = object({
26893
+ trigger: RecordTriggerSchema,
26894
+ day: number().int().min(0).max(6),
26895
+ startMinute: number().int().min(0).max(1439),
26896
+ endMinute: number().int().min(1).max(1440)
26897
+ });
26898
+ /** Status of one physical volume, as the camera itself describes it. */
26899
+ var OnboardStorageVolumeSchema = object({
26900
+ /** The camera's own id for the volume (`hdd/id`, Reolink `HddInfo/number`). */
26901
+ id: string(),
26902
+ /** The camera's own name for it, when it gives one (`hddName`). */
26903
+ label: string().optional(),
26904
+ status: _enum([
26905
+ "ok",
26906
+ "unformatted",
26907
+ "error",
26908
+ "offline",
26909
+ "unknown"
26910
+ ]),
26911
+ /**
26912
+ * Total size in MB, or **null when the camera did not say**.
26913
+ *
26914
+ * Never 0 for an unreadable value: a measurement that failed is not a
26915
+ * measurement (D393), and a card whose size is unknown must not be
26916
+ * rendered as a card of size zero.
26917
+ */
26918
+ capacityMb: number().nullable(),
26919
+ /**
26920
+ * Free space in MB, or null when unknown.
26921
+ *
26922
+ * **Not a proxy for "has footage".** Measured 2026-09-22: 1436 and
26923
+ * 1439 both report exactly 11776 MB free — the fixed reserve a looping
26924
+ * card converges on once it has wrapped. At loop steady state the
26925
+ * number is identical whether the camera recorded yesterday or stopped
26926
+ * a month ago.
26927
+ */
26928
+ freeMb: number().nullable(),
26929
+ /** True when the camera reports the volume writable (`property` RW). */
26930
+ writable: boolean().optional()
26931
+ });
26932
+ object({
26933
+ storage: discriminatedUnion("kind", [
26934
+ object({
26935
+ kind: literal("present"),
26936
+ volumes: array(OnboardStorageVolumeSchema)
26937
+ }),
26938
+ object({
26939
+ kind: literal("absent"),
26940
+ reason: string()
26941
+ }),
26942
+ object({
26943
+ kind: literal("unknown"),
26944
+ reason: string()
26945
+ })
26946
+ ]),
26947
+ tracks: array(object({
26948
+ id: string(),
26949
+ enabled: boolean(),
26950
+ isVideo: boolean(),
26951
+ /** From the camera's own track description. Null when it does not say. */
26952
+ codec: string().nullable(),
26953
+ resolution: string().nullable(),
26954
+ /** Per-track overwrite flag, where the firmware keeps it per track. */
26955
+ overwriteWhenFull: boolean().nullable()
26956
+ })),
26957
+ /**
26958
+ * The track the write path targets — the enabled VIDEO one. Null when
26959
+ * no track could be identified, which is itself a refusal reason.
26960
+ */
26961
+ primaryTrackId: string().nullable(),
26962
+ /** Master "record to the card at all" switch. */
26963
+ enabled: boolean().nullable(),
26964
+ overwriteWhenFull: boolean().nullable(),
26965
+ preRecordSec: number().nullable(),
26966
+ postRecordSec: number().nullable(),
26967
+ /** Length of one recorded file, in minutes. */
26968
+ segmentMinutes: number().nullable(),
26969
+ /** The primary track's weekly windows, flattened. */
26970
+ windows: array(RecordWindowSchema),
26971
+ /**
26972
+ * How many windows the camera described that CamStack could NOT read —
26973
+ * an unrecognised trigger, an unparseable clock, a weekday it does not
26974
+ * name.
26975
+ *
26976
+ * A dropped window is work the reader threw away, and a schedule that
26977
+ * silently shows fewer rows than the camera holds is how an operator
26978
+ * saves back a schedule shorter than the one they were looking at
26979
+ * (D391). Non-zero means the window list is INCOMPLETE and a write
26980
+ * that replaces it would delete what was not shown — which is why a
26981
+ * provider reporting a non-zero count also reports the schedule as not
26982
+ * writable.
26983
+ */
26984
+ unreadableWindows: number(),
26985
+ /**
26986
+ * The camera is scheduled to record and has NO usable storage.
26987
+ *
26988
+ * A first-class fact because it is the fleet's most common silent
26989
+ * defect: measured 2026-09-22, 1441 and 3831 are both motion-recording
26990
+ * to a card that is not there. Neither the schedule nor the storage
26991
+ * read says anything wrong on its own; only the pair does.
26992
+ */
26993
+ recordingToNowhere: boolean(),
26994
+ lastFetchedAt: number()
26995
+ });
26996
+ /** Numeric range descriptor — `{ min, max, step }` per the getOptions convention. */
26997
+ var RangeSchema = object({
26998
+ min: number(),
26999
+ max: number(),
27000
+ step: number()
27001
+ });
27002
+ /**
27003
+ * The values a camera actually takes for a numeric field, when they are a SET
27004
+ * rather than a range.
27005
+ *
27006
+ * `{min,max,step}` cannot say what these two firmwares do. Measured on 1436
27007
+ * (I91DN) on 2026-09-22 by writing each value and reading it back:
27008
+ *
27009
+ * - pre-record: `0, 5, 10, 15, 20, 25, 30` and `2147483647` (INT32_MAX, the
27010
+ * camera's "no limit" — `-1` and `4294967295` both land on it);
27011
+ * - post-record: `5, 10, 30, 60, 120, 300, 600`.
27012
+ *
27013
+ * Neither is expressible as a step: the first has a sentinel two billion away
27014
+ * from its neighbours, the second doubles and then jumps. A range that tried
27015
+ * would forbid values the camera takes AND permit values it silently replaces
27016
+ * with 5 — wrong in both directions at once.
27017
+ *
27018
+ * `sentinel` names the member that is not a duration, so a surface can render
27019
+ * "no limit" instead of `2147483647` seconds.
27020
+ */
27021
+ var AllowedValuesSchema = object({
27022
+ values: array(number()).min(1),
27023
+ sentinel: object({
27024
+ value: number(),
27025
+ meaning: _enum(["no-limit", "disabled"])
27026
+ }).optional()
27027
+ });
27028
+ /**
27029
+ * Per-field availability on ONE camera.
27030
+ *
27031
+ * The field exists on every camera — this says whether this one can be
27032
+ * read and whether it can be written, and `reason` says why not when
27033
+ * either is false. The UI renders the control DISABLED with the reason
27034
+ * rather than hiding it, so a limitation is legible instead of looking
27035
+ * like a missing feature.
27036
+ */
27037
+ var OnboardFieldSupportSchema = object({
27038
+ readable: boolean(),
27039
+ writable: boolean(),
27040
+ /** Required whenever `readable` or `writable` is false. */
27041
+ reason: string().optional()
27042
+ });
27043
+ /** What this camera's schedule model can express. */
27044
+ var OnboardScheduleSupportSchema = object({
27045
+ support: OnboardFieldSupportSchema,
27046
+ /**
27047
+ * The smallest time step the camera can express, in minutes.
27048
+ *
27049
+ * Hikvision takes arbitrary minutes (`00:05:00`–`23:57:00` observed on
27050
+ * 1436's track 103). Reolink's schedule is a 7×24 HOUR mask, so 60. A
27051
+ * window whose edges are not a multiple of this is REFUSED rather than
27052
+ * quietly rounded — rounding is how an operator's 06:30 becomes 06:00
27053
+ * and nothing says so.
27054
+ */
27055
+ granularityMinutes: number(),
27056
+ /** Triggers this camera can record on. A window naming another is refused. */
27057
+ triggers: array(RecordTriggerSchema),
27058
+ /**
27059
+ * False when the camera stores ONE trigger per time range, so two
27060
+ * windows overlapping on the same day cannot carry different triggers.
27061
+ * True on Reolink, whose mask is per-trigger and independent.
27062
+ */
27063
+ supportsOverlappingTriggers: boolean()
27064
+ });
27065
+ var RecordingOnboardOptionsSchema = object({
27066
+ enabled: OnboardFieldSupportSchema,
27067
+ overwriteWhenFull: OnboardFieldSupportSchema,
27068
+ preRecordSec: OnboardFieldSupportSchema,
27069
+ preRecordSecRange: RangeSchema.optional(),
27070
+ /** Preferred over the range when the camera takes a SET, not a span. */
27071
+ preRecordSecAllowed: AllowedValuesSchema.optional(),
27072
+ postRecordSec: OnboardFieldSupportSchema,
27073
+ postRecordSecRange: RangeSchema.optional(),
27074
+ /** Preferred over the range when the camera takes a SET, not a span. */
27075
+ postRecordSecAllowed: AllowedValuesSchema.optional(),
27076
+ segmentMinutes: OnboardFieldSupportSchema,
27077
+ segmentMinutesRange: RangeSchema.optional(),
27078
+ /** Preferred over the range when the camera takes a SET, not a span. */
27079
+ segmentMinutesAllowed: AllowedValuesSchema.optional(),
27080
+ schedule: OnboardScheduleSupportSchema
27081
+ });
27082
+ /**
27083
+ * A partial change. Every field optional.
27084
+ *
27085
+ * Unlike the other `deviceConfig` caps, a provider here does **NOT**
27086
+ * silently ignore a field it cannot support — it refuses, by name,
27087
+ * through {@link describeOnboardRefusal}. Silence on a recording setting
27088
+ * is the failure D62 exists to prevent: the operator believes the camera
27089
+ * is recording the way the form says, and it is not.
27090
+ */
27091
+ var RecordingOnboardPatchSchema = object({
27092
+ enabled: boolean().optional(),
27093
+ overwriteWhenFull: boolean().optional(),
27094
+ preRecordSec: number().optional(),
27095
+ postRecordSec: number().optional(),
27096
+ segmentMinutes: number().optional(),
27097
+ /** The complete new window set for the primary track — not a delta. */
27098
+ windows: array(RecordWindowSchema).optional()
27099
+ });
27100
+ DeviceType.Camera, method(object({ deviceId: number() }), RecordingOnboardOptionsSchema), method(object({
27101
+ deviceId: number(),
27102
+ settings: RecordingOnboardPatchSchema
27103
+ }), _void(), {
27104
+ kind: "mutation",
27105
+ auth: "admin"
27106
+ });
27107
+ /**
26587
27108
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
26588
27109
  * for every device, regardless of provider — the kernel needs a uniform
26589
27110
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -30729,7 +31250,7 @@ method(object({
30729
31250
  auth: "admin"
30730
31251
  }), method(object({ deviceId: number() }), RecordingConfigSchema, {
30731
31252
  kind: "query",
30732
- auth: "admin"
31253
+ auth: "protected"
30733
31254
  }), method(object({
30734
31255
  deviceId: number(),
30735
31256
  profile: string(),
@@ -32950,7 +33471,1336 @@ AccessoryKind.Siren, AccessoryKind.Floodlight, AccessoryKind.Spotlight, Accessor
32950
33471
  DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder;
32951
33472
  new Set(Object.values(DeviceType));
32952
33473
  DeviceFeature.BatteryOperated;
33474
+ /**
33475
+ * The vocabulary, in the order a picker offers it.
33476
+ *
33477
+ * Adding a key here is not enough to make it pickable: both glyph tables must
33478
+ * gain it too, and their tests fail until they do. That is the intended
33479
+ * friction — it is the only thing that keeps the two surfaces honest.
33480
+ */
33481
+ var DISPLAY_ICON_VOCABULARY = [
33482
+ {
33483
+ key: "camera",
33484
+ group: "device",
33485
+ synonyms: [
33486
+ "telecamera",
33487
+ "videocamera",
33488
+ "camera",
33489
+ "cam"
33490
+ ]
33491
+ },
33492
+ {
33493
+ key: "network",
33494
+ group: "device",
33495
+ synonyms: [
33496
+ "rete",
33497
+ "network",
33498
+ "lan"
33499
+ ]
33500
+ },
33501
+ {
33502
+ key: "toggle-left",
33503
+ group: "device",
33504
+ synonyms: [
33505
+ "interruttore",
33506
+ "switch",
33507
+ "toggle"
33508
+ ]
33509
+ },
33510
+ {
33511
+ key: "toggle-right",
33512
+ group: "device",
33513
+ synonyms: [
33514
+ "interruttore",
33515
+ "switch",
33516
+ "toggle",
33517
+ "acceso"
33518
+ ]
33519
+ },
33520
+ {
33521
+ key: "circle-dot",
33522
+ group: "device",
33523
+ synonyms: [
33524
+ "pulsante",
33525
+ "bottone",
33526
+ "button",
33527
+ "dot"
33528
+ ]
33529
+ },
33530
+ {
33531
+ key: "refresh-cw",
33532
+ group: "device",
33533
+ synonyms: [
33534
+ "aggiorna",
33535
+ "ricarica",
33536
+ "refresh",
33537
+ "reload",
33538
+ "ciclo"
33539
+ ]
33540
+ },
33541
+ {
33542
+ key: "box",
33543
+ group: "device",
33544
+ synonyms: [
33545
+ "scatola",
33546
+ "box",
33547
+ "contenitore"
33548
+ ]
33549
+ },
33550
+ {
33551
+ key: "scroll-text",
33552
+ group: "device",
33553
+ synonyms: [
33554
+ "registro",
33555
+ "log",
33556
+ "testo"
33557
+ ]
33558
+ },
33559
+ {
33560
+ key: "workflow",
33561
+ group: "device",
33562
+ synonyms: [
33563
+ "automazione",
33564
+ "flusso",
33565
+ "workflow",
33566
+ "scenario"
33567
+ ]
33568
+ },
33569
+ {
33570
+ key: "lock",
33571
+ group: "device",
33572
+ synonyms: [
33573
+ "serratura",
33574
+ "chiave",
33575
+ "lucchetto",
33576
+ "chiuso",
33577
+ "locked"
33578
+ ]
33579
+ },
33580
+ {
33581
+ key: "lock-open",
33582
+ group: "device",
33583
+ synonyms: [
33584
+ "serratura",
33585
+ "aperta",
33586
+ "sbloccato",
33587
+ "unlocked"
33588
+ ]
33589
+ },
33590
+ {
33591
+ key: "blinds",
33592
+ group: "device",
33593
+ synonyms: [
33594
+ "tapparella",
33595
+ "persiana",
33596
+ "serranda",
33597
+ "avvolgibile",
33598
+ "shutter",
33599
+ "blind",
33600
+ "veneziana"
33601
+ ]
33602
+ },
33603
+ {
33604
+ key: "air-vent",
33605
+ group: "device",
33606
+ synonyms: [
33607
+ "bocchetta",
33608
+ "aria",
33609
+ "ventilazione",
33610
+ "condizionatore",
33611
+ "vent"
33612
+ ]
33613
+ },
33614
+ {
33615
+ key: "monitor-play",
33616
+ group: "device",
33617
+ synonyms: [
33618
+ "schermo",
33619
+ "riproduzione",
33620
+ "player",
33621
+ "display"
33622
+ ]
33623
+ },
33624
+ {
33625
+ key: "sliders-horizontal",
33626
+ group: "device",
33627
+ synonyms: [
33628
+ "regolazione",
33629
+ "cursori",
33630
+ "impostazioni",
33631
+ "slider"
33632
+ ]
33633
+ },
33634
+ {
33635
+ key: "map-pin",
33636
+ group: "device",
33637
+ synonyms: [
33638
+ "posizione",
33639
+ "luogo",
33640
+ "mappa",
33641
+ "pin"
33642
+ ]
33643
+ },
33644
+ {
33645
+ key: "bot",
33646
+ group: "device",
33647
+ synonyms: [
33648
+ "robot",
33649
+ "aspirapolvere",
33650
+ "bot"
33651
+ ]
33652
+ },
33653
+ {
33654
+ key: "tractor",
33655
+ group: "device",
33656
+ synonyms: [
33657
+ "trattore",
33658
+ "tosaerba",
33659
+ "giardino"
33660
+ ]
33661
+ },
33662
+ {
33663
+ key: "image",
33664
+ group: "device",
33665
+ synonyms: [
33666
+ "immagine",
33667
+ "foto",
33668
+ "snapshot"
33669
+ ]
33670
+ },
33671
+ {
33672
+ key: "bone",
33673
+ group: "device",
33674
+ synonyms: ["osso", "cane"]
33675
+ },
33676
+ {
33677
+ key: "door-closed",
33678
+ group: "device",
33679
+ synonyms: [
33680
+ "porta",
33681
+ "chiusa",
33682
+ "contatto"
33683
+ ]
33684
+ },
33685
+ {
33686
+ key: "door-open",
33687
+ group: "device",
33688
+ synonyms: [
33689
+ "porta",
33690
+ "aperta",
33691
+ "contatto",
33692
+ "ingresso",
33693
+ "uscita"
33694
+ ]
33695
+ },
33696
+ {
33697
+ key: "crosshair",
33698
+ group: "device",
33699
+ synonyms: [
33700
+ "mirino",
33701
+ "puntamento",
33702
+ "centro"
33703
+ ]
33704
+ },
33705
+ {
33706
+ key: "eye",
33707
+ group: "device",
33708
+ synonyms: [
33709
+ "occhio",
33710
+ "visibile",
33711
+ "visto"
33712
+ ]
33713
+ },
33714
+ {
33715
+ key: "eye-off",
33716
+ group: "device",
33717
+ synonyms: [
33718
+ "privacy",
33719
+ "nascosto",
33720
+ "oscurato",
33721
+ "mascherato",
33722
+ "invisibile"
33723
+ ]
33724
+ },
33725
+ {
33726
+ key: "smartphone",
33727
+ group: "device",
33728
+ synonyms: [
33729
+ "telefono",
33730
+ "cellulare",
33731
+ "smartphone"
33732
+ ]
33733
+ },
33734
+ {
33735
+ key: "phone",
33736
+ group: "device",
33737
+ synonyms: ["telefono", "chiamata"]
33738
+ },
33739
+ {
33740
+ key: "tablet",
33741
+ group: "device",
33742
+ synonyms: ["tablet", "ipad"]
33743
+ },
33744
+ {
33745
+ key: "laptop",
33746
+ group: "device",
33747
+ synonyms: [
33748
+ "portatile",
33749
+ "laptop",
33750
+ "notebook"
33751
+ ]
33752
+ },
33753
+ {
33754
+ key: "monitor",
33755
+ group: "device",
33756
+ synonyms: ["monitor", "schermo"]
33757
+ },
33758
+ {
33759
+ key: "tv",
33760
+ group: "device",
33761
+ synonyms: ["televisore", "tv"]
33762
+ },
33763
+ {
33764
+ key: "speaker",
33765
+ group: "device",
33766
+ synonyms: [
33767
+ "altoparlante",
33768
+ "cassa",
33769
+ "speaker"
33770
+ ]
33771
+ },
33772
+ {
33773
+ key: "printer",
33774
+ group: "device",
33775
+ synonyms: ["stampante"]
33776
+ },
33777
+ {
33778
+ key: "projector",
33779
+ group: "device",
33780
+ synonyms: ["proiettore"]
33781
+ },
33782
+ {
33783
+ key: "gamepad-2",
33784
+ group: "device",
33785
+ synonyms: [
33786
+ "console",
33787
+ "gioco",
33788
+ "joystick"
33789
+ ]
33790
+ },
33791
+ {
33792
+ key: "radio",
33793
+ group: "device",
33794
+ synonyms: ["radio"]
33795
+ },
33796
+ {
33797
+ key: "router",
33798
+ group: "device",
33799
+ synonyms: ["router", "modem"]
33800
+ },
33801
+ {
33802
+ key: "bluetooth",
33803
+ group: "device",
33804
+ synonyms: ["bluetooth"]
33805
+ },
33806
+ {
33807
+ key: "cpu",
33808
+ group: "device",
33809
+ synonyms: [
33810
+ "processore",
33811
+ "cpu",
33812
+ "chip",
33813
+ "dispositivo"
33814
+ ]
33815
+ },
33816
+ {
33817
+ key: "hard-drive",
33818
+ group: "device",
33819
+ synonyms: [
33820
+ "disco",
33821
+ "hdd",
33822
+ "archiviazione",
33823
+ "storage"
33824
+ ]
33825
+ },
33826
+ {
33827
+ key: "server",
33828
+ group: "device",
33829
+ synonyms: ["server", "nas"]
33830
+ },
33831
+ {
33832
+ key: "mic",
33833
+ group: "device",
33834
+ synonyms: ["microfono", "audio"]
33835
+ },
33836
+ {
33837
+ key: "mic-off",
33838
+ group: "device",
33839
+ synonyms: [
33840
+ "microfono",
33841
+ "spento",
33842
+ "muto"
33843
+ ]
33844
+ },
33845
+ {
33846
+ key: "video",
33847
+ group: "device",
33848
+ synonyms: ["video"]
33849
+ },
33850
+ {
33851
+ key: "video-off",
33852
+ group: "device",
33853
+ synonyms: ["video", "spento"]
33854
+ },
33855
+ {
33856
+ key: "music",
33857
+ group: "device",
33858
+ synonyms: ["musica"]
33859
+ },
33860
+ {
33861
+ key: "plug",
33862
+ group: "device",
33863
+ synonyms: [
33864
+ "presa",
33865
+ "spina",
33866
+ "plug"
33867
+ ]
33868
+ },
33869
+ {
33870
+ key: "plug-zap",
33871
+ group: "device",
33872
+ synonyms: ["presa", "alimentata"]
33873
+ },
33874
+ {
33875
+ key: "power",
33876
+ group: "device",
33877
+ synonyms: [
33878
+ "accensione",
33879
+ "alimentazione",
33880
+ "power"
33881
+ ]
33882
+ },
33883
+ {
33884
+ key: "power-off",
33885
+ group: "device",
33886
+ synonyms: ["spegnimento", "spento"]
33887
+ },
33888
+ {
33889
+ key: "cable",
33890
+ group: "device",
33891
+ synonyms: ["cavo"]
33892
+ },
33893
+ {
33894
+ key: "battery",
33895
+ group: "device",
33896
+ synonyms: ["batteria"]
33897
+ },
33898
+ {
33899
+ key: "battery-charging",
33900
+ group: "device",
33901
+ synonyms: [
33902
+ "batteria",
33903
+ "carica",
33904
+ "ricarica"
33905
+ ]
33906
+ },
33907
+ {
33908
+ key: "battery-full",
33909
+ group: "device",
33910
+ synonyms: [
33911
+ "batteria",
33912
+ "carica",
33913
+ "piena"
33914
+ ]
33915
+ },
33916
+ {
33917
+ key: "battery-low",
33918
+ group: "device",
33919
+ synonyms: ["batteria", "scarica"]
33920
+ },
33921
+ {
33922
+ key: "key",
33923
+ group: "device",
33924
+ synonyms: ["chiave"]
33925
+ },
33926
+ {
33927
+ key: "key-round",
33928
+ group: "device",
33929
+ synonyms: ["chiave", "tonda"]
33930
+ },
33931
+ {
33932
+ key: "mailbox",
33933
+ group: "device",
33934
+ synonyms: [
33935
+ "cassetta",
33936
+ "postale",
33937
+ "posta"
33938
+ ]
33939
+ },
33940
+ {
33941
+ key: "package",
33942
+ group: "device",
33943
+ synonyms: ["pacco", "consegna"]
33944
+ },
33945
+ {
33946
+ key: "shield",
33947
+ group: "device",
33948
+ synonyms: [
33949
+ "scudo",
33950
+ "protezione",
33951
+ "sicurezza",
33952
+ "allarme"
33953
+ ]
33954
+ },
33955
+ {
33956
+ key: "shield-check",
33957
+ group: "device",
33958
+ synonyms: [
33959
+ "protetto",
33960
+ "sicuro",
33961
+ "armato"
33962
+ ]
33963
+ },
33964
+ {
33965
+ key: "shield-off",
33966
+ group: "device",
33967
+ synonyms: [
33968
+ "protezione",
33969
+ "disattivata",
33970
+ "disarmato"
33971
+ ]
33972
+ },
33973
+ {
33974
+ key: "briefcase",
33975
+ group: "device",
33976
+ synonyms: [
33977
+ "ufficio",
33978
+ "lavoro",
33979
+ "valigetta",
33980
+ "studio"
33981
+ ]
33982
+ },
33983
+ {
33984
+ key: "lightbulb",
33985
+ group: "lighting",
33986
+ synonyms: [
33987
+ "luce",
33988
+ "lampadina",
33989
+ "lampada",
33990
+ "light"
33991
+ ]
33992
+ },
33993
+ {
33994
+ key: "lamp",
33995
+ group: "lighting",
33996
+ synonyms: ["lampada", "abatjour"]
33997
+ },
33998
+ {
33999
+ key: "lamp-ceiling",
34000
+ group: "lighting",
34001
+ synonyms: [
34002
+ "plafoniera",
34003
+ "lampadario",
34004
+ "luce",
34005
+ "soffitto"
34006
+ ]
34007
+ },
34008
+ {
34009
+ key: "lamp-desk",
34010
+ group: "lighting",
34011
+ synonyms: [
34012
+ "lampada",
34013
+ "scrivania",
34014
+ "abatjour"
34015
+ ]
34016
+ },
34017
+ {
34018
+ key: "lamp-floor",
34019
+ group: "lighting",
34020
+ synonyms: [
34021
+ "piantana",
34022
+ "lampada",
34023
+ "terra"
34024
+ ]
34025
+ },
34026
+ {
34027
+ key: "flashlight",
34028
+ group: "lighting",
34029
+ synonyms: [
34030
+ "faretto",
34031
+ "torcia",
34032
+ "spot",
34033
+ "faro"
34034
+ ]
34035
+ },
34036
+ {
34037
+ key: "heater",
34038
+ group: "lighting",
34039
+ synonyms: [
34040
+ "riscaldamento",
34041
+ "termosifone",
34042
+ "stufa",
34043
+ "calore"
34044
+ ]
34045
+ },
34046
+ {
34047
+ key: "snowflake",
34048
+ group: "lighting",
34049
+ synonyms: [
34050
+ "freddo",
34051
+ "raffrescamento",
34052
+ "aria",
34053
+ "condizionata",
34054
+ "neve"
34055
+ ]
34056
+ },
34057
+ {
34058
+ key: "thermometer-sun",
34059
+ group: "lighting",
34060
+ synonyms: [
34061
+ "caldo",
34062
+ "temperatura",
34063
+ "alta"
34064
+ ]
34065
+ },
34066
+ {
34067
+ key: "thermometer-snowflake",
34068
+ group: "lighting",
34069
+ synonyms: [
34070
+ "freddo",
34071
+ "temperatura",
34072
+ "bassa"
34073
+ ]
34074
+ },
34075
+ {
34076
+ key: "refrigerator",
34077
+ group: "lighting",
34078
+ synonyms: ["frigorifero", "frigo"]
34079
+ },
34080
+ {
34081
+ key: "microwave",
34082
+ group: "lighting",
34083
+ synonyms: ["microonde", "forno"]
34084
+ },
34085
+ {
34086
+ key: "washing-machine",
34087
+ group: "lighting",
34088
+ synonyms: [
34089
+ "lavatrice",
34090
+ "lavastoviglie",
34091
+ "asciugatrice"
34092
+ ]
34093
+ },
34094
+ {
34095
+ key: "cooking-pot",
34096
+ group: "lighting",
34097
+ synonyms: [
34098
+ "pentola",
34099
+ "cucina",
34100
+ "fornello"
34101
+ ]
34102
+ },
34103
+ {
34104
+ key: "utensils",
34105
+ group: "lighting",
34106
+ synonyms: [
34107
+ "cucina",
34108
+ "posate",
34109
+ "sala",
34110
+ "pranzo"
34111
+ ]
34112
+ },
34113
+ {
34114
+ key: "thermometer",
34115
+ group: "sensing",
34116
+ synonyms: [
34117
+ "temperatura",
34118
+ "termometro",
34119
+ "termostato"
34120
+ ]
34121
+ },
34122
+ {
34123
+ key: "droplets",
34124
+ group: "sensing",
34125
+ synonyms: [
34126
+ "umidita",
34127
+ "acqua",
34128
+ "allagamento",
34129
+ "perdita"
34130
+ ]
34131
+ },
34132
+ {
34133
+ key: "droplet",
34134
+ group: "sensing",
34135
+ synonyms: [
34136
+ "goccia",
34137
+ "acqua",
34138
+ "perdita",
34139
+ "allagamento"
34140
+ ]
34141
+ },
34142
+ {
34143
+ key: "gauge",
34144
+ group: "sensing",
34145
+ synonyms: [
34146
+ "misura",
34147
+ "livello",
34148
+ "pressione",
34149
+ "indicatore"
34150
+ ]
34151
+ },
34152
+ {
34153
+ key: "gauge2",
34154
+ group: "sensing",
34155
+ synonyms: [
34156
+ "misura",
34157
+ "livello",
34158
+ "pressione",
34159
+ "indicatore"
34160
+ ],
34161
+ aliasOf: "gauge"
34162
+ },
34163
+ {
34164
+ key: "sun",
34165
+ group: "sensing",
34166
+ synonyms: [
34167
+ "sole",
34168
+ "luminosita",
34169
+ "giorno",
34170
+ "esterno"
34171
+ ]
34172
+ },
34173
+ {
34174
+ key: "sun-medium",
34175
+ group: "sensing",
34176
+ synonyms: ["sole", "luminosita"]
34177
+ },
34178
+ {
34179
+ key: "sunrise",
34180
+ group: "sensing",
34181
+ synonyms: ["alba"]
34182
+ },
34183
+ {
34184
+ key: "moon",
34185
+ group: "sensing",
34186
+ synonyms: [
34187
+ "notte",
34188
+ "luna",
34189
+ "notturna",
34190
+ "nightvision"
34191
+ ]
34192
+ },
34193
+ {
34194
+ key: "wind",
34195
+ group: "sensing",
34196
+ synonyms: [
34197
+ "vento",
34198
+ "aria",
34199
+ "gas",
34200
+ "monossido",
34201
+ "co"
34202
+ ]
34203
+ },
34204
+ {
34205
+ key: "cloud",
34206
+ group: "sensing",
34207
+ synonyms: ["nuvola", "nuvoloso"]
34208
+ },
34209
+ {
34210
+ key: "cloud-rain",
34211
+ group: "sensing",
34212
+ synonyms: ["pioggia"]
34213
+ },
34214
+ {
34215
+ key: "cloud-sun",
34216
+ group: "sensing",
34217
+ synonyms: [
34218
+ "variabile",
34219
+ "sole",
34220
+ "nuvole"
34221
+ ]
34222
+ },
34223
+ {
34224
+ key: "waves",
34225
+ group: "sensing",
34226
+ synonyms: [
34227
+ "onde",
34228
+ "acqua",
34229
+ "vibrazione"
34230
+ ]
34231
+ },
34232
+ {
34233
+ key: "sprout",
34234
+ group: "sensing",
34235
+ synonyms: [
34236
+ "irrigazione",
34237
+ "pianta",
34238
+ "germoglio",
34239
+ "orto"
34240
+ ]
34241
+ },
34242
+ {
34243
+ key: "leaf",
34244
+ group: "sensing",
34245
+ synonyms: [
34246
+ "foglia",
34247
+ "pianta",
34248
+ "verde"
34249
+ ]
34250
+ },
34251
+ {
34252
+ key: "flower",
34253
+ group: "sensing",
34254
+ synonyms: ["fiore", "pianta"]
34255
+ },
34256
+ {
34257
+ key: "zap",
34258
+ group: "sensing",
34259
+ synonyms: [
34260
+ "energia",
34261
+ "corrente",
34262
+ "consumo",
34263
+ "watt",
34264
+ "elettricita"
34265
+ ]
34266
+ },
34267
+ {
34268
+ key: "flame",
34269
+ group: "sensing",
34270
+ synonyms: [
34271
+ "fiamma",
34272
+ "gas",
34273
+ "fuoco",
34274
+ "incendio"
34275
+ ]
34276
+ },
34277
+ {
34278
+ key: "bell",
34279
+ group: "sensing",
34280
+ synonyms: [
34281
+ "campanello",
34282
+ "suoneria",
34283
+ "notifica",
34284
+ "bell",
34285
+ "chime"
34286
+ ]
34287
+ },
34288
+ {
34289
+ key: "bell-ring",
34290
+ group: "sensing",
34291
+ synonyms: [
34292
+ "campanello",
34293
+ "suona",
34294
+ "doorbell",
34295
+ "notifica"
34296
+ ]
34297
+ },
34298
+ {
34299
+ key: "bell-off",
34300
+ group: "sensing",
34301
+ synonyms: [
34302
+ "silenzioso",
34303
+ "notifiche",
34304
+ "disattivate",
34305
+ "muto"
34306
+ ]
34307
+ },
34308
+ {
34309
+ key: "siren",
34310
+ group: "sensing",
34311
+ synonyms: ["sirena", "allarme"]
34312
+ },
34313
+ {
34314
+ key: "radar",
34315
+ group: "sensing",
34316
+ synonyms: [
34317
+ "movimento",
34318
+ "presenza",
34319
+ "pir",
34320
+ "rilevamento",
34321
+ "radar"
34322
+ ]
34323
+ },
34324
+ {
34325
+ key: "activity",
34326
+ group: "sensing",
34327
+ synonyms: [
34328
+ "attivita",
34329
+ "sensore",
34330
+ "generico"
34331
+ ]
34332
+ },
34333
+ {
34334
+ key: "hash",
34335
+ group: "sensing",
34336
+ synonyms: [
34337
+ "numero",
34338
+ "contatore",
34339
+ "valore"
34340
+ ]
34341
+ },
34342
+ {
34343
+ key: "clock",
34344
+ group: "sensing",
34345
+ synonyms: [
34346
+ "orologio",
34347
+ "ora",
34348
+ "tempo"
34349
+ ]
34350
+ },
34351
+ {
34352
+ key: "timer",
34353
+ group: "sensing",
34354
+ synonyms: [
34355
+ "timer",
34356
+ "conto",
34357
+ "rovescia"
34358
+ ]
34359
+ },
34360
+ {
34361
+ key: "calendar",
34362
+ group: "sensing",
34363
+ synonyms: [
34364
+ "calendario",
34365
+ "data",
34366
+ "pianificazione"
34367
+ ]
34368
+ },
34369
+ {
34370
+ key: "pipette",
34371
+ group: "sensing",
34372
+ synonyms: [
34373
+ "qualita",
34374
+ "aria",
34375
+ "misura",
34376
+ "campione"
34377
+ ]
34378
+ },
34379
+ {
34380
+ key: "fan",
34381
+ group: "sensing",
34382
+ synonyms: [
34383
+ "ventilatore",
34384
+ "ventola",
34385
+ "aria"
34386
+ ]
34387
+ },
34388
+ {
34389
+ key: "bath",
34390
+ group: "sensing",
34391
+ synonyms: [
34392
+ "bagno",
34393
+ "vasca",
34394
+ "doccia"
34395
+ ]
34396
+ },
34397
+ {
34398
+ key: "footprints",
34399
+ group: "sensing",
34400
+ synonyms: [
34401
+ "movimento",
34402
+ "passi",
34403
+ "presenza",
34404
+ "motion"
34405
+ ]
34406
+ },
34407
+ {
34408
+ key: "alarm-smoke",
34409
+ group: "sensing",
34410
+ synonyms: [
34411
+ "fumo",
34412
+ "antincendio",
34413
+ "rilevatore"
34414
+ ]
34415
+ },
34416
+ {
34417
+ key: "shield-alert",
34418
+ group: "sensing",
34419
+ synonyms: [
34420
+ "manomissione",
34421
+ "allarme",
34422
+ "tamper",
34423
+ "avviso"
34424
+ ]
34425
+ },
34426
+ {
34427
+ key: "vibrate",
34428
+ group: "sensing",
34429
+ synonyms: [
34430
+ "vibrazione",
34431
+ "urto",
34432
+ "tamper"
34433
+ ]
34434
+ },
34435
+ {
34436
+ key: "wifi",
34437
+ group: "sensing",
34438
+ synonyms: [
34439
+ "wifi",
34440
+ "rete",
34441
+ "segnale"
34442
+ ]
34443
+ },
34444
+ {
34445
+ key: "wifi-off",
34446
+ group: "sensing",
34447
+ synonyms: [
34448
+ "wifi",
34449
+ "assente",
34450
+ "offline",
34451
+ "disconnesso"
34452
+ ]
34453
+ },
34454
+ {
34455
+ key: "volume-2",
34456
+ group: "sensing",
34457
+ synonyms: [
34458
+ "volume",
34459
+ "audio",
34460
+ "altoparlante",
34461
+ "suono"
34462
+ ]
34463
+ },
34464
+ {
34465
+ key: "volume-x",
34466
+ group: "sensing",
34467
+ synonyms: [
34468
+ "muto",
34469
+ "silenziato",
34470
+ "volume",
34471
+ "spento"
34472
+ ]
34473
+ },
34474
+ {
34475
+ key: "heart",
34476
+ group: "sensing",
34477
+ synonyms: [
34478
+ "cuore",
34479
+ "preferito",
34480
+ "salute"
34481
+ ]
34482
+ },
34483
+ {
34484
+ key: "heart-pulse",
34485
+ group: "sensing",
34486
+ synonyms: [
34487
+ "battito",
34488
+ "salute",
34489
+ "monitoraggio"
34490
+ ]
34491
+ },
34492
+ {
34493
+ key: "star",
34494
+ group: "sensing",
34495
+ synonyms: [
34496
+ "preferito",
34497
+ "stella",
34498
+ "importante"
34499
+ ]
34500
+ },
34501
+ {
34502
+ key: "sparkles",
34503
+ group: "sensing",
34504
+ synonyms: [
34505
+ "automatico",
34506
+ "intelligente",
34507
+ "ai",
34508
+ "scena"
34509
+ ]
34510
+ },
34511
+ {
34512
+ key: "house",
34513
+ group: "place",
34514
+ synonyms: [
34515
+ "casa",
34516
+ "abitazione",
34517
+ "home"
34518
+ ]
34519
+ },
34520
+ {
34521
+ key: "sofa",
34522
+ group: "place",
34523
+ synonyms: [
34524
+ "salone",
34525
+ "soggiorno",
34526
+ "divano",
34527
+ "living"
34528
+ ]
34529
+ },
34530
+ {
34531
+ key: "bed-double",
34532
+ group: "place",
34533
+ synonyms: [
34534
+ "camera",
34535
+ "letto",
34536
+ "matrimoniale"
34537
+ ]
34538
+ },
34539
+ {
34540
+ key: "bed",
34541
+ group: "place",
34542
+ synonyms: [
34543
+ "cameretta",
34544
+ "letto",
34545
+ "singolo"
34546
+ ]
34547
+ },
34548
+ {
34549
+ key: "warehouse",
34550
+ group: "place",
34551
+ synonyms: [
34552
+ "magazzino",
34553
+ "capanno",
34554
+ "deposito",
34555
+ "cantina"
34556
+ ]
34557
+ },
34558
+ {
34559
+ key: "trees",
34560
+ group: "place",
34561
+ synonyms: [
34562
+ "giardino",
34563
+ "alberi",
34564
+ "esterno",
34565
+ "parco"
34566
+ ]
34567
+ },
34568
+ {
34569
+ key: "tree-pine",
34570
+ group: "place",
34571
+ synonyms: [
34572
+ "albero",
34573
+ "pino",
34574
+ "giardino"
34575
+ ]
34576
+ },
34577
+ {
34578
+ key: "fence",
34579
+ group: "place",
34580
+ synonyms: [
34581
+ "recinto",
34582
+ "cancello",
34583
+ "staccionata",
34584
+ "perimetro"
34585
+ ]
34586
+ },
34587
+ {
34588
+ key: "store",
34589
+ group: "place",
34590
+ synonyms: [
34591
+ "negozio",
34592
+ "ingresso",
34593
+ "vetrina"
34594
+ ]
34595
+ },
34596
+ {
34597
+ key: "building",
34598
+ group: "place",
34599
+ synonyms: ["edificio", "palazzo"]
34600
+ },
34601
+ {
34602
+ key: "building-2",
34603
+ group: "place",
34604
+ synonyms: [
34605
+ "edificio",
34606
+ "uffici",
34607
+ "condominio"
34608
+ ]
34609
+ },
34610
+ {
34611
+ key: "mountain",
34612
+ group: "place",
34613
+ synonyms: [
34614
+ "montagna",
34615
+ "esterno",
34616
+ "panorama"
34617
+ ]
34618
+ },
34619
+ {
34620
+ key: "umbrella",
34621
+ group: "place",
34622
+ synonyms: [
34623
+ "tenda",
34624
+ "markise",
34625
+ "ombrellone",
34626
+ "pergola",
34627
+ "veranda"
34628
+ ]
34629
+ },
34630
+ {
34631
+ key: "dumbbell",
34632
+ group: "place",
34633
+ synonyms: ["palestra", "attrezzi"]
34634
+ },
34635
+ {
34636
+ key: "wrench",
34637
+ group: "place",
34638
+ synonyms: [
34639
+ "officina",
34640
+ "manutenzione",
34641
+ "attrezzi",
34642
+ "utenze"
34643
+ ]
34644
+ },
34645
+ {
34646
+ key: "hammer",
34647
+ group: "place",
34648
+ synonyms: [
34649
+ "officina",
34650
+ "martello",
34651
+ "lavori"
34652
+ ]
34653
+ },
34654
+ {
34655
+ key: "drill",
34656
+ group: "place",
34657
+ synonyms: [
34658
+ "officina",
34659
+ "trapano",
34660
+ "lavori"
34661
+ ]
34662
+ },
34663
+ {
34664
+ key: "waves-ladder",
34665
+ group: "place",
34666
+ synonyms: ["piscina", "vasca"]
34667
+ },
34668
+ {
34669
+ key: "circle-parking",
34670
+ group: "place",
34671
+ synonyms: [
34672
+ "parcheggio",
34673
+ "posto",
34674
+ "auto",
34675
+ "garage"
34676
+ ]
34677
+ },
34678
+ {
34679
+ key: "route",
34680
+ group: "place",
34681
+ synonyms: [
34682
+ "percorso",
34683
+ "strada",
34684
+ "vialetto",
34685
+ "tragitto"
34686
+ ]
34687
+ },
34688
+ {
34689
+ key: "car",
34690
+ group: "life",
34691
+ synonyms: [
34692
+ "auto",
34693
+ "macchina",
34694
+ "veicolo",
34695
+ "parcheggio"
34696
+ ]
34697
+ },
34698
+ {
34699
+ key: "bike",
34700
+ group: "life",
34701
+ synonyms: [
34702
+ "bicicletta",
34703
+ "bici",
34704
+ "moto"
34705
+ ]
34706
+ },
34707
+ {
34708
+ key: "bus",
34709
+ group: "life",
34710
+ synonyms: ["autobus", "pullman"]
34711
+ },
34712
+ {
34713
+ key: "truck",
34714
+ group: "life",
34715
+ synonyms: [
34716
+ "camion",
34717
+ "furgone",
34718
+ "consegna"
34719
+ ]
34720
+ },
34721
+ {
34722
+ key: "plane",
34723
+ group: "life",
34724
+ synonyms: ["aereo"]
34725
+ },
34726
+ {
34727
+ key: "train-front",
34728
+ group: "life",
34729
+ synonyms: ["treno"]
34730
+ },
34731
+ {
34732
+ key: "sailboat",
34733
+ group: "life",
34734
+ synonyms: ["barca", "imbarcazione"]
34735
+ },
34736
+ {
34737
+ key: "dog",
34738
+ group: "life",
34739
+ synonyms: ["cane", "animale"]
34740
+ },
34741
+ {
34742
+ key: "cat",
34743
+ group: "life",
34744
+ synonyms: ["gatto", "animale"]
34745
+ },
34746
+ {
34747
+ key: "bird",
34748
+ group: "life",
34749
+ synonyms: ["uccello", "animale"]
34750
+ },
34751
+ {
34752
+ key: "paw-print",
34753
+ group: "life",
34754
+ synonyms: [
34755
+ "animale",
34756
+ "zampa",
34757
+ "pet"
34758
+ ]
34759
+ },
34760
+ {
34761
+ key: "baby",
34762
+ group: "life",
34763
+ synonyms: [
34764
+ "neonato",
34765
+ "bimbo",
34766
+ "cameretta",
34767
+ "babymonitor"
34768
+ ]
34769
+ },
34770
+ {
34771
+ key: "user",
34772
+ group: "life",
34773
+ synonyms: ["persona", "utente"]
34774
+ },
34775
+ {
34776
+ key: "users",
34777
+ group: "life",
34778
+ synonyms: [
34779
+ "persone",
34780
+ "gruppo",
34781
+ "famiglia"
34782
+ ]
34783
+ },
34784
+ {
34785
+ key: "person-standing",
34786
+ group: "life",
34787
+ synonyms: [
34788
+ "persona",
34789
+ "piedi",
34790
+ "presenza"
34791
+ ]
34792
+ }
34793
+ ];
34794
+ DISPLAY_ICON_VOCABULARY.map((e) => e.key);
34795
+ DISPLAY_ICON_VOCABULARY.filter((e) => e.aliasOf === void 0).map((e) => e.key);
34796
+ new Map(DISPLAY_ICON_VOCABULARY.map((e) => [e.key, e]));
32953
34797
  Object.freeze({
34798
+ "accessories.getStatus": {
34799
+ capName: "accessories",
34800
+ capScope: "device",
34801
+ addonId: null,
34802
+ access: "view"
34803
+ },
32954
34804
  "accessories.setChildHidden": {
32955
34805
  capName: "accessories",
32956
34806
  capScope: "device",
@@ -33233,6 +35083,12 @@ Object.freeze({
33233
35083
  addonId: null,
33234
35084
  access: "view"
33235
35085
  },
35086
+ "airQualitySensor.getStatus": {
35087
+ capName: "air-quality-sensor",
35088
+ capScope: "device",
35089
+ addonId: null,
35090
+ access: "view"
35091
+ },
33236
35092
  "alarmPanel.arm": {
33237
35093
  capName: "alarm-panel",
33238
35094
  capScope: "device",
@@ -33245,6 +35101,12 @@ Object.freeze({
33245
35101
  addonId: null,
33246
35102
  access: "create"
33247
35103
  },
35104
+ "alarmPanel.getStatus": {
35105
+ capName: "alarm-panel",
35106
+ capScope: "device",
35107
+ addonId: null,
35108
+ access: "view"
35109
+ },
33248
35110
  "alarmPanel.trigger": {
33249
35111
  capName: "alarm-panel",
33250
35112
  capScope: "device",
@@ -33293,6 +35155,30 @@ Object.freeze({
33293
35155
  addonId: null,
33294
35156
  access: "create"
33295
35157
  },
35158
+ "ambientLightSensor.getStatus": {
35159
+ capName: "ambient-light-sensor",
35160
+ capScope: "device",
35161
+ addonId: null,
35162
+ access: "view"
35163
+ },
35164
+ "audioAnalysis.applyDeviceSettingsPatch": {
35165
+ capName: "audio-analysis",
35166
+ capScope: "device",
35167
+ addonId: null,
35168
+ access: "create"
35169
+ },
35170
+ "audioAnalysis.getDeviceLiveContribution": {
35171
+ capName: "audio-analysis",
35172
+ capScope: "device",
35173
+ addonId: null,
35174
+ access: "view"
35175
+ },
35176
+ "audioAnalysis.getDeviceSettingsContribution": {
35177
+ capName: "audio-analysis",
35178
+ capScope: "device",
35179
+ addonId: null,
35180
+ access: "view"
35181
+ },
33296
35182
  "audioAnalysis.resolveDeviceSettings": {
33297
35183
  capName: "audio-analysis",
33298
35184
  capScope: "device",
@@ -33455,6 +35341,12 @@ Object.freeze({
33455
35341
  addonId: null,
33456
35342
  access: "create"
33457
35343
  },
35344
+ "automationControl.getStatus": {
35345
+ capName: "automation-control",
35346
+ capScope: "device",
35347
+ addonId: null,
35348
+ access: "view"
35349
+ },
33458
35350
  "automationControl.trigger": {
33459
35351
  capName: "automation-control",
33460
35352
  capScope: "device",
@@ -33551,12 +35443,30 @@ Object.freeze({
33551
35443
  addonId: null,
33552
35444
  access: "create"
33553
35445
  },
35446
+ "battery.getStatus": {
35447
+ capName: "battery",
35448
+ capScope: "device",
35449
+ addonId: null,
35450
+ access: "view"
35451
+ },
33554
35452
  "battery.wakeForStream": {
33555
35453
  capName: "battery",
33556
35454
  capScope: "device",
33557
35455
  addonId: null,
33558
35456
  access: "create"
33559
35457
  },
35458
+ "binary.getStatus": {
35459
+ capName: "binary",
35460
+ capScope: "device",
35461
+ addonId: null,
35462
+ access: "view"
35463
+ },
35464
+ "brightness.getStatus": {
35465
+ capName: "brightness",
35466
+ capScope: "device",
35467
+ addonId: null,
35468
+ access: "view"
35469
+ },
33560
35470
  "brightness.setBrightness": {
33561
35471
  capName: "brightness",
33562
35472
  capScope: "device",
@@ -33671,6 +35581,30 @@ Object.freeze({
33671
35581
  addonId: null,
33672
35582
  access: "view"
33673
35583
  },
35584
+ "cameraCredentials.getStatus": {
35585
+ capName: "camera-credentials",
35586
+ capScope: "device",
35587
+ addonId: null,
35588
+ access: "view"
35589
+ },
35590
+ "cameraGridLayout.applyDeviceSettingsPatch": {
35591
+ capName: "camera-grid-layout",
35592
+ capScope: "device",
35593
+ addonId: null,
35594
+ access: "create"
35595
+ },
35596
+ "cameraGridLayout.getDeviceLiveContribution": {
35597
+ capName: "camera-grid-layout",
35598
+ capScope: "device",
35599
+ addonId: null,
35600
+ access: "view"
35601
+ },
35602
+ "cameraGridLayout.getDeviceSettingsContribution": {
35603
+ capName: "camera-grid-layout",
35604
+ capScope: "device",
35605
+ addonId: null,
35606
+ access: "view"
35607
+ },
33674
35608
  "cameraGridLayout.getLayout": {
33675
35609
  capName: "camera-grid-layout",
33676
35610
  capScope: "device",
@@ -33683,6 +35617,24 @@ Object.freeze({
33683
35617
  addonId: null,
33684
35618
  access: "create"
33685
35619
  },
35620
+ "cameraPipelineConfig.applyDeviceSettingsPatch": {
35621
+ capName: "camera-pipeline-config",
35622
+ capScope: "device",
35623
+ addonId: null,
35624
+ access: "create"
35625
+ },
35626
+ "cameraPipelineConfig.getDeviceLiveContribution": {
35627
+ capName: "camera-pipeline-config",
35628
+ capScope: "device",
35629
+ addonId: null,
35630
+ access: "view"
35631
+ },
35632
+ "cameraPipelineConfig.getDeviceSettingsContribution": {
35633
+ capName: "camera-pipeline-config",
35634
+ capScope: "device",
35635
+ addonId: null,
35636
+ access: "view"
35637
+ },
33686
35638
  "cameraStreams.getBrokerStreams": {
33687
35639
  capName: "camera-streams",
33688
35640
  capScope: "device",
@@ -33713,6 +35665,18 @@ Object.freeze({
33713
35665
  addonId: null,
33714
35666
  access: "view"
33715
35667
  },
35668
+ "carbonMonoxide.getStatus": {
35669
+ capName: "carbon-monoxide",
35670
+ capScope: "device",
35671
+ addonId: null,
35672
+ access: "view"
35673
+ },
35674
+ "climateControl.getStatus": {
35675
+ capName: "climate-control",
35676
+ capScope: "device",
35677
+ addonId: null,
35678
+ access: "view"
35679
+ },
33716
35680
  "climateControl.setFanMode": {
33717
35681
  capName: "climate-control",
33718
35682
  capScope: "device",
@@ -33761,6 +35725,12 @@ Object.freeze({
33761
35725
  addonId: null,
33762
35726
  access: "create"
33763
35727
  },
35728
+ "color.getStatus": {
35729
+ capName: "color",
35730
+ capScope: "device",
35731
+ addonId: null,
35732
+ access: "view"
35733
+ },
33764
35734
  "color.setColor": {
33765
35735
  capName: "color",
33766
35736
  capScope: "device",
@@ -33779,12 +35749,36 @@ Object.freeze({
33779
35749
  addonId: null,
33780
35750
  access: "create"
33781
35751
  },
35752
+ "connectivity.getStatus": {
35753
+ capName: "connectivity",
35754
+ capScope: "device",
35755
+ addonId: null,
35756
+ access: "view"
35757
+ },
35758
+ "consumables.getStatus": {
35759
+ capName: "consumables",
35760
+ capScope: "device",
35761
+ addonId: null,
35762
+ access: "view"
35763
+ },
33782
35764
  "consumables.reset": {
33783
35765
  capName: "consumables",
33784
35766
  capScope: "device",
33785
35767
  addonId: null,
33786
35768
  access: "delete"
33787
35769
  },
35770
+ "contact.getStatus": {
35771
+ capName: "contact",
35772
+ capScope: "device",
35773
+ addonId: null,
35774
+ access: "view"
35775
+ },
35776
+ "control.getStatus": {
35777
+ capName: "control",
35778
+ capScope: "device",
35779
+ addonId: null,
35780
+ access: "view"
35781
+ },
33788
35782
  "control.setValue": {
33789
35783
  capName: "control",
33790
35784
  capScope: "device",
@@ -33851,6 +35845,12 @@ Object.freeze({
33851
35845
  addonId: null,
33852
35846
  access: "create"
33853
35847
  },
35848
+ "cover.getStatus": {
35849
+ capName: "cover",
35850
+ capScope: "device",
35851
+ addonId: null,
35852
+ access: "view"
35853
+ },
33854
35854
  "cover.open": {
33855
35855
  capName: "cover",
33856
35856
  capScope: "device",
@@ -33983,6 +35983,12 @@ Object.freeze({
33983
35983
  addonId: null,
33984
35984
  access: "view"
33985
35985
  },
35986
+ "dayNight.getStatus": {
35987
+ capName: "day-night",
35988
+ capScope: "device",
35989
+ addonId: null,
35990
+ access: "view"
35991
+ },
33986
35992
  "dayNight.setSettings": {
33987
35993
  capName: "day-night",
33988
35994
  capScope: "device",
@@ -34073,6 +36079,30 @@ Object.freeze({
34073
36079
  addonId: null,
34074
36080
  access: "view"
34075
36081
  },
36082
+ "detectionPipeline.applyDeviceSettingsPatch": {
36083
+ capName: "detection-pipeline",
36084
+ capScope: "device",
36085
+ addonId: null,
36086
+ access: "create"
36087
+ },
36088
+ "detectionPipeline.getDeviceLiveContribution": {
36089
+ capName: "detection-pipeline",
36090
+ capScope: "device",
36091
+ addonId: null,
36092
+ access: "view"
36093
+ },
36094
+ "detectionPipeline.getDeviceSettingsContribution": {
36095
+ capName: "detection-pipeline",
36096
+ capScope: "device",
36097
+ addonId: null,
36098
+ access: "view"
36099
+ },
36100
+ "deviceAdminLink.getAdminLink": {
36101
+ capName: "device-admin-link",
36102
+ capScope: "device",
36103
+ addonId: null,
36104
+ access: "view"
36105
+ },
34076
36106
  "deviceAdoption.adopt": {
34077
36107
  capName: "device-adoption",
34078
36108
  capScope: "system",
@@ -34085,6 +36115,12 @@ Object.freeze({
34085
36115
  addonId: null,
34086
36116
  access: "view"
34087
36117
  },
36118
+ "deviceAdoption.getStatus": {
36119
+ capName: "device-adoption",
36120
+ capScope: "system",
36121
+ addonId: null,
36122
+ access: "view"
36123
+ },
34088
36124
  "deviceAdoption.listCandidateFilters": {
34089
36125
  capName: "device-adoption",
34090
36126
  capScope: "system",
@@ -34121,6 +36157,12 @@ Object.freeze({
34121
36157
  addonId: null,
34122
36158
  access: "create"
34123
36159
  },
36160
+ "deviceDiscovery.getStatus": {
36161
+ capName: "device-discovery",
36162
+ capScope: "device",
36163
+ addonId: null,
36164
+ access: "view"
36165
+ },
34124
36166
  "deviceDiscovery.listDiscovered": {
34125
36167
  capName: "device-discovery",
34126
36168
  capScope: "device",
@@ -34139,12 +36181,30 @@ Object.freeze({
34139
36181
  addonId: null,
34140
36182
  access: "create"
34141
36183
  },
36184
+ "deviceExport.applyDeviceSettingsPatch": {
36185
+ capName: "device-export",
36186
+ capScope: "system",
36187
+ addonId: null,
36188
+ access: "create"
36189
+ },
34142
36190
  "deviceExport.exposeDevice": {
34143
36191
  capName: "device-export",
34144
36192
  capScope: "system",
34145
36193
  addonId: null,
34146
36194
  access: "create"
34147
36195
  },
36196
+ "deviceExport.getDeviceLiveContribution": {
36197
+ capName: "device-export",
36198
+ capScope: "system",
36199
+ addonId: null,
36200
+ access: "view"
36201
+ },
36202
+ "deviceExport.getDeviceSettingsContribution": {
36203
+ capName: "device-export",
36204
+ capScope: "system",
36205
+ addonId: null,
36206
+ access: "view"
36207
+ },
34148
36208
  "deviceExport.getStatus": {
34149
36209
  capName: "device-export",
34150
36210
  capScope: "system",
@@ -34241,6 +36301,12 @@ Object.freeze({
34241
36301
  addonId: null,
34242
36302
  access: "create"
34243
36303
  },
36304
+ "deviceManager.applyDeviceSettingsPatch": {
36305
+ capName: "device-manager",
36306
+ capScope: "system",
36307
+ addonId: null,
36308
+ access: "create"
36309
+ },
34244
36310
  "deviceManager.applyInitialMeta": {
34245
36311
  capName: "device-manager",
34246
36312
  capScope: "system",
@@ -34343,6 +36409,12 @@ Object.freeze({
34343
36409
  addonId: null,
34344
36410
  access: "view"
34345
36411
  },
36412
+ "deviceManager.getDeviceLiveContribution": {
36413
+ capName: "device-manager",
36414
+ capScope: "system",
36415
+ addonId: null,
36416
+ access: "view"
36417
+ },
34346
36418
  "deviceManager.getDeviceLiveInfoAggregate": {
34347
36419
  capName: "device-manager",
34348
36420
  capScope: "system",
@@ -34355,6 +36427,12 @@ Object.freeze({
34355
36427
  addonId: null,
34356
36428
  access: "view"
34357
36429
  },
36430
+ "deviceManager.getDeviceSettingsContribution": {
36431
+ capName: "device-manager",
36432
+ capScope: "system",
36433
+ addonId: null,
36434
+ access: "view"
36435
+ },
34358
36436
  "deviceManager.getDeviceStatusAggregate": {
34359
36437
  capName: "device-manager",
34360
36438
  capScope: "system",
@@ -34847,6 +36925,36 @@ Object.freeze({
34847
36925
  addonId: null,
34848
36926
  access: "create"
34849
36927
  },
36928
+ "deviceStatus.getStatus": {
36929
+ capName: "device-status",
36930
+ capScope: "device",
36931
+ addonId: null,
36932
+ access: "view"
36933
+ },
36934
+ "doorbell.applyDeviceSettingsPatch": {
36935
+ capName: "doorbell",
36936
+ capScope: "device",
36937
+ addonId: null,
36938
+ access: "create"
36939
+ },
36940
+ "doorbell.getDeviceLiveContribution": {
36941
+ capName: "doorbell",
36942
+ capScope: "device",
36943
+ addonId: null,
36944
+ access: "view"
36945
+ },
36946
+ "doorbell.getDeviceSettingsContribution": {
36947
+ capName: "doorbell",
36948
+ capScope: "device",
36949
+ addonId: null,
36950
+ access: "view"
36951
+ },
36952
+ "doorbell.getStatus": {
36953
+ capName: "doorbell",
36954
+ capScope: "device",
36955
+ addonId: null,
36956
+ access: "view"
36957
+ },
34850
36958
  "embeddingEncoder.encode": {
34851
36959
  capName: "embedding-encoder",
34852
36960
  capScope: "system",
@@ -34865,6 +36973,18 @@ Object.freeze({
34865
36973
  addonId: null,
34866
36974
  access: "view"
34867
36975
  },
36976
+ "enumSensor.getStatus": {
36977
+ capName: "enum-sensor",
36978
+ capScope: "device",
36979
+ addonId: null,
36980
+ access: "view"
36981
+ },
36982
+ "eventEmitter.getStatus": {
36983
+ capName: "event-emitter",
36984
+ capScope: "device",
36985
+ addonId: null,
36986
+ access: "view"
36987
+ },
34868
36988
  "events.getEventClipUrl": {
34869
36989
  capName: "events",
34870
36990
  capScope: "device",
@@ -34985,6 +37105,12 @@ Object.freeze({
34985
37105
  addonId: null,
34986
37106
  access: "view"
34987
37107
  },
37108
+ "fanControl.getStatus": {
37109
+ capName: "fan-control",
37110
+ capScope: "device",
37111
+ addonId: null,
37112
+ access: "view"
37113
+ },
34988
37114
  "fanControl.setDirection": {
34989
37115
  capName: "fan-control",
34990
37116
  capScope: "device",
@@ -35009,6 +37135,12 @@ Object.freeze({
35009
37135
  addonId: null,
35010
37136
  access: "create"
35011
37137
  },
37138
+ "featureProbe.getStatus": {
37139
+ capName: "feature-probe",
37140
+ capScope: "device",
37141
+ addonId: null,
37142
+ access: "view"
37143
+ },
35012
37144
  "filesystemBrowse.browse": {
35013
37145
  capName: "filesystem-browse",
35014
37146
  capScope: "system",
@@ -35027,6 +37159,24 @@ Object.freeze({
35027
37159
  addonId: null,
35028
37160
  access: "view"
35029
37161
  },
37162
+ "flood.getStatus": {
37163
+ capName: "flood",
37164
+ capScope: "device",
37165
+ addonId: null,
37166
+ access: "view"
37167
+ },
37168
+ "gas.getStatus": {
37169
+ capName: "gas",
37170
+ capScope: "device",
37171
+ addonId: null,
37172
+ access: "view"
37173
+ },
37174
+ "humidifier.getStatus": {
37175
+ capName: "humidifier",
37176
+ capScope: "device",
37177
+ addonId: null,
37178
+ access: "view"
37179
+ },
35030
37180
  "humidifier.setMode": {
35031
37181
  capName: "humidifier",
35032
37182
  capScope: "device",
@@ -35045,12 +37195,30 @@ Object.freeze({
35045
37195
  addonId: null,
35046
37196
  access: "create"
35047
37197
  },
37198
+ "humiditySensor.getStatus": {
37199
+ capName: "humidity-sensor",
37200
+ capScope: "device",
37201
+ addonId: null,
37202
+ access: "view"
37203
+ },
37204
+ "image.getStatus": {
37205
+ capName: "image",
37206
+ capScope: "device",
37207
+ addonId: null,
37208
+ access: "view"
37209
+ },
35048
37210
  "imageSettings.getOptions": {
35049
37211
  capName: "image-settings",
35050
37212
  capScope: "device",
35051
37213
  addonId: null,
35052
37214
  access: "view"
35053
37215
  },
37216
+ "imageSettings.getStatus": {
37217
+ capName: "image-settings",
37218
+ capScope: "device",
37219
+ addonId: null,
37220
+ access: "view"
37221
+ },
35054
37222
  "imageSettings.setSettings": {
35055
37223
  capName: "image-settings",
35056
37224
  capScope: "device",
@@ -35123,6 +37291,12 @@ Object.freeze({
35123
37291
  addonId: null,
35124
37292
  access: "create"
35125
37293
  },
37294
+ "intercom.getStatus": {
37295
+ capName: "intercom",
37296
+ capScope: "device",
37297
+ addonId: null,
37298
+ access: "view"
37299
+ },
35126
37300
  "intercom.handleAnswer": {
35127
37301
  capName: "intercom",
35128
37302
  capScope: "device",
@@ -35159,6 +37333,12 @@ Object.freeze({
35159
37333
  addonId: null,
35160
37334
  access: "create"
35161
37335
  },
37336
+ "lawnMowerControl.getStatus": {
37337
+ capName: "lawn-mower-control",
37338
+ capScope: "device",
37339
+ addonId: null,
37340
+ access: "view"
37341
+ },
35162
37342
  "lawnMowerControl.pause": {
35163
37343
  capName: "lawn-mower-control",
35164
37344
  capScope: "device",
@@ -35441,6 +37621,12 @@ Object.freeze({
35441
37621
  addonId: null,
35442
37622
  access: "create"
35443
37623
  },
37624
+ "lockControl.getStatus": {
37625
+ capName: "lock-control",
37626
+ capScope: "device",
37627
+ addonId: null,
37628
+ access: "view"
37629
+ },
35444
37630
  "lockControl.lock": {
35445
37631
  capName: "lock-control",
35446
37632
  capScope: "device",
@@ -35489,6 +37675,12 @@ Object.freeze({
35489
37675
  addonId: null,
35490
37676
  access: "view"
35491
37677
  },
37678
+ "mediaPlayer.getStatus": {
37679
+ capName: "media-player",
37680
+ capScope: "device",
37681
+ addonId: null,
37682
+ access: "view"
37683
+ },
35492
37684
  "mediaPlayer.next": {
35493
37685
  capName: "media-player",
35494
37686
  capScope: "device",
@@ -35681,6 +37873,12 @@ Object.freeze({
35681
37873
  addonId: null,
35682
37874
  access: "create"
35683
37875
  },
37876
+ "motion.getStatus": {
37877
+ capName: "motion",
37878
+ capScope: "device",
37879
+ addonId: null,
37880
+ access: "view"
37881
+ },
35684
37882
  "motion.isDetected": {
35685
37883
  capName: "motion",
35686
37884
  capScope: "device",
@@ -35693,6 +37891,24 @@ Object.freeze({
35693
37891
  addonId: null,
35694
37892
  access: "create"
35695
37893
  },
37894
+ "motionDetection.applyDeviceSettingsPatch": {
37895
+ capName: "motion-detection",
37896
+ capScope: "device",
37897
+ addonId: null,
37898
+ access: "create"
37899
+ },
37900
+ "motionDetection.getDeviceLiveContribution": {
37901
+ capName: "motion-detection",
37902
+ capScope: "device",
37903
+ addonId: null,
37904
+ access: "view"
37905
+ },
37906
+ "motionDetection.getDeviceSettingsContribution": {
37907
+ capName: "motion-detection",
37908
+ capScope: "device",
37909
+ addonId: null,
37910
+ access: "view"
37911
+ },
35696
37912
  "motionDetection.removeCamera": {
35697
37913
  capName: "motion-detection",
35698
37914
  capScope: "device",
@@ -35705,6 +37921,12 @@ Object.freeze({
35705
37921
  addonId: null,
35706
37922
  access: "delete"
35707
37923
  },
37924
+ "motionTrigger.getStatus": {
37925
+ capName: "motion-trigger",
37926
+ capScope: "device",
37927
+ addonId: null,
37928
+ access: "view"
37929
+ },
35708
37930
  "motionTrigger.setMotionTrigger": {
35709
37931
  capName: "motion-trigger",
35710
37932
  capScope: "device",
@@ -35717,6 +37939,12 @@ Object.freeze({
35717
37939
  addonId: null,
35718
37940
  access: "view"
35719
37941
  },
37942
+ "motionZones.getStatus": {
37943
+ capName: "motion-zones",
37944
+ capScope: "device",
37945
+ addonId: null,
37946
+ access: "view"
37947
+ },
35720
37948
  "motionZones.setZone": {
35721
37949
  capName: "motion-zones",
35722
37950
  capScope: "device",
@@ -35777,6 +38005,12 @@ Object.freeze({
35777
38005
  addonId: null,
35778
38006
  access: "view"
35779
38007
  },
38008
+ "nativeObjectDetection.getStatus": {
38009
+ capName: "native-object-detection",
38010
+ capScope: "device",
38011
+ addonId: null,
38012
+ access: "view"
38013
+ },
35780
38014
  "nativeObjectDetection.setEnabled": {
35781
38015
  capName: "native-object-detection",
35782
38016
  capScope: "device",
@@ -35795,6 +38029,12 @@ Object.freeze({
35795
38029
  addonId: null,
35796
38030
  access: "view"
35797
38031
  },
38032
+ "navigation.getStatus": {
38033
+ capName: "navigation",
38034
+ capScope: "device",
38035
+ addonId: null,
38036
+ access: "view"
38037
+ },
35798
38038
  "navigation.goToPoint": {
35799
38039
  capName: "navigation",
35800
38040
  capScope: "device",
@@ -35879,6 +38119,12 @@ Object.freeze({
35879
38119
  addonId: null,
35880
38120
  access: "create"
35881
38121
  },
38122
+ "networkLink.getStatus": {
38123
+ capName: "network-link",
38124
+ capScope: "device",
38125
+ addonId: null,
38126
+ access: "view"
38127
+ },
35882
38128
  "networkQuality.getAllStats": {
35883
38129
  capName: "network-quality",
35884
38130
  capScope: "system",
@@ -36137,18 +38383,36 @@ Object.freeze({
36137
38383
  addonId: null,
36138
38384
  access: "create"
36139
38385
  },
38386
+ "notifier.getStatus": {
38387
+ capName: "notifier",
38388
+ capScope: "device",
38389
+ addonId: null,
38390
+ access: "view"
38391
+ },
36140
38392
  "notifier.send": {
36141
38393
  capName: "notifier",
36142
38394
  capScope: "device",
36143
38395
  addonId: null,
36144
38396
  access: "create"
36145
38397
  },
38398
+ "numericSensor.getStatus": {
38399
+ capName: "numeric-sensor",
38400
+ capScope: "device",
38401
+ addonId: null,
38402
+ access: "view"
38403
+ },
36146
38404
  "oauthIntegration.getDescriptor": {
36147
38405
  capName: "oauth-integration",
36148
38406
  capScope: "system",
36149
38407
  addonId: null,
36150
38408
  access: "view"
36151
38409
  },
38410
+ "osd.getStatus": {
38411
+ capName: "osd",
38412
+ capScope: "device",
38413
+ addonId: null,
38414
+ access: "view"
38415
+ },
36152
38416
  "osd.setOverlay": {
36153
38417
  capName: "osd",
36154
38418
  capScope: "device",
@@ -36221,6 +38485,12 @@ Object.freeze({
36221
38485
  addonId: null,
36222
38486
  access: "create"
36223
38487
  },
38488
+ "petFeeder.getStatus": {
38489
+ capName: "pet-feeder",
38490
+ capScope: "device",
38491
+ addonId: null,
38492
+ access: "view"
38493
+ },
36224
38494
  "petFeeder.markFoodReplenished": {
36225
38495
  capName: "pet-feeder",
36226
38496
  capScope: "device",
@@ -36263,6 +38533,12 @@ Object.freeze({
36263
38533
  addonId: null,
36264
38534
  access: "create"
36265
38535
  },
38536
+ "pipelineAnalytics.applyDeviceSettingsPatch": {
38537
+ capName: "pipeline-analytics",
38538
+ capScope: "device",
38539
+ addonId: null,
38540
+ access: "create"
38541
+ },
36266
38542
  "pipelineAnalytics.cancelRelocateMedia": {
36267
38543
  capName: "pipeline-analytics",
36268
38544
  capScope: "device",
@@ -36329,6 +38605,18 @@ Object.freeze({
36329
38605
  addonId: null,
36330
38606
  access: "view"
36331
38607
  },
38608
+ "pipelineAnalytics.getDeviceLiveContribution": {
38609
+ capName: "pipeline-analytics",
38610
+ capScope: "device",
38611
+ addonId: null,
38612
+ access: "view"
38613
+ },
38614
+ "pipelineAnalytics.getDeviceSettingsContribution": {
38615
+ capName: "pipeline-analytics",
38616
+ capScope: "device",
38617
+ addonId: null,
38618
+ access: "view"
38619
+ },
36332
38620
  "pipelineAnalytics.getEventDensity": {
36333
38621
  capName: "pipeline-analytics",
36334
38622
  capScope: "device",
@@ -36899,6 +39187,12 @@ Object.freeze({
36899
39187
  addonId: null,
36900
39188
  access: "view"
36901
39189
  },
39190
+ "pipelineOrchestrator.applyDeviceSettingsPatch": {
39191
+ capName: "pipeline-orchestrator",
39192
+ capScope: "system",
39193
+ addonId: null,
39194
+ access: "create"
39195
+ },
36902
39196
  "pipelineOrchestrator.assignAudio": {
36903
39197
  capName: "pipeline-orchestrator",
36904
39198
  capScope: "system",
@@ -36989,6 +39283,18 @@ Object.freeze({
36989
39283
  addonId: null,
36990
39284
  access: "view"
36991
39285
  },
39286
+ "pipelineOrchestrator.getDeviceLiveContribution": {
39287
+ capName: "pipeline-orchestrator",
39288
+ capScope: "system",
39289
+ addonId: null,
39290
+ access: "view"
39291
+ },
39292
+ "pipelineOrchestrator.getDeviceSettingsContribution": {
39293
+ capName: "pipeline-orchestrator",
39294
+ capScope: "system",
39295
+ addonId: null,
39296
+ access: "view"
39297
+ },
36992
39298
  "pipelineOrchestrator.getGlobalMetrics": {
36993
39299
  capName: "pipeline-orchestrator",
36994
39300
  capScope: "system",
@@ -37397,12 +39703,36 @@ Object.freeze({
37397
39703
  addonId: null,
37398
39704
  access: "view"
37399
39705
  },
39706
+ "powerMeter.getStatus": {
39707
+ capName: "power-meter",
39708
+ capScope: "device",
39709
+ addonId: null,
39710
+ access: "view"
39711
+ },
39712
+ "presence.getStatus": {
39713
+ capName: "presence",
39714
+ capScope: "device",
39715
+ addonId: null,
39716
+ access: "view"
39717
+ },
39718
+ "pressureSensor.getStatus": {
39719
+ capName: "pressure-sensor",
39720
+ capScope: "device",
39721
+ addonId: null,
39722
+ access: "view"
39723
+ },
37400
39724
  "privacyMask.getOptions": {
37401
39725
  capName: "privacy-mask",
37402
39726
  capScope: "device",
37403
39727
  addonId: null,
37404
39728
  access: "view"
37405
39729
  },
39730
+ "privacyMask.getStatus": {
39731
+ capName: "privacy-mask",
39732
+ capScope: "device",
39733
+ addonId: null,
39734
+ access: "view"
39735
+ },
37406
39736
  "privacyMask.setAudioEnabled": {
37407
39737
  capName: "privacy-mask",
37408
39738
  capScope: "device",
@@ -37463,6 +39793,12 @@ Object.freeze({
37463
39793
  addonId: null,
37464
39794
  access: "view"
37465
39795
  },
39796
+ "ptz.getStatus": {
39797
+ capName: "ptz",
39798
+ capScope: "device",
39799
+ addonId: null,
39800
+ access: "view"
39801
+ },
37466
39802
  "ptz.goHome": {
37467
39803
  capName: "ptz",
37468
39804
  capScope: "device",
@@ -37541,6 +39877,12 @@ Object.freeze({
37541
39877
  addonId: null,
37542
39878
  access: "create"
37543
39879
  },
39880
+ "recording.applyDeviceSettingsPatch": {
39881
+ capName: "recording",
39882
+ capScope: "system",
39883
+ addonId: null,
39884
+ access: "create"
39885
+ },
37544
39886
  "recording.cancelRelocateJob": {
37545
39887
  capName: "recording",
37546
39888
  capScope: "system",
@@ -37589,6 +39931,18 @@ Object.freeze({
37589
39931
  addonId: null,
37590
39932
  access: "view"
37591
39933
  },
39934
+ "recording.getDeviceLiveContribution": {
39935
+ capName: "recording",
39936
+ capScope: "system",
39937
+ addonId: null,
39938
+ access: "view"
39939
+ },
39940
+ "recording.getDeviceSettingsContribution": {
39941
+ capName: "recording",
39942
+ capScope: "system",
39943
+ addonId: null,
39944
+ access: "view"
39945
+ },
37592
39946
  "recording.getPlacement": {
37593
39947
  capName: "recording",
37594
39948
  capScope: "system",
@@ -37607,6 +39961,12 @@ Object.freeze({
37607
39961
  addonId: null,
37608
39962
  access: "view"
37609
39963
  },
39964
+ "recording.getStatus": {
39965
+ capName: "recording",
39966
+ capScope: "system",
39967
+ addonId: null,
39968
+ access: "view"
39969
+ },
37610
39970
  "recording.getStorageMigrationMoveStatus": {
37611
39971
  capName: "recording",
37612
39972
  capScope: "system",
@@ -37781,6 +40141,24 @@ Object.freeze({
37781
40141
  addonId: null,
37782
40142
  access: "view"
37783
40143
  },
40144
+ "recordingOnboard.getOptions": {
40145
+ capName: "recording-onboard",
40146
+ capScope: "device",
40147
+ addonId: null,
40148
+ access: "view"
40149
+ },
40150
+ "recordingOnboard.getStatus": {
40151
+ capName: "recording-onboard",
40152
+ capScope: "device",
40153
+ addonId: null,
40154
+ access: "view"
40155
+ },
40156
+ "recordingOnboard.setSettings": {
40157
+ capName: "recording-onboard",
40158
+ capScope: "device",
40159
+ addonId: null,
40160
+ access: "create"
40161
+ },
37784
40162
  "recordingSignal.getStatus": {
37785
40163
  capName: "recording-signal",
37786
40164
  capScope: "device",
@@ -37811,6 +40189,12 @@ Object.freeze({
37811
40189
  addonId: null,
37812
40190
  access: "delete"
37813
40191
  },
40192
+ "sceneMonitor.getStatus": {
40193
+ capName: "scene-monitor",
40194
+ capScope: "device",
40195
+ addonId: null,
40196
+ access: "view"
40197
+ },
37814
40198
  "sceneMonitor.listScenes": {
37815
40199
  capName: "scene-monitor",
37816
40200
  capScope: "device",
@@ -37841,6 +40225,12 @@ Object.freeze({
37841
40225
  addonId: null,
37842
40226
  access: "create"
37843
40227
  },
40228
+ "scriptRunner.getStatus": {
40229
+ capName: "script-runner",
40230
+ capScope: "device",
40231
+ addonId: null,
40232
+ access: "view"
40233
+ },
37844
40234
  "scriptRunner.run": {
37845
40235
  capName: "script-runner",
37846
40236
  capScope: "device",
@@ -37973,6 +40363,12 @@ Object.freeze({
37973
40363
  addonId: null,
37974
40364
  access: "create"
37975
40365
  },
40366
+ "smoke.getStatus": {
40367
+ capName: "smoke",
40368
+ capScope: "device",
40369
+ addonId: null,
40370
+ access: "view"
40371
+ },
37976
40372
  "smtpProvider.getStatus": {
37977
40373
  capName: "smtp-provider",
37978
40374
  capScope: "system",
@@ -37991,12 +40387,30 @@ Object.freeze({
37991
40387
  addonId: null,
37992
40388
  access: "view"
37993
40389
  },
40390
+ "snapshot.applyDeviceSettingsPatch": {
40391
+ capName: "snapshot",
40392
+ capScope: "device",
40393
+ addonId: null,
40394
+ access: "create"
40395
+ },
37994
40396
  "snapshot.getDebugState": {
37995
40397
  capName: "snapshot",
37996
40398
  capScope: "device",
37997
40399
  addonId: null,
37998
40400
  access: "view"
37999
40401
  },
40402
+ "snapshot.getDeviceLiveContribution": {
40403
+ capName: "snapshot",
40404
+ capScope: "device",
40405
+ addonId: null,
40406
+ access: "view"
40407
+ },
40408
+ "snapshot.getDeviceSettingsContribution": {
40409
+ capName: "snapshot",
40410
+ capScope: "device",
40411
+ addonId: null,
40412
+ access: "view"
40413
+ },
38000
40414
  "snapshot.getSnapshot": {
38001
40415
  capName: "snapshot",
38002
40416
  capScope: "device",
@@ -38015,6 +40429,12 @@ Object.freeze({
38015
40429
  addonId: null,
38016
40430
  access: "view"
38017
40431
  },
40432
+ "snapshot.getStatus": {
40433
+ capName: "snapshot",
40434
+ capScope: "device",
40435
+ addonId: null,
40436
+ access: "view"
40437
+ },
38018
40438
  "snapshot.invalidateCache": {
38019
40439
  capName: "snapshot",
38020
40440
  capScope: "device",
@@ -38351,6 +40771,12 @@ Object.freeze({
38351
40771
  addonId: null,
38352
40772
  access: "create"
38353
40773
  },
40774
+ "streamBroker.applyDeviceSettingsPatch": {
40775
+ capName: "stream-broker",
40776
+ capScope: "system",
40777
+ addonId: null,
40778
+ access: "create"
40779
+ },
38354
40780
  "streamBroker.assignProfile": {
38355
40781
  capName: "stream-broker",
38356
40782
  capScope: "system",
@@ -38387,6 +40813,18 @@ Object.freeze({
38387
40813
  addonId: null,
38388
40814
  access: "view"
38389
40815
  },
40816
+ "streamBroker.getDeviceLiveContribution": {
40817
+ capName: "stream-broker",
40818
+ capScope: "system",
40819
+ addonId: null,
40820
+ access: "view"
40821
+ },
40822
+ "streamBroker.getDeviceSettingsContribution": {
40823
+ capName: "stream-broker",
40824
+ capScope: "system",
40825
+ addonId: null,
40826
+ access: "view"
40827
+ },
38390
40828
  "streamBroker.getPreBufferInfo": {
38391
40829
  capName: "stream-broker",
38392
40830
  capScope: "system",
@@ -38585,6 +41023,12 @@ Object.freeze({
38585
41023
  addonId: null,
38586
41024
  access: "view"
38587
41025
  },
41026
+ "streamParams.getStatus": {
41027
+ capName: "stream-params",
41028
+ capScope: "device",
41029
+ addonId: null,
41030
+ access: "view"
41031
+ },
38588
41032
  "streamParams.setProfile": {
38589
41033
  capName: "stream-params",
38590
41034
  capScope: "device",
@@ -38597,6 +41041,12 @@ Object.freeze({
38597
41041
  addonId: null,
38598
41042
  access: "view"
38599
41043
  },
41044
+ "switch.getStatus": {
41045
+ capName: "switch",
41046
+ capScope: "device",
41047
+ addonId: null,
41048
+ access: "view"
41049
+ },
38600
41050
  "switch.setState": {
38601
41051
  capName: "switch",
38602
41052
  capScope: "device",
@@ -38693,6 +41143,18 @@ Object.freeze({
38693
41143
  addonId: null,
38694
41144
  access: "create"
38695
41145
  },
41146
+ "tamper.getStatus": {
41147
+ capName: "tamper",
41148
+ capScope: "device",
41149
+ addonId: null,
41150
+ access: "view"
41151
+ },
41152
+ "temperatureSensor.getStatus": {
41153
+ capName: "temperature-sensor",
41154
+ capScope: "device",
41155
+ addonId: null,
41156
+ access: "view"
41157
+ },
38696
41158
  "terminalSession.adoptLegacyMonitor": {
38697
41159
  capName: "terminal-session",
38698
41160
  capScope: "system",
@@ -38789,6 +41251,12 @@ Object.freeze({
38789
41251
  addonId: null,
38790
41252
  access: "view"
38791
41253
  },
41254
+ "update.getStatus": {
41255
+ capName: "update",
41256
+ capScope: "device",
41257
+ addonId: null,
41258
+ access: "view"
41259
+ },
38792
41260
  "update.installUpdate": {
38793
41261
  capName: "update",
38794
41262
  capScope: "device",
@@ -39011,6 +41479,12 @@ Object.freeze({
39011
41479
  addonId: null,
39012
41480
  access: "create"
39013
41481
  },
41482
+ "vacuumControl.getStatus": {
41483
+ capName: "vacuum-control",
41484
+ capScope: "device",
41485
+ addonId: null,
41486
+ access: "view"
41487
+ },
39014
41488
  "vacuumControl.locate": {
39015
41489
  capName: "vacuum-control",
39016
41490
  capScope: "device",
@@ -39053,6 +41527,12 @@ Object.freeze({
39053
41527
  addonId: null,
39054
41528
  access: "create"
39055
41529
  },
41530
+ "valve.getStatus": {
41531
+ capName: "valve",
41532
+ capScope: "device",
41533
+ addonId: null,
41534
+ access: "view"
41535
+ },
39056
41536
  "valve.open": {
39057
41537
  capName: "valve",
39058
41538
  capScope: "device",
@@ -39125,6 +41605,18 @@ Object.freeze({
39125
41605
  addonId: null,
39126
41606
  access: "create"
39127
41607
  },
41608
+ "vibration.getStatus": {
41609
+ capName: "vibration",
41610
+ capScope: "device",
41611
+ addonId: null,
41612
+ access: "view"
41613
+ },
41614
+ "videoclips.dialClipStream": {
41615
+ capName: "videoclips",
41616
+ capScope: "device",
41617
+ addonId: null,
41618
+ access: "view"
41619
+ },
39128
41620
  "videoclips.getClipPlayback": {
39129
41621
  capName: "videoclips",
39130
41622
  capScope: "device",
@@ -39161,6 +41653,12 @@ Object.freeze({
39161
41653
  addonId: null,
39162
41654
  access: "view"
39163
41655
  },
41656
+ "waterHeater.getStatus": {
41657
+ capName: "water-heater",
41658
+ capScope: "device",
41659
+ addonId: null,
41660
+ access: "view"
41661
+ },
39164
41662
  "waterHeater.setAway": {
39165
41663
  capName: "water-heater",
39166
41664
  capScope: "device",
@@ -39179,6 +41677,12 @@ Object.freeze({
39179
41677
  addonId: null,
39180
41678
  access: "create"
39181
41679
  },
41680
+ "weather.getStatus": {
41681
+ capName: "weather",
41682
+ capScope: "device",
41683
+ addonId: null,
41684
+ access: "view"
41685
+ },
39182
41686
  "webrtcSession.addIceCandidate": {
39183
41687
  capName: "webrtc-session",
39184
41688
  capScope: "device",
@@ -39541,6 +42045,11 @@ Object.freeze({
39541
42045
  form: "single",
39542
42046
  optional: true
39543
42047
  }],
42048
+ "deviceAdminLink.getAdminLink": [{
42049
+ name: "deviceId",
42050
+ form: "single",
42051
+ optional: false
42052
+ }],
39544
42053
  "deviceAdoption.release": [{
39545
42054
  name: "camDeviceId",
39546
42055
  form: "single",
@@ -40926,6 +43435,16 @@ Object.freeze({
40926
43435
  form: "single",
40927
43436
  optional: true
40928
43437
  }],
43438
+ "recordingOnboard.getOptions": [{
43439
+ name: "deviceId",
43440
+ form: "single",
43441
+ optional: false
43442
+ }],
43443
+ "recordingOnboard.setSettings": [{
43444
+ name: "deviceId",
43445
+ form: "single",
43446
+ optional: false
43447
+ }],
40929
43448
  "recordingSignal.getStatus": [{
40930
43449
  name: "deviceId",
40931
43450
  form: "single",
@@ -41152,6 +43671,11 @@ Object.freeze({
41152
43671
  form: "single",
41153
43672
  optional: false
41154
43673
  }],
43674
+ "videoclips.dialClipStream": [{
43675
+ name: "deviceId",
43676
+ form: "single",
43677
+ optional: false
43678
+ }],
41155
43679
  "videoclips.getClipPlayback": [{
41156
43680
  name: "deviceId",
41157
43681
  form: "single",