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