@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
@@ -5863,7 +5863,7 @@ var ZodIssueCode = {
5863
5863
  var ZodFirstPartyTypeKind;
5864
5864
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5865
5865
  //#endregion
5866
- //#region ../types/dist/sleep-BVhJDJka.mjs
5866
+ //#region ../types/dist/sleep-i3eUVc-d.mjs
5867
5867
  /**
5868
5868
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5869
5869
  * window to float samples (D455).
@@ -8351,10 +8351,20 @@ var CameraSwitchAuthoritySchema = discriminatedUnion("kind", [
8351
8351
  var CameraSwitchUnavailableReasonSchema = _enum([
8352
8352
  "no-provider",
8353
8353
  "source-unreachable",
8354
- "not-configured",
8355
8354
  "device-disabled"
8356
8355
  ]);
8357
8356
  /**
8357
+ * Something true about a switch that is nonetheless OFFERED.
8358
+ *
8359
+ * The distinction from {@link CameraSwitchUnavailableReasonSchema} is the
8360
+ * whole point: a reason replaces the control, a warning travels WITH it. The
8361
+ * privacy mask taught us the difference — greying the one button that starts
8362
+ * the feature teaches the operator the feature is broken, while a live toggle
8363
+ * that flips nothing teaches them the switch is broken. Neither is true; the
8364
+ * honest surface is a working toggle that says what is missing.
8365
+ */
8366
+ var CameraSwitchWarningSchema = _enum(["no-privacy-zones"]);
8367
+ /**
8358
8368
  * One switch, resolved for one camera.
8359
8369
  *
8360
8370
  * `label` and `costWhenOff` travel ON THE WIRE rather than being looked up
@@ -8373,6 +8383,11 @@ var CameraSwitchSchema = object({
8373
8383
  /** False = do not render a control. `unavailableReason` says why. */
8374
8384
  available: boolean(),
8375
8385
  unavailableReason: CameraSwitchUnavailableReasonSchema.optional(),
8386
+ /**
8387
+ * Present on an AVAILABLE switch only. Rendered beside the live control;
8388
+ * never a substitute for one.
8389
+ */
8390
+ warning: CameraSwitchWarningSchema.optional(),
8376
8391
  /** Current state. Meaningless when `available` is false — read it as `true`. */
8377
8392
  enabled: boolean(),
8378
8393
  authority: CameraSwitchAuthoritySchema
@@ -13894,6 +13909,97 @@ method(object({ integrationId: string() }), object({ filters: array(AdoptionFilt
13894
13909
  auth: "admin"
13895
13910
  });
13896
13911
  /**
13912
+ * device-admin-link — "this device has a management page of its own, and here
13913
+ * is its address".
13914
+ *
13915
+ * ## Why this is not a `deviceConfig` cap
13916
+ *
13917
+ * There is nothing to edit. A `deviceConfig` cap (D14) exists so the framework
13918
+ * can DERIVE a settings form from `getOptions` + `getStatus` and route a flat
13919
+ * patch back through a setter; it costs a `builderId` reducer in
13920
+ * `device-config-contribution.ts` and a `*-config-schema.ts` beside it, and it
13921
+ * renders a form section. This cap answers ONE question with ONE read and
13922
+ * renders a button. Nothing about it is a form, so it carries no `deviceConfig`
13923
+ * block, no `settings`, no `runtimeState` and no reducer — exactly like
13924
+ * `reboot`, the other pure-RPC device-native cap.
13925
+ *
13926
+ * ## Absent, and the difference between "no page" and "we cannot say"
13927
+ *
13928
+ * The two are answered at DIFFERENT layers, on purpose:
13929
+ *
13930
+ * - **"We cannot say"** → the provider never registers the cap for that
13931
+ * device. A VeSync humidifier, a Petkit feeder, a Dreame vacuum and a Dreo
13932
+ * fan are reached only through a vendor cloud; there is no address to hand
13933
+ * out and no page to open. A Tuya plug, a Wyze camera and a Gree air
13934
+ * conditioner DO have a LAN IP, and still have no HTTP management page
13935
+ * behind it. None of them register, so `deviceManager.getBindings` never
13936
+ * lists the cap and no surface asks.
13937
+ * - **"This device has no page, and I know that"** → the provider registers
13938
+ * and `getAdminLink` returns `null`. This is the answer for a device whose
13939
+ * sibling DOES have a page: a Reolink battery camera reached over UDP by
13940
+ * `uid` with a blank `host`, an Ecowitt gateway configured in `listener`
13941
+ * transport, a Home Assistant broker authenticated by supervisor token
13942
+ * (which carries no `baseUrl` at all).
13943
+ *
13944
+ * Both draw NOTHING. A button that opens a browser error is worse than no
13945
+ * button, and D62 is the same rule from the other side: an off switch is
13946
+ * reported off, never made to look broken. There is no third state where the
13947
+ * UI renders a disabled button "because the device might have a page".
13948
+ *
13949
+ * ## The URL never carries credentials
13950
+ *
13951
+ * Not in userinfo, not in a query string. Every provider builds through
13952
+ * `buildDeviceAdminUrl` (`device-admin-link-url.ts`), which takes host, port,
13953
+ * scheme and path as separate arguments — there is no parameter a secret could
13954
+ * arrive in — and re-checks its own output for the `scheme://user:pass@` shape
13955
+ * that `scripts/check-no-credential-urls-in-fixtures.ts` bans from recorded
13956
+ * output. `scripts/check-admin-link-builder-is-the-only-url-source.ts` is what
13957
+ * keeps providers from hand-rolling one anyway.
13958
+ *
13959
+ * This matters here more than anywhere else in the repo, because every provider
13960
+ * that knows a device's host knows its PASSWORD too: `{ host, port, username,
13961
+ * password }` sit in one object on Hikvision, Amcrest, Reolink and ONVIF alike,
13962
+ * and `http://admin:hunter2@192.168.50.139/` is a URL a browser accepts. The
13963
+ * camera's own page will ask for its own login. That is correct, and pre-
13964
+ * filling it is the operator's business, not ours.
13965
+ *
13966
+ * ## It is a LAN fact
13967
+ *
13968
+ * The URL addresses the device where the NODE can see it. It is not proxied,
13969
+ * not made reachable from outside, and not sent anywhere. A surface renders it
13970
+ * as a link the operator's own browser follows, on the operator's own network,
13971
+ * or renders nothing.
13972
+ */
13973
+ /**
13974
+ * Whose page is it. The distinction is for the OPERATOR, who needs to know
13975
+ * before clicking whether he is about to land on a camera's own web server or
13976
+ * inside Home Assistant.
13977
+ */
13978
+ var AdminLinkTargetEnum = _enum(["device", "integration"]);
13979
+ var DeviceAdminLinkSchema = object({
13980
+ /**
13981
+ * Absolute `http(s)://` URL. Built by `buildDeviceAdminUrl` and therefore
13982
+ * free of userinfo and of any credential-shaped query key.
13983
+ */
13984
+ url: string(),
13985
+ /**
13986
+ * What the surface calls it — "Web UI", "Home Assistant", "UniFi controller".
13987
+ * The PROVIDER names it, because only the provider knows what the page is;
13988
+ * a UI that invented the label from the addon id would call the Home
13989
+ * Assistant device page "Provider Homeassistant".
13990
+ */
13991
+ label: string(),
13992
+ target: AdminLinkTargetEnum,
13993
+ /**
13994
+ * Host the URL points at, without scheme, port or path — for the tooltip, so
13995
+ * an operator can see WHERE the button goes before he follows it. Redundant
13996
+ * with `url` by construction; carried separately so no surface has to parse
13997
+ * a URL to show it.
13998
+ */
13999
+ host: string()
14000
+ });
14001
+ method(object({ deviceId: number().int().nonnegative() }), DeviceAdminLinkSchema.nullable(), { auth: "admin" });
14002
+ /**
13897
14003
  * `device-export` — collection cap for addons that export camstack
13898
14004
  * devices to external ecosystems (HomeAssistant via MQTT discovery,
13899
14005
  * HomeKit/HAP, Alexa Smart Home, …).
@@ -24864,6 +24970,82 @@ var ClipBytesSchema = object({
24864
24970
  */
24865
24971
  durationMs: number().positive().optional()
24866
24972
  });
24973
+ /**
24974
+ * Where a clip's STREAM can be dialled (D597) — the answer to
24975
+ * {@link videoclipsCapability.methods.dialClipStream}.
24976
+ *
24977
+ * `url` is plain `http://` on the provider's own token-gated listener, one
24978
+ * shot, short-lived. It is NOT the hub-proxied `/addon/<id>/clip-stream/…`
24979
+ * path: that plane takes only a user credential, which an addon does not
24980
+ * hold, and the framework offers no addon→addon byte transport — the one
24981
+ * precedent is the broker's own restream URLs (`getStreamWithCodec`), which
24982
+ * a consumer dials directly, and this is that precedent one addon over.
24983
+ */
24984
+ /**
24985
+ * The audio a clip stream can be asked for, and the audio it carries.
24986
+ *
24987
+ * The camera stores AAC and no WebRTC session speaks it, so a stream that
24988
+ * carries sound carries it TRANSCODED, muxed as a second track beside the
24989
+ * video by the one ffmpeg the provider already runs (D600). `opus` is
24990
+ * 48 kHz mono, `pcmu` is 8 kHz µ-law — the two codecs a broker session
24991
+ * negotiates — and `none` is a stream asked for, or served, without sound.
24992
+ */
24993
+ var ClipStreamAudioSchema = _enum([
24994
+ "opus",
24995
+ "pcmu",
24996
+ "none"
24997
+ ]);
24998
+ /**
24999
+ * Why a stream that was ASKED for sound is not carrying it (D600).
25000
+ *
25001
+ * Only ever set beside `servedAudio: 'none'` after a non-`none` ask. Absent
25002
+ * means the ask was honoured, or there was no ask.
25003
+ *
25004
+ * - `not-requested` — the caller asked for `none`.
25005
+ * - `unsupported-ask` — the provider cannot produce that codec.
25006
+ *
25007
+ * Whether the RECORDING has sound at all is not knowable here: the camera
25008
+ * declares no audio track before its first frame arrives. That answer is in
25009
+ * the stream itself — an fMP4 with no audio track — and the broker reads it
25010
+ * there. A dial that says `opus` promises the codec, never the content.
25011
+ */
25012
+ var ClipStreamAudioReasonSchema = _enum(["not-requested", "unsupported-ask"]);
25013
+ var ClipStreamDialSchema = object({
25014
+ url: string().min(1),
25015
+ /** After this the token is gone and the URL answers 404 `dial-expired`. */
25016
+ expiresAtMs: number(),
25017
+ /** What the stream IS — a consumer that cannot honour it must not dial. */
25018
+ transport: literal("forward-only"),
25019
+ /**
25020
+ * Which twin the stream ACTUALLY carries — not what was asked for.
25021
+ *
25022
+ * The stream serves every profile (D599), and a recording whose main twin
25023
+ * does not exist is streamed as its sub copy, which this field reports as
25024
+ * `low`. That is the whole reason the dial no longer refuses `high`:
25025
+ * stating what was served is what makes accepting honest, where a silent
25026
+ * substitution would be the 33x lie D576 forbids. Stated rather than
25027
+ * assumed, the way {@link ClipPlaybackSchema.served} is (D549 15).
25028
+ */
25029
+ served: CamProfileSchema,
25030
+ /**
25031
+ * Which audio the stream will ACTUALLY carry — `served`'s companion for
25032
+ * sound, and the same reasoning (D599, D600).
25033
+ *
25034
+ * The broker asks for the codec its WebRTC session negotiated, and the
25035
+ * provider either muxes that codec or carries none. Stating it is what
25036
+ * lets the broker wire the matching sink before the first byte, and what
25037
+ * keeps a session from being handed a codec it cannot send — the audio
25038
+ * shape of the substitution `served` exists to prevent.
25039
+ *
25040
+ * It is a promise about the CODEC, not about the content: a recording with
25041
+ * no microphone track answers `opus` here and then arrives with no audio
25042
+ * track at all. That second answer is in the stream, and the broker reads
25043
+ * it from the `moov`.
25044
+ */
25045
+ servedAudio: ClipStreamAudioSchema,
25046
+ /** Why `servedAudio` is `none` although sound was asked for. */
25047
+ audioReason: ClipStreamAudioReasonSchema.optional()
25048
+ });
24867
25049
  var ClipSourceAvailabilitySchema = object({
24868
25050
  state: _enum([
24869
25051
  "ok",
@@ -24983,6 +25165,23 @@ DeviceType.Camera, method(object({
24983
25165
  deviceId: number(),
24984
25166
  clipId: string().min(1),
24985
25167
  /**
25168
+ * WHICH provider holds the bytes — the `addonId` a
25169
+ * {@link ClipSourceSchema} row carries. **Required**, for the reason
25170
+ * `listClips` states one method above and for a second one this method
25171
+ * learned the hard way.
25172
+ *
25173
+ * The caller is the stream broker, and the broker lives in
25174
+ * `addon-pipeline` — the same addon that registers the RECORDER's
25175
+ * videoclips provider. With no provider named, the in-process
25176
+ * resolution handed it its own sibling, which implements this method
25177
+ * solely to explain that an analytics visit has no file behind it. So
25178
+ * every onboard clip answered with that sentence, a flash of video and
25179
+ * nothing more, while the SAME call from outside the addon reached the
25180
+ * right provider and returned the bytes (measured on 3628,
25181
+ * 2026-09-21).
25182
+ */
25183
+ provider: string().min(1),
25184
+ /**
24986
25185
  * Which twin to fetch, on the mapping D549 15 already fixed:
24987
25186
  * `low | mid` → the sub file, `high` → the main twin. `auto` is not
24988
25187
  * accepted here for the same reason it is not accepted by
@@ -25006,6 +25205,27 @@ DeviceType.Camera, method(object({
25006
25205
  }), ClipBytesSchema, {
25007
25206
  kind: "query",
25008
25207
  auth: "protected"
25208
+ }), optionalMethod(object({
25209
+ deviceId: number(),
25210
+ clipId: string().min(1),
25211
+ /** WHICH provider holds the camera — see `readClipBytes.provider`. */
25212
+ provider: string().min(1),
25213
+ /** Which twin — `high` → the main file, everything else the sub (D599). */
25214
+ profile: CamProfileSchema.optional(),
25215
+ /**
25216
+ * Which audio codec the caller's session negotiated, so the provider
25217
+ * can mux it (D600). The ask travels on the DIAL because the mux is
25218
+ * spawned once, before the first byte, and cannot gain a track later.
25219
+ *
25220
+ * ABSENT IS `none`, never a guess: a caller that does not state an
25221
+ * ask is served the video-only stream that shipped first, so a broker
25222
+ * older than this field keeps working unchanged (D382 — an unstated
25223
+ * ask is zero).
25224
+ */
25225
+ audio: ClipStreamAudioSchema.optional()
25226
+ }), ClipStreamDialSchema, {
25227
+ kind: "query",
25228
+ auth: "protected"
25009
25229
  });
25010
25230
  /**
25011
25231
  * Optional client-side hints sent at session creation to help the provider
@@ -26563,6 +26783,307 @@ DeviceType.Camera, method(object({ deviceId: number() }), DayNightOptionsSchema)
26563
26783
  auth: "admin"
26564
26784
  });
26565
26785
  /**
26786
+ * Vendor-neutral **onboard** recording + storage cap — what the CAMERA
26787
+ * writes to the CAMERA's own card, on the camera's own schedule.
26788
+ *
26789
+ * This is NOT `recording.cap.ts`. That one is CamStack's recorder: our
26790
+ * footage ledger, our storage locations, our retention. This one has a
26791
+ * different authority — the camera's firmware — and per D62 it stores
26792
+ * nothing of its own. Every value here is read from the camera and every
26793
+ * write goes back to the camera; there is no CamStack-side mirror that
26794
+ * could disagree with the device.
26795
+ *
26796
+ * ## One shape, two firmwares
26797
+ *
26798
+ * Measured 2026-09-22 against the live fleet:
26799
+ *
26800
+ * | fact | Hikvision (ISAPI) | Reolink (Baichuan) |
26801
+ * | --- | --- | --- |
26802
+ * | storage | `ContentMgmt/Storage` `<hdd>` rows: status, capacity, freeSpace (MB) | `getHddInfoList` (cmd 102): `mount`, `format`, `capacity` GB + `capacityM` MB remainder |
26803
+ * | tracks | several (101 **and** 103 on both 1436 and 3833), each with its own schedule | one per channel |
26804
+ * | schedule | per track, 7 `ScheduleAction` blocks: DayOfWeek + TimeOfDay range + ONE `ActionRecordingMode` | per trigger type, a 168-char weekly HOUR mask |
26805
+ * | triggers | `CMR`, `MOTION` | `Normal`, `MD`, `people`, `vehicle`, `dog_cat`, `crossline`, `intrude`, `loitering` |
26806
+ * | pre-record | `PreRecordTimeSeconds` | `preRecordTime` |
26807
+ * | post-record | `PostRecordTimeSeconds` | `recordDelayTime` |
26808
+ * | overwrite | per track `LoopEnable` | `cycle`, with `cycleList` enumerating the accepted values |
26809
+ * | segment length | not exposed on V5.7.1 | `packageTime` (minutes) |
26810
+ *
26811
+ * The two schedule models look different and are the same thing in
26812
+ * different coordinates: both answer "for this trigger, during which
26813
+ * weekly windows does the camera record". {@link RecordWindow} is that
26814
+ * question in one shape — Hikvision's ranges map straight onto it,
26815
+ * Reolink's mask expands into hour-aligned windows.
26816
+ *
26817
+ * ## Union, not intersection
26818
+ *
26819
+ * **The same fields exist on every camera.** What differs per device is
26820
+ * which VALUES that device accepts, and that is what {@link
26821
+ * RecordingOnboardOptions} reports — a `{ readable, writable, reason }`
26822
+ * per field plus the schedule's own limits. A control a camera cannot
26823
+ * honour is rendered DISABLED WITH ITS REASON, never missing and never
26824
+ * dead: disabled must not look like broken.
26825
+ *
26826
+ * ## Refusal by name
26827
+ *
26828
+ * A write a camera cannot honour is refused with a sentence the operator
26829
+ * can read — never accepted and dropped. Both providers refuse through
26830
+ * {@link describeOnboardRefusal}, so the vocabulary is one function and
26831
+ * one test, not two hand-written vendor opinions.
26832
+ *
26833
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
26834
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
26835
+ * injected from `status`) reports the live values, and a single
26836
+ * `setSettings` mutation applies a partial change. No hand-written
26837
+ * settings-contribution methods.
26838
+ */
26839
+ /**
26840
+ * What makes the camera start recording during a window.
26841
+ *
26842
+ * The union of both vendors' vocabularies. `continuous` is Hikvision's
26843
+ * `CMR` and Reolink's `Normal`; `motion` is `MOTION` / `MD`. The
26844
+ * object-class triggers are Reolink-only today and the smart-event ones
26845
+ * (`lineCrossing`, `intrusion`, `loitering`) are Reolink-only on the
26846
+ * firmwares measured — a camera that cannot record on a trigger simply
26847
+ * does not list it in `options.schedule.triggers`, and a window naming
26848
+ * it is REFUSED, not dropped.
26849
+ */
26850
+ var RecordTriggerSchema = _enum([
26851
+ "continuous",
26852
+ "motion",
26853
+ "person",
26854
+ "vehicle",
26855
+ "animal",
26856
+ "lineCrossing",
26857
+ "intrusion",
26858
+ "loitering",
26859
+ "alarmInput"
26860
+ ]);
26861
+ /**
26862
+ * One weekly recording window: "on `day`, from `startMinute` to
26863
+ * `endMinute`, record on `trigger`".
26864
+ *
26865
+ * `day` is 0 = Monday … 6 = Sunday (ISO order, which is also the order
26866
+ * both firmwares enumerate). Minutes are local camera time since
26867
+ * midnight; `endMinute` may be 1440, meaning end of day — that is
26868
+ * Hikvision's literal `24:00` and Reolink's 24th mask slot, and
26869
+ * collapsing it to 0 would turn a whole-day window into an empty one.
26870
+ */
26871
+ var RecordWindowSchema = object({
26872
+ trigger: RecordTriggerSchema,
26873
+ day: number().int().min(0).max(6),
26874
+ startMinute: number().int().min(0).max(1439),
26875
+ endMinute: number().int().min(1).max(1440)
26876
+ });
26877
+ /** Status of one physical volume, as the camera itself describes it. */
26878
+ var OnboardStorageVolumeSchema = object({
26879
+ /** The camera's own id for the volume (`hdd/id`, Reolink `HddInfo/number`). */
26880
+ id: string(),
26881
+ /** The camera's own name for it, when it gives one (`hddName`). */
26882
+ label: string().optional(),
26883
+ status: _enum([
26884
+ "ok",
26885
+ "unformatted",
26886
+ "error",
26887
+ "offline",
26888
+ "unknown"
26889
+ ]),
26890
+ /**
26891
+ * Total size in MB, or **null when the camera did not say**.
26892
+ *
26893
+ * Never 0 for an unreadable value: a measurement that failed is not a
26894
+ * measurement (D393), and a card whose size is unknown must not be
26895
+ * rendered as a card of size zero.
26896
+ */
26897
+ capacityMb: number().nullable(),
26898
+ /**
26899
+ * Free space in MB, or null when unknown.
26900
+ *
26901
+ * **Not a proxy for "has footage".** Measured 2026-09-22: 1436 and
26902
+ * 1439 both report exactly 11776 MB free — the fixed reserve a looping
26903
+ * card converges on once it has wrapped. At loop steady state the
26904
+ * number is identical whether the camera recorded yesterday or stopped
26905
+ * a month ago.
26906
+ */
26907
+ freeMb: number().nullable(),
26908
+ /** True when the camera reports the volume writable (`property` RW). */
26909
+ writable: boolean().optional()
26910
+ });
26911
+ object({
26912
+ storage: discriminatedUnion("kind", [
26913
+ object({
26914
+ kind: literal("present"),
26915
+ volumes: array(OnboardStorageVolumeSchema)
26916
+ }),
26917
+ object({
26918
+ kind: literal("absent"),
26919
+ reason: string()
26920
+ }),
26921
+ object({
26922
+ kind: literal("unknown"),
26923
+ reason: string()
26924
+ })
26925
+ ]),
26926
+ tracks: array(object({
26927
+ id: string(),
26928
+ enabled: boolean(),
26929
+ isVideo: boolean(),
26930
+ /** From the camera's own track description. Null when it does not say. */
26931
+ codec: string().nullable(),
26932
+ resolution: string().nullable(),
26933
+ /** Per-track overwrite flag, where the firmware keeps it per track. */
26934
+ overwriteWhenFull: boolean().nullable()
26935
+ })),
26936
+ /**
26937
+ * The track the write path targets — the enabled VIDEO one. Null when
26938
+ * no track could be identified, which is itself a refusal reason.
26939
+ */
26940
+ primaryTrackId: string().nullable(),
26941
+ /** Master "record to the card at all" switch. */
26942
+ enabled: boolean().nullable(),
26943
+ overwriteWhenFull: boolean().nullable(),
26944
+ preRecordSec: number().nullable(),
26945
+ postRecordSec: number().nullable(),
26946
+ /** Length of one recorded file, in minutes. */
26947
+ segmentMinutes: number().nullable(),
26948
+ /** The primary track's weekly windows, flattened. */
26949
+ windows: array(RecordWindowSchema),
26950
+ /**
26951
+ * How many windows the camera described that CamStack could NOT read —
26952
+ * an unrecognised trigger, an unparseable clock, a weekday it does not
26953
+ * name.
26954
+ *
26955
+ * A dropped window is work the reader threw away, and a schedule that
26956
+ * silently shows fewer rows than the camera holds is how an operator
26957
+ * saves back a schedule shorter than the one they were looking at
26958
+ * (D391). Non-zero means the window list is INCOMPLETE and a write
26959
+ * that replaces it would delete what was not shown — which is why a
26960
+ * provider reporting a non-zero count also reports the schedule as not
26961
+ * writable.
26962
+ */
26963
+ unreadableWindows: number(),
26964
+ /**
26965
+ * The camera is scheduled to record and has NO usable storage.
26966
+ *
26967
+ * A first-class fact because it is the fleet's most common silent
26968
+ * defect: measured 2026-09-22, 1441 and 3831 are both motion-recording
26969
+ * to a card that is not there. Neither the schedule nor the storage
26970
+ * read says anything wrong on its own; only the pair does.
26971
+ */
26972
+ recordingToNowhere: boolean(),
26973
+ lastFetchedAt: number()
26974
+ });
26975
+ /** Numeric range descriptor — `{ min, max, step }` per the getOptions convention. */
26976
+ var RangeSchema = object({
26977
+ min: number(),
26978
+ max: number(),
26979
+ step: number()
26980
+ });
26981
+ /**
26982
+ * The values a camera actually takes for a numeric field, when they are a SET
26983
+ * rather than a range.
26984
+ *
26985
+ * `{min,max,step}` cannot say what these two firmwares do. Measured on 1436
26986
+ * (I91DN) on 2026-09-22 by writing each value and reading it back:
26987
+ *
26988
+ * - pre-record: `0, 5, 10, 15, 20, 25, 30` and `2147483647` (INT32_MAX, the
26989
+ * camera's "no limit" — `-1` and `4294967295` both land on it);
26990
+ * - post-record: `5, 10, 30, 60, 120, 300, 600`.
26991
+ *
26992
+ * Neither is expressible as a step: the first has a sentinel two billion away
26993
+ * from its neighbours, the second doubles and then jumps. A range that tried
26994
+ * would forbid values the camera takes AND permit values it silently replaces
26995
+ * with 5 — wrong in both directions at once.
26996
+ *
26997
+ * `sentinel` names the member that is not a duration, so a surface can render
26998
+ * "no limit" instead of `2147483647` seconds.
26999
+ */
27000
+ var AllowedValuesSchema = object({
27001
+ values: array(number()).min(1),
27002
+ sentinel: object({
27003
+ value: number(),
27004
+ meaning: _enum(["no-limit", "disabled"])
27005
+ }).optional()
27006
+ });
27007
+ /**
27008
+ * Per-field availability on ONE camera.
27009
+ *
27010
+ * The field exists on every camera — this says whether this one can be
27011
+ * read and whether it can be written, and `reason` says why not when
27012
+ * either is false. The UI renders the control DISABLED with the reason
27013
+ * rather than hiding it, so a limitation is legible instead of looking
27014
+ * like a missing feature.
27015
+ */
27016
+ var OnboardFieldSupportSchema = object({
27017
+ readable: boolean(),
27018
+ writable: boolean(),
27019
+ /** Required whenever `readable` or `writable` is false. */
27020
+ reason: string().optional()
27021
+ });
27022
+ /** What this camera's schedule model can express. */
27023
+ var OnboardScheduleSupportSchema = object({
27024
+ support: OnboardFieldSupportSchema,
27025
+ /**
27026
+ * The smallest time step the camera can express, in minutes.
27027
+ *
27028
+ * Hikvision takes arbitrary minutes (`00:05:00`–`23:57:00` observed on
27029
+ * 1436's track 103). Reolink's schedule is a 7×24 HOUR mask, so 60. A
27030
+ * window whose edges are not a multiple of this is REFUSED rather than
27031
+ * quietly rounded — rounding is how an operator's 06:30 becomes 06:00
27032
+ * and nothing says so.
27033
+ */
27034
+ granularityMinutes: number(),
27035
+ /** Triggers this camera can record on. A window naming another is refused. */
27036
+ triggers: array(RecordTriggerSchema),
27037
+ /**
27038
+ * False when the camera stores ONE trigger per time range, so two
27039
+ * windows overlapping on the same day cannot carry different triggers.
27040
+ * True on Reolink, whose mask is per-trigger and independent.
27041
+ */
27042
+ supportsOverlappingTriggers: boolean()
27043
+ });
27044
+ var RecordingOnboardOptionsSchema = object({
27045
+ enabled: OnboardFieldSupportSchema,
27046
+ overwriteWhenFull: OnboardFieldSupportSchema,
27047
+ preRecordSec: OnboardFieldSupportSchema,
27048
+ preRecordSecRange: RangeSchema.optional(),
27049
+ /** Preferred over the range when the camera takes a SET, not a span. */
27050
+ preRecordSecAllowed: AllowedValuesSchema.optional(),
27051
+ postRecordSec: OnboardFieldSupportSchema,
27052
+ postRecordSecRange: RangeSchema.optional(),
27053
+ /** Preferred over the range when the camera takes a SET, not a span. */
27054
+ postRecordSecAllowed: AllowedValuesSchema.optional(),
27055
+ segmentMinutes: OnboardFieldSupportSchema,
27056
+ segmentMinutesRange: RangeSchema.optional(),
27057
+ /** Preferred over the range when the camera takes a SET, not a span. */
27058
+ segmentMinutesAllowed: AllowedValuesSchema.optional(),
27059
+ schedule: OnboardScheduleSupportSchema
27060
+ });
27061
+ /**
27062
+ * A partial change. Every field optional.
27063
+ *
27064
+ * Unlike the other `deviceConfig` caps, a provider here does **NOT**
27065
+ * silently ignore a field it cannot support — it refuses, by name,
27066
+ * through {@link describeOnboardRefusal}. Silence on a recording setting
27067
+ * is the failure D62 exists to prevent: the operator believes the camera
27068
+ * is recording the way the form says, and it is not.
27069
+ */
27070
+ var RecordingOnboardPatchSchema = object({
27071
+ enabled: boolean().optional(),
27072
+ overwriteWhenFull: boolean().optional(),
27073
+ preRecordSec: number().optional(),
27074
+ postRecordSec: number().optional(),
27075
+ segmentMinutes: number().optional(),
27076
+ /** The complete new window set for the primary track — not a delta. */
27077
+ windows: array(RecordWindowSchema).optional()
27078
+ });
27079
+ DeviceType.Camera, method(object({ deviceId: number() }), RecordingOnboardOptionsSchema), method(object({
27080
+ deviceId: number(),
27081
+ settings: RecordingOnboardPatchSchema
27082
+ }), _void(), {
27083
+ kind: "mutation",
27084
+ auth: "admin"
27085
+ });
27086
+ /**
26566
27087
  * Generic device-level status snapshot. Auto-registered by `BaseDevice`
26567
27088
  * for every device, regardless of provider — the kernel needs a uniform
26568
27089
  * cap-keyed slice for the basic device flags every consumer expects to
@@ -30708,7 +31229,7 @@ method(object({
30708
31229
  auth: "admin"
30709
31230
  }), method(object({ deviceId: number() }), RecordingConfigSchema, {
30710
31231
  kind: "query",
30711
- auth: "admin"
31232
+ auth: "protected"
30712
31233
  }), method(object({
30713
31234
  deviceId: number(),
30714
31235
  profile: string(),
@@ -32929,7 +33450,1336 @@ AccessoryKind.Siren, AccessoryKind.Floodlight, AccessoryKind.Spotlight, Accessor
32929
33450
  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;
32930
33451
  new Set(Object.values(DeviceType));
32931
33452
  DeviceFeature.BatteryOperated;
33453
+ /**
33454
+ * The vocabulary, in the order a picker offers it.
33455
+ *
33456
+ * Adding a key here is not enough to make it pickable: both glyph tables must
33457
+ * gain it too, and their tests fail until they do. That is the intended
33458
+ * friction — it is the only thing that keeps the two surfaces honest.
33459
+ */
33460
+ var DISPLAY_ICON_VOCABULARY = [
33461
+ {
33462
+ key: "camera",
33463
+ group: "device",
33464
+ synonyms: [
33465
+ "telecamera",
33466
+ "videocamera",
33467
+ "camera",
33468
+ "cam"
33469
+ ]
33470
+ },
33471
+ {
33472
+ key: "network",
33473
+ group: "device",
33474
+ synonyms: [
33475
+ "rete",
33476
+ "network",
33477
+ "lan"
33478
+ ]
33479
+ },
33480
+ {
33481
+ key: "toggle-left",
33482
+ group: "device",
33483
+ synonyms: [
33484
+ "interruttore",
33485
+ "switch",
33486
+ "toggle"
33487
+ ]
33488
+ },
33489
+ {
33490
+ key: "toggle-right",
33491
+ group: "device",
33492
+ synonyms: [
33493
+ "interruttore",
33494
+ "switch",
33495
+ "toggle",
33496
+ "acceso"
33497
+ ]
33498
+ },
33499
+ {
33500
+ key: "circle-dot",
33501
+ group: "device",
33502
+ synonyms: [
33503
+ "pulsante",
33504
+ "bottone",
33505
+ "button",
33506
+ "dot"
33507
+ ]
33508
+ },
33509
+ {
33510
+ key: "refresh-cw",
33511
+ group: "device",
33512
+ synonyms: [
33513
+ "aggiorna",
33514
+ "ricarica",
33515
+ "refresh",
33516
+ "reload",
33517
+ "ciclo"
33518
+ ]
33519
+ },
33520
+ {
33521
+ key: "box",
33522
+ group: "device",
33523
+ synonyms: [
33524
+ "scatola",
33525
+ "box",
33526
+ "contenitore"
33527
+ ]
33528
+ },
33529
+ {
33530
+ key: "scroll-text",
33531
+ group: "device",
33532
+ synonyms: [
33533
+ "registro",
33534
+ "log",
33535
+ "testo"
33536
+ ]
33537
+ },
33538
+ {
33539
+ key: "workflow",
33540
+ group: "device",
33541
+ synonyms: [
33542
+ "automazione",
33543
+ "flusso",
33544
+ "workflow",
33545
+ "scenario"
33546
+ ]
33547
+ },
33548
+ {
33549
+ key: "lock",
33550
+ group: "device",
33551
+ synonyms: [
33552
+ "serratura",
33553
+ "chiave",
33554
+ "lucchetto",
33555
+ "chiuso",
33556
+ "locked"
33557
+ ]
33558
+ },
33559
+ {
33560
+ key: "lock-open",
33561
+ group: "device",
33562
+ synonyms: [
33563
+ "serratura",
33564
+ "aperta",
33565
+ "sbloccato",
33566
+ "unlocked"
33567
+ ]
33568
+ },
33569
+ {
33570
+ key: "blinds",
33571
+ group: "device",
33572
+ synonyms: [
33573
+ "tapparella",
33574
+ "persiana",
33575
+ "serranda",
33576
+ "avvolgibile",
33577
+ "shutter",
33578
+ "blind",
33579
+ "veneziana"
33580
+ ]
33581
+ },
33582
+ {
33583
+ key: "air-vent",
33584
+ group: "device",
33585
+ synonyms: [
33586
+ "bocchetta",
33587
+ "aria",
33588
+ "ventilazione",
33589
+ "condizionatore",
33590
+ "vent"
33591
+ ]
33592
+ },
33593
+ {
33594
+ key: "monitor-play",
33595
+ group: "device",
33596
+ synonyms: [
33597
+ "schermo",
33598
+ "riproduzione",
33599
+ "player",
33600
+ "display"
33601
+ ]
33602
+ },
33603
+ {
33604
+ key: "sliders-horizontal",
33605
+ group: "device",
33606
+ synonyms: [
33607
+ "regolazione",
33608
+ "cursori",
33609
+ "impostazioni",
33610
+ "slider"
33611
+ ]
33612
+ },
33613
+ {
33614
+ key: "map-pin",
33615
+ group: "device",
33616
+ synonyms: [
33617
+ "posizione",
33618
+ "luogo",
33619
+ "mappa",
33620
+ "pin"
33621
+ ]
33622
+ },
33623
+ {
33624
+ key: "bot",
33625
+ group: "device",
33626
+ synonyms: [
33627
+ "robot",
33628
+ "aspirapolvere",
33629
+ "bot"
33630
+ ]
33631
+ },
33632
+ {
33633
+ key: "tractor",
33634
+ group: "device",
33635
+ synonyms: [
33636
+ "trattore",
33637
+ "tosaerba",
33638
+ "giardino"
33639
+ ]
33640
+ },
33641
+ {
33642
+ key: "image",
33643
+ group: "device",
33644
+ synonyms: [
33645
+ "immagine",
33646
+ "foto",
33647
+ "snapshot"
33648
+ ]
33649
+ },
33650
+ {
33651
+ key: "bone",
33652
+ group: "device",
33653
+ synonyms: ["osso", "cane"]
33654
+ },
33655
+ {
33656
+ key: "door-closed",
33657
+ group: "device",
33658
+ synonyms: [
33659
+ "porta",
33660
+ "chiusa",
33661
+ "contatto"
33662
+ ]
33663
+ },
33664
+ {
33665
+ key: "door-open",
33666
+ group: "device",
33667
+ synonyms: [
33668
+ "porta",
33669
+ "aperta",
33670
+ "contatto",
33671
+ "ingresso",
33672
+ "uscita"
33673
+ ]
33674
+ },
33675
+ {
33676
+ key: "crosshair",
33677
+ group: "device",
33678
+ synonyms: [
33679
+ "mirino",
33680
+ "puntamento",
33681
+ "centro"
33682
+ ]
33683
+ },
33684
+ {
33685
+ key: "eye",
33686
+ group: "device",
33687
+ synonyms: [
33688
+ "occhio",
33689
+ "visibile",
33690
+ "visto"
33691
+ ]
33692
+ },
33693
+ {
33694
+ key: "eye-off",
33695
+ group: "device",
33696
+ synonyms: [
33697
+ "privacy",
33698
+ "nascosto",
33699
+ "oscurato",
33700
+ "mascherato",
33701
+ "invisibile"
33702
+ ]
33703
+ },
33704
+ {
33705
+ key: "smartphone",
33706
+ group: "device",
33707
+ synonyms: [
33708
+ "telefono",
33709
+ "cellulare",
33710
+ "smartphone"
33711
+ ]
33712
+ },
33713
+ {
33714
+ key: "phone",
33715
+ group: "device",
33716
+ synonyms: ["telefono", "chiamata"]
33717
+ },
33718
+ {
33719
+ key: "tablet",
33720
+ group: "device",
33721
+ synonyms: ["tablet", "ipad"]
33722
+ },
33723
+ {
33724
+ key: "laptop",
33725
+ group: "device",
33726
+ synonyms: [
33727
+ "portatile",
33728
+ "laptop",
33729
+ "notebook"
33730
+ ]
33731
+ },
33732
+ {
33733
+ key: "monitor",
33734
+ group: "device",
33735
+ synonyms: ["monitor", "schermo"]
33736
+ },
33737
+ {
33738
+ key: "tv",
33739
+ group: "device",
33740
+ synonyms: ["televisore", "tv"]
33741
+ },
33742
+ {
33743
+ key: "speaker",
33744
+ group: "device",
33745
+ synonyms: [
33746
+ "altoparlante",
33747
+ "cassa",
33748
+ "speaker"
33749
+ ]
33750
+ },
33751
+ {
33752
+ key: "printer",
33753
+ group: "device",
33754
+ synonyms: ["stampante"]
33755
+ },
33756
+ {
33757
+ key: "projector",
33758
+ group: "device",
33759
+ synonyms: ["proiettore"]
33760
+ },
33761
+ {
33762
+ key: "gamepad-2",
33763
+ group: "device",
33764
+ synonyms: [
33765
+ "console",
33766
+ "gioco",
33767
+ "joystick"
33768
+ ]
33769
+ },
33770
+ {
33771
+ key: "radio",
33772
+ group: "device",
33773
+ synonyms: ["radio"]
33774
+ },
33775
+ {
33776
+ key: "router",
33777
+ group: "device",
33778
+ synonyms: ["router", "modem"]
33779
+ },
33780
+ {
33781
+ key: "bluetooth",
33782
+ group: "device",
33783
+ synonyms: ["bluetooth"]
33784
+ },
33785
+ {
33786
+ key: "cpu",
33787
+ group: "device",
33788
+ synonyms: [
33789
+ "processore",
33790
+ "cpu",
33791
+ "chip",
33792
+ "dispositivo"
33793
+ ]
33794
+ },
33795
+ {
33796
+ key: "hard-drive",
33797
+ group: "device",
33798
+ synonyms: [
33799
+ "disco",
33800
+ "hdd",
33801
+ "archiviazione",
33802
+ "storage"
33803
+ ]
33804
+ },
33805
+ {
33806
+ key: "server",
33807
+ group: "device",
33808
+ synonyms: ["server", "nas"]
33809
+ },
33810
+ {
33811
+ key: "mic",
33812
+ group: "device",
33813
+ synonyms: ["microfono", "audio"]
33814
+ },
33815
+ {
33816
+ key: "mic-off",
33817
+ group: "device",
33818
+ synonyms: [
33819
+ "microfono",
33820
+ "spento",
33821
+ "muto"
33822
+ ]
33823
+ },
33824
+ {
33825
+ key: "video",
33826
+ group: "device",
33827
+ synonyms: ["video"]
33828
+ },
33829
+ {
33830
+ key: "video-off",
33831
+ group: "device",
33832
+ synonyms: ["video", "spento"]
33833
+ },
33834
+ {
33835
+ key: "music",
33836
+ group: "device",
33837
+ synonyms: ["musica"]
33838
+ },
33839
+ {
33840
+ key: "plug",
33841
+ group: "device",
33842
+ synonyms: [
33843
+ "presa",
33844
+ "spina",
33845
+ "plug"
33846
+ ]
33847
+ },
33848
+ {
33849
+ key: "plug-zap",
33850
+ group: "device",
33851
+ synonyms: ["presa", "alimentata"]
33852
+ },
33853
+ {
33854
+ key: "power",
33855
+ group: "device",
33856
+ synonyms: [
33857
+ "accensione",
33858
+ "alimentazione",
33859
+ "power"
33860
+ ]
33861
+ },
33862
+ {
33863
+ key: "power-off",
33864
+ group: "device",
33865
+ synonyms: ["spegnimento", "spento"]
33866
+ },
33867
+ {
33868
+ key: "cable",
33869
+ group: "device",
33870
+ synonyms: ["cavo"]
33871
+ },
33872
+ {
33873
+ key: "battery",
33874
+ group: "device",
33875
+ synonyms: ["batteria"]
33876
+ },
33877
+ {
33878
+ key: "battery-charging",
33879
+ group: "device",
33880
+ synonyms: [
33881
+ "batteria",
33882
+ "carica",
33883
+ "ricarica"
33884
+ ]
33885
+ },
33886
+ {
33887
+ key: "battery-full",
33888
+ group: "device",
33889
+ synonyms: [
33890
+ "batteria",
33891
+ "carica",
33892
+ "piena"
33893
+ ]
33894
+ },
33895
+ {
33896
+ key: "battery-low",
33897
+ group: "device",
33898
+ synonyms: ["batteria", "scarica"]
33899
+ },
33900
+ {
33901
+ key: "key",
33902
+ group: "device",
33903
+ synonyms: ["chiave"]
33904
+ },
33905
+ {
33906
+ key: "key-round",
33907
+ group: "device",
33908
+ synonyms: ["chiave", "tonda"]
33909
+ },
33910
+ {
33911
+ key: "mailbox",
33912
+ group: "device",
33913
+ synonyms: [
33914
+ "cassetta",
33915
+ "postale",
33916
+ "posta"
33917
+ ]
33918
+ },
33919
+ {
33920
+ key: "package",
33921
+ group: "device",
33922
+ synonyms: ["pacco", "consegna"]
33923
+ },
33924
+ {
33925
+ key: "shield",
33926
+ group: "device",
33927
+ synonyms: [
33928
+ "scudo",
33929
+ "protezione",
33930
+ "sicurezza",
33931
+ "allarme"
33932
+ ]
33933
+ },
33934
+ {
33935
+ key: "shield-check",
33936
+ group: "device",
33937
+ synonyms: [
33938
+ "protetto",
33939
+ "sicuro",
33940
+ "armato"
33941
+ ]
33942
+ },
33943
+ {
33944
+ key: "shield-off",
33945
+ group: "device",
33946
+ synonyms: [
33947
+ "protezione",
33948
+ "disattivata",
33949
+ "disarmato"
33950
+ ]
33951
+ },
33952
+ {
33953
+ key: "briefcase",
33954
+ group: "device",
33955
+ synonyms: [
33956
+ "ufficio",
33957
+ "lavoro",
33958
+ "valigetta",
33959
+ "studio"
33960
+ ]
33961
+ },
33962
+ {
33963
+ key: "lightbulb",
33964
+ group: "lighting",
33965
+ synonyms: [
33966
+ "luce",
33967
+ "lampadina",
33968
+ "lampada",
33969
+ "light"
33970
+ ]
33971
+ },
33972
+ {
33973
+ key: "lamp",
33974
+ group: "lighting",
33975
+ synonyms: ["lampada", "abatjour"]
33976
+ },
33977
+ {
33978
+ key: "lamp-ceiling",
33979
+ group: "lighting",
33980
+ synonyms: [
33981
+ "plafoniera",
33982
+ "lampadario",
33983
+ "luce",
33984
+ "soffitto"
33985
+ ]
33986
+ },
33987
+ {
33988
+ key: "lamp-desk",
33989
+ group: "lighting",
33990
+ synonyms: [
33991
+ "lampada",
33992
+ "scrivania",
33993
+ "abatjour"
33994
+ ]
33995
+ },
33996
+ {
33997
+ key: "lamp-floor",
33998
+ group: "lighting",
33999
+ synonyms: [
34000
+ "piantana",
34001
+ "lampada",
34002
+ "terra"
34003
+ ]
34004
+ },
34005
+ {
34006
+ key: "flashlight",
34007
+ group: "lighting",
34008
+ synonyms: [
34009
+ "faretto",
34010
+ "torcia",
34011
+ "spot",
34012
+ "faro"
34013
+ ]
34014
+ },
34015
+ {
34016
+ key: "heater",
34017
+ group: "lighting",
34018
+ synonyms: [
34019
+ "riscaldamento",
34020
+ "termosifone",
34021
+ "stufa",
34022
+ "calore"
34023
+ ]
34024
+ },
34025
+ {
34026
+ key: "snowflake",
34027
+ group: "lighting",
34028
+ synonyms: [
34029
+ "freddo",
34030
+ "raffrescamento",
34031
+ "aria",
34032
+ "condizionata",
34033
+ "neve"
34034
+ ]
34035
+ },
34036
+ {
34037
+ key: "thermometer-sun",
34038
+ group: "lighting",
34039
+ synonyms: [
34040
+ "caldo",
34041
+ "temperatura",
34042
+ "alta"
34043
+ ]
34044
+ },
34045
+ {
34046
+ key: "thermometer-snowflake",
34047
+ group: "lighting",
34048
+ synonyms: [
34049
+ "freddo",
34050
+ "temperatura",
34051
+ "bassa"
34052
+ ]
34053
+ },
34054
+ {
34055
+ key: "refrigerator",
34056
+ group: "lighting",
34057
+ synonyms: ["frigorifero", "frigo"]
34058
+ },
34059
+ {
34060
+ key: "microwave",
34061
+ group: "lighting",
34062
+ synonyms: ["microonde", "forno"]
34063
+ },
34064
+ {
34065
+ key: "washing-machine",
34066
+ group: "lighting",
34067
+ synonyms: [
34068
+ "lavatrice",
34069
+ "lavastoviglie",
34070
+ "asciugatrice"
34071
+ ]
34072
+ },
34073
+ {
34074
+ key: "cooking-pot",
34075
+ group: "lighting",
34076
+ synonyms: [
34077
+ "pentola",
34078
+ "cucina",
34079
+ "fornello"
34080
+ ]
34081
+ },
34082
+ {
34083
+ key: "utensils",
34084
+ group: "lighting",
34085
+ synonyms: [
34086
+ "cucina",
34087
+ "posate",
34088
+ "sala",
34089
+ "pranzo"
34090
+ ]
34091
+ },
34092
+ {
34093
+ key: "thermometer",
34094
+ group: "sensing",
34095
+ synonyms: [
34096
+ "temperatura",
34097
+ "termometro",
34098
+ "termostato"
34099
+ ]
34100
+ },
34101
+ {
34102
+ key: "droplets",
34103
+ group: "sensing",
34104
+ synonyms: [
34105
+ "umidita",
34106
+ "acqua",
34107
+ "allagamento",
34108
+ "perdita"
34109
+ ]
34110
+ },
34111
+ {
34112
+ key: "droplet",
34113
+ group: "sensing",
34114
+ synonyms: [
34115
+ "goccia",
34116
+ "acqua",
34117
+ "perdita",
34118
+ "allagamento"
34119
+ ]
34120
+ },
34121
+ {
34122
+ key: "gauge",
34123
+ group: "sensing",
34124
+ synonyms: [
34125
+ "misura",
34126
+ "livello",
34127
+ "pressione",
34128
+ "indicatore"
34129
+ ]
34130
+ },
34131
+ {
34132
+ key: "gauge2",
34133
+ group: "sensing",
34134
+ synonyms: [
34135
+ "misura",
34136
+ "livello",
34137
+ "pressione",
34138
+ "indicatore"
34139
+ ],
34140
+ aliasOf: "gauge"
34141
+ },
34142
+ {
34143
+ key: "sun",
34144
+ group: "sensing",
34145
+ synonyms: [
34146
+ "sole",
34147
+ "luminosita",
34148
+ "giorno",
34149
+ "esterno"
34150
+ ]
34151
+ },
34152
+ {
34153
+ key: "sun-medium",
34154
+ group: "sensing",
34155
+ synonyms: ["sole", "luminosita"]
34156
+ },
34157
+ {
34158
+ key: "sunrise",
34159
+ group: "sensing",
34160
+ synonyms: ["alba"]
34161
+ },
34162
+ {
34163
+ key: "moon",
34164
+ group: "sensing",
34165
+ synonyms: [
34166
+ "notte",
34167
+ "luna",
34168
+ "notturna",
34169
+ "nightvision"
34170
+ ]
34171
+ },
34172
+ {
34173
+ key: "wind",
34174
+ group: "sensing",
34175
+ synonyms: [
34176
+ "vento",
34177
+ "aria",
34178
+ "gas",
34179
+ "monossido",
34180
+ "co"
34181
+ ]
34182
+ },
34183
+ {
34184
+ key: "cloud",
34185
+ group: "sensing",
34186
+ synonyms: ["nuvola", "nuvoloso"]
34187
+ },
34188
+ {
34189
+ key: "cloud-rain",
34190
+ group: "sensing",
34191
+ synonyms: ["pioggia"]
34192
+ },
34193
+ {
34194
+ key: "cloud-sun",
34195
+ group: "sensing",
34196
+ synonyms: [
34197
+ "variabile",
34198
+ "sole",
34199
+ "nuvole"
34200
+ ]
34201
+ },
34202
+ {
34203
+ key: "waves",
34204
+ group: "sensing",
34205
+ synonyms: [
34206
+ "onde",
34207
+ "acqua",
34208
+ "vibrazione"
34209
+ ]
34210
+ },
34211
+ {
34212
+ key: "sprout",
34213
+ group: "sensing",
34214
+ synonyms: [
34215
+ "irrigazione",
34216
+ "pianta",
34217
+ "germoglio",
34218
+ "orto"
34219
+ ]
34220
+ },
34221
+ {
34222
+ key: "leaf",
34223
+ group: "sensing",
34224
+ synonyms: [
34225
+ "foglia",
34226
+ "pianta",
34227
+ "verde"
34228
+ ]
34229
+ },
34230
+ {
34231
+ key: "flower",
34232
+ group: "sensing",
34233
+ synonyms: ["fiore", "pianta"]
34234
+ },
34235
+ {
34236
+ key: "zap",
34237
+ group: "sensing",
34238
+ synonyms: [
34239
+ "energia",
34240
+ "corrente",
34241
+ "consumo",
34242
+ "watt",
34243
+ "elettricita"
34244
+ ]
34245
+ },
34246
+ {
34247
+ key: "flame",
34248
+ group: "sensing",
34249
+ synonyms: [
34250
+ "fiamma",
34251
+ "gas",
34252
+ "fuoco",
34253
+ "incendio"
34254
+ ]
34255
+ },
34256
+ {
34257
+ key: "bell",
34258
+ group: "sensing",
34259
+ synonyms: [
34260
+ "campanello",
34261
+ "suoneria",
34262
+ "notifica",
34263
+ "bell",
34264
+ "chime"
34265
+ ]
34266
+ },
34267
+ {
34268
+ key: "bell-ring",
34269
+ group: "sensing",
34270
+ synonyms: [
34271
+ "campanello",
34272
+ "suona",
34273
+ "doorbell",
34274
+ "notifica"
34275
+ ]
34276
+ },
34277
+ {
34278
+ key: "bell-off",
34279
+ group: "sensing",
34280
+ synonyms: [
34281
+ "silenzioso",
34282
+ "notifiche",
34283
+ "disattivate",
34284
+ "muto"
34285
+ ]
34286
+ },
34287
+ {
34288
+ key: "siren",
34289
+ group: "sensing",
34290
+ synonyms: ["sirena", "allarme"]
34291
+ },
34292
+ {
34293
+ key: "radar",
34294
+ group: "sensing",
34295
+ synonyms: [
34296
+ "movimento",
34297
+ "presenza",
34298
+ "pir",
34299
+ "rilevamento",
34300
+ "radar"
34301
+ ]
34302
+ },
34303
+ {
34304
+ key: "activity",
34305
+ group: "sensing",
34306
+ synonyms: [
34307
+ "attivita",
34308
+ "sensore",
34309
+ "generico"
34310
+ ]
34311
+ },
34312
+ {
34313
+ key: "hash",
34314
+ group: "sensing",
34315
+ synonyms: [
34316
+ "numero",
34317
+ "contatore",
34318
+ "valore"
34319
+ ]
34320
+ },
34321
+ {
34322
+ key: "clock",
34323
+ group: "sensing",
34324
+ synonyms: [
34325
+ "orologio",
34326
+ "ora",
34327
+ "tempo"
34328
+ ]
34329
+ },
34330
+ {
34331
+ key: "timer",
34332
+ group: "sensing",
34333
+ synonyms: [
34334
+ "timer",
34335
+ "conto",
34336
+ "rovescia"
34337
+ ]
34338
+ },
34339
+ {
34340
+ key: "calendar",
34341
+ group: "sensing",
34342
+ synonyms: [
34343
+ "calendario",
34344
+ "data",
34345
+ "pianificazione"
34346
+ ]
34347
+ },
34348
+ {
34349
+ key: "pipette",
34350
+ group: "sensing",
34351
+ synonyms: [
34352
+ "qualita",
34353
+ "aria",
34354
+ "misura",
34355
+ "campione"
34356
+ ]
34357
+ },
34358
+ {
34359
+ key: "fan",
34360
+ group: "sensing",
34361
+ synonyms: [
34362
+ "ventilatore",
34363
+ "ventola",
34364
+ "aria"
34365
+ ]
34366
+ },
34367
+ {
34368
+ key: "bath",
34369
+ group: "sensing",
34370
+ synonyms: [
34371
+ "bagno",
34372
+ "vasca",
34373
+ "doccia"
34374
+ ]
34375
+ },
34376
+ {
34377
+ key: "footprints",
34378
+ group: "sensing",
34379
+ synonyms: [
34380
+ "movimento",
34381
+ "passi",
34382
+ "presenza",
34383
+ "motion"
34384
+ ]
34385
+ },
34386
+ {
34387
+ key: "alarm-smoke",
34388
+ group: "sensing",
34389
+ synonyms: [
34390
+ "fumo",
34391
+ "antincendio",
34392
+ "rilevatore"
34393
+ ]
34394
+ },
34395
+ {
34396
+ key: "shield-alert",
34397
+ group: "sensing",
34398
+ synonyms: [
34399
+ "manomissione",
34400
+ "allarme",
34401
+ "tamper",
34402
+ "avviso"
34403
+ ]
34404
+ },
34405
+ {
34406
+ key: "vibrate",
34407
+ group: "sensing",
34408
+ synonyms: [
34409
+ "vibrazione",
34410
+ "urto",
34411
+ "tamper"
34412
+ ]
34413
+ },
34414
+ {
34415
+ key: "wifi",
34416
+ group: "sensing",
34417
+ synonyms: [
34418
+ "wifi",
34419
+ "rete",
34420
+ "segnale"
34421
+ ]
34422
+ },
34423
+ {
34424
+ key: "wifi-off",
34425
+ group: "sensing",
34426
+ synonyms: [
34427
+ "wifi",
34428
+ "assente",
34429
+ "offline",
34430
+ "disconnesso"
34431
+ ]
34432
+ },
34433
+ {
34434
+ key: "volume-2",
34435
+ group: "sensing",
34436
+ synonyms: [
34437
+ "volume",
34438
+ "audio",
34439
+ "altoparlante",
34440
+ "suono"
34441
+ ]
34442
+ },
34443
+ {
34444
+ key: "volume-x",
34445
+ group: "sensing",
34446
+ synonyms: [
34447
+ "muto",
34448
+ "silenziato",
34449
+ "volume",
34450
+ "spento"
34451
+ ]
34452
+ },
34453
+ {
34454
+ key: "heart",
34455
+ group: "sensing",
34456
+ synonyms: [
34457
+ "cuore",
34458
+ "preferito",
34459
+ "salute"
34460
+ ]
34461
+ },
34462
+ {
34463
+ key: "heart-pulse",
34464
+ group: "sensing",
34465
+ synonyms: [
34466
+ "battito",
34467
+ "salute",
34468
+ "monitoraggio"
34469
+ ]
34470
+ },
34471
+ {
34472
+ key: "star",
34473
+ group: "sensing",
34474
+ synonyms: [
34475
+ "preferito",
34476
+ "stella",
34477
+ "importante"
34478
+ ]
34479
+ },
34480
+ {
34481
+ key: "sparkles",
34482
+ group: "sensing",
34483
+ synonyms: [
34484
+ "automatico",
34485
+ "intelligente",
34486
+ "ai",
34487
+ "scena"
34488
+ ]
34489
+ },
34490
+ {
34491
+ key: "house",
34492
+ group: "place",
34493
+ synonyms: [
34494
+ "casa",
34495
+ "abitazione",
34496
+ "home"
34497
+ ]
34498
+ },
34499
+ {
34500
+ key: "sofa",
34501
+ group: "place",
34502
+ synonyms: [
34503
+ "salone",
34504
+ "soggiorno",
34505
+ "divano",
34506
+ "living"
34507
+ ]
34508
+ },
34509
+ {
34510
+ key: "bed-double",
34511
+ group: "place",
34512
+ synonyms: [
34513
+ "camera",
34514
+ "letto",
34515
+ "matrimoniale"
34516
+ ]
34517
+ },
34518
+ {
34519
+ key: "bed",
34520
+ group: "place",
34521
+ synonyms: [
34522
+ "cameretta",
34523
+ "letto",
34524
+ "singolo"
34525
+ ]
34526
+ },
34527
+ {
34528
+ key: "warehouse",
34529
+ group: "place",
34530
+ synonyms: [
34531
+ "magazzino",
34532
+ "capanno",
34533
+ "deposito",
34534
+ "cantina"
34535
+ ]
34536
+ },
34537
+ {
34538
+ key: "trees",
34539
+ group: "place",
34540
+ synonyms: [
34541
+ "giardino",
34542
+ "alberi",
34543
+ "esterno",
34544
+ "parco"
34545
+ ]
34546
+ },
34547
+ {
34548
+ key: "tree-pine",
34549
+ group: "place",
34550
+ synonyms: [
34551
+ "albero",
34552
+ "pino",
34553
+ "giardino"
34554
+ ]
34555
+ },
34556
+ {
34557
+ key: "fence",
34558
+ group: "place",
34559
+ synonyms: [
34560
+ "recinto",
34561
+ "cancello",
34562
+ "staccionata",
34563
+ "perimetro"
34564
+ ]
34565
+ },
34566
+ {
34567
+ key: "store",
34568
+ group: "place",
34569
+ synonyms: [
34570
+ "negozio",
34571
+ "ingresso",
34572
+ "vetrina"
34573
+ ]
34574
+ },
34575
+ {
34576
+ key: "building",
34577
+ group: "place",
34578
+ synonyms: ["edificio", "palazzo"]
34579
+ },
34580
+ {
34581
+ key: "building-2",
34582
+ group: "place",
34583
+ synonyms: [
34584
+ "edificio",
34585
+ "uffici",
34586
+ "condominio"
34587
+ ]
34588
+ },
34589
+ {
34590
+ key: "mountain",
34591
+ group: "place",
34592
+ synonyms: [
34593
+ "montagna",
34594
+ "esterno",
34595
+ "panorama"
34596
+ ]
34597
+ },
34598
+ {
34599
+ key: "umbrella",
34600
+ group: "place",
34601
+ synonyms: [
34602
+ "tenda",
34603
+ "markise",
34604
+ "ombrellone",
34605
+ "pergola",
34606
+ "veranda"
34607
+ ]
34608
+ },
34609
+ {
34610
+ key: "dumbbell",
34611
+ group: "place",
34612
+ synonyms: ["palestra", "attrezzi"]
34613
+ },
34614
+ {
34615
+ key: "wrench",
34616
+ group: "place",
34617
+ synonyms: [
34618
+ "officina",
34619
+ "manutenzione",
34620
+ "attrezzi",
34621
+ "utenze"
34622
+ ]
34623
+ },
34624
+ {
34625
+ key: "hammer",
34626
+ group: "place",
34627
+ synonyms: [
34628
+ "officina",
34629
+ "martello",
34630
+ "lavori"
34631
+ ]
34632
+ },
34633
+ {
34634
+ key: "drill",
34635
+ group: "place",
34636
+ synonyms: [
34637
+ "officina",
34638
+ "trapano",
34639
+ "lavori"
34640
+ ]
34641
+ },
34642
+ {
34643
+ key: "waves-ladder",
34644
+ group: "place",
34645
+ synonyms: ["piscina", "vasca"]
34646
+ },
34647
+ {
34648
+ key: "circle-parking",
34649
+ group: "place",
34650
+ synonyms: [
34651
+ "parcheggio",
34652
+ "posto",
34653
+ "auto",
34654
+ "garage"
34655
+ ]
34656
+ },
34657
+ {
34658
+ key: "route",
34659
+ group: "place",
34660
+ synonyms: [
34661
+ "percorso",
34662
+ "strada",
34663
+ "vialetto",
34664
+ "tragitto"
34665
+ ]
34666
+ },
34667
+ {
34668
+ key: "car",
34669
+ group: "life",
34670
+ synonyms: [
34671
+ "auto",
34672
+ "macchina",
34673
+ "veicolo",
34674
+ "parcheggio"
34675
+ ]
34676
+ },
34677
+ {
34678
+ key: "bike",
34679
+ group: "life",
34680
+ synonyms: [
34681
+ "bicicletta",
34682
+ "bici",
34683
+ "moto"
34684
+ ]
34685
+ },
34686
+ {
34687
+ key: "bus",
34688
+ group: "life",
34689
+ synonyms: ["autobus", "pullman"]
34690
+ },
34691
+ {
34692
+ key: "truck",
34693
+ group: "life",
34694
+ synonyms: [
34695
+ "camion",
34696
+ "furgone",
34697
+ "consegna"
34698
+ ]
34699
+ },
34700
+ {
34701
+ key: "plane",
34702
+ group: "life",
34703
+ synonyms: ["aereo"]
34704
+ },
34705
+ {
34706
+ key: "train-front",
34707
+ group: "life",
34708
+ synonyms: ["treno"]
34709
+ },
34710
+ {
34711
+ key: "sailboat",
34712
+ group: "life",
34713
+ synonyms: ["barca", "imbarcazione"]
34714
+ },
34715
+ {
34716
+ key: "dog",
34717
+ group: "life",
34718
+ synonyms: ["cane", "animale"]
34719
+ },
34720
+ {
34721
+ key: "cat",
34722
+ group: "life",
34723
+ synonyms: ["gatto", "animale"]
34724
+ },
34725
+ {
34726
+ key: "bird",
34727
+ group: "life",
34728
+ synonyms: ["uccello", "animale"]
34729
+ },
34730
+ {
34731
+ key: "paw-print",
34732
+ group: "life",
34733
+ synonyms: [
34734
+ "animale",
34735
+ "zampa",
34736
+ "pet"
34737
+ ]
34738
+ },
34739
+ {
34740
+ key: "baby",
34741
+ group: "life",
34742
+ synonyms: [
34743
+ "neonato",
34744
+ "bimbo",
34745
+ "cameretta",
34746
+ "babymonitor"
34747
+ ]
34748
+ },
34749
+ {
34750
+ key: "user",
34751
+ group: "life",
34752
+ synonyms: ["persona", "utente"]
34753
+ },
34754
+ {
34755
+ key: "users",
34756
+ group: "life",
34757
+ synonyms: [
34758
+ "persone",
34759
+ "gruppo",
34760
+ "famiglia"
34761
+ ]
34762
+ },
34763
+ {
34764
+ key: "person-standing",
34765
+ group: "life",
34766
+ synonyms: [
34767
+ "persona",
34768
+ "piedi",
34769
+ "presenza"
34770
+ ]
34771
+ }
34772
+ ];
34773
+ DISPLAY_ICON_VOCABULARY.map((e) => e.key);
34774
+ DISPLAY_ICON_VOCABULARY.filter((e) => e.aliasOf === void 0).map((e) => e.key);
34775
+ new Map(DISPLAY_ICON_VOCABULARY.map((e) => [e.key, e]));
32932
34776
  Object.freeze({
34777
+ "accessories.getStatus": {
34778
+ capName: "accessories",
34779
+ capScope: "device",
34780
+ addonId: null,
34781
+ access: "view"
34782
+ },
32933
34783
  "accessories.setChildHidden": {
32934
34784
  capName: "accessories",
32935
34785
  capScope: "device",
@@ -33212,6 +35062,12 @@ Object.freeze({
33212
35062
  addonId: null,
33213
35063
  access: "view"
33214
35064
  },
35065
+ "airQualitySensor.getStatus": {
35066
+ capName: "air-quality-sensor",
35067
+ capScope: "device",
35068
+ addonId: null,
35069
+ access: "view"
35070
+ },
33215
35071
  "alarmPanel.arm": {
33216
35072
  capName: "alarm-panel",
33217
35073
  capScope: "device",
@@ -33224,6 +35080,12 @@ Object.freeze({
33224
35080
  addonId: null,
33225
35081
  access: "create"
33226
35082
  },
35083
+ "alarmPanel.getStatus": {
35084
+ capName: "alarm-panel",
35085
+ capScope: "device",
35086
+ addonId: null,
35087
+ access: "view"
35088
+ },
33227
35089
  "alarmPanel.trigger": {
33228
35090
  capName: "alarm-panel",
33229
35091
  capScope: "device",
@@ -33272,6 +35134,30 @@ Object.freeze({
33272
35134
  addonId: null,
33273
35135
  access: "create"
33274
35136
  },
35137
+ "ambientLightSensor.getStatus": {
35138
+ capName: "ambient-light-sensor",
35139
+ capScope: "device",
35140
+ addonId: null,
35141
+ access: "view"
35142
+ },
35143
+ "audioAnalysis.applyDeviceSettingsPatch": {
35144
+ capName: "audio-analysis",
35145
+ capScope: "device",
35146
+ addonId: null,
35147
+ access: "create"
35148
+ },
35149
+ "audioAnalysis.getDeviceLiveContribution": {
35150
+ capName: "audio-analysis",
35151
+ capScope: "device",
35152
+ addonId: null,
35153
+ access: "view"
35154
+ },
35155
+ "audioAnalysis.getDeviceSettingsContribution": {
35156
+ capName: "audio-analysis",
35157
+ capScope: "device",
35158
+ addonId: null,
35159
+ access: "view"
35160
+ },
33275
35161
  "audioAnalysis.resolveDeviceSettings": {
33276
35162
  capName: "audio-analysis",
33277
35163
  capScope: "device",
@@ -33434,6 +35320,12 @@ Object.freeze({
33434
35320
  addonId: null,
33435
35321
  access: "create"
33436
35322
  },
35323
+ "automationControl.getStatus": {
35324
+ capName: "automation-control",
35325
+ capScope: "device",
35326
+ addonId: null,
35327
+ access: "view"
35328
+ },
33437
35329
  "automationControl.trigger": {
33438
35330
  capName: "automation-control",
33439
35331
  capScope: "device",
@@ -33530,12 +35422,30 @@ Object.freeze({
33530
35422
  addonId: null,
33531
35423
  access: "create"
33532
35424
  },
35425
+ "battery.getStatus": {
35426
+ capName: "battery",
35427
+ capScope: "device",
35428
+ addonId: null,
35429
+ access: "view"
35430
+ },
33533
35431
  "battery.wakeForStream": {
33534
35432
  capName: "battery",
33535
35433
  capScope: "device",
33536
35434
  addonId: null,
33537
35435
  access: "create"
33538
35436
  },
35437
+ "binary.getStatus": {
35438
+ capName: "binary",
35439
+ capScope: "device",
35440
+ addonId: null,
35441
+ access: "view"
35442
+ },
35443
+ "brightness.getStatus": {
35444
+ capName: "brightness",
35445
+ capScope: "device",
35446
+ addonId: null,
35447
+ access: "view"
35448
+ },
33539
35449
  "brightness.setBrightness": {
33540
35450
  capName: "brightness",
33541
35451
  capScope: "device",
@@ -33650,6 +35560,30 @@ Object.freeze({
33650
35560
  addonId: null,
33651
35561
  access: "view"
33652
35562
  },
35563
+ "cameraCredentials.getStatus": {
35564
+ capName: "camera-credentials",
35565
+ capScope: "device",
35566
+ addonId: null,
35567
+ access: "view"
35568
+ },
35569
+ "cameraGridLayout.applyDeviceSettingsPatch": {
35570
+ capName: "camera-grid-layout",
35571
+ capScope: "device",
35572
+ addonId: null,
35573
+ access: "create"
35574
+ },
35575
+ "cameraGridLayout.getDeviceLiveContribution": {
35576
+ capName: "camera-grid-layout",
35577
+ capScope: "device",
35578
+ addonId: null,
35579
+ access: "view"
35580
+ },
35581
+ "cameraGridLayout.getDeviceSettingsContribution": {
35582
+ capName: "camera-grid-layout",
35583
+ capScope: "device",
35584
+ addonId: null,
35585
+ access: "view"
35586
+ },
33653
35587
  "cameraGridLayout.getLayout": {
33654
35588
  capName: "camera-grid-layout",
33655
35589
  capScope: "device",
@@ -33662,6 +35596,24 @@ Object.freeze({
33662
35596
  addonId: null,
33663
35597
  access: "create"
33664
35598
  },
35599
+ "cameraPipelineConfig.applyDeviceSettingsPatch": {
35600
+ capName: "camera-pipeline-config",
35601
+ capScope: "device",
35602
+ addonId: null,
35603
+ access: "create"
35604
+ },
35605
+ "cameraPipelineConfig.getDeviceLiveContribution": {
35606
+ capName: "camera-pipeline-config",
35607
+ capScope: "device",
35608
+ addonId: null,
35609
+ access: "view"
35610
+ },
35611
+ "cameraPipelineConfig.getDeviceSettingsContribution": {
35612
+ capName: "camera-pipeline-config",
35613
+ capScope: "device",
35614
+ addonId: null,
35615
+ access: "view"
35616
+ },
33665
35617
  "cameraStreams.getBrokerStreams": {
33666
35618
  capName: "camera-streams",
33667
35619
  capScope: "device",
@@ -33692,6 +35644,18 @@ Object.freeze({
33692
35644
  addonId: null,
33693
35645
  access: "view"
33694
35646
  },
35647
+ "carbonMonoxide.getStatus": {
35648
+ capName: "carbon-monoxide",
35649
+ capScope: "device",
35650
+ addonId: null,
35651
+ access: "view"
35652
+ },
35653
+ "climateControl.getStatus": {
35654
+ capName: "climate-control",
35655
+ capScope: "device",
35656
+ addonId: null,
35657
+ access: "view"
35658
+ },
33695
35659
  "climateControl.setFanMode": {
33696
35660
  capName: "climate-control",
33697
35661
  capScope: "device",
@@ -33740,6 +35704,12 @@ Object.freeze({
33740
35704
  addonId: null,
33741
35705
  access: "create"
33742
35706
  },
35707
+ "color.getStatus": {
35708
+ capName: "color",
35709
+ capScope: "device",
35710
+ addonId: null,
35711
+ access: "view"
35712
+ },
33743
35713
  "color.setColor": {
33744
35714
  capName: "color",
33745
35715
  capScope: "device",
@@ -33758,12 +35728,36 @@ Object.freeze({
33758
35728
  addonId: null,
33759
35729
  access: "create"
33760
35730
  },
35731
+ "connectivity.getStatus": {
35732
+ capName: "connectivity",
35733
+ capScope: "device",
35734
+ addonId: null,
35735
+ access: "view"
35736
+ },
35737
+ "consumables.getStatus": {
35738
+ capName: "consumables",
35739
+ capScope: "device",
35740
+ addonId: null,
35741
+ access: "view"
35742
+ },
33761
35743
  "consumables.reset": {
33762
35744
  capName: "consumables",
33763
35745
  capScope: "device",
33764
35746
  addonId: null,
33765
35747
  access: "delete"
33766
35748
  },
35749
+ "contact.getStatus": {
35750
+ capName: "contact",
35751
+ capScope: "device",
35752
+ addonId: null,
35753
+ access: "view"
35754
+ },
35755
+ "control.getStatus": {
35756
+ capName: "control",
35757
+ capScope: "device",
35758
+ addonId: null,
35759
+ access: "view"
35760
+ },
33767
35761
  "control.setValue": {
33768
35762
  capName: "control",
33769
35763
  capScope: "device",
@@ -33830,6 +35824,12 @@ Object.freeze({
33830
35824
  addonId: null,
33831
35825
  access: "create"
33832
35826
  },
35827
+ "cover.getStatus": {
35828
+ capName: "cover",
35829
+ capScope: "device",
35830
+ addonId: null,
35831
+ access: "view"
35832
+ },
33833
35833
  "cover.open": {
33834
35834
  capName: "cover",
33835
35835
  capScope: "device",
@@ -33962,6 +35962,12 @@ Object.freeze({
33962
35962
  addonId: null,
33963
35963
  access: "view"
33964
35964
  },
35965
+ "dayNight.getStatus": {
35966
+ capName: "day-night",
35967
+ capScope: "device",
35968
+ addonId: null,
35969
+ access: "view"
35970
+ },
33965
35971
  "dayNight.setSettings": {
33966
35972
  capName: "day-night",
33967
35973
  capScope: "device",
@@ -34052,6 +36058,30 @@ Object.freeze({
34052
36058
  addonId: null,
34053
36059
  access: "view"
34054
36060
  },
36061
+ "detectionPipeline.applyDeviceSettingsPatch": {
36062
+ capName: "detection-pipeline",
36063
+ capScope: "device",
36064
+ addonId: null,
36065
+ access: "create"
36066
+ },
36067
+ "detectionPipeline.getDeviceLiveContribution": {
36068
+ capName: "detection-pipeline",
36069
+ capScope: "device",
36070
+ addonId: null,
36071
+ access: "view"
36072
+ },
36073
+ "detectionPipeline.getDeviceSettingsContribution": {
36074
+ capName: "detection-pipeline",
36075
+ capScope: "device",
36076
+ addonId: null,
36077
+ access: "view"
36078
+ },
36079
+ "deviceAdminLink.getAdminLink": {
36080
+ capName: "device-admin-link",
36081
+ capScope: "device",
36082
+ addonId: null,
36083
+ access: "view"
36084
+ },
34055
36085
  "deviceAdoption.adopt": {
34056
36086
  capName: "device-adoption",
34057
36087
  capScope: "system",
@@ -34064,6 +36094,12 @@ Object.freeze({
34064
36094
  addonId: null,
34065
36095
  access: "view"
34066
36096
  },
36097
+ "deviceAdoption.getStatus": {
36098
+ capName: "device-adoption",
36099
+ capScope: "system",
36100
+ addonId: null,
36101
+ access: "view"
36102
+ },
34067
36103
  "deviceAdoption.listCandidateFilters": {
34068
36104
  capName: "device-adoption",
34069
36105
  capScope: "system",
@@ -34100,6 +36136,12 @@ Object.freeze({
34100
36136
  addonId: null,
34101
36137
  access: "create"
34102
36138
  },
36139
+ "deviceDiscovery.getStatus": {
36140
+ capName: "device-discovery",
36141
+ capScope: "device",
36142
+ addonId: null,
36143
+ access: "view"
36144
+ },
34103
36145
  "deviceDiscovery.listDiscovered": {
34104
36146
  capName: "device-discovery",
34105
36147
  capScope: "device",
@@ -34118,12 +36160,30 @@ Object.freeze({
34118
36160
  addonId: null,
34119
36161
  access: "create"
34120
36162
  },
36163
+ "deviceExport.applyDeviceSettingsPatch": {
36164
+ capName: "device-export",
36165
+ capScope: "system",
36166
+ addonId: null,
36167
+ access: "create"
36168
+ },
34121
36169
  "deviceExport.exposeDevice": {
34122
36170
  capName: "device-export",
34123
36171
  capScope: "system",
34124
36172
  addonId: null,
34125
36173
  access: "create"
34126
36174
  },
36175
+ "deviceExport.getDeviceLiveContribution": {
36176
+ capName: "device-export",
36177
+ capScope: "system",
36178
+ addonId: null,
36179
+ access: "view"
36180
+ },
36181
+ "deviceExport.getDeviceSettingsContribution": {
36182
+ capName: "device-export",
36183
+ capScope: "system",
36184
+ addonId: null,
36185
+ access: "view"
36186
+ },
34127
36187
  "deviceExport.getStatus": {
34128
36188
  capName: "device-export",
34129
36189
  capScope: "system",
@@ -34220,6 +36280,12 @@ Object.freeze({
34220
36280
  addonId: null,
34221
36281
  access: "create"
34222
36282
  },
36283
+ "deviceManager.applyDeviceSettingsPatch": {
36284
+ capName: "device-manager",
36285
+ capScope: "system",
36286
+ addonId: null,
36287
+ access: "create"
36288
+ },
34223
36289
  "deviceManager.applyInitialMeta": {
34224
36290
  capName: "device-manager",
34225
36291
  capScope: "system",
@@ -34322,6 +36388,12 @@ Object.freeze({
34322
36388
  addonId: null,
34323
36389
  access: "view"
34324
36390
  },
36391
+ "deviceManager.getDeviceLiveContribution": {
36392
+ capName: "device-manager",
36393
+ capScope: "system",
36394
+ addonId: null,
36395
+ access: "view"
36396
+ },
34325
36397
  "deviceManager.getDeviceLiveInfoAggregate": {
34326
36398
  capName: "device-manager",
34327
36399
  capScope: "system",
@@ -34334,6 +36406,12 @@ Object.freeze({
34334
36406
  addonId: null,
34335
36407
  access: "view"
34336
36408
  },
36409
+ "deviceManager.getDeviceSettingsContribution": {
36410
+ capName: "device-manager",
36411
+ capScope: "system",
36412
+ addonId: null,
36413
+ access: "view"
36414
+ },
34337
36415
  "deviceManager.getDeviceStatusAggregate": {
34338
36416
  capName: "device-manager",
34339
36417
  capScope: "system",
@@ -34826,6 +36904,36 @@ Object.freeze({
34826
36904
  addonId: null,
34827
36905
  access: "create"
34828
36906
  },
36907
+ "deviceStatus.getStatus": {
36908
+ capName: "device-status",
36909
+ capScope: "device",
36910
+ addonId: null,
36911
+ access: "view"
36912
+ },
36913
+ "doorbell.applyDeviceSettingsPatch": {
36914
+ capName: "doorbell",
36915
+ capScope: "device",
36916
+ addonId: null,
36917
+ access: "create"
36918
+ },
36919
+ "doorbell.getDeviceLiveContribution": {
36920
+ capName: "doorbell",
36921
+ capScope: "device",
36922
+ addonId: null,
36923
+ access: "view"
36924
+ },
36925
+ "doorbell.getDeviceSettingsContribution": {
36926
+ capName: "doorbell",
36927
+ capScope: "device",
36928
+ addonId: null,
36929
+ access: "view"
36930
+ },
36931
+ "doorbell.getStatus": {
36932
+ capName: "doorbell",
36933
+ capScope: "device",
36934
+ addonId: null,
36935
+ access: "view"
36936
+ },
34829
36937
  "embeddingEncoder.encode": {
34830
36938
  capName: "embedding-encoder",
34831
36939
  capScope: "system",
@@ -34844,6 +36952,18 @@ Object.freeze({
34844
36952
  addonId: null,
34845
36953
  access: "view"
34846
36954
  },
36955
+ "enumSensor.getStatus": {
36956
+ capName: "enum-sensor",
36957
+ capScope: "device",
36958
+ addonId: null,
36959
+ access: "view"
36960
+ },
36961
+ "eventEmitter.getStatus": {
36962
+ capName: "event-emitter",
36963
+ capScope: "device",
36964
+ addonId: null,
36965
+ access: "view"
36966
+ },
34847
36967
  "events.getEventClipUrl": {
34848
36968
  capName: "events",
34849
36969
  capScope: "device",
@@ -34964,6 +37084,12 @@ Object.freeze({
34964
37084
  addonId: null,
34965
37085
  access: "view"
34966
37086
  },
37087
+ "fanControl.getStatus": {
37088
+ capName: "fan-control",
37089
+ capScope: "device",
37090
+ addonId: null,
37091
+ access: "view"
37092
+ },
34967
37093
  "fanControl.setDirection": {
34968
37094
  capName: "fan-control",
34969
37095
  capScope: "device",
@@ -34988,6 +37114,12 @@ Object.freeze({
34988
37114
  addonId: null,
34989
37115
  access: "create"
34990
37116
  },
37117
+ "featureProbe.getStatus": {
37118
+ capName: "feature-probe",
37119
+ capScope: "device",
37120
+ addonId: null,
37121
+ access: "view"
37122
+ },
34991
37123
  "filesystemBrowse.browse": {
34992
37124
  capName: "filesystem-browse",
34993
37125
  capScope: "system",
@@ -35006,6 +37138,24 @@ Object.freeze({
35006
37138
  addonId: null,
35007
37139
  access: "view"
35008
37140
  },
37141
+ "flood.getStatus": {
37142
+ capName: "flood",
37143
+ capScope: "device",
37144
+ addonId: null,
37145
+ access: "view"
37146
+ },
37147
+ "gas.getStatus": {
37148
+ capName: "gas",
37149
+ capScope: "device",
37150
+ addonId: null,
37151
+ access: "view"
37152
+ },
37153
+ "humidifier.getStatus": {
37154
+ capName: "humidifier",
37155
+ capScope: "device",
37156
+ addonId: null,
37157
+ access: "view"
37158
+ },
35009
37159
  "humidifier.setMode": {
35010
37160
  capName: "humidifier",
35011
37161
  capScope: "device",
@@ -35024,12 +37174,30 @@ Object.freeze({
35024
37174
  addonId: null,
35025
37175
  access: "create"
35026
37176
  },
37177
+ "humiditySensor.getStatus": {
37178
+ capName: "humidity-sensor",
37179
+ capScope: "device",
37180
+ addonId: null,
37181
+ access: "view"
37182
+ },
37183
+ "image.getStatus": {
37184
+ capName: "image",
37185
+ capScope: "device",
37186
+ addonId: null,
37187
+ access: "view"
37188
+ },
35027
37189
  "imageSettings.getOptions": {
35028
37190
  capName: "image-settings",
35029
37191
  capScope: "device",
35030
37192
  addonId: null,
35031
37193
  access: "view"
35032
37194
  },
37195
+ "imageSettings.getStatus": {
37196
+ capName: "image-settings",
37197
+ capScope: "device",
37198
+ addonId: null,
37199
+ access: "view"
37200
+ },
35033
37201
  "imageSettings.setSettings": {
35034
37202
  capName: "image-settings",
35035
37203
  capScope: "device",
@@ -35102,6 +37270,12 @@ Object.freeze({
35102
37270
  addonId: null,
35103
37271
  access: "create"
35104
37272
  },
37273
+ "intercom.getStatus": {
37274
+ capName: "intercom",
37275
+ capScope: "device",
37276
+ addonId: null,
37277
+ access: "view"
37278
+ },
35105
37279
  "intercom.handleAnswer": {
35106
37280
  capName: "intercom",
35107
37281
  capScope: "device",
@@ -35138,6 +37312,12 @@ Object.freeze({
35138
37312
  addonId: null,
35139
37313
  access: "create"
35140
37314
  },
37315
+ "lawnMowerControl.getStatus": {
37316
+ capName: "lawn-mower-control",
37317
+ capScope: "device",
37318
+ addonId: null,
37319
+ access: "view"
37320
+ },
35141
37321
  "lawnMowerControl.pause": {
35142
37322
  capName: "lawn-mower-control",
35143
37323
  capScope: "device",
@@ -35420,6 +37600,12 @@ Object.freeze({
35420
37600
  addonId: null,
35421
37601
  access: "create"
35422
37602
  },
37603
+ "lockControl.getStatus": {
37604
+ capName: "lock-control",
37605
+ capScope: "device",
37606
+ addonId: null,
37607
+ access: "view"
37608
+ },
35423
37609
  "lockControl.lock": {
35424
37610
  capName: "lock-control",
35425
37611
  capScope: "device",
@@ -35468,6 +37654,12 @@ Object.freeze({
35468
37654
  addonId: null,
35469
37655
  access: "view"
35470
37656
  },
37657
+ "mediaPlayer.getStatus": {
37658
+ capName: "media-player",
37659
+ capScope: "device",
37660
+ addonId: null,
37661
+ access: "view"
37662
+ },
35471
37663
  "mediaPlayer.next": {
35472
37664
  capName: "media-player",
35473
37665
  capScope: "device",
@@ -35660,6 +37852,12 @@ Object.freeze({
35660
37852
  addonId: null,
35661
37853
  access: "create"
35662
37854
  },
37855
+ "motion.getStatus": {
37856
+ capName: "motion",
37857
+ capScope: "device",
37858
+ addonId: null,
37859
+ access: "view"
37860
+ },
35663
37861
  "motion.isDetected": {
35664
37862
  capName: "motion",
35665
37863
  capScope: "device",
@@ -35672,6 +37870,24 @@ Object.freeze({
35672
37870
  addonId: null,
35673
37871
  access: "create"
35674
37872
  },
37873
+ "motionDetection.applyDeviceSettingsPatch": {
37874
+ capName: "motion-detection",
37875
+ capScope: "device",
37876
+ addonId: null,
37877
+ access: "create"
37878
+ },
37879
+ "motionDetection.getDeviceLiveContribution": {
37880
+ capName: "motion-detection",
37881
+ capScope: "device",
37882
+ addonId: null,
37883
+ access: "view"
37884
+ },
37885
+ "motionDetection.getDeviceSettingsContribution": {
37886
+ capName: "motion-detection",
37887
+ capScope: "device",
37888
+ addonId: null,
37889
+ access: "view"
37890
+ },
35675
37891
  "motionDetection.removeCamera": {
35676
37892
  capName: "motion-detection",
35677
37893
  capScope: "device",
@@ -35684,6 +37900,12 @@ Object.freeze({
35684
37900
  addonId: null,
35685
37901
  access: "delete"
35686
37902
  },
37903
+ "motionTrigger.getStatus": {
37904
+ capName: "motion-trigger",
37905
+ capScope: "device",
37906
+ addonId: null,
37907
+ access: "view"
37908
+ },
35687
37909
  "motionTrigger.setMotionTrigger": {
35688
37910
  capName: "motion-trigger",
35689
37911
  capScope: "device",
@@ -35696,6 +37918,12 @@ Object.freeze({
35696
37918
  addonId: null,
35697
37919
  access: "view"
35698
37920
  },
37921
+ "motionZones.getStatus": {
37922
+ capName: "motion-zones",
37923
+ capScope: "device",
37924
+ addonId: null,
37925
+ access: "view"
37926
+ },
35699
37927
  "motionZones.setZone": {
35700
37928
  capName: "motion-zones",
35701
37929
  capScope: "device",
@@ -35756,6 +37984,12 @@ Object.freeze({
35756
37984
  addonId: null,
35757
37985
  access: "view"
35758
37986
  },
37987
+ "nativeObjectDetection.getStatus": {
37988
+ capName: "native-object-detection",
37989
+ capScope: "device",
37990
+ addonId: null,
37991
+ access: "view"
37992
+ },
35759
37993
  "nativeObjectDetection.setEnabled": {
35760
37994
  capName: "native-object-detection",
35761
37995
  capScope: "device",
@@ -35774,6 +38008,12 @@ Object.freeze({
35774
38008
  addonId: null,
35775
38009
  access: "view"
35776
38010
  },
38011
+ "navigation.getStatus": {
38012
+ capName: "navigation",
38013
+ capScope: "device",
38014
+ addonId: null,
38015
+ access: "view"
38016
+ },
35777
38017
  "navigation.goToPoint": {
35778
38018
  capName: "navigation",
35779
38019
  capScope: "device",
@@ -35858,6 +38098,12 @@ Object.freeze({
35858
38098
  addonId: null,
35859
38099
  access: "create"
35860
38100
  },
38101
+ "networkLink.getStatus": {
38102
+ capName: "network-link",
38103
+ capScope: "device",
38104
+ addonId: null,
38105
+ access: "view"
38106
+ },
35861
38107
  "networkQuality.getAllStats": {
35862
38108
  capName: "network-quality",
35863
38109
  capScope: "system",
@@ -36116,18 +38362,36 @@ Object.freeze({
36116
38362
  addonId: null,
36117
38363
  access: "create"
36118
38364
  },
38365
+ "notifier.getStatus": {
38366
+ capName: "notifier",
38367
+ capScope: "device",
38368
+ addonId: null,
38369
+ access: "view"
38370
+ },
36119
38371
  "notifier.send": {
36120
38372
  capName: "notifier",
36121
38373
  capScope: "device",
36122
38374
  addonId: null,
36123
38375
  access: "create"
36124
38376
  },
38377
+ "numericSensor.getStatus": {
38378
+ capName: "numeric-sensor",
38379
+ capScope: "device",
38380
+ addonId: null,
38381
+ access: "view"
38382
+ },
36125
38383
  "oauthIntegration.getDescriptor": {
36126
38384
  capName: "oauth-integration",
36127
38385
  capScope: "system",
36128
38386
  addonId: null,
36129
38387
  access: "view"
36130
38388
  },
38389
+ "osd.getStatus": {
38390
+ capName: "osd",
38391
+ capScope: "device",
38392
+ addonId: null,
38393
+ access: "view"
38394
+ },
36131
38395
  "osd.setOverlay": {
36132
38396
  capName: "osd",
36133
38397
  capScope: "device",
@@ -36200,6 +38464,12 @@ Object.freeze({
36200
38464
  addonId: null,
36201
38465
  access: "create"
36202
38466
  },
38467
+ "petFeeder.getStatus": {
38468
+ capName: "pet-feeder",
38469
+ capScope: "device",
38470
+ addonId: null,
38471
+ access: "view"
38472
+ },
36203
38473
  "petFeeder.markFoodReplenished": {
36204
38474
  capName: "pet-feeder",
36205
38475
  capScope: "device",
@@ -36242,6 +38512,12 @@ Object.freeze({
36242
38512
  addonId: null,
36243
38513
  access: "create"
36244
38514
  },
38515
+ "pipelineAnalytics.applyDeviceSettingsPatch": {
38516
+ capName: "pipeline-analytics",
38517
+ capScope: "device",
38518
+ addonId: null,
38519
+ access: "create"
38520
+ },
36245
38521
  "pipelineAnalytics.cancelRelocateMedia": {
36246
38522
  capName: "pipeline-analytics",
36247
38523
  capScope: "device",
@@ -36308,6 +38584,18 @@ Object.freeze({
36308
38584
  addonId: null,
36309
38585
  access: "view"
36310
38586
  },
38587
+ "pipelineAnalytics.getDeviceLiveContribution": {
38588
+ capName: "pipeline-analytics",
38589
+ capScope: "device",
38590
+ addonId: null,
38591
+ access: "view"
38592
+ },
38593
+ "pipelineAnalytics.getDeviceSettingsContribution": {
38594
+ capName: "pipeline-analytics",
38595
+ capScope: "device",
38596
+ addonId: null,
38597
+ access: "view"
38598
+ },
36311
38599
  "pipelineAnalytics.getEventDensity": {
36312
38600
  capName: "pipeline-analytics",
36313
38601
  capScope: "device",
@@ -36878,6 +39166,12 @@ Object.freeze({
36878
39166
  addonId: null,
36879
39167
  access: "view"
36880
39168
  },
39169
+ "pipelineOrchestrator.applyDeviceSettingsPatch": {
39170
+ capName: "pipeline-orchestrator",
39171
+ capScope: "system",
39172
+ addonId: null,
39173
+ access: "create"
39174
+ },
36881
39175
  "pipelineOrchestrator.assignAudio": {
36882
39176
  capName: "pipeline-orchestrator",
36883
39177
  capScope: "system",
@@ -36968,6 +39262,18 @@ Object.freeze({
36968
39262
  addonId: null,
36969
39263
  access: "view"
36970
39264
  },
39265
+ "pipelineOrchestrator.getDeviceLiveContribution": {
39266
+ capName: "pipeline-orchestrator",
39267
+ capScope: "system",
39268
+ addonId: null,
39269
+ access: "view"
39270
+ },
39271
+ "pipelineOrchestrator.getDeviceSettingsContribution": {
39272
+ capName: "pipeline-orchestrator",
39273
+ capScope: "system",
39274
+ addonId: null,
39275
+ access: "view"
39276
+ },
36971
39277
  "pipelineOrchestrator.getGlobalMetrics": {
36972
39278
  capName: "pipeline-orchestrator",
36973
39279
  capScope: "system",
@@ -37376,12 +39682,36 @@ Object.freeze({
37376
39682
  addonId: null,
37377
39683
  access: "view"
37378
39684
  },
39685
+ "powerMeter.getStatus": {
39686
+ capName: "power-meter",
39687
+ capScope: "device",
39688
+ addonId: null,
39689
+ access: "view"
39690
+ },
39691
+ "presence.getStatus": {
39692
+ capName: "presence",
39693
+ capScope: "device",
39694
+ addonId: null,
39695
+ access: "view"
39696
+ },
39697
+ "pressureSensor.getStatus": {
39698
+ capName: "pressure-sensor",
39699
+ capScope: "device",
39700
+ addonId: null,
39701
+ access: "view"
39702
+ },
37379
39703
  "privacyMask.getOptions": {
37380
39704
  capName: "privacy-mask",
37381
39705
  capScope: "device",
37382
39706
  addonId: null,
37383
39707
  access: "view"
37384
39708
  },
39709
+ "privacyMask.getStatus": {
39710
+ capName: "privacy-mask",
39711
+ capScope: "device",
39712
+ addonId: null,
39713
+ access: "view"
39714
+ },
37385
39715
  "privacyMask.setAudioEnabled": {
37386
39716
  capName: "privacy-mask",
37387
39717
  capScope: "device",
@@ -37442,6 +39772,12 @@ Object.freeze({
37442
39772
  addonId: null,
37443
39773
  access: "view"
37444
39774
  },
39775
+ "ptz.getStatus": {
39776
+ capName: "ptz",
39777
+ capScope: "device",
39778
+ addonId: null,
39779
+ access: "view"
39780
+ },
37445
39781
  "ptz.goHome": {
37446
39782
  capName: "ptz",
37447
39783
  capScope: "device",
@@ -37520,6 +39856,12 @@ Object.freeze({
37520
39856
  addonId: null,
37521
39857
  access: "create"
37522
39858
  },
39859
+ "recording.applyDeviceSettingsPatch": {
39860
+ capName: "recording",
39861
+ capScope: "system",
39862
+ addonId: null,
39863
+ access: "create"
39864
+ },
37523
39865
  "recording.cancelRelocateJob": {
37524
39866
  capName: "recording",
37525
39867
  capScope: "system",
@@ -37568,6 +39910,18 @@ Object.freeze({
37568
39910
  addonId: null,
37569
39911
  access: "view"
37570
39912
  },
39913
+ "recording.getDeviceLiveContribution": {
39914
+ capName: "recording",
39915
+ capScope: "system",
39916
+ addonId: null,
39917
+ access: "view"
39918
+ },
39919
+ "recording.getDeviceSettingsContribution": {
39920
+ capName: "recording",
39921
+ capScope: "system",
39922
+ addonId: null,
39923
+ access: "view"
39924
+ },
37571
39925
  "recording.getPlacement": {
37572
39926
  capName: "recording",
37573
39927
  capScope: "system",
@@ -37586,6 +39940,12 @@ Object.freeze({
37586
39940
  addonId: null,
37587
39941
  access: "view"
37588
39942
  },
39943
+ "recording.getStatus": {
39944
+ capName: "recording",
39945
+ capScope: "system",
39946
+ addonId: null,
39947
+ access: "view"
39948
+ },
37589
39949
  "recording.getStorageMigrationMoveStatus": {
37590
39950
  capName: "recording",
37591
39951
  capScope: "system",
@@ -37760,6 +40120,24 @@ Object.freeze({
37760
40120
  addonId: null,
37761
40121
  access: "view"
37762
40122
  },
40123
+ "recordingOnboard.getOptions": {
40124
+ capName: "recording-onboard",
40125
+ capScope: "device",
40126
+ addonId: null,
40127
+ access: "view"
40128
+ },
40129
+ "recordingOnboard.getStatus": {
40130
+ capName: "recording-onboard",
40131
+ capScope: "device",
40132
+ addonId: null,
40133
+ access: "view"
40134
+ },
40135
+ "recordingOnboard.setSettings": {
40136
+ capName: "recording-onboard",
40137
+ capScope: "device",
40138
+ addonId: null,
40139
+ access: "create"
40140
+ },
37763
40141
  "recordingSignal.getStatus": {
37764
40142
  capName: "recording-signal",
37765
40143
  capScope: "device",
@@ -37790,6 +40168,12 @@ Object.freeze({
37790
40168
  addonId: null,
37791
40169
  access: "delete"
37792
40170
  },
40171
+ "sceneMonitor.getStatus": {
40172
+ capName: "scene-monitor",
40173
+ capScope: "device",
40174
+ addonId: null,
40175
+ access: "view"
40176
+ },
37793
40177
  "sceneMonitor.listScenes": {
37794
40178
  capName: "scene-monitor",
37795
40179
  capScope: "device",
@@ -37820,6 +40204,12 @@ Object.freeze({
37820
40204
  addonId: null,
37821
40205
  access: "create"
37822
40206
  },
40207
+ "scriptRunner.getStatus": {
40208
+ capName: "script-runner",
40209
+ capScope: "device",
40210
+ addonId: null,
40211
+ access: "view"
40212
+ },
37823
40213
  "scriptRunner.run": {
37824
40214
  capName: "script-runner",
37825
40215
  capScope: "device",
@@ -37952,6 +40342,12 @@ Object.freeze({
37952
40342
  addonId: null,
37953
40343
  access: "create"
37954
40344
  },
40345
+ "smoke.getStatus": {
40346
+ capName: "smoke",
40347
+ capScope: "device",
40348
+ addonId: null,
40349
+ access: "view"
40350
+ },
37955
40351
  "smtpProvider.getStatus": {
37956
40352
  capName: "smtp-provider",
37957
40353
  capScope: "system",
@@ -37970,12 +40366,30 @@ Object.freeze({
37970
40366
  addonId: null,
37971
40367
  access: "view"
37972
40368
  },
40369
+ "snapshot.applyDeviceSettingsPatch": {
40370
+ capName: "snapshot",
40371
+ capScope: "device",
40372
+ addonId: null,
40373
+ access: "create"
40374
+ },
37973
40375
  "snapshot.getDebugState": {
37974
40376
  capName: "snapshot",
37975
40377
  capScope: "device",
37976
40378
  addonId: null,
37977
40379
  access: "view"
37978
40380
  },
40381
+ "snapshot.getDeviceLiveContribution": {
40382
+ capName: "snapshot",
40383
+ capScope: "device",
40384
+ addonId: null,
40385
+ access: "view"
40386
+ },
40387
+ "snapshot.getDeviceSettingsContribution": {
40388
+ capName: "snapshot",
40389
+ capScope: "device",
40390
+ addonId: null,
40391
+ access: "view"
40392
+ },
37979
40393
  "snapshot.getSnapshot": {
37980
40394
  capName: "snapshot",
37981
40395
  capScope: "device",
@@ -37994,6 +40408,12 @@ Object.freeze({
37994
40408
  addonId: null,
37995
40409
  access: "view"
37996
40410
  },
40411
+ "snapshot.getStatus": {
40412
+ capName: "snapshot",
40413
+ capScope: "device",
40414
+ addonId: null,
40415
+ access: "view"
40416
+ },
37997
40417
  "snapshot.invalidateCache": {
37998
40418
  capName: "snapshot",
37999
40419
  capScope: "device",
@@ -38330,6 +40750,12 @@ Object.freeze({
38330
40750
  addonId: null,
38331
40751
  access: "create"
38332
40752
  },
40753
+ "streamBroker.applyDeviceSettingsPatch": {
40754
+ capName: "stream-broker",
40755
+ capScope: "system",
40756
+ addonId: null,
40757
+ access: "create"
40758
+ },
38333
40759
  "streamBroker.assignProfile": {
38334
40760
  capName: "stream-broker",
38335
40761
  capScope: "system",
@@ -38366,6 +40792,18 @@ Object.freeze({
38366
40792
  addonId: null,
38367
40793
  access: "view"
38368
40794
  },
40795
+ "streamBroker.getDeviceLiveContribution": {
40796
+ capName: "stream-broker",
40797
+ capScope: "system",
40798
+ addonId: null,
40799
+ access: "view"
40800
+ },
40801
+ "streamBroker.getDeviceSettingsContribution": {
40802
+ capName: "stream-broker",
40803
+ capScope: "system",
40804
+ addonId: null,
40805
+ access: "view"
40806
+ },
38369
40807
  "streamBroker.getPreBufferInfo": {
38370
40808
  capName: "stream-broker",
38371
40809
  capScope: "system",
@@ -38564,6 +41002,12 @@ Object.freeze({
38564
41002
  addonId: null,
38565
41003
  access: "view"
38566
41004
  },
41005
+ "streamParams.getStatus": {
41006
+ capName: "stream-params",
41007
+ capScope: "device",
41008
+ addonId: null,
41009
+ access: "view"
41010
+ },
38567
41011
  "streamParams.setProfile": {
38568
41012
  capName: "stream-params",
38569
41013
  capScope: "device",
@@ -38576,6 +41020,12 @@ Object.freeze({
38576
41020
  addonId: null,
38577
41021
  access: "view"
38578
41022
  },
41023
+ "switch.getStatus": {
41024
+ capName: "switch",
41025
+ capScope: "device",
41026
+ addonId: null,
41027
+ access: "view"
41028
+ },
38579
41029
  "switch.setState": {
38580
41030
  capName: "switch",
38581
41031
  capScope: "device",
@@ -38672,6 +41122,18 @@ Object.freeze({
38672
41122
  addonId: null,
38673
41123
  access: "create"
38674
41124
  },
41125
+ "tamper.getStatus": {
41126
+ capName: "tamper",
41127
+ capScope: "device",
41128
+ addonId: null,
41129
+ access: "view"
41130
+ },
41131
+ "temperatureSensor.getStatus": {
41132
+ capName: "temperature-sensor",
41133
+ capScope: "device",
41134
+ addonId: null,
41135
+ access: "view"
41136
+ },
38675
41137
  "terminalSession.adoptLegacyMonitor": {
38676
41138
  capName: "terminal-session",
38677
41139
  capScope: "system",
@@ -38768,6 +41230,12 @@ Object.freeze({
38768
41230
  addonId: null,
38769
41231
  access: "view"
38770
41232
  },
41233
+ "update.getStatus": {
41234
+ capName: "update",
41235
+ capScope: "device",
41236
+ addonId: null,
41237
+ access: "view"
41238
+ },
38771
41239
  "update.installUpdate": {
38772
41240
  capName: "update",
38773
41241
  capScope: "device",
@@ -38990,6 +41458,12 @@ Object.freeze({
38990
41458
  addonId: null,
38991
41459
  access: "create"
38992
41460
  },
41461
+ "vacuumControl.getStatus": {
41462
+ capName: "vacuum-control",
41463
+ capScope: "device",
41464
+ addonId: null,
41465
+ access: "view"
41466
+ },
38993
41467
  "vacuumControl.locate": {
38994
41468
  capName: "vacuum-control",
38995
41469
  capScope: "device",
@@ -39032,6 +41506,12 @@ Object.freeze({
39032
41506
  addonId: null,
39033
41507
  access: "create"
39034
41508
  },
41509
+ "valve.getStatus": {
41510
+ capName: "valve",
41511
+ capScope: "device",
41512
+ addonId: null,
41513
+ access: "view"
41514
+ },
39035
41515
  "valve.open": {
39036
41516
  capName: "valve",
39037
41517
  capScope: "device",
@@ -39104,6 +41584,18 @@ Object.freeze({
39104
41584
  addonId: null,
39105
41585
  access: "create"
39106
41586
  },
41587
+ "vibration.getStatus": {
41588
+ capName: "vibration",
41589
+ capScope: "device",
41590
+ addonId: null,
41591
+ access: "view"
41592
+ },
41593
+ "videoclips.dialClipStream": {
41594
+ capName: "videoclips",
41595
+ capScope: "device",
41596
+ addonId: null,
41597
+ access: "view"
41598
+ },
39107
41599
  "videoclips.getClipPlayback": {
39108
41600
  capName: "videoclips",
39109
41601
  capScope: "device",
@@ -39140,6 +41632,12 @@ Object.freeze({
39140
41632
  addonId: null,
39141
41633
  access: "view"
39142
41634
  },
41635
+ "waterHeater.getStatus": {
41636
+ capName: "water-heater",
41637
+ capScope: "device",
41638
+ addonId: null,
41639
+ access: "view"
41640
+ },
39143
41641
  "waterHeater.setAway": {
39144
41642
  capName: "water-heater",
39145
41643
  capScope: "device",
@@ -39158,6 +41656,12 @@ Object.freeze({
39158
41656
  addonId: null,
39159
41657
  access: "create"
39160
41658
  },
41659
+ "weather.getStatus": {
41660
+ capName: "weather",
41661
+ capScope: "device",
41662
+ addonId: null,
41663
+ access: "view"
41664
+ },
39161
41665
  "webrtcSession.addIceCandidate": {
39162
41666
  capName: "webrtc-session",
39163
41667
  capScope: "device",
@@ -39520,6 +42024,11 @@ Object.freeze({
39520
42024
  form: "single",
39521
42025
  optional: true
39522
42026
  }],
42027
+ "deviceAdminLink.getAdminLink": [{
42028
+ name: "deviceId",
42029
+ form: "single",
42030
+ optional: false
42031
+ }],
39523
42032
  "deviceAdoption.release": [{
39524
42033
  name: "camDeviceId",
39525
42034
  form: "single",
@@ -40905,6 +43414,16 @@ Object.freeze({
40905
43414
  form: "single",
40906
43415
  optional: true
40907
43416
  }],
43417
+ "recordingOnboard.getOptions": [{
43418
+ name: "deviceId",
43419
+ form: "single",
43420
+ optional: false
43421
+ }],
43422
+ "recordingOnboard.setSettings": [{
43423
+ name: "deviceId",
43424
+ form: "single",
43425
+ optional: false
43426
+ }],
40908
43427
  "recordingSignal.getStatus": [{
40909
43428
  name: "deviceId",
40910
43429
  form: "single",
@@ -41131,6 +43650,11 @@ Object.freeze({
41131
43650
  form: "single",
41132
43651
  optional: false
41133
43652
  }],
43653
+ "videoclips.dialClipStream": [{
43654
+ name: "deviceId",
43655
+ form: "single",
43656
+ optional: false
43657
+ }],
41134
43658
  "videoclips.getClipPlayback": [{
41135
43659
  name: "deviceId",
41136
43660
  form: "single",