@camstack/addon-provider-homeassistant 1.2.650 → 1.2.652

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.
@@ -5975,7 +5975,7 @@ var ZodIssueCode = {
5975
5975
  var ZodFirstPartyTypeKind;
5976
5976
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5977
5977
  //#endregion
5978
- //#region ../types/dist/sleep-QsoHs66J.mjs
5978
+ //#region ../types/dist/sleep-hmSP-eJt.mjs
5979
5979
  /**
5980
5980
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5981
5981
  * window to float samples (D455).
@@ -9764,6 +9764,7 @@ var CAP_NAMES = Object.freeze([
9764
9764
  "backup",
9765
9765
  "battery",
9766
9766
  "binary",
9767
+ "board-key-source",
9767
9768
  "brightness",
9768
9769
  "broker",
9769
9770
  "button",
@@ -9885,6 +9886,7 @@ var CAP_NAMES = Object.freeze([
9885
9886
  "privacy-mask",
9886
9887
  "ptz",
9887
9888
  "ptz-autotrack",
9889
+ "pump-cycle",
9888
9890
  "reboot",
9889
9891
  "record-entries",
9890
9892
  "recording",
@@ -11177,18 +11179,6 @@ Object.freeze({
11177
11179
  "path": "pumpRunning",
11178
11180
  "valueType": "boolean"
11179
11181
  },
11180
- {
11181
- "path": "pumpIntervalEnabled",
11182
- "valueType": "boolean"
11183
- },
11184
- {
11185
- "path": "pumpOnTime",
11186
- "valueType": "number"
11187
- },
11188
- {
11189
- "path": "pumpOffTime",
11190
- "valueType": "number"
11191
- },
11192
11182
  {
11193
11183
  "path": "lastDrink",
11194
11184
  "valueType": "number"
@@ -11312,6 +11302,20 @@ Object.freeze({
11312
11302
  "valueType": "number"
11313
11303
  }
11314
11304
  ],
11305
+ "pump-cycle": [
11306
+ {
11307
+ "path": "enabled",
11308
+ "valueType": "boolean"
11309
+ },
11310
+ {
11311
+ "path": "onTime",
11312
+ "valueType": "number"
11313
+ },
11314
+ {
11315
+ "path": "offTime",
11316
+ "valueType": "number"
11317
+ }
11318
+ ],
11315
11319
  "recording-archive": [
11316
11320
  {
11317
11321
  "path": "deviceId",
@@ -12975,6 +12979,73 @@ var NodeColorIdSchema = _enum([
12975
12979
  "node-g",
12976
12980
  "node-h"
12977
12981
  ]);
12982
+ //#endregion
12983
+ //#region ../types/dist/index.mjs
12984
+ var SMTP_INBOUND_DEFAULT_PORT = 2525;
12985
+ var SMTP_INBOUND_DEFAULT_DOMAIN = "camstack.local";
12986
+ var SMTP_INBOUND_DEFAULT_MAX_MESSAGE_BYTES = 25 * 1024 * 1024;
12987
+ /** The text excerpt a message carries on the bus. */
12988
+ var SMTP_INBOUND_TEXT_MAX_CHARS = 4096;
12989
+ var PortSchema = number().int().min(1).max(65535);
12990
+ /** A recipient local-part: what stands before the `@`. */
12991
+ var SmtpRecipientSchema = string().min(1).max(64).regex(/^[A-Za-z0-9._+-]+$/);
12992
+ object({
12993
+ port: PortSchema.default(SMTP_INBOUND_DEFAULT_PORT),
12994
+ bindHost: string().min(1).default("0.0.0.0"),
12995
+ domain: string().min(1).default(SMTP_INBOUND_DEFAULT_DOMAIN),
12996
+ requireAuth: boolean().default(true),
12997
+ username: string().default(""),
12998
+ password: string().default("").meta({ secret: true }),
12999
+ starttls: boolean().default(false),
13000
+ maxMessageBytes: number().int().positive().default(SMTP_INBOUND_DEFAULT_MAX_MESSAGE_BYTES)
13001
+ });
13002
+ object({
13003
+ host: string().min(1).nullable(),
13004
+ hostReason: string().nullable(),
13005
+ port: PortSchema,
13006
+ domain: string().min(1),
13007
+ requireAuth: boolean(),
13008
+ username: string(),
13009
+ password: string(),
13010
+ starttls: boolean()
13011
+ });
13012
+ object({
13013
+ recipients: array(SmtpRecipientSchema).min(1),
13014
+ /**
13015
+ * Who is subscribing. A second `subscribe` with the same id REPLACES that subscriber's
13016
+ * recipients (the way a consumer that restarted, or lost a device, declares its set again);
13017
+ * a recipient held by another subscriber is refused with `smtp-inbound/recipient-claimed`.
13018
+ * Absent, the subscriber is anonymous and unique.
13019
+ */
13020
+ subscriberId: string().min(1).max(64).optional()
13021
+ });
13022
+ var SmtpInboundAttachmentSchema = object({
13023
+ filename: string(),
13024
+ contentType: string(),
13025
+ bytes: number().int().nonnegative()
13026
+ });
13027
+ /** The payload of one `broker.message` (the key is the recipient local-part). */
13028
+ var SmtpInboundMessageSchema = object({
13029
+ /** Monotonic per mailbox; a gap tells a consumer it missed an event. */
13030
+ seq: number().int().positive(),
13031
+ messageId: string(),
13032
+ receivedAt: number().int().nonnegative(),
13033
+ from: string(),
13034
+ to: string(),
13035
+ subject: string(),
13036
+ text: string().max(SMTP_INBOUND_TEXT_MAX_CHARS),
13037
+ attachments: array(SmtpInboundAttachmentSchema)
13038
+ });
13039
+ object({
13040
+ /** The newest seq issued so far (0 before any mail). */
13041
+ lastSeq: number().int().nonnegative(),
13042
+ /** The oldest seq still retained; messages below it are gone. */
13043
+ oldestSeq: number().int().nonnegative(),
13044
+ messages: array(object({
13045
+ key: string(),
13046
+ message: SmtpInboundMessageSchema
13047
+ }))
13048
+ });
12978
13049
  new Set([
12979
13050
  "track",
12980
13051
  "face",
@@ -19401,24 +19472,52 @@ var APPLIANCE_CAP_VOCABULARY = {
19401
19472
  args: { on: false }
19402
19473
  },
19403
19474
  {
19404
- id: "petFountain.intervalOn",
19405
- method: "setPumpInterval",
19475
+ id: "petFountain.resetDailyConsumption",
19476
+ method: "resetDailyConsumption",
19477
+ label: t("Clear daily consumption", "Azzera il consumo giornaliero"),
19478
+ phrase: t("Clear the daily water consumption of {device}", "Azzera il consumo giornaliero di acqua di {device}"),
19479
+ icon: "rotate-ccw"
19480
+ }
19481
+ ],
19482
+ state: [{
19483
+ kind: "boolean",
19484
+ field: "empty",
19485
+ label: t("Tank empty", "Serbatoio vuoto"),
19486
+ whenTrue: t("When the tank of {device} is empty", "Quando il serbatoio di {device} è vuoto"),
19487
+ whenFalse: t("When the tank of {device} is refilled", "Quando il serbatoio di {device} viene riempito"),
19488
+ icon: "droplet"
19489
+ }, {
19490
+ kind: "numeric",
19491
+ field: "waterLevel",
19492
+ quantity: t("the water level", "il livello dell’acqua"),
19493
+ label: t("Water level", "Livello dell’acqua"),
19494
+ unit: "%",
19495
+ icon: "droplets"
19496
+ }]
19497
+ },
19498
+ "pump-cycle": {
19499
+ scope: "device",
19500
+ noun: t("Pump cycle", "Ciclo della pompa"),
19501
+ actions: [
19502
+ {
19503
+ id: "pumpCycle.on",
19504
+ method: "setEnabled",
19406
19505
  label: t("Pump cycle on", "Ciclo pompa attivo"),
19407
19506
  phrase: t("Run the pump of {device} on its on/off cycle", "Fai lavorare la pompa di {device} a ciclo acceso/spento"),
19408
19507
  icon: "timer",
19409
19508
  args: { on: true }
19410
19509
  },
19411
19510
  {
19412
- id: "petFountain.intervalOff",
19413
- method: "setPumpInterval",
19511
+ id: "pumpCycle.off",
19512
+ method: "setEnabled",
19414
19513
  label: t("Pump cycle off", "Ciclo pompa spento"),
19415
19514
  phrase: t("Run the pump of {device} continuously", "Fai lavorare la pompa di {device} in continuo"),
19416
19515
  icon: "timer-off",
19417
19516
  args: { on: false }
19418
19517
  },
19419
19518
  {
19420
- id: "petFountain.pumpOnMinutes",
19421
- method: "setPumpOnMinutes",
19519
+ id: "pumpCycle.onMinutes",
19520
+ method: "setOnMinutes",
19422
19521
  label: t("Set pump run time", "Imposta il tempo di lavoro della pompa"),
19423
19522
  phrase: t("Set the pump of {device} to run {minutes} minutes per cycle", "Imposta la pompa di {device} a lavorare {minutes} minuti per ciclo"),
19424
19523
  icon: "timer",
@@ -19434,8 +19533,8 @@ var APPLIANCE_CAP_VOCABULARY = {
19434
19533
  }]
19435
19534
  },
19436
19535
  {
19437
- id: "petFountain.pumpOffMinutes",
19438
- method: "setPumpOffMinutes",
19536
+ id: "pumpCycle.offMinutes",
19537
+ method: "setOffMinutes",
19439
19538
  label: t("Set pump rest time", "Imposta il tempo di riposo della pompa"),
19440
19539
  phrase: t("Set the pump of {device} to rest {minutes} minutes per cycle", "Imposta la pompa di {device} a riposare {minutes} minuti per ciclo"),
19441
19540
  icon: "timer-off",
@@ -19449,29 +19548,15 @@ var APPLIANCE_CAP_VOCABULARY = {
19449
19548
  unit: "min"
19450
19549
  }
19451
19550
  }]
19452
- },
19453
- {
19454
- id: "petFountain.resetDailyConsumption",
19455
- method: "resetDailyConsumption",
19456
- label: t("Clear daily consumption", "Azzera il consumo giornaliero"),
19457
- phrase: t("Clear the daily water consumption of {device}", "Azzera il consumo giornaliero di acqua di {device}"),
19458
- icon: "rotate-ccw"
19459
19551
  }
