@camstack/addon-matter-broker 0.2.128 → 0.2.130
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.
- package/dist/addon.js +341 -37
- package/dist/addon.mjs +341 -37
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -13,7 +13,7 @@ let node_stream_promises = require("node:stream/promises");
|
|
|
13
13
|
let node_net = require("node:net");
|
|
14
14
|
let node_dgram = require("node:dgram");
|
|
15
15
|
node_dgram = require_esm.__toESM(node_dgram, 1);
|
|
16
|
-
//#region ../types/dist/event-category-
|
|
16
|
+
//#region ../types/dist/event-category-DOl51-Ij.mjs
|
|
17
17
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
18
18
|
EventCategory["SystemBoot"] = "system.boot";
|
|
19
19
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -92,9 +92,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
92
92
|
/**
|
|
93
93
|
* The node's one-shot runner boot check (D877): planned runners against the
|
|
94
94
|
* process service, `degraded` when any is failed, refused or missing. The
|
|
95
|
-
* alert centre turns it into one
|
|
95
|
+
* alert centre turns it into one critical alert.
|
|
96
96
|
*/
|
|
97
97
|
EventCategory["SystemRunnerCheck"] = "system.runner-check";
|
|
98
|
+
/**
|
|
99
|
+
* An alert EPISODE opened or closed, emitted by the alert centre for alerts
|
|
100
|
+
* of severity `critical` or `error` (`AlertEpisodePayload`). The alert
|
|
101
|
+
* centre sends no notification of its own: Notification Center turns this
|
|
102
|
+
* into the `alert-critical` / `alert-error` / `alert-critical-resolved`
|
|
103
|
+
* system-event kinds, and reconciles from the alerts store because a bus
|
|
104
|
+
* event may be dropped (D8, D11).
|
|
105
|
+
*/
|
|
106
|
+
EventCategory["AlertEpisode"] = "alert.episode";
|
|
98
107
|
EventCategory["AddonError"] = "addon.error";
|
|
99
108
|
EventCategory["AddonPageReady"] = "addon.page-ready";
|
|
100
109
|
EventCategory["AddonWidgetReady"] = "addon.widget-ready";
|
|
@@ -5552,7 +5561,7 @@ var ZodIssueCode = {
|
|
|
5552
5561
|
var ZodFirstPartyTypeKind;
|
|
5553
5562
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5554
5563
|
//#endregion
|
|
5555
|
-
//#region ../types/dist/sleep-
|
|
5564
|
+
//#region ../types/dist/sleep-BxjU_fJM.mjs
|
|
5556
5565
|
/**
|
|
5557
5566
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5558
5567
|
* window to float samples (D455).
|
|
@@ -13515,7 +13524,14 @@ var AlertSeveritySchema = _enum([
|
|
|
13515
13524
|
]);
|
|
13516
13525
|
var AlertActionSchema = object({
|
|
13517
13526
|
label: string$2(),
|
|
13518
|
-
href: string$2().optional()
|
|
13527
|
+
href: string$2().optional(),
|
|
13528
|
+
/**
|
|
13529
|
+
* How `href` is followed. Absent / `app`: an admin-ui route (client-side).
|
|
13530
|
+
* `server`: a route the HUB serves (an addon HTTP route such as an OAuth
|
|
13531
|
+
* start) — the browser must leave the SPA with a full navigation, because
|
|
13532
|
+
* the SPA has no such route and would bounce to the home page.
|
|
13533
|
+
*/
|
|
13534
|
+
navigation: _enum(["app", "server"]).optional()
|
|
13519
13535
|
});
|
|
13520
13536
|
var AlertStatusSchema = _enum([
|
|
13521
13537
|
"active",
|
|
@@ -17945,7 +17961,11 @@ var deviceDiscoveryCapability = {
|
|
|
17945
17961
|
};
|
|
17946
17962
|
/**
|
|
17947
17963
|
* `device-adoption` — generic discovery + adoption surface,
|
|
17948
|
-
* system-scoped
|
|
17964
|
+
* system-scoped collection (one provider per integration addon), routed
|
|
17965
|
+
* by explicit `{ addonId }` on direct `deviceAdoption.*` calls — the same
|
|
17966
|
+
* pin model as `connection-test`. The admin UI keeps using
|
|
17967
|
+
* `deviceManager.adoption*` (which already threads `addonId`). The de-HA-ified
|
|
17968
|
+
* successor to `ha-discovery`:
|
|
17949
17969
|
* keyed by `integrationId` (the addon resolves integrationId → broker
|
|
17950
17970
|
* internally) rather than a connection-specific `brokerId`, and it
|
|
17951
17971
|
* REUSES the shared `DiscoveredChildDevice` candidate type from
|
|
@@ -18110,7 +18130,7 @@ var ResyncResultSchema = object({
|
|
|
18110
18130
|
var deviceAdoptionCapability = {
|
|
18111
18131
|
name: "device-adoption",
|
|
18112
18132
|
scope: "system",
|
|
18113
|
-
mode: "
|
|
18133
|
+
mode: "collection",
|
|
18114
18134
|
status: {
|
|
18115
18135
|
schema: AdoptionStatusSchema,
|
|
18116
18136
|
kind: "poll"
|
|
@@ -42293,6 +42313,9 @@ var NcSystemEventKindSchema = _enum([
|
|
|
42293
42313
|
"server-updated",
|
|
42294
42314
|
"export-completed",
|
|
42295
42315
|
"backup-completed",
|
|
42316
|
+
"alert-critical",
|
|
42317
|
+
"alert-error",
|
|
42318
|
+
"alert-critical-resolved",
|
|
42296
42319
|
"camera-online",
|
|
42297
42320
|
"camera-offline",
|
|
42298
42321
|
"camera-disabled",
|
|
@@ -51369,7 +51392,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
51369
51392
|
}), method(object({ jobId: string$2().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string$2() }), object({ cancelled: boolean() }), {
|
|
51370
51393
|
kind: "mutation",
|
|
51371
51394
|
auth: "admin"
|
|
51372
|
-
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({
|
|
51395
|
+
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string$2()).readonly() }), object({
|
|
51396
|
+
clear: boolean(),
|
|
51397
|
+
repointLocationId: string$2().optional()
|
|
51398
|
+
}), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string$2() }), {
|
|
51373
51399
|
kind: "mutation",
|
|
51374
51400
|
auth: "admin"
|
|
51375
51401
|
}), method(StorageCleanupInputSchema, object({ jobId: string$2() }), {
|
|
@@ -55642,6 +55668,11 @@ onStatusChanged: { data: object({
|
|
|
55642
55668
|
*
|
|
55643
55669
|
* `kind: 'poll'` — cloud REST APIs typically have no push channel; the
|
|
55644
55670
|
* provider refreshes the slice on an interval and eagerly after commands.
|
|
55671
|
+
*
|
|
55672
|
+
* UNKNOWN IS NOT OFF. Every field the appliance reports separately is
|
|
55673
|
+
* nullable: `null` means "not known right now" (the appliance has not said,
|
|
55674
|
+
* the link is down, or the description does not carry it) and is never
|
|
55675
|
+
* rendered or exported as `false` / `0`. `availability` says why.
|
|
55645
55676
|
*/
|
|
55646
55677
|
var DishwasherStateSchema = _enum([
|
|
55647
55678
|
"idle",
|
|
@@ -55651,35 +55682,155 @@ var DishwasherStateSchema = _enum([
|
|
|
55651
55682
|
"error",
|
|
55652
55683
|
"unavailable"
|
|
55653
55684
|
]);
|
|
55685
|
+
/**
|
|
55686
|
+
* The appliance's own operation state, uncollapsed. `state` above is the coarse
|
|
55687
|
+
* view for compact surfaces; this is what the appliance said.
|
|
55688
|
+
*/
|
|
55689
|
+
var DishwasherOperationStateSchema = _enum([
|
|
55690
|
+
"Inactive",
|
|
55691
|
+
"Ready",
|
|
55692
|
+
"DelayedStart",
|
|
55693
|
+
"Run",
|
|
55694
|
+
"Pause",
|
|
55695
|
+
"ActionRequired",
|
|
55696
|
+
"Finished",
|
|
55697
|
+
"Error",
|
|
55698
|
+
"Aborting"
|
|
55699
|
+
]);
|
|
55700
|
+
/**
|
|
55701
|
+
* Why fields may be `null`:
|
|
55702
|
+
* - `available` — the link is up and the description is loaded;
|
|
55703
|
+
* - `offline` — the local link is down (values are unknown, not last-known);
|
|
55704
|
+
* - `description-missing` — the link is up but the appliance's description could not
|
|
55705
|
+
* be loaded, so its values cannot be decoded.
|
|
55706
|
+
*/
|
|
55707
|
+
var DishwasherAvailabilitySchema = _enum([
|
|
55708
|
+
"available",
|
|
55709
|
+
"offline",
|
|
55710
|
+
"description-missing"
|
|
55711
|
+
]);
|
|
55654
55712
|
var DishwasherConsumableLevelSchema = _enum([
|
|
55655
55713
|
"ok",
|
|
55656
55714
|
"low",
|
|
55657
55715
|
"empty"
|
|
55658
55716
|
]);
|
|
55659
55717
|
var DishwasherStatusSchema = object({
|
|
55718
|
+
availability: DishwasherAvailabilitySchema,
|
|
55719
|
+
/** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
|
|
55660
55720
|
state: DishwasherStateSchema,
|
|
55661
|
-
/**
|
|
55721
|
+
/** The appliance's operation state as reported; null when not known. */
|
|
55722
|
+
operationState: DishwasherOperationStateSchema.nullable(),
|
|
55723
|
+
/** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
|
|
55662
55724
|
program: string$2().nullable(),
|
|
55663
|
-
/**
|
|
55725
|
+
/** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
|
|
55726
|
+
selectedProgram: string$2().nullable(),
|
|
55727
|
+
/** Feature keys of the programs the appliance currently offers — drives the UI selector. */
|
|
55664
55728
|
availablePrograms: array(string$2()),
|
|
55665
|
-
/**
|
|
55666
|
-
|
|
55729
|
+
/** Seconds remaining on the active cycle, or null when not running / not known. */
|
|
55730
|
+
remainingSeconds: number().int().nonnegative().nullable(),
|
|
55731
|
+
/** Seconds the delayed start is set to (time until the cycle starts), or null. */
|
|
55732
|
+
delayedStartSeconds: number().int().nonnegative().nullable(),
|
|
55667
55733
|
/** Cycle completion 0..100, or null when not applicable. */
|
|
55668
55734
|
progressPercent: number().min(0).max(100).nullable(),
|
|
55669
|
-
/** True when the door is reported open. */
|
|
55670
|
-
doorOpen: boolean(),
|
|
55671
|
-
/** True when
|
|
55672
|
-
|
|
55673
|
-
/**
|
|
55674
|
-
|
|
55735
|
+
/** True when the door is reported open; null when the door state is not known. */
|
|
55736
|
+
doorOpen: boolean().nullable(),
|
|
55737
|
+
/** True when the door is latched (locked) during a cycle; null when not reported. */
|
|
55738
|
+
doorLocked: boolean().nullable(),
|
|
55739
|
+
/** True when remote start is allowed (door closed, power on, etc.); null when not known. */
|
|
55740
|
+
remoteStartAllowed: boolean().nullable(),
|
|
55741
|
+
/** True when the appliance accepts remote control now; null when not known. */
|
|
55742
|
+
remoteControlActive: boolean().nullable(),
|
|
55743
|
+
/** True while somebody operates the appliance at its panel; null when not reported. */
|
|
55744
|
+
localControlActive: boolean().nullable(),
|
|
55745
|
+
/** Main power / switched-on state; null when not known. */
|
|
55746
|
+
powerOn: boolean().nullable(),
|
|
55747
|
+
/** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
|
|
55748
|
+
powerState: string$2().nullable(),
|
|
55675
55749
|
saltLevel: DishwasherConsumableLevelSchema.nullable(),
|
|
55676
55750
|
rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
|
|
55677
|
-
|
|
55678
|
-
|
|
55751
|
+
/** Option states: null when the appliance does not expose the option or has not said. */
|
|
55752
|
+
halfLoad: boolean().nullable(),
|
|
55753
|
+
hygienePlus: boolean().nullable(),
|
|
55754
|
+
/** Extra dry option when the appliance exposes it. */
|
|
55755
|
+
extraDry: boolean().nullable(),
|
|
55756
|
+
/** Intensive zone (lower basket) when the appliance exposes it. */
|
|
55757
|
+
intensiveZone: boolean().nullable(),
|
|
55758
|
+
/** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
|
|
55759
|
+
varioSpeedPlus: boolean().nullable(),
|
|
55760
|
+
/** Child lock (controls disabled on the appliance); null when not known. */
|
|
55761
|
+
childLock: boolean().nullable(),
|
|
55762
|
+
/** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
|
|
55763
|
+
activeEvents: array(string$2()),
|
|
55764
|
+
/** Numeric error code when the appliance reports one; null otherwise. */
|
|
55679
55765
|
errorCode: number().nullable(),
|
|
55766
|
+
/** Name of the raised alert-level event while the appliance is in error; null otherwise. */
|
|
55680
55767
|
errorLabel: string$2().nullable(),
|
|
55768
|
+
/** Ms epoch of the last value received from the appliance; 0 = never. */
|
|
55681
55769
|
lastFetchedAt: number()
|
|
55682
55770
|
});
|
|
55771
|
+
var DeviceIdSchema = number().int().nonnegative();
|
|
55772
|
+
/** A value a program option or setting can take. */
|
|
55773
|
+
var DishwasherValueSchema = union([
|
|
55774
|
+
boolean(),
|
|
55775
|
+
string$2(),
|
|
55776
|
+
number()
|
|
55777
|
+
]);
|
|
55778
|
+
var DishwasherAccessSchema = _enum([
|
|
55779
|
+
"none",
|
|
55780
|
+
"read",
|
|
55781
|
+
"readWrite",
|
|
55782
|
+
"writeOnly",
|
|
55783
|
+
"readStatic"
|
|
55784
|
+
]);
|
|
55785
|
+
/**
|
|
55786
|
+
* One option or setting the appliance declares, with the constraints its description
|
|
55787
|
+
* gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
|
|
55788
|
+
*/
|
|
55789
|
+
var DishwasherOptionDescriptorSchema = object({
|
|
55790
|
+
/** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
|
|
55791
|
+
key: string$2(),
|
|
55792
|
+
/** Last segment of the key, for display. */
|
|
55793
|
+
name: string$2(),
|
|
55794
|
+
type: _enum([
|
|
55795
|
+
"boolean",
|
|
55796
|
+
"number",
|
|
55797
|
+
"enum",
|
|
55798
|
+
"string"
|
|
55799
|
+
]),
|
|
55800
|
+
access: DishwasherAccessSchema,
|
|
55801
|
+
/** The appliance reports this entity as currently available. */
|
|
55802
|
+
available: boolean(),
|
|
55803
|
+
/** Unit the description declares for a number; null when it declares none. */
|
|
55804
|
+
unit: string$2().nullable(),
|
|
55805
|
+
min: number().nullable(),
|
|
55806
|
+
max: number().nullable(),
|
|
55807
|
+
step: number().nullable(),
|
|
55808
|
+
/** Allowed members of an enum; null for other types. */
|
|
55809
|
+
enumValues: array(string$2()).nullable(),
|
|
55810
|
+
defaultValue: DishwasherValueSchema.nullable()
|
|
55811
|
+
});
|
|
55812
|
+
var DishwasherProgramSchema = object({
|
|
55813
|
+
/** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
|
|
55814
|
+
key: string$2(),
|
|
55815
|
+
name: string$2(),
|
|
55816
|
+
/** The appliance currently offers this program. */
|
|
55817
|
+
available: boolean(),
|
|
55818
|
+
/** The options this program lists, with the program-level access / availability / default. */
|
|
55819
|
+
options: array(DishwasherOptionDescriptorSchema)
|
|
55820
|
+
});
|
|
55821
|
+
var DishwasherOptionsSchema = object({
|
|
55822
|
+
availability: DishwasherAvailabilitySchema,
|
|
55823
|
+
/** What the appliance can be told to do, from the commands its description declares. */
|
|
55824
|
+
supportsStart: boolean(),
|
|
55825
|
+
supportsPause: boolean(),
|
|
55826
|
+
supportsResume: boolean(),
|
|
55827
|
+
supportsStop: boolean(),
|
|
55828
|
+
supportsPower: boolean(),
|
|
55829
|
+
/** Every program the description lists, with its options. */
|
|
55830
|
+
programs: array(DishwasherProgramSchema),
|
|
55831
|
+
/** Every option and setting entity the description lists (programs reference these by key). */
|
|
55832
|
+
options: array(DishwasherOptionDescriptorSchema)
|
|
55833
|
+
});
|
|
55683
55834
|
var dishwasherCapability = {
|
|
55684
55835
|
name: "dishwasher",
|
|
55685
55836
|
scope: "device",
|
|
@@ -55687,58 +55838,102 @@ var dishwasherCapability = {
|
|
|
55687
55838
|
mode: "singleton",
|
|
55688
55839
|
deviceTypes: [DeviceType.Dishwasher],
|
|
55689
55840
|
methods: {
|
|
55690
|
-
|
|
55841
|
+
/**
|
|
55842
|
+
* Start a program. Without `program` the selected one starts. `options` are
|
|
55843
|
+
* option feature keys; each is checked against the program's constraints.
|
|
55844
|
+
*/
|
|
55845
|
+
start: method(object({
|
|
55846
|
+
deviceId: DeviceIdSchema,
|
|
55847
|
+
program: string$2().min(1).optional(),
|
|
55848
|
+
options: record(string$2(), DishwasherValueSchema).optional()
|
|
55849
|
+
}), _void(), {
|
|
55691
55850
|
kind: "mutation",
|
|
55692
55851
|
auth: "protected"
|
|
55693
55852
|
}),
|
|
55694
|
-
pause: method(object({ deviceId:
|
|
55853
|
+
pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
|
|
55695
55854
|
kind: "mutation",
|
|
55696
55855
|
auth: "protected"
|
|
55697
55856
|
}),
|
|
55698
|
-
|
|
55857
|
+
resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
|
|
55699
55858
|
kind: "mutation",
|
|
55700
55859
|
auth: "protected"
|
|
55701
55860
|
}),
|
|
55861
|
+
stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
|
|
55862
|
+
kind: "mutation",
|
|
55863
|
+
auth: "protected"
|
|
55864
|
+
}),
|
|
55865
|
+
/** Select (not start) a program; refused when the appliance does not offer it. */
|
|
55702
55866
|
setProgram: method(object({
|
|
55703
|
-
deviceId:
|
|
55867
|
+
deviceId: DeviceIdSchema,
|
|
55704
55868
|
program: string$2().min(1)
|
|
55705
55869
|
}), _void(), {
|
|
55706
55870
|
kind: "mutation",
|
|
55707
55871
|
auth: "protected"
|
|
55708
55872
|
}),
|
|
55709
55873
|
setPower: method(object({
|
|
55710
|
-
deviceId:
|
|
55874
|
+
deviceId: DeviceIdSchema,
|
|
55711
55875
|
on: boolean()
|
|
55712
55876
|
}), _void(), {
|
|
55713
55877
|
kind: "mutation",
|
|
55714
55878
|
auth: "protected"
|
|
55715
55879
|
}),
|
|
55716
55880
|
setHalfLoad: method(object({
|
|
55717
|
-
deviceId:
|
|
55881
|
+
deviceId: DeviceIdSchema,
|
|
55718
55882
|
on: boolean()
|
|
55719
55883
|
}), _void(), {
|
|
55720
55884
|
kind: "mutation",
|
|
55721
55885
|
auth: "protected"
|
|
55722
55886
|
}),
|
|
55723
55887
|
setHygienePlus: method(object({
|
|
55724
|
-
deviceId:
|
|
55888
|
+
deviceId: DeviceIdSchema,
|
|
55725
55889
|
on: boolean()
|
|
55726
55890
|
}), _void(), {
|
|
55727
55891
|
kind: "mutation",
|
|
55728
55892
|
auth: "protected"
|
|
55729
55893
|
}),
|
|
55894
|
+
setExtraDry: method(object({
|
|
55895
|
+
deviceId: DeviceIdSchema,
|
|
55896
|
+
on: boolean()
|
|
55897
|
+
}), _void(), {
|
|
55898
|
+
kind: "mutation",
|
|
55899
|
+
auth: "protected"
|
|
55900
|
+
}),
|
|
55901
|
+
setIntensiveZone: method(object({
|
|
55902
|
+
deviceId: DeviceIdSchema,
|
|
55903
|
+
on: boolean()
|
|
55904
|
+
}), _void(), {
|
|
55905
|
+
kind: "mutation",
|
|
55906
|
+
auth: "protected"
|
|
55907
|
+
}),
|
|
55908
|
+
setVarioSpeedPlus: method(object({
|
|
55909
|
+
deviceId: DeviceIdSchema,
|
|
55910
|
+
on: boolean()
|
|
55911
|
+
}), _void(), {
|
|
55912
|
+
kind: "mutation",
|
|
55913
|
+
auth: "protected"
|
|
55914
|
+
}),
|
|
55915
|
+
setChildLock: method(object({
|
|
55916
|
+
deviceId: DeviceIdSchema,
|
|
55917
|
+
on: boolean()
|
|
55918
|
+
}), _void(), {
|
|
55919
|
+
kind: "mutation",
|
|
55920
|
+
auth: "protected"
|
|
55921
|
+
}),
|
|
55922
|
+
/**
|
|
55923
|
+
* Write any option or setting by feature key. Refused when the description does
|
|
55924
|
+
* not list it, it is not writable or not available now, or the value is outside
|
|
55925
|
+
* its declared range / members.
|
|
55926
|
+
*/
|
|
55730
55927
|
setOption: method(object({
|
|
55731
|
-
deviceId:
|
|
55928
|
+
deviceId: DeviceIdSchema,
|
|
55732
55929
|
key: string$2().min(1),
|
|
55733
|
-
value:
|
|
55734
|
-
boolean(),
|
|
55735
|
-
string$2(),
|
|
55736
|
-
number()
|
|
55737
|
-
])
|
|
55930
|
+
value: DishwasherValueSchema
|
|
55738
55931
|
}), _void(), {
|
|
55739
55932
|
kind: "mutation",
|
|
55740
55933
|
auth: "protected"
|
|
55741
|
-
})
|
|
55934
|
+
}),
|
|
55935
|
+
/** What this appliance can do, from its own description — the UI is derived from it. */
|
|
55936
|
+
getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
|
|
55742
55937
|
},
|
|
55743
55938
|
status: {
|
|
55744
55939
|
schema: DishwasherStatusSchema,
|
|
@@ -69687,6 +69882,12 @@ Object.freeze({
|
|
|
69687
69882
|
addonId: null,
|
|
69688
69883
|
access: "view"
|
|
69689
69884
|
},
|
|
69885
|
+
"dishwasher.getOptions": {
|
|
69886
|
+
capName: "dishwasher",
|
|
69887
|
+
capScope: "device",
|
|
69888
|
+
addonId: null,
|
|
69889
|
+
access: "view"
|
|
69890
|
+
},
|
|
69690
69891
|
"dishwasher.getStatus": {
|
|
69691
69892
|
capName: "dishwasher",
|
|
69692
69893
|
capScope: "device",
|
|
@@ -69699,6 +69900,24 @@ Object.freeze({
|
|
|
69699
69900
|
addonId: null,
|
|
69700
69901
|
access: "create"
|
|
69701
69902
|
},
|
|
69903
|
+
"dishwasher.resume": {
|
|
69904
|
+
capName: "dishwasher",
|
|
69905
|
+
capScope: "device",
|
|
69906
|
+
addonId: null,
|
|
69907
|
+
access: "create"
|
|
69908
|
+
},
|
|
69909
|
+
"dishwasher.setChildLock": {
|
|
69910
|
+
capName: "dishwasher",
|
|
69911
|
+
capScope: "device",
|
|
69912
|
+
addonId: null,
|
|
69913
|
+
access: "create"
|
|
69914
|
+
},
|
|
69915
|
+
"dishwasher.setExtraDry": {
|
|
69916
|
+
capName: "dishwasher",
|
|
69917
|
+
capScope: "device",
|
|
69918
|
+
addonId: null,
|
|
69919
|
+
access: "create"
|
|
69920
|
+
},
|
|
69702
69921
|
"dishwasher.setHalfLoad": {
|
|
69703
69922
|
capName: "dishwasher",
|
|
69704
69923
|
capScope: "device",
|
|
@@ -69711,6 +69930,12 @@ Object.freeze({
|
|
|
69711
69930
|
addonId: null,
|
|
69712
69931
|
access: "create"
|
|
69713
69932
|
},
|
|
69933
|
+
"dishwasher.setIntensiveZone": {
|
|
69934
|
+
capName: "dishwasher",
|
|
69935
|
+
capScope: "device",
|
|
69936
|
+
addonId: null,
|
|
69937
|
+
access: "create"
|
|
69938
|
+
},
|
|
69714
69939
|
"dishwasher.setOption": {
|
|
69715
69940
|
capName: "dishwasher",
|
|
69716
69941
|
capScope: "device",
|
|
@@ -69729,6 +69954,12 @@ Object.freeze({
|
|
|
69729
69954
|
addonId: null,
|
|
69730
69955
|
access: "create"
|
|
69731
69956
|
},
|
|
69957
|
+
"dishwasher.setVarioSpeedPlus": {
|
|
69958
|
+
capName: "dishwasher",
|
|
69959
|
+
capScope: "device",
|
|
69960
|
+
addonId: null,
|
|
69961
|
+
access: "create"
|
|
69962
|
+
},
|
|
69732
69963
|
"dishwasher.start": {
|
|
69733
69964
|
capName: "dishwasher",
|
|
69734
69965
|
capScope: "device",
|
|
@@ -74175,6 +74406,12 @@ Object.freeze({
|
|
|
74175
74406
|
addonId: null,
|
|
74176
74407
|
access: "view"
|
|
74177
74408
|
},
|
|
74409
|
+
"storageMigration.moverClearance": {
|
|
74410
|
+
capName: "storage-migration",
|
|
74411
|
+
capScope: "system",
|
|
74412
|
+
addonId: null,
|
|
74413
|
+
access: "view"
|
|
74414
|
+
},
|
|
74178
74415
|
"storageMigration.movers": {
|
|
74179
74416
|
capName: "storage-migration",
|
|
74180
74417
|
capScope: "system",
|
|
@@ -76368,6 +76605,11 @@ Object.freeze({
|
|
|
76368
76605
|
form: "single",
|
|
76369
76606
|
optional: false
|
|
76370
76607
|
}],
|
|
76608
|
+
"dishwasher.getOptions": [{
|
|
76609
|
+
name: "deviceId",
|
|
76610
|
+
form: "single",
|
|
76611
|
+
optional: false
|
|
76612
|
+
}],
|
|
76371
76613
|
"dishwasher.getStatus": [{
|
|
76372
76614
|
name: "deviceId",
|
|
76373
76615
|
form: "single",
|
|
@@ -76378,6 +76620,21 @@ Object.freeze({
|
|
|
76378
76620
|
form: "single",
|
|
76379
76621
|
optional: false
|
|
76380
76622
|
}],
|
|
76623
|
+
"dishwasher.resume": [{
|
|
76624
|
+
name: "deviceId",
|
|
76625
|
+
form: "single",
|
|
76626
|
+
optional: false
|
|
76627
|
+
}],
|
|
76628
|
+
"dishwasher.setChildLock": [{
|
|
76629
|
+
name: "deviceId",
|
|
76630
|
+
form: "single",
|
|
76631
|
+
optional: false
|
|
76632
|
+
}],
|
|
76633
|
+
"dishwasher.setExtraDry": [{
|
|
76634
|
+
name: "deviceId",
|
|
76635
|
+
form: "single",
|
|
76636
|
+
optional: false
|
|
76637
|
+
}],
|
|
76381
76638
|
"dishwasher.setHalfLoad": [{
|
|
76382
76639
|
name: "deviceId",
|
|
76383
76640
|
form: "single",
|
|
@@ -76388,6 +76645,11 @@ Object.freeze({
|
|
|
76388
76645
|
form: "single",
|
|
76389
76646
|
optional: false
|
|
76390
76647
|
}],
|
|
76648
|
+
"dishwasher.setIntensiveZone": [{
|
|
76649
|
+
name: "deviceId",
|
|
76650
|
+
form: "single",
|
|
76651
|
+
optional: false
|
|
76652
|
+
}],
|
|
76391
76653
|
"dishwasher.setOption": [{
|
|
76392
76654
|
name: "deviceId",
|
|
76393
76655
|
form: "single",
|
|
@@ -76403,6 +76665,11 @@ Object.freeze({
|
|
|
76403
76665
|
form: "single",
|
|
76404
76666
|
optional: false
|
|
76405
76667
|
}],
|
|
76668
|
+
"dishwasher.setVarioSpeedPlus": [{
|
|
76669
|
+
name: "deviceId",
|
|
76670
|
+
form: "single",
|
|
76671
|
+
optional: false
|
|
76672
|
+
}],
|
|
76406
76673
|
"dishwasher.start": [{
|
|
76407
76674
|
name: "deviceId",
|
|
76408
76675
|
form: "single",
|
|
@@ -78444,6 +78711,9 @@ new Map(Object.entries({
|
|
|
78444
78711
|
"wrapper-update-available": "system",
|
|
78445
78712
|
"backup-completed": "system",
|
|
78446
78713
|
"export-completed": "system",
|
|
78714
|
+
"alert-critical": "system",
|
|
78715
|
+
"alert-error": "system",
|
|
78716
|
+
"alert-critical-resolved": "system",
|
|
78447
78717
|
"storage-location-low": "system",
|
|
78448
78718
|
"storage-location-critical": "system",
|
|
78449
78719
|
"storage-location-ok": "system",
|
|
@@ -78568,6 +78838,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
78568
78838
|
"storage-location-ok"
|
|
78569
78839
|
]
|
|
78570
78840
|
},
|
|
78841
|
+
{
|
|
78842
|
+
id: "alerts",
|
|
78843
|
+
family: "system",
|
|
78844
|
+
label: "Alerts",
|
|
78845
|
+
kinds: [
|
|
78846
|
+
"alert-critical",
|
|
78847
|
+
"alert-error",
|
|
78848
|
+
"alert-critical-resolved"
|
|
78849
|
+
]
|
|
78850
|
+
},
|
|
78571
78851
|
{
|
|
78572
78852
|
id: "alarm",
|
|
78573
78853
|
family: "alarm",
|
|
@@ -78612,6 +78892,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
|
|
|
78612
78892
|
return [[descriptor.kind, field]];
|
|
78613
78893
|
})));
|
|
78614
78894
|
Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
|
|
78895
|
+
object({
|
|
78896
|
+
phase: _enum(["raised", "resolved"]),
|
|
78897
|
+
episodeId: string$2().min(1),
|
|
78898
|
+
alertId: string$2().min(1),
|
|
78899
|
+
severity: AlertSeveritySchema,
|
|
78900
|
+
category: string$2(),
|
|
78901
|
+
title: string$2(),
|
|
78902
|
+
message: string$2(),
|
|
78903
|
+
sourceType: string$2().optional(),
|
|
78904
|
+
sourceId: string$2().optional(),
|
|
78905
|
+
nodeId: string$2().optional(),
|
|
78906
|
+
/** The alert's own action link (where the operator acts on it), when it has one. */
|
|
78907
|
+
actionUrl: string$2().optional(),
|
|
78908
|
+
at: number()
|
|
78909
|
+
});
|
|
78615
78910
|
var RULE_BODY_ONLY = ["body"];
|
|
78616
78911
|
var RULE_TEXT = ["title", "body"];
|
|
78617
78912
|
var BATTERY = ["device-battery-low", "device-battery-normal"];
|
|
@@ -78621,6 +78916,11 @@ var TANK = [
|
|
|
78621
78916
|
"device-tank-full",
|
|
78622
78917
|
"device-tank-normal"
|
|
78623
78918
|
];
|
|
78919
|
+
var ALERT_EPISODE = [
|
|
78920
|
+
"alert-critical",
|
|
78921
|
+
"alert-error",
|
|
78922
|
+
"alert-critical-resolved"
|
|
78923
|
+
];
|
|
78624
78924
|
var UPDATES = [
|
|
78625
78925
|
"addon-update-available",
|
|
78626
78926
|
"server-update-available",
|
|
@@ -78813,14 +79113,14 @@ var STATE_SUMMARY_VARS = [
|
|
|
78813
79113
|
([...RULE_TEXT], [...CONSUMABLE]),
|
|
78814
79114
|
([...RULE_TEXT], [...TANK]),
|
|
78815
79115
|
[...RULE_TEXT],
|
|
78816
|
-
([...RULE_TEXT], [...UPDATES]),
|
|
78817
|
-
([...RULE_TEXT], [...UPDATES]),
|
|
78818
|
-
[...RULE_TEXT],
|
|
79116
|
+
([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
|
|
79117
|
+
([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
|
|
78819
79118
|
[...RULE_TEXT],
|
|
78820
79119
|
[...RULE_TEXT],
|
|
78821
79120
|
[...RULE_TEXT],
|
|
78822
79121
|
[...RULE_TEXT],
|
|
78823
79122
|
[...RULE_TEXT],
|
|
79123
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
78824
79124
|
[...RULE_TEXT],
|
|
78825
79125
|
[...RULE_TEXT],
|
|
78826
79126
|
[...RULE_TEXT],
|
|
@@ -78838,7 +79138,11 @@ var STATE_SUMMARY_VARS = [
|
|
|
78838
79138
|
[...RULE_TEXT],
|
|
78839
79139
|
[...RULE_TEXT],
|
|
78840
79140
|
[...RULE_TEXT],
|
|
78841
|
-
[...RULE_TEXT],
|
|
79141
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
79142
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
79143
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
79144
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
79145
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
78842
79146
|
[...RULE_TEXT],
|
|
78843
79147
|
[...RULE_TEXT],
|
|
78844
79148
|
[...RULE_TEXT],
|
package/dist/addon.mjs
CHANGED
|
@@ -11,7 +11,7 @@ import { networkInterfaces, tmpdir, uptime } from "node:os";
|
|
|
11
11
|
import { finished } from "node:stream/promises";
|
|
12
12
|
import { createConnection, createServer as createServer$2 } from "node:net";
|
|
13
13
|
import * as dgram from "node:dgram";
|
|
14
|
-
//#region ../types/dist/event-category-
|
|
14
|
+
//#region ../types/dist/event-category-DOl51-Ij.mjs
|
|
15
15
|
var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
16
16
|
EventCategory["SystemBoot"] = "system.boot";
|
|
17
17
|
EventCategory["SystemAddonsReady"] = "system.addons-ready";
|
|
@@ -90,9 +90,18 @@ var EventCategory = /* @__PURE__ */ function(EventCategory) {
|
|
|
90
90
|
/**
|
|
91
91
|
* The node's one-shot runner boot check (D877): planned runners against the
|
|
92
92
|
* process service, `degraded` when any is failed, refused or missing. The
|
|
93
|
-
* alert centre turns it into one
|
|
93
|
+
* alert centre turns it into one critical alert.
|
|
94
94
|
*/
|
|
95
95
|
EventCategory["SystemRunnerCheck"] = "system.runner-check";
|
|
96
|
+
/**
|
|
97
|
+
* An alert EPISODE opened or closed, emitted by the alert centre for alerts
|
|
98
|
+
* of severity `critical` or `error` (`AlertEpisodePayload`). The alert
|
|
99
|
+
* centre sends no notification of its own: Notification Center turns this
|
|
100
|
+
* into the `alert-critical` / `alert-error` / `alert-critical-resolved`
|
|
101
|
+
* system-event kinds, and reconciles from the alerts store because a bus
|
|
102
|
+
* event may be dropped (D8, D11).
|
|
103
|
+
*/
|
|
104
|
+
EventCategory["AlertEpisode"] = "alert.episode";
|
|
96
105
|
EventCategory["AddonError"] = "addon.error";
|
|
97
106
|
EventCategory["AddonPageReady"] = "addon.page-ready";
|
|
98
107
|
EventCategory["AddonWidgetReady"] = "addon.widget-ready";
|
|
@@ -5550,7 +5559,7 @@ var ZodIssueCode = {
|
|
|
5550
5559
|
var ZodFirstPartyTypeKind;
|
|
5551
5560
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5552
5561
|
//#endregion
|
|
5553
|
-
//#region ../types/dist/sleep-
|
|
5562
|
+
//#region ../types/dist/sleep-BxjU_fJM.mjs
|
|
5554
5563
|
/**
|
|
5555
5564
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5556
5565
|
* window to float samples (D455).
|
|
@@ -13513,7 +13522,14 @@ var AlertSeveritySchema = _enum([
|
|
|
13513
13522
|
]);
|
|
13514
13523
|
var AlertActionSchema = object({
|
|
13515
13524
|
label: string$2(),
|
|
13516
|
-
href: string$2().optional()
|
|
13525
|
+
href: string$2().optional(),
|
|
13526
|
+
/**
|
|
13527
|
+
* How `href` is followed. Absent / `app`: an admin-ui route (client-side).
|
|
13528
|
+
* `server`: a route the HUB serves (an addon HTTP route such as an OAuth
|
|
13529
|
+
* start) — the browser must leave the SPA with a full navigation, because
|
|
13530
|
+
* the SPA has no such route and would bounce to the home page.
|
|
13531
|
+
*/
|
|
13532
|
+
navigation: _enum(["app", "server"]).optional()
|
|
13517
13533
|
});
|
|
13518
13534
|
var AlertStatusSchema = _enum([
|
|
13519
13535
|
"active",
|
|
@@ -17943,7 +17959,11 @@ var deviceDiscoveryCapability = {
|
|
|
17943
17959
|
};
|
|
17944
17960
|
/**
|
|
17945
17961
|
* `device-adoption` — generic discovery + adoption surface,
|
|
17946
|
-
* system-scoped
|
|
17962
|
+
* system-scoped collection (one provider per integration addon), routed
|
|
17963
|
+
* by explicit `{ addonId }` on direct `deviceAdoption.*` calls — the same
|
|
17964
|
+
* pin model as `connection-test`. The admin UI keeps using
|
|
17965
|
+
* `deviceManager.adoption*` (which already threads `addonId`). The de-HA-ified
|
|
17966
|
+
* successor to `ha-discovery`:
|
|
17947
17967
|
* keyed by `integrationId` (the addon resolves integrationId → broker
|
|
17948
17968
|
* internally) rather than a connection-specific `brokerId`, and it
|
|
17949
17969
|
* REUSES the shared `DiscoveredChildDevice` candidate type from
|
|
@@ -18108,7 +18128,7 @@ var ResyncResultSchema = object({
|
|
|
18108
18128
|
var deviceAdoptionCapability = {
|
|
18109
18129
|
name: "device-adoption",
|
|
18110
18130
|
scope: "system",
|
|
18111
|
-
mode: "
|
|
18131
|
+
mode: "collection",
|
|
18112
18132
|
status: {
|
|
18113
18133
|
schema: AdoptionStatusSchema,
|
|
18114
18134
|
kind: "poll"
|
|
@@ -42291,6 +42311,9 @@ var NcSystemEventKindSchema = _enum([
|
|
|
42291
42311
|
"server-updated",
|
|
42292
42312
|
"export-completed",
|
|
42293
42313
|
"backup-completed",
|
|
42314
|
+
"alert-critical",
|
|
42315
|
+
"alert-error",
|
|
42316
|
+
"alert-critical-resolved",
|
|
42294
42317
|
"camera-online",
|
|
42295
42318
|
"camera-offline",
|
|
42296
42319
|
"camera-disabled",
|
|
@@ -51367,7 +51390,10 @@ method(StorageMigrationInputSchema, StorageMigrationPlanSchema, { auth: "admin"
|
|
|
51367
51390
|
}), method(object({ jobId: string$2().optional() }), StorageMigrationJobSchema.nullable(), { auth: "admin" }), method(object({ jobId: string$2() }), object({ cancelled: boolean() }), {
|
|
51368
51391
|
kind: "mutation",
|
|
51369
51392
|
auth: "admin"
|
|
51370
|
-
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({
|
|
51393
|
+
}), method(object({}), array(StorageMigrationMoverSchema).readonly(), { auth: "admin" }), method(object({ locationIds: array(string$2()).readonly() }), object({
|
|
51394
|
+
clear: boolean(),
|
|
51395
|
+
repointLocationId: string$2().optional()
|
|
51396
|
+
}), { auth: "admin" }), method(object({}), array(StorageMigrationResidueSchema).readonly(), { auth: "admin" }), method(StorageMigrationDrainInputSchema, object({ jobId: string$2() }), {
|
|
51371
51397
|
kind: "mutation",
|
|
51372
51398
|
auth: "admin"
|
|
51373
51399
|
}), method(StorageCleanupInputSchema, object({ jobId: string$2() }), {
|
|
@@ -55640,6 +55666,11 @@ onStatusChanged: { data: object({
|
|
|
55640
55666
|
*
|
|
55641
55667
|
* `kind: 'poll'` — cloud REST APIs typically have no push channel; the
|
|
55642
55668
|
* provider refreshes the slice on an interval and eagerly after commands.
|
|
55669
|
+
*
|
|
55670
|
+
* UNKNOWN IS NOT OFF. Every field the appliance reports separately is
|
|
55671
|
+
* nullable: `null` means "not known right now" (the appliance has not said,
|
|
55672
|
+
* the link is down, or the description does not carry it) and is never
|
|
55673
|
+
* rendered or exported as `false` / `0`. `availability` says why.
|
|
55643
55674
|
*/
|
|
55644
55675
|
var DishwasherStateSchema = _enum([
|
|
55645
55676
|
"idle",
|
|
@@ -55649,35 +55680,155 @@ var DishwasherStateSchema = _enum([
|
|
|
55649
55680
|
"error",
|
|
55650
55681
|
"unavailable"
|
|
55651
55682
|
]);
|
|
55683
|
+
/**
|
|
55684
|
+
* The appliance's own operation state, uncollapsed. `state` above is the coarse
|
|
55685
|
+
* view for compact surfaces; this is what the appliance said.
|
|
55686
|
+
*/
|
|
55687
|
+
var DishwasherOperationStateSchema = _enum([
|
|
55688
|
+
"Inactive",
|
|
55689
|
+
"Ready",
|
|
55690
|
+
"DelayedStart",
|
|
55691
|
+
"Run",
|
|
55692
|
+
"Pause",
|
|
55693
|
+
"ActionRequired",
|
|
55694
|
+
"Finished",
|
|
55695
|
+
"Error",
|
|
55696
|
+
"Aborting"
|
|
55697
|
+
]);
|
|
55698
|
+
/**
|
|
55699
|
+
* Why fields may be `null`:
|
|
55700
|
+
* - `available` — the link is up and the description is loaded;
|
|
55701
|
+
* - `offline` — the local link is down (values are unknown, not last-known);
|
|
55702
|
+
* - `description-missing` — the link is up but the appliance's description could not
|
|
55703
|
+
* be loaded, so its values cannot be decoded.
|
|
55704
|
+
*/
|
|
55705
|
+
var DishwasherAvailabilitySchema = _enum([
|
|
55706
|
+
"available",
|
|
55707
|
+
"offline",
|
|
55708
|
+
"description-missing"
|
|
55709
|
+
]);
|
|
55652
55710
|
var DishwasherConsumableLevelSchema = _enum([
|
|
55653
55711
|
"ok",
|
|
55654
55712
|
"low",
|
|
55655
55713
|
"empty"
|
|
55656
55714
|
]);
|
|
55657
55715
|
var DishwasherStatusSchema = object({
|
|
55716
|
+
availability: DishwasherAvailabilitySchema,
|
|
55717
|
+
/** Coarse state for compact surfaces; `unavailable` whenever the appliance state is not known. */
|
|
55658
55718
|
state: DishwasherStateSchema,
|
|
55659
|
-
/**
|
|
55719
|
+
/** The appliance's operation state as reported; null when not known. */
|
|
55720
|
+
operationState: DishwasherOperationStateSchema.nullable(),
|
|
55721
|
+
/** Feature key of the ACTIVE (running) program, or null when none runs / not known. */
|
|
55660
55722
|
program: string$2().nullable(),
|
|
55661
|
-
/**
|
|
55723
|
+
/** Feature key of the SELECTED program (what Start would run), or null when none / not known. */
|
|
55724
|
+
selectedProgram: string$2().nullable(),
|
|
55725
|
+
/** Feature keys of the programs the appliance currently offers — drives the UI selector. */
|
|
55662
55726
|
availablePrograms: array(string$2()),
|
|
55663
|
-
/**
|
|
55664
|
-
|
|
55727
|
+
/** Seconds remaining on the active cycle, or null when not running / not known. */
|
|
55728
|
+
remainingSeconds: number().int().nonnegative().nullable(),
|
|
55729
|
+
/** Seconds the delayed start is set to (time until the cycle starts), or null. */
|
|
55730
|
+
delayedStartSeconds: number().int().nonnegative().nullable(),
|
|
55665
55731
|
/** Cycle completion 0..100, or null when not applicable. */
|
|
55666
55732
|
progressPercent: number().min(0).max(100).nullable(),
|
|
55667
|
-
/** True when the door is reported open. */
|
|
55668
|
-
doorOpen: boolean(),
|
|
55669
|
-
/** True when
|
|
55670
|
-
|
|
55671
|
-
/**
|
|
55672
|
-
|
|
55733
|
+
/** True when the door is reported open; null when the door state is not known. */
|
|
55734
|
+
doorOpen: boolean().nullable(),
|
|
55735
|
+
/** True when the door is latched (locked) during a cycle; null when not reported. */
|
|
55736
|
+
doorLocked: boolean().nullable(),
|
|
55737
|
+
/** True when remote start is allowed (door closed, power on, etc.); null when not known. */
|
|
55738
|
+
remoteStartAllowed: boolean().nullable(),
|
|
55739
|
+
/** True when the appliance accepts remote control now; null when not known. */
|
|
55740
|
+
remoteControlActive: boolean().nullable(),
|
|
55741
|
+
/** True while somebody operates the appliance at its panel; null when not reported. */
|
|
55742
|
+
localControlActive: boolean().nullable(),
|
|
55743
|
+
/** Main power / switched-on state; null when not known. */
|
|
55744
|
+
powerOn: boolean().nullable(),
|
|
55745
|
+
/** The raw power state (`On`, `Off`, `Standby`, …); null when not known. */
|
|
55746
|
+
powerState: string$2().nullable(),
|
|
55673
55747
|
saltLevel: DishwasherConsumableLevelSchema.nullable(),
|
|
55674
55748
|
rinseAidLevel: DishwasherConsumableLevelSchema.nullable(),
|
|
55675
|
-
|
|
55676
|
-
|
|
55749
|
+
/** Option states: null when the appliance does not expose the option or has not said. */
|
|
55750
|
+
halfLoad: boolean().nullable(),
|
|
55751
|
+
hygienePlus: boolean().nullable(),
|
|
55752
|
+
/** Extra dry option when the appliance exposes it. */
|
|
55753
|
+
extraDry: boolean().nullable(),
|
|
55754
|
+
/** Intensive zone (lower basket) when the appliance exposes it. */
|
|
55755
|
+
intensiveZone: boolean().nullable(),
|
|
55756
|
+
/** VarioSpeed / VarioSpeed+ when the appliance exposes it. */
|
|
55757
|
+
varioSpeedPlus: boolean().nullable(),
|
|
55758
|
+
/** Child lock (controls disabled on the appliance); null when not known. */
|
|
55759
|
+
childLock: boolean().nullable(),
|
|
55760
|
+
/** Feature keys of the events currently raised (salt low, rinse aid low, program finished, …). */
|
|
55761
|
+
activeEvents: array(string$2()),
|
|
55762
|
+
/** Numeric error code when the appliance reports one; null otherwise. */
|
|
55677
55763
|
errorCode: number().nullable(),
|
|
55764
|
+
/** Name of the raised alert-level event while the appliance is in error; null otherwise. */
|
|
55678
55765
|
errorLabel: string$2().nullable(),
|
|
55766
|
+
/** Ms epoch of the last value received from the appliance; 0 = never. */
|
|
55679
55767
|
lastFetchedAt: number()
|
|
55680
55768
|
});
|
|
55769
|
+
var DeviceIdSchema = number().int().nonnegative();
|
|
55770
|
+
/** A value a program option or setting can take. */
|
|
55771
|
+
var DishwasherValueSchema = union([
|
|
55772
|
+
boolean(),
|
|
55773
|
+
string$2(),
|
|
55774
|
+
number()
|
|
55775
|
+
]);
|
|
55776
|
+
var DishwasherAccessSchema = _enum([
|
|
55777
|
+
"none",
|
|
55778
|
+
"read",
|
|
55779
|
+
"readWrite",
|
|
55780
|
+
"writeOnly",
|
|
55781
|
+
"readStatic"
|
|
55782
|
+
]);
|
|
55783
|
+
/**
|
|
55784
|
+
* One option or setting the appliance declares, with the constraints its description
|
|
55785
|
+
* gives. A `readWrite` descriptor that is `available` is what `setOption` accepts.
|
|
55786
|
+
*/
|
|
55787
|
+
var DishwasherOptionDescriptorSchema = object({
|
|
55788
|
+
/** Feature key (`Dishcare.Dishwasher.Option.ExtraDry`). */
|
|
55789
|
+
key: string$2(),
|
|
55790
|
+
/** Last segment of the key, for display. */
|
|
55791
|
+
name: string$2(),
|
|
55792
|
+
type: _enum([
|
|
55793
|
+
"boolean",
|
|
55794
|
+
"number",
|
|
55795
|
+
"enum",
|
|
55796
|
+
"string"
|
|
55797
|
+
]),
|
|
55798
|
+
access: DishwasherAccessSchema,
|
|
55799
|
+
/** The appliance reports this entity as currently available. */
|
|
55800
|
+
available: boolean(),
|
|
55801
|
+
/** Unit the description declares for a number; null when it declares none. */
|
|
55802
|
+
unit: string$2().nullable(),
|
|
55803
|
+
min: number().nullable(),
|
|
55804
|
+
max: number().nullable(),
|
|
55805
|
+
step: number().nullable(),
|
|
55806
|
+
/** Allowed members of an enum; null for other types. */
|
|
55807
|
+
enumValues: array(string$2()).nullable(),
|
|
55808
|
+
defaultValue: DishwasherValueSchema.nullable()
|
|
55809
|
+
});
|
|
55810
|
+
var DishwasherProgramSchema = object({
|
|
55811
|
+
/** Feature key (`Dishcare.Dishwasher.Program.Eco50`) — what `setProgram` / `start` take. */
|
|
55812
|
+
key: string$2(),
|
|
55813
|
+
name: string$2(),
|
|
55814
|
+
/** The appliance currently offers this program. */
|
|
55815
|
+
available: boolean(),
|
|
55816
|
+
/** The options this program lists, with the program-level access / availability / default. */
|
|
55817
|
+
options: array(DishwasherOptionDescriptorSchema)
|
|
55818
|
+
});
|
|
55819
|
+
var DishwasherOptionsSchema = object({
|
|
55820
|
+
availability: DishwasherAvailabilitySchema,
|
|
55821
|
+
/** What the appliance can be told to do, from the commands its description declares. */
|
|
55822
|
+
supportsStart: boolean(),
|
|
55823
|
+
supportsPause: boolean(),
|
|
55824
|
+
supportsResume: boolean(),
|
|
55825
|
+
supportsStop: boolean(),
|
|
55826
|
+
supportsPower: boolean(),
|
|
55827
|
+
/** Every program the description lists, with its options. */
|
|
55828
|
+
programs: array(DishwasherProgramSchema),
|
|
55829
|
+
/** Every option and setting entity the description lists (programs reference these by key). */
|
|
55830
|
+
options: array(DishwasherOptionDescriptorSchema)
|
|
55831
|
+
});
|
|
55681
55832
|
var dishwasherCapability = {
|
|
55682
55833
|
name: "dishwasher",
|
|
55683
55834
|
scope: "device",
|
|
@@ -55685,58 +55836,102 @@ var dishwasherCapability = {
|
|
|
55685
55836
|
mode: "singleton",
|
|
55686
55837
|
deviceTypes: [DeviceType.Dishwasher],
|
|
55687
55838
|
methods: {
|
|
55688
|
-
|
|
55839
|
+
/**
|
|
55840
|
+
* Start a program. Without `program` the selected one starts. `options` are
|
|
55841
|
+
* option feature keys; each is checked against the program's constraints.
|
|
55842
|
+
*/
|
|
55843
|
+
start: method(object({
|
|
55844
|
+
deviceId: DeviceIdSchema,
|
|
55845
|
+
program: string$2().min(1).optional(),
|
|
55846
|
+
options: record(string$2(), DishwasherValueSchema).optional()
|
|
55847
|
+
}), _void(), {
|
|
55689
55848
|
kind: "mutation",
|
|
55690
55849
|
auth: "protected"
|
|
55691
55850
|
}),
|
|
55692
|
-
pause: method(object({ deviceId:
|
|
55851
|
+
pause: method(object({ deviceId: DeviceIdSchema }), _void(), {
|
|
55693
55852
|
kind: "mutation",
|
|
55694
55853
|
auth: "protected"
|
|
55695
55854
|
}),
|
|
55696
|
-
|
|
55855
|
+
resume: method(object({ deviceId: DeviceIdSchema }), _void(), {
|
|
55697
55856
|
kind: "mutation",
|
|
55698
55857
|
auth: "protected"
|
|
55699
55858
|
}),
|
|
55859
|
+
stop: method(object({ deviceId: DeviceIdSchema }), _void(), {
|
|
55860
|
+
kind: "mutation",
|
|
55861
|
+
auth: "protected"
|
|
55862
|
+
}),
|
|
55863
|
+
/** Select (not start) a program; refused when the appliance does not offer it. */
|
|
55700
55864
|
setProgram: method(object({
|
|
55701
|
-
deviceId:
|
|
55865
|
+
deviceId: DeviceIdSchema,
|
|
55702
55866
|
program: string$2().min(1)
|
|
55703
55867
|
}), _void(), {
|
|
55704
55868
|
kind: "mutation",
|
|
55705
55869
|
auth: "protected"
|
|
55706
55870
|
}),
|
|
55707
55871
|
setPower: method(object({
|
|
55708
|
-
deviceId:
|
|
55872
|
+
deviceId: DeviceIdSchema,
|
|
55709
55873
|
on: boolean()
|
|
55710
55874
|
}), _void(), {
|
|
55711
55875
|
kind: "mutation",
|
|
55712
55876
|
auth: "protected"
|
|
55713
55877
|
}),
|
|
55714
55878
|
setHalfLoad: method(object({
|
|
55715
|
-
deviceId:
|
|
55879
|
+
deviceId: DeviceIdSchema,
|
|
55716
55880
|
on: boolean()
|
|
55717
55881
|
}), _void(), {
|
|
55718
55882
|
kind: "mutation",
|
|
55719
55883
|
auth: "protected"
|
|
55720
55884
|
}),
|
|
55721
55885
|
setHygienePlus: method(object({
|
|
55722
|
-
deviceId:
|
|
55886
|
+
deviceId: DeviceIdSchema,
|
|
55723
55887
|
on: boolean()
|
|
55724
55888
|
}), _void(), {
|
|
55725
55889
|
kind: "mutation",
|
|
55726
55890
|
auth: "protected"
|
|
55727
55891
|
}),
|
|
55892
|
+
setExtraDry: method(object({
|
|
55893
|
+
deviceId: DeviceIdSchema,
|
|
55894
|
+
on: boolean()
|
|
55895
|
+
}), _void(), {
|
|
55896
|
+
kind: "mutation",
|
|
55897
|
+
auth: "protected"
|
|
55898
|
+
}),
|
|
55899
|
+
setIntensiveZone: method(object({
|
|
55900
|
+
deviceId: DeviceIdSchema,
|
|
55901
|
+
on: boolean()
|
|
55902
|
+
}), _void(), {
|
|
55903
|
+
kind: "mutation",
|
|
55904
|
+
auth: "protected"
|
|
55905
|
+
}),
|
|
55906
|
+
setVarioSpeedPlus: method(object({
|
|
55907
|
+
deviceId: DeviceIdSchema,
|
|
55908
|
+
on: boolean()
|
|
55909
|
+
}), _void(), {
|
|
55910
|
+
kind: "mutation",
|
|
55911
|
+
auth: "protected"
|
|
55912
|
+
}),
|
|
55913
|
+
setChildLock: method(object({
|
|
55914
|
+
deviceId: DeviceIdSchema,
|
|
55915
|
+
on: boolean()
|
|
55916
|
+
}), _void(), {
|
|
55917
|
+
kind: "mutation",
|
|
55918
|
+
auth: "protected"
|
|
55919
|
+
}),
|
|
55920
|
+
/**
|
|
55921
|
+
* Write any option or setting by feature key. Refused when the description does
|
|
55922
|
+
* not list it, it is not writable or not available now, or the value is outside
|
|
55923
|
+
* its declared range / members.
|
|
55924
|
+
*/
|
|
55728
55925
|
setOption: method(object({
|
|
55729
|
-
deviceId:
|
|
55926
|
+
deviceId: DeviceIdSchema,
|
|
55730
55927
|
key: string$2().min(1),
|
|
55731
|
-
value:
|
|
55732
|
-
boolean(),
|
|
55733
|
-
string$2(),
|
|
55734
|
-
number()
|
|
55735
|
-
])
|
|
55928
|
+
value: DishwasherValueSchema
|
|
55736
55929
|
}), _void(), {
|
|
55737
55930
|
kind: "mutation",
|
|
55738
55931
|
auth: "protected"
|
|
55739
|
-
})
|
|
55932
|
+
}),
|
|
55933
|
+
/** What this appliance can do, from its own description — the UI is derived from it. */
|
|
55934
|
+
getOptions: method(object({ deviceId: DeviceIdSchema }), DishwasherOptionsSchema, { auth: "protected" })
|
|
55740
55935
|
},
|
|
55741
55936
|
status: {
|
|
55742
55937
|
schema: DishwasherStatusSchema,
|
|
@@ -69685,6 +69880,12 @@ Object.freeze({
|
|
|
69685
69880
|
addonId: null,
|
|
69686
69881
|
access: "view"
|
|
69687
69882
|
},
|
|
69883
|
+
"dishwasher.getOptions": {
|
|
69884
|
+
capName: "dishwasher",
|
|
69885
|
+
capScope: "device",
|
|
69886
|
+
addonId: null,
|
|
69887
|
+
access: "view"
|
|
69888
|
+
},
|
|
69688
69889
|
"dishwasher.getStatus": {
|
|
69689
69890
|
capName: "dishwasher",
|
|
69690
69891
|
capScope: "device",
|
|
@@ -69697,6 +69898,24 @@ Object.freeze({
|
|
|
69697
69898
|
addonId: null,
|
|
69698
69899
|
access: "create"
|
|
69699
69900
|
},
|
|
69901
|
+
"dishwasher.resume": {
|
|
69902
|
+
capName: "dishwasher",
|
|
69903
|
+
capScope: "device",
|
|
69904
|
+
addonId: null,
|
|
69905
|
+
access: "create"
|
|
69906
|
+
},
|
|
69907
|
+
"dishwasher.setChildLock": {
|
|
69908
|
+
capName: "dishwasher",
|
|
69909
|
+
capScope: "device",
|
|
69910
|
+
addonId: null,
|
|
69911
|
+
access: "create"
|
|
69912
|
+
},
|
|
69913
|
+
"dishwasher.setExtraDry": {
|
|
69914
|
+
capName: "dishwasher",
|
|
69915
|
+
capScope: "device",
|
|
69916
|
+
addonId: null,
|
|
69917
|
+
access: "create"
|
|
69918
|
+
},
|
|
69700
69919
|
"dishwasher.setHalfLoad": {
|
|
69701
69920
|
capName: "dishwasher",
|
|
69702
69921
|
capScope: "device",
|
|
@@ -69709,6 +69928,12 @@ Object.freeze({
|
|
|
69709
69928
|
addonId: null,
|
|
69710
69929
|
access: "create"
|
|
69711
69930
|
},
|
|
69931
|
+
"dishwasher.setIntensiveZone": {
|
|
69932
|
+
capName: "dishwasher",
|
|
69933
|
+
capScope: "device",
|
|
69934
|
+
addonId: null,
|
|
69935
|
+
access: "create"
|
|
69936
|
+
},
|
|
69712
69937
|
"dishwasher.setOption": {
|
|
69713
69938
|
capName: "dishwasher",
|
|
69714
69939
|
capScope: "device",
|
|
@@ -69727,6 +69952,12 @@ Object.freeze({
|
|
|
69727
69952
|
addonId: null,
|
|
69728
69953
|
access: "create"
|
|
69729
69954
|
},
|
|
69955
|
+
"dishwasher.setVarioSpeedPlus": {
|
|
69956
|
+
capName: "dishwasher",
|
|
69957
|
+
capScope: "device",
|
|
69958
|
+
addonId: null,
|
|
69959
|
+
access: "create"
|
|
69960
|
+
},
|
|
69730
69961
|
"dishwasher.start": {
|
|
69731
69962
|
capName: "dishwasher",
|
|
69732
69963
|
capScope: "device",
|
|
@@ -74173,6 +74404,12 @@ Object.freeze({
|
|
|
74173
74404
|
addonId: null,
|
|
74174
74405
|
access: "view"
|
|
74175
74406
|
},
|
|
74407
|
+
"storageMigration.moverClearance": {
|
|
74408
|
+
capName: "storage-migration",
|
|
74409
|
+
capScope: "system",
|
|
74410
|
+
addonId: null,
|
|
74411
|
+
access: "view"
|
|
74412
|
+
},
|
|
74176
74413
|
"storageMigration.movers": {
|
|
74177
74414
|
capName: "storage-migration",
|
|
74178
74415
|
capScope: "system",
|
|
@@ -76366,6 +76603,11 @@ Object.freeze({
|
|
|
76366
76603
|
form: "single",
|
|
76367
76604
|
optional: false
|
|
76368
76605
|
}],
|
|
76606
|
+
"dishwasher.getOptions": [{
|
|
76607
|
+
name: "deviceId",
|
|
76608
|
+
form: "single",
|
|
76609
|
+
optional: false
|
|
76610
|
+
}],
|
|
76369
76611
|
"dishwasher.getStatus": [{
|
|
76370
76612
|
name: "deviceId",
|
|
76371
76613
|
form: "single",
|
|
@@ -76376,6 +76618,21 @@ Object.freeze({
|
|
|
76376
76618
|
form: "single",
|
|
76377
76619
|
optional: false
|
|
76378
76620
|
}],
|
|
76621
|
+
"dishwasher.resume": [{
|
|
76622
|
+
name: "deviceId",
|
|
76623
|
+
form: "single",
|
|
76624
|
+
optional: false
|
|
76625
|
+
}],
|
|
76626
|
+
"dishwasher.setChildLock": [{
|
|
76627
|
+
name: "deviceId",
|
|
76628
|
+
form: "single",
|
|
76629
|
+
optional: false
|
|
76630
|
+
}],
|
|
76631
|
+
"dishwasher.setExtraDry": [{
|
|
76632
|
+
name: "deviceId",
|
|
76633
|
+
form: "single",
|
|
76634
|
+
optional: false
|
|
76635
|
+
}],
|
|
76379
76636
|
"dishwasher.setHalfLoad": [{
|
|
76380
76637
|
name: "deviceId",
|
|
76381
76638
|
form: "single",
|
|
@@ -76386,6 +76643,11 @@ Object.freeze({
|
|
|
76386
76643
|
form: "single",
|
|
76387
76644
|
optional: false
|
|
76388
76645
|
}],
|
|
76646
|
+
"dishwasher.setIntensiveZone": [{
|
|
76647
|
+
name: "deviceId",
|
|
76648
|
+
form: "single",
|
|
76649
|
+
optional: false
|
|
76650
|
+
}],
|
|
76389
76651
|
"dishwasher.setOption": [{
|
|
76390
76652
|
name: "deviceId",
|
|
76391
76653
|
form: "single",
|
|
@@ -76401,6 +76663,11 @@ Object.freeze({
|
|
|
76401
76663
|
form: "single",
|
|
76402
76664
|
optional: false
|
|
76403
76665
|
}],
|
|
76666
|
+
"dishwasher.setVarioSpeedPlus": [{
|
|
76667
|
+
name: "deviceId",
|
|
76668
|
+
form: "single",
|
|
76669
|
+
optional: false
|
|
76670
|
+
}],
|
|
76404
76671
|
"dishwasher.start": [{
|
|
76405
76672
|
name: "deviceId",
|
|
76406
76673
|
form: "single",
|
|
@@ -78442,6 +78709,9 @@ new Map(Object.entries({
|
|
|
78442
78709
|
"wrapper-update-available": "system",
|
|
78443
78710
|
"backup-completed": "system",
|
|
78444
78711
|
"export-completed": "system",
|
|
78712
|
+
"alert-critical": "system",
|
|
78713
|
+
"alert-error": "system",
|
|
78714
|
+
"alert-critical-resolved": "system",
|
|
78445
78715
|
"storage-location-low": "system",
|
|
78446
78716
|
"storage-location-critical": "system",
|
|
78447
78717
|
"storage-location-ok": "system",
|
|
@@ -78566,6 +78836,16 @@ var NC_SYSTEM_EVENT_KIND_GROUP_SPECS = [
|
|
|
78566
78836
|
"storage-location-ok"
|
|
78567
78837
|
]
|
|
78568
78838
|
},
|
|
78839
|
+
{
|
|
78840
|
+
id: "alerts",
|
|
78841
|
+
family: "system",
|
|
78842
|
+
label: "Alerts",
|
|
78843
|
+
kinds: [
|
|
78844
|
+
"alert-critical",
|
|
78845
|
+
"alert-error",
|
|
78846
|
+
"alert-critical-resolved"
|
|
78847
|
+
]
|
|
78848
|
+
},
|
|
78569
78849
|
{
|
|
78570
78850
|
id: "alarm",
|
|
78571
78851
|
family: "alarm",
|
|
@@ -78610,6 +78890,21 @@ var NC_SENSOR_RAISED_FIELD_BY_KIND = Object.freeze(Object.fromEntries(Object.ent
|
|
|
78610
78890
|
return [[descriptor.kind, field]];
|
|
78611
78891
|
})));
|
|
78612
78892
|
Object.freeze(Object.keys(NC_SENSOR_RAISED_FIELD_BY_KIND));
|
|
78893
|
+
object({
|
|
78894
|
+
phase: _enum(["raised", "resolved"]),
|
|
78895
|
+
episodeId: string$2().min(1),
|
|
78896
|
+
alertId: string$2().min(1),
|
|
78897
|
+
severity: AlertSeveritySchema,
|
|
78898
|
+
category: string$2(),
|
|
78899
|
+
title: string$2(),
|
|
78900
|
+
message: string$2(),
|
|
78901
|
+
sourceType: string$2().optional(),
|
|
78902
|
+
sourceId: string$2().optional(),
|
|
78903
|
+
nodeId: string$2().optional(),
|
|
78904
|
+
/** The alert's own action link (where the operator acts on it), when it has one. */
|
|
78905
|
+
actionUrl: string$2().optional(),
|
|
78906
|
+
at: number()
|
|
78907
|
+
});
|
|
78613
78908
|
var RULE_BODY_ONLY = ["body"];
|
|
78614
78909
|
var RULE_TEXT = ["title", "body"];
|
|
78615
78910
|
var BATTERY = ["device-battery-low", "device-battery-normal"];
|
|
@@ -78619,6 +78914,11 @@ var TANK = [
|
|
|
78619
78914
|
"device-tank-full",
|
|
78620
78915
|
"device-tank-normal"
|
|
78621
78916
|
];
|
|
78917
|
+
var ALERT_EPISODE = [
|
|
78918
|
+
"alert-critical",
|
|
78919
|
+
"alert-error",
|
|
78920
|
+
"alert-critical-resolved"
|
|
78921
|
+
];
|
|
78622
78922
|
var UPDATES = [
|
|
78623
78923
|
"addon-update-available",
|
|
78624
78924
|
"server-update-available",
|
|
@@ -78811,14 +79111,14 @@ var STATE_SUMMARY_VARS = [
|
|
|
78811
79111
|
([...RULE_TEXT], [...CONSUMABLE]),
|
|
78812
79112
|
([...RULE_TEXT], [...TANK]),
|
|
78813
79113
|
[...RULE_TEXT],
|
|
78814
|
-
([...RULE_TEXT], [...UPDATES]),
|
|
78815
|
-
([...RULE_TEXT], [...UPDATES]),
|
|
78816
|
-
[...RULE_TEXT],
|
|
79114
|
+
([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
|
|
79115
|
+
([...RULE_TEXT], [...UPDATES, ...ALERT_EPISODE]),
|
|
78817
79116
|
[...RULE_TEXT],
|
|
78818
79117
|
[...RULE_TEXT],
|
|
78819
79118
|
[...RULE_TEXT],
|
|
78820
79119
|
[...RULE_TEXT],
|
|
78821
79120
|
[...RULE_TEXT],
|
|
79121
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
78822
79122
|
[...RULE_TEXT],
|
|
78823
79123
|
[...RULE_TEXT],
|
|
78824
79124
|
[...RULE_TEXT],
|
|
@@ -78836,7 +79136,11 @@ var STATE_SUMMARY_VARS = [
|
|
|
78836
79136
|
[...RULE_TEXT],
|
|
78837
79137
|
[...RULE_TEXT],
|
|
78838
79138
|
[...RULE_TEXT],
|
|
78839
|
-
[...RULE_TEXT],
|
|
79139
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
79140
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
79141
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
79142
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
79143
|
+
([...RULE_TEXT], [...ALERT_EPISODE]),
|
|
78840
79144
|
[...RULE_TEXT],
|
|
78841
79145
|
[...RULE_TEXT],
|
|
78842
79146
|
[...RULE_TEXT],
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-matter-broker",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.130",
|
|
4
4
|
"description": "Matter broker addon for CamStack — owns a Matter fabric (commissioning + the long-lived controller) via the matter.js controller and brokers commissioned Matter nodes into CamStack",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|