19460
19552
  ],
19461
19553
  state: [{
19462
19554
  kind: "boolean",
19463
- field: "empty",
19464
- label: t("Tank empty", "Serbatoio vuoto"),
19465
- whenTrue: t("When the tank of {device} is empty", "Quando il serbatoio di {device} è vuoto"),
19466
- whenFalse: t("When the tank of {device} is refilled", "Quando il serbatoio di {device} viene riempito"),
19467
- icon: "droplet"
19468
- }, {
19469
- kind: "numeric",
19470
- field: "waterLevel",
19471
- quantity: t("the water level", "il livello dell’acqua"),
19472
- label: t("Water level", "Livello dell’acqua"),
19473
- unit: "%",
19474
- icon: "droplets"
19555
+ field: "enabled",
19556
+ label: t("Pump cycle", "Ciclo pompa"),
19557
+ whenTrue: t("When {device} starts running its pump on a cycle", "Quando {device} inizia a far lavorare la pompa a ciclo"),
19558
+ whenFalse: t("When {device} runs its pump continuously", "Quando {device} fa lavorare la pompa in continuo"),
19559
+ icon: "timer"
19475
19560
  }]
19476
19561
  },
19477
19562
  "media-player": {
@@ -21364,6 +21449,7 @@ var SYSTEM_CAP_VOCABULARY = {
21364
21449
  "audio-analyzer": system(PIPELINE),
21365
21450
  "audio-codec": system(INTERNAL),
21366
21451
  "auth-provider": system(IDENTITY),
21452
+ "board-key-source": system(INTERNAL),
21367
21453
  backup: system("system backups — run and restored from the Backups page"),
21368
21454
  broker: system("message-broker connections — configured, not actuated"),
21369
21455
  "calendar-source": system(INTERNAL),
@@ -46618,6 +46704,63 @@ var binaryCapability = {
46618
46704
  volatileStateFields: ["lastChangedAt"]
46619
46705
  };
46620
46706
  /**
46707
+ * Why a board key could not be read. Typed so a caller reports the cause and
46708
+ * never treats "could not read" as "has no key" (D49).
46709
+ */
46710
+ var BoardKeyFailureReasonSchema = _enum([
46711
+ "unknown-source",
46712
+ "not-admin",
46713
+ "no-builder",
46714
+ "no-ingress-url",
46715
+ "unreachable",
46716
+ "unknown-board",
46717
+ "no-encryption-key",
46718
+ "unreadable-config"
46719
+ ]);
46720
+ var BoardKeySourceSchema = object({
46721
+ sourceId: string(),
46722
+ name: string()
46723
+ });
46724
+ var BoardKeyBoardSchema = object({
46725
+ /** The builder's file name, e.g. `kitchen.yaml`: the handle `getBoardKey` takes. */
46726
+ configuration: string(),
46727
+ /** The node name the builder gives the board. */
46728
+ name: string(),
46729
+ /** The address the builder knows the board by, when it has one. */
46730
+ address: string().nullable()
46731
+ });
46732
+ var BoardKeyFailureSchema = object({
46733
+ ok: literal(false),
46734
+ reason: BoardKeyFailureReasonSchema,
46735
+ detail: string().optional()
46736
+ });
46737
+ var ListBoardsResultSchema = discriminatedUnion("ok", [object({
46738
+ ok: literal(true),
46739
+ boards: array(BoardKeyBoardSchema).readonly()
46740
+ }), BoardKeyFailureSchema]);
46741
+ var GetBoardKeyResultSchema = discriminatedUnion("ok", [object({
46742
+ ok: literal(true),
46743
+ key: string()
46744
+ }), BoardKeyFailureSchema]);
46745
+ /**
46746
+ * Where a device board's API encryption key can be read from (the ESPHome
46747
+ * builder that runs beside a Home Assistant). Admin only: `getBoardKey`
46748
+ * returns a credential, and nothing else the source holds ever crosses.
46749
+ */
46750
+ var boardKeySourceCapability = {
46751
+ name: "board-key-source",
46752
+ scope: "system",
46753
+ mode: "collection",
46754
+ methods: {
46755
+ listSources: method(_void(), array(BoardKeySourceSchema).readonly(), { auth: "admin" }),
46756
+ listBoards: method(object({ sourceId: string().min(1) }), ListBoardsResultSchema, { auth: "admin" }),
46757
+ getBoardKey: method(object({
46758
+ sourceId: string().min(1),
46759
+ configuration: string().min(1)
46760
+ }), GetBoardKeyResultSchema, { auth: "admin" })
46761
+ }
46762
+ };
46763
+ /**
46621
46764
  * Dimmable-light brightness control. Co-exists with `switch` on the
46622
46765
  * same device — the switch toggles on/off, this cap sets the level
46623
46766
  * applied when the light is on. Drivers map their per-vendor dim
@@ -53361,7 +53504,7 @@ var DishwasherStatusSchema = object({
53361
53504
  /** Ms epoch of the last value received from the appliance; 0 = never. */
53362
53505
  lastFetchedAt: number()
53363
53506
  });
53364
- var DeviceIdSchema$1 = number().int().nonnegative();
53507
+ var DeviceIdSchema$2 = number().int().nonnegative();
53365
53508
  /** A value a program option or setting can take. */
53366
53509
  var DishwasherValueSchema = union([
53367
53510
  boolean(),
@@ -53436,77 +53579,77 @@ var dishwasherCapability = {
53436
53579
  * option feature keys; each is checked against the program's constraints.
53437
53580
  */
53438
53581
  start: method(object({
53439
- deviceId: DeviceIdSchema$1,
53582
+ deviceId: DeviceIdSchema$2,
53440
53583
  program: string().min(1).optional(),
53441
53584
  options: record(string(), DishwasherValueSchema).optional()
53442
53585
  }), _void(), {
53443
53586
  kind: "mutation",
53444
53587
  auth: "protected"
53445
53588
  }),
53446
- pause: method(object({ deviceId: DeviceIdSchema$1 }), _void(), {
53589
+ pause: method(object({ deviceId: DeviceIdSchema$2 }), _void(), {
53447
53590
  kind: "mutation",
53448
53591
  auth: "protected"
53449
53592
  }),
53450
- resume: method(object({ deviceId: DeviceIdSchema$1 }), _void(), {
53593
+ resume: method(object({ deviceId: DeviceIdSchema$2 }), _void(), {
53451
53594
  kind: "mutation",
53452
53595
  auth: "protected"
53453
53596
  }),
53454
- stop: method(object({ deviceId: DeviceIdSchema$1 }), _void(), {
53597
+ stop: method(object({ deviceId: DeviceIdSchema$2 }), _void(), {
53455
53598
  kind: "mutation",
53456
53599
  auth: "protected"
53457
53600
  }),
53458
53601
  /** Select (not start) a program; refused when the appliance does not offer it. */
53459
53602
  setProgram: method(object({
53460
- deviceId: DeviceIdSchema$1,
53603
+ deviceId: DeviceIdSchema$2,
53461
53604
  program: string().min(1)
53462
53605
  }), _void(), {
53463
53606
  kind: "mutation",
53464
53607
  auth: "protected"
53465
53608
  }),
53466
53609
  setPower: method(object({
53467
- deviceId: DeviceIdSchema$1,
53610
+ deviceId: DeviceIdSchema$2,
53468
53611
  on: boolean()
53469
53612
  }), _void(), {
53470
53613
  kind: "mutation",
53471
53614
  auth: "protected"
53472
53615
  }),
53473
53616
  setHalfLoad: method(object({
53474
- deviceId: DeviceIdSchema$1,
53617
+ deviceId: DeviceIdSchema$2,
53475
53618
  on: boolean()
53476
53619
  }), _void(), {
53477
53620
  kind: "mutation",
53478
53621
  auth: "protected"
53479
53622
  }),
53480
53623
  setHygienePlus: method(object({
53481
- deviceId: DeviceIdSchema$1,
53624
+ deviceId: DeviceIdSchema$2,
53482
53625
  on: boolean()
53483
53626
  }), _void(), {
53484
53627
  kind: "mutation",
53485
53628
  auth: "protected"
53486
53629
  }),
53487
53630
  setExtraDry: method(object({
53488
- deviceId: DeviceIdSchema$1,
53631
+ deviceId: DeviceIdSchema$2,
53489
53632
  on: boolean()
53490
53633
  }), _void(), {
53491
53634
  kind: "mutation",
53492
53635
  auth: "protected"
53493
53636
  }),
53494
53637
  setIntensiveZone: method(object({
53495
- deviceId: DeviceIdSchema$1,
53638
+ deviceId: DeviceIdSchema$2,
53496
53639
  on: boolean()
53497
53640
  }), _void(), {
53498
53641
  kind: "mutation",
53499
53642
  auth: "protected"
53500
53643
  }),
53501
53644
  setVarioSpeedPlus: method(object({
53502
- deviceId: DeviceIdSchema$1,
53645
+ deviceId: DeviceIdSchema$2,
53503
53646
  on: boolean()
53504
53647
  }), _void(), {
53505
53648
  kind: "mutation",
53506
53649
  auth: "protected"
53507
53650
  }),
53508
53651
  setChildLock: method(object({
53509
- deviceId: DeviceIdSchema$1,
53652
+ deviceId: DeviceIdSchema$2,
53510
53653
  on: boolean()
53511
53654
  }), _void(), {
53512
53655
  kind: "mutation",
@@ -53518,7 +53661,7 @@ var dishwasherCapability = {
53518
53661
  * its declared range / members.
53519
53662
  */
53520
53663
  setOption: method(object({
53521
- deviceId: DeviceIdSchema$1,
53664
+ deviceId: DeviceIdSchema$2,
53522
53665
  key: string().min(1),
53523
53666
  value: DishwasherValueSchema
53524
53667
  }), _void(), {
@@ -53526,7 +53669,7 @@ var dishwasherCapability = {
53526
53669
  auth: "protected"
53527
53670
  }),
53528
53671
  /** What this appliance can do, from its own description — the UI is derived from it. */
53529
- getOptions: method(object({ deviceId: DeviceIdSchema$1 }), DishwasherOptionsSchema, { auth: "protected" })
53672
+ getOptions: method(object({ deviceId: DeviceIdSchema$2 }), DishwasherOptionsSchema, { auth: "protected" })
53530
53673
  },
53531
53674
  status: {
53532
53675
  schema: DishwasherStatusSchema,
@@ -55901,6 +56044,11 @@ var IntegrationInstanceSchema = object({
55901
56044
  name: string(),
55902
56045
  /** The addon's own rule (an URL is present, a client id is present...). */
55903
56046
  configured: boolean(),
56047
+ /**
56048
+ * The instance's own on/off switch (D996): always present, derived from the record body
56049
+ * (`enabled !== false`, so a row written before the field existed is on).
56050
+ */
56051
+ enabled: boolean(),
55904
56052
  /** Values for the instance form; a secret is a `SecretFieldView`, never text. */
55905
56053
  formValues: record(string(), unknown()),
55906
56054
  status: IntegrationInstanceStatusSchema.optional()
@@ -55920,6 +56068,12 @@ method(_void(), IntegrationInstanceDescriptionSchema, { auth: "admin" }), method
55920
56068
  }), method(IntegrationInstancePatchSchema, object({ ok: literal(true) }), {
55921
56069
  kind: "mutation",
55922
56070
  auth: "admin"
56071
+ }), method(object({
56072
+ id: IntegrationInstanceIdSchema,
56073
+ enabled: boolean()
56074
+ }), object({ ok: literal(true) }), {
56075
+ kind: "mutation",
56076
+ auth: "admin"
55923
56077
  }), method(object({ id: IntegrationInstanceIdSchema }), object({ ok: literal(true) }), {
55924
56078
  kind: "mutation",
55925
56079
  auth: "admin"
@@ -68864,7 +69018,7 @@ var petFeederCapability = {
68864
69018
  /**
68865
69019
  * Pet water-fountain cap. Models the telemetry and the control surface of a
68866
69020
  * circulating drinking fountain: how much water is in the tank, how much the
68867
- * pet drank, whether the pump runs and on what duty cycle.
69021
+ * pet drank, whether the pump runs.
68868
69022
  *
68869
69023
  * It has no native vendor provider of its own: a fountain reaches CamStack as
68870
69024
  * a container of loose entities (a pump switch, two number boxes, a "filter
@@ -68880,8 +69034,10 @@ var petFeederCapability = {
68880
69034
  * never here. Every reading may be `null`: a source that is offline or does
68881
69035
  * not report is unknown, never zero.
68882
69036
  *
68883
- * The filter is not a field of this cap: it is an item of the `consumables`
68884
- * cap on the same device (kind `wear`), reset by the same forward mechanism.
69037
+ * The pump's on/off duty cycle is model-specific and lives in the optional
69038
+ * `pump-cycle` cap. The filter, the cleaning and the water change are not
69039
+ * fields of this cap: they are items of the `consumables` cap on the same
69040
+ * device (kind `wear`), reset by the same forward mechanism.
68885
69041
  */
68886
69042
  var PetFountainStatusSchema = object({
68887
69043
  /** Water in the tank, 0..100 (%). Null while the source has not reported. */
@@ -68892,27 +69048,20 @@ var PetFountainStatusSchema = object({
68892
69048
  empty: boolean().nullable(),
68893
69049
  /** True while the pump is running. Null while unknown. */
68894
69050
  pumpRunning: boolean().nullable(),
68895
- /** True when the pump works on an on/off duty cycle rather than continuously. */
68896
- pumpIntervalEnabled: boolean().nullable(),
68897
- /** How long the pump runs per cycle, in seconds. */
68898
- pumpOnTime: number().min(0).nullable().meta(readingMeta("duration")),
68899
- /** How long the pump rests per cycle, in seconds. */
68900
- pumpOffTime: number().min(0).nullable().meta(readingMeta("duration")),
68901
69051
  /** Water drunk in the last drink, in litres. */
68902
69052
  lastDrink: number().min(0).nullable().meta(readingMeta("volume")),
68903
69053
  /** Water drunk in the current hour, in litres. */
68904
69054
  currentHourDrink: number().min(0).nullable().meta(readingMeta("volume")),
68905
69055
  /** Water drunk over the last 24 hours (rolling), in litres. */
68906
69056
  last24hDrink: number().min(0).nullable().meta(readingMeta("volume")),
68907
- /** Water drunk since local midnight, in litres. */
69057
+ /** Water drunk since local midnight, in litres. Null when the fountain has no such sensor. */
68908
69058
  todayDrink: number().min(0).nullable().meta(readingMeta("volume")),
68909
69059
  /** Decoded fault message. Null means healthy; a non-null string is an active fault. */
68910
69060
  error: string().nullable(),
68911
69061
  /** Ms epoch when the slice was last refreshed. */
68912
69062
  lastFetchedAt: number()
68913
69063
  });
68914
- var DeviceIdSchema = number().int().nonnegative();
68915
- var MinutesSchema = number().int().min(0);
69064
+ var DeviceIdSchema$1 = number().int().nonnegative();
68916
69065
  var petFountainCapability = {
68917
69066
  name: "pet-fountain",
68918
69067
  scope: "device",
@@ -68922,38 +69071,14 @@ var petFountainCapability = {
68922
69071
  methods: {
68923
69072
  /** Start or stop the pump. */
68924
69073
  setPump: method(object({
68925
- deviceId: DeviceIdSchema,
68926
- on: boolean()
68927
- }), _void(), {
68928
- kind: "mutation",
68929
- auth: "protected"
68930
- }),
68931
- /** Switch the on/off duty cycle on or off (off = the pump runs continuously). */
68932
- setPumpInterval: method(object({
68933
- deviceId: DeviceIdSchema,
69074
+ deviceId: DeviceIdSchema$1,
68934
69075
  on: boolean()
68935
69076
  }), _void(), {
68936
69077
  kind: "mutation",
68937
69078
  auth: "protected"
68938
69079
  }),
68939
- /** Set how many minutes the pump runs per cycle. */
68940
- setPumpOnMinutes: method(object({
68941
- deviceId: DeviceIdSchema,
68942
- minutes: MinutesSchema
68943
- }), _void(), {
68944
- kind: "mutation",
68945
- auth: "protected"
68946
- }),
68947
- /** Set how many minutes the pump rests per cycle. */
68948
- setPumpOffMinutes: method(object({
68949
- deviceId: DeviceIdSchema,
68950
- minutes: MinutesSchema
68951
- }), _void(), {
68952
- kind: "mutation",
68953
- auth: "protected"
68954
- }),
68955
69080
  /** Clear the rolling daily consumption counters on the device. */
68956
- resetDailyConsumption: method(object({ deviceId: DeviceIdSchema }), _void(), {
69081
+ resetDailyConsumption: method(object({ deviceId: DeviceIdSchema$1 }), _void(), {
68957
69082
  kind: "mutation",
68958
69083
  auth: "protected"
68959
69084
  })
@@ -71286,6 +71411,79 @@ var ptzAutotrackCapability = {
71286
71411
  */
71287
71412
  history: "none"
71288
71413
  };
71414
+ /**
71415
+ * The on/off duty cycle of a pet fountain's pump. Some models run the pump
71416
+ * continuously and have nothing to configure; others can alternate a run time
71417
+ * and a rest time. That is model-specific, so it is its own optional cap on the
71418
+ * fountain device: a fountain without cycle entities simply never composes it
71419
+ * (planning#366), and the `pet-fountain` cap stays the model-independent core.
71420
+ *
71421
+ * Like `pet-fountain` it has no native vendor provider: an operator BUILDS the
71422
+ * cycle from loose entities (a cycle switch and two number boxes) and every
71423
+ * method is a forward to one source entity (D659, D967). Durations are stored
71424
+ * in SECONDS (D944); a number box that cannot be read back leaves them `null`
71425
+ * — unknown, never zero (D393).
71426
+ */
71427
+ var PumpCycleStatusSchema = object({
71428
+ /** True when the pump works on the on/off cycle, false when it runs continuously. Null while unknown. */
71429
+ enabled: boolean().nullable(),
71430
+ /** How long the pump runs per cycle, in seconds. Null while unknown. */
71431
+ onTime: number().min(0).nullable().meta(readingMeta("duration")),
71432
+ /** How long the pump rests per cycle, in seconds. Null while unknown. */
71433
+ offTime: number().min(0).nullable().meta(readingMeta("duration")),
71434
+ /** Ms epoch when the slice was last refreshed. */
71435
+ lastFetchedAt: number()
71436
+ });
71437
+ var DeviceIdSchema = number().int().nonnegative();
71438
+ var MinutesSchema = number().int().min(0);
71439
+ var pumpCycleCapability = {
71440
+ name: "pump-cycle",
71441
+ scope: "device",
71442
+ deviceNative: true,
71443
+ mode: "singleton",
71444
+ deviceTypes: [DeviceType.PetFountain],
71445
+ methods: {
71446
+ /** Switch the on/off duty cycle on or off (off = the pump runs continuously). */
71447
+ setEnabled: method(object({
71448
+ deviceId: DeviceIdSchema,
71449
+ on: boolean()
71450
+ }), _void(), {
71451
+ kind: "mutation",
71452
+ auth: "protected"
71453
+ }),
71454
+ /** Set how many minutes the pump runs per cycle. */
71455
+ setOnMinutes: method(object({
71456
+ deviceId: DeviceIdSchema,
71457
+ minutes: MinutesSchema
71458
+ }), _void(), {
71459
+ kind: "mutation",
71460
+ auth: "protected"
71461
+ }),
71462
+ /** Set how many minutes the pump rests per cycle. */
71463
+ setOffMinutes: method(object({
71464
+ deviceId: DeviceIdSchema,
71465
+ minutes: MinutesSchema
71466
+ }), _void(), {
71467
+ kind: "mutation",
71468
+ auth: "protected"
71469
+ })
71470
+ },
71471
+ status: {
71472
+ schema: PumpCycleStatusSchema,
71473
+ kind: "push"
71474
+ },
71475
+ /** Runtime-state slice — mirrored by the kernel; the hero card reads it whole. */
71476
+ runtimeState: PumpCycleStatusSchema,
71477
+ /**
71478
+ * Runtime-state durability: **session** — live appliance state re-published on connect.
71479
+ *
71480
+ * See `RuntimeStateDurability`. Enforced by
71481
+ * `scripts/check-runtime-state-durability.ts`.
71482
+ */
71483
+ durability: "session",
71484
+ /** History (D850): a duty-cycle setting is not a series worth recording. */
71485
+ history: "none"
71486
+ };
71289
71487
  DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, DeviceType.Gateway, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
71290
71488
  kind: "mutation",
71291
71489
  auth: "admin"
@@ -80582,6 +80780,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
80582
80780
  pressureSensor: pressureSensorCapability,
80583
80781
  privacyMask: privacyMaskCapability,
80584
80782
  ptzAutotrack: ptzAutotrackCapability,
80783
+ pumpCycle: pumpCycleCapability,
80585
80784
  recordingOnboard: recordingOnboardCapability,
80586
80785
  recordingSignal: recordingSignalCapability,
80587
80786
  runningState: runningStateCapability,
@@ -82766,6 +82965,27 @@ Object.freeze({
82766
82965
  access: "view",
82767
82966
  role: "viewer"
82768
82967
  },
82968
+ "boardKeySource.getBoardKey": {
82969
+ capName: "board-key-source",
82970
+ capScope: "system",
82971
+ addonId: null,
82972
+ access: "view",
82973
+ role: "admin"
82974
+ },
82975
+ "boardKeySource.listBoards": {
82976
+ capName: "board-key-source",
82977
+ capScope: "system",
82978
+ addonId: null,
82979
+ access: "view",
82980
+ role: "admin"
82981
+ },
82982
+ "boardKeySource.listSources": {
82983
+ capName: "board-key-source",
82984
+ capScope: "system",
82985
+ addonId: null,
82986
+ access: "view",
82987
+ role: "admin"
82988
+ },
82769
82989
  "brightness.getStatus": {
82770
82990
  capName: "brightness",
82771
82991
  capScope: "device",
@@ -85447,6 +85667,13 @@ Object.freeze({
85447
85667
  access: "view",
85448
85668
  role: "admin"
85449
85669
  },
85670
+ "integrationInstances.setInstanceEnabled": {
85671
+ capName: "integration-instances",
85672
+ capScope: "system",
85673
+ addonId: null,
85674
+ access: "create",
85675
+ role: "admin"
85676
+ },
85450
85677
  "integrationInstances.testInstance": {
85451
85678
  capName: "integration-instances",
85452
85679
  capScope: "system",
@@ -87582,27 +87809,6 @@ Object.freeze({
87582
87809
  access: "create",
87583
87810
  role: "viewer"
87584
87811
  },
87585
- "petFountain.setPumpInterval": {
87586
- capName: "pet-fountain",
87587
- capScope: "device",
87588
- addonId: null,
87589
- access: "create",
87590
- role: "viewer"
87591
- },
87592
- "petFountain.setPumpOffMinutes": {
87593
- capName: "pet-fountain",
87594
- capScope: "device",
87595
- addonId: null,
87596
- access: "create",
87597
- role: "viewer"
87598
- },
87599
- "petFountain.setPumpOnMinutes": {
87600
- capName: "pet-fountain",
87601
- capScope: "device",
87602
- addonId: null,
87603
- access: "create",
87604
- role: "viewer"
87605
- },
87606
87812
  "pipelineAnalytics.addRetrainFrameFromRecording": {
87607
87813
  capName: "pipeline-analytics",
87608
87814
  capScope: "device",
@@ -89381,6 +89587,34 @@ Object.freeze({
89381
89587
  access: "create",
89382
89588
  role: "admin"
89383
89589
  },
89590
+ "pumpCycle.getStatus": {
89591
+ capName: "pump-cycle",
89592
+ capScope: "device",
89593
+ addonId: null,
89594
+ access: "view",
89595
+ role: "viewer"
89596
+ },
89597
+ "pumpCycle.setEnabled": {
89598
+ capName: "pump-cycle",
89599
+ capScope: "device",
89600
+ addonId: null,
89601
+ access: "create",
89602
+ role: "viewer"
89603
+ },
89604
+ "pumpCycle.setOffMinutes": {
89605
+ capName: "pump-cycle",
89606
+ capScope: "device",
89607
+ addonId: null,
89608
+ access: "create",
89609
+ role: "viewer"
89610
+ },
89611
+ "pumpCycle.setOnMinutes": {
89612
+ capName: "pump-cycle",
89613
+ capScope: "device",
89614
+ addonId: null,
89615
+ access: "create",
89616
+ role: "viewer"
89617
+ },
89384
89618
  "reboot.reboot": {
89385
89619
  capName: "reboot",
89386
89620
  capScope: "device",
@@ -93936,21 +94170,6 @@ Object.freeze({
93936
94170
  form: "single",
93937
94171
  optional: false
93938
94172
  }],
93939
- "petFountain.setPumpInterval": [{
93940
- name: "deviceId",
93941
- form: "single",
93942
- optional: false
93943
- }],
93944
- "petFountain.setPumpOffMinutes": [{
93945
- name: "deviceId",
93946
- form: "single",
93947
- optional: false
93948
- }],
93949
- "petFountain.setPumpOnMinutes": [{
93950
- name: "deviceId",
93951
- form: "single",
93952
- optional: false
93953
- }],
93954
94173
  "pipelineAnalytics.addRetrainFrameFromRecording": [{
93955
94174
  name: "deviceId",
93956
94175
  form: "single",
@@ -94586,6 +94805,26 @@ Object.freeze({
94586
94805
  form: "single",
94587
94806
  optional: false
94588
94807
  }],
94808
+ "pumpCycle.getStatus": [{
94809
+ name: "deviceId",
94810
+ form: "single",
94811
+ optional: false
94812
+ }],
94813
+ "pumpCycle.setEnabled": [{
94814
+ name: "deviceId",
94815
+ form: "single",
94816
+ optional: false
94817
+ }],
94818
+ "pumpCycle.setOffMinutes": [{
94819
+ name: "deviceId",
94820
+ form: "single",
94821
+ optional: false
94822
+ }],
94823
+ "pumpCycle.setOnMinutes": [{
94824
+ name: "deviceId",
94825
+ form: "single",
94826
+ optional: false
94827
+ }],
94589
94828
  "reboot.reboot": [{
94590
94829
  name: "deviceId",
94591
94830
  form: "single",
@@ -97440,6 +97679,12 @@ Object.defineProperty(exports, "binaryCapability", {
97440
97679
  return binaryCapability;
97441
97680
  }
97442
97681
  });
97682
+ Object.defineProperty(exports, "boardKeySourceCapability", {
97683
+ enumerable: true,
97684
+ get: function() {
97685
+ return boardKeySourceCapability;
97686
+ }
97687
+ });
97443
97688
  Object.defineProperty(exports, "boolean", {
97444
97689
  enumerable: true,
97445
97690
  get: function() {