@camstack/addon-training 0.1.89 → 0.1.91
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/{MotionZonesSettings-1v53BmVJ.mjs → MotionZonesSettings-kbJlg0c5.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-B1WrMGZy.mjs → PrivacyMaskSettings-B3gzWS6Y.mjs} +2 -2
- package/dist/{SceneMonitorEditor-wJjFFoHA.mjs → SceneMonitorEditor-CjxaItjN.mjs} +1 -1
- package/dist/_stub.js +44495 -23332
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-3rzzcUyu.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-Cer78kD4.mjs} +3 -3
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DM1LS5rC.mjs +26 -0
- package/dist/{dist-CUYMVsX0.mjs → dist-B3Dz3xDZ.mjs} +273 -28
- package/dist/{dist-CnS9QrjX.js → dist-uLc6FQWF.js} +273 -28
- package/dist/{hostInit-DNFhB54Y.mjs → hostInit-C-l48gwp.mjs} +2 -2
- package/dist/{icons-DGnDNIHD.mjs → icons-BQdiqxUM.mjs} +1482 -1509
- package/dist/index.js +1 -1
- package/dist/orchestrator/training.addon.js +1 -1
- package/dist/orchestrator/training.addon.mjs +1 -1
- package/dist/{player-overlays-BvnJqnez.mjs → player-overlays-DrA4TUe3.mjs} +1 -1
- package/dist/providers/modal/training-modal.addon.js +1 -1
- package/dist/providers/modal/training-modal.addon.mjs +1 -1
- package/dist/remoteEntry.js +1 -1
- package/dist/{responsive-Dfx762zU.mjs → responsive-C46lpRSX.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-tkZ3pY5a.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-qVIpiQZD.mjs} +1 -1
- package/dist/{zoom-out-DzQMgNQw.mjs → zoom-out-YWRm0VbK.mjs} +38 -11
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-VNxr7qQe.mjs +0 -26
|
@@ -5575,7 +5575,7 @@ var ZodIssueCode = {
|
|
|
5575
5575
|
var ZodFirstPartyTypeKind;
|
|
5576
5576
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5577
5577
|
//#endregion
|
|
5578
|
-
//#region ../types/dist/sleep-
|
|
5578
|
+
//#region ../types/dist/sleep-0sD_LHLI.mjs
|
|
5579
5579
|
/**
|
|
5580
5580
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5581
5581
|
* window to float samples (D455).
|
|
@@ -8967,6 +8967,7 @@ var CAP_NAMES = Object.freeze([
|
|
|
8967
8967
|
"login-method",
|
|
8968
8968
|
"media-player",
|
|
8969
8969
|
"mesh-network",
|
|
8970
|
+
"meter",
|
|
8970
8971
|
"metrics-provider",
|
|
8971
8972
|
"model-convert",
|
|
8972
8973
|
"model-distributor",
|
|
@@ -10024,6 +10025,10 @@ Object.freeze({
|
|
|
10024
10025
|
]
|
|
10025
10026
|
}
|
|
10026
10027
|
],
|
|
10028
|
+
"meter": [{
|
|
10029
|
+
"path": "value",
|
|
10030
|
+
"valueType": "number"
|
|
10031
|
+
}],
|
|
10027
10032
|
"motion": [
|
|
10028
10033
|
{
|
|
10029
10034
|
"path": "detected",
|
|
@@ -10767,7 +10772,7 @@ object({
|
|
|
10767
10772
|
params: record(string(), union([string(), number()])).optional()
|
|
10768
10773
|
});
|
|
10769
10774
|
//#endregion
|
|
10770
|
-
//#region ../types/dist/err-msg-
|
|
10775
|
+
//#region ../types/dist/err-msg-DIorGYeC.mjs
|
|
10771
10776
|
var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
10772
10777
|
DeviceType["Camera"] = "camera";
|
|
10773
10778
|
DeviceType["Hub"] = "hub";
|
|
@@ -10861,8 +10866,14 @@ var DeviceType = /* @__PURE__ */ function(DeviceType) {
|
|
|
10861
10866
|
DeviceType["PetFeeder"] = "pet-feeder";
|
|
10862
10867
|
/** Built-in dishwasher — program lifecycle, door / remote-start gates,
|
|
10863
10868
|
* salt and rinse-aid levels. Installed with the `dishwasher` cap.
|
|
10864
|
-
* Sources: native Bosch Home Connect, reusable by similar integrations.
|
|
10869
|
+
* Sources: native Bosch Home Connect, reusable by similar integrations.
|
|
10870
|
+
* A plug-built dishwasher carries running-state and power instead. */
|
|
10865
10871
|
DeviceType["Dishwasher"] = "dishwasher";
|
|
10872
|
+
/** Washing machine. A plug-built one is running while its power stays
|
|
10873
|
+
* above a threshold. No program cap — that surface is the dishwasher's. */
|
|
10874
|
+
DeviceType["Washer"] = "washer";
|
|
10875
|
+
/** Tumble dryer. Same plug-built running surface as {@link Washer}. */
|
|
10876
|
+
DeviceType["Dryer"] = "dryer";
|
|
10866
10877
|
return DeviceType;
|
|
10867
10878
|
}({});
|
|
10868
10879
|
var DeviceFeature = /* @__PURE__ */ function(DeviceFeature) {
|
|
@@ -11110,7 +11121,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
11110
11121
|
return DeviceRole;
|
|
11111
11122
|
}({});
|
|
11112
11123
|
//#endregion
|
|
11113
|
-
//#region ../types/dist/composition-
|
|
11124
|
+
//#region ../types/dist/composition-CpETZ4HL.mjs
|
|
11114
11125
|
/**
|
|
11115
11126
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
11116
11127
|
*
|
|
@@ -11866,6 +11877,97 @@ function validateExpressionSource(src) {
|
|
|
11866
11877
|
return null;
|
|
11867
11878
|
}
|
|
11868
11879
|
/**
|
|
11880
|
+
* One power reading becomes a washer, dryer or dishwasher (D944 helper).
|
|
11881
|
+
*
|
|
11882
|
+
* Standby of the control board is under 5 W; a motor or a heater is far
|
|
11883
|
+
* above that, so 5 W is the line. A door lock or a short pump spike is not
|
|
11884
|
+
* a cycle, so running starts only after 30 s above the line.
|
|
11885
|
+
*
|
|
11886
|
+
* A wash, dry or dishwasher pause (soak, heat-wait, heater off between
|
|
11887
|
+
* bursts) lasts several minutes. Ending the cycle on the first dip would
|
|
11888
|
+
* report "finished" in the middle of the program, so the stop dwell is
|
|
11889
|
+
* 10 minutes on every type. The number is stored per type so one machine
|
|
11890
|
+
* can move later without moving the others.
|
|
11891
|
+
*/
|
|
11892
|
+
var APPLIANCE_TEMPLATE_ID = "appliance";
|
|
11893
|
+
var APPLIANCE_KINDS = [
|
|
11894
|
+
"washer",
|
|
11895
|
+
"dryer",
|
|
11896
|
+
"dishwasher"
|
|
11897
|
+
];
|
|
11898
|
+
DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
|
|
11899
|
+
/**
|
|
11900
|
+
* Statistics and integrals over a history read (D944).
|
|
11901
|
+
*
|
|
11902
|
+
* Pure: the same points always give the same answer, so a restart recomputes
|
|
11903
|
+
* rather than trusting a buffer. A gauge mean is time-weighted (value × ms),
|
|
11904
|
+
* never the mean of the samples. A hole with no held value is not integrated
|
|
11905
|
+
* as zero. A truncated read is not published.
|
|
11906
|
+
*/
|
|
11907
|
+
var STATISTIC_STATS = [
|
|
11908
|
+
"min",
|
|
11909
|
+
"max",
|
|
11910
|
+
"mean",
|
|
11911
|
+
"sum",
|
|
11912
|
+
"count",
|
|
11913
|
+
"change"
|
|
11914
|
+
];
|
|
11915
|
+
/**
|
|
11916
|
+
* The range a statistics or integral helper asks history for (D944).
|
|
11917
|
+
*
|
|
11918
|
+
* Calendar edges are the hub's timezone, never UTC midnight: a day is 23, 24
|
|
11919
|
+
* or 25 hours across a DST change. A tier is eligible only when its retention
|
|
11920
|
+
* is strictly longer than the longest that range can be. Forever qualifies.
|
|
11921
|
+
* Equal to a tier's retention is a refusal, not a short answer.
|
|
11922
|
+
*/
|
|
11923
|
+
var MINUTE_MS = 6e4;
|
|
11924
|
+
var HOUR_MS = 60 * MINUTE_MS;
|
|
11925
|
+
var DAY_MS = 24 * HOUR_MS;
|
|
11926
|
+
var ROLLING_SPANS = [
|
|
11927
|
+
"1h",
|
|
11928
|
+
"24h",
|
|
11929
|
+
"2d",
|
|
11930
|
+
"7d",
|
|
11931
|
+
"30d",
|
|
11932
|
+
"custom"
|
|
11933
|
+
];
|
|
11934
|
+
var CALENDAR_PERIODS = [
|
|
11935
|
+
"today",
|
|
11936
|
+
"yesterday",
|
|
11937
|
+
"this-week",
|
|
11938
|
+
"this-month"
|
|
11939
|
+
];
|
|
11940
|
+
var RESET_PERIODS = [
|
|
11941
|
+
"never",
|
|
11942
|
+
"daily",
|
|
11943
|
+
"weekly",
|
|
11944
|
+
"monthly"
|
|
11945
|
+
];
|
|
11946
|
+
5 * MINUTE_MS;
|
|
11947
|
+
24 * HOUR_MS, 2 * DAY_MS, 7 * DAY_MS, 30 * DAY_MS;
|
|
11948
|
+
7 * DAY_MS, 30 * DAY_MS, 365 * DAY_MS;
|
|
11949
|
+
var StatisticWindowSchema = discriminatedUnion("kind", [object({
|
|
11950
|
+
kind: literal("rolling"),
|
|
11951
|
+
span: _enum(ROLLING_SPANS),
|
|
11952
|
+
customMinutes: number().int().min(5).optional()
|
|
11953
|
+
}).check((payload) => {
|
|
11954
|
+
if (payload.value.span === "custom" && payload.value.customMinutes === void 0) payload.issues.push({
|
|
11955
|
+
code: "custom",
|
|
11956
|
+
message: "a custom range needs a duration in minutes",
|
|
11957
|
+
path: ["customMinutes"],
|
|
11958
|
+
input: payload.value
|
|
11959
|
+
});
|
|
11960
|
+
if (payload.value.span !== "custom" && payload.value.customMinutes !== void 0) payload.issues.push({
|
|
11961
|
+
code: "custom",
|
|
11962
|
+
message: "only a custom range carries a duration",
|
|
11963
|
+
path: ["customMinutes"],
|
|
11964
|
+
input: payload.value
|
|
11965
|
+
});
|
|
11966
|
+
}), object({
|
|
11967
|
+
kind: literal("calendar"),
|
|
11968
|
+
period: _enum(CALENDAR_PERIODS)
|
|
11969
|
+
})]);
|
|
11970
|
+
/**
|
|
11869
11971
|
* A composition source identity: `(addonId, stableId)`, never a numeric device
|
|
11870
11972
|
* id. Split out so helper schemas can name it without a cycle through
|
|
11871
11973
|
* `composition.ts` (D659).
|
|
@@ -11921,14 +12023,37 @@ var HelperMemberSchema = object({
|
|
|
11921
12023
|
cap: string().min(1),
|
|
11922
12024
|
fieldPath: string().min(1)
|
|
11923
12025
|
});
|
|
11924
|
-
var HelperSpecSchema = discriminatedUnion("kind", [
|
|
11925
|
-
|
|
11926
|
-
|
|
11927
|
-
|
|
11928
|
-
|
|
11929
|
-
|
|
11930
|
-
|
|
11931
|
-
|
|
12026
|
+
var HelperSpecSchema = discriminatedUnion("kind", [
|
|
12027
|
+
object({
|
|
12028
|
+
kind: literal("group"),
|
|
12029
|
+
templateId: GroupTemplateIdSchema,
|
|
12030
|
+
aggregate: AggregateReducerSchema,
|
|
12031
|
+
members: array(HelperMemberSchema).min(1).max(64),
|
|
12032
|
+
/** Actuator groups only. Readings leave this unset. */
|
|
12033
|
+
active: ActiveCriterionSchema.optional()
|
|
12034
|
+
}),
|
|
12035
|
+
object({
|
|
12036
|
+
kind: literal("appliance"),
|
|
12037
|
+
templateId: literal(APPLIANCE_TEMPLATE_ID),
|
|
12038
|
+
appliance: _enum(APPLIANCE_KINDS),
|
|
12039
|
+
thresholdWatts: number().positive(),
|
|
12040
|
+
startDwellMs: number().int().nonnegative(),
|
|
12041
|
+
stopDwellMs: number().int().nonnegative(),
|
|
12042
|
+
member: HelperMemberSchema
|
|
12043
|
+
}),
|
|
12044
|
+
object({
|
|
12045
|
+
kind: literal("statistic"),
|
|
12046
|
+
stat: _enum(STATISTIC_STATS),
|
|
12047
|
+
window: StatisticWindowSchema,
|
|
12048
|
+
source: HelperMemberSchema
|
|
12049
|
+
}),
|
|
12050
|
+
object({
|
|
12051
|
+
kind: literal("integral"),
|
|
12052
|
+
reset: _enum(RESET_PERIODS),
|
|
12053
|
+
output: _enum(["energy", "meter"]),
|
|
12054
|
+
source: HelperMemberSchema
|
|
12055
|
+
})
|
|
12056
|
+
]);
|
|
11932
12057
|
/** A composed device's stableId is this prefix plus the block id. */
|
|
11933
12058
|
var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
|
|
11934
12059
|
/** Longest snippet a `code` source may carry (slice 4). */
|
|
@@ -12002,6 +12127,26 @@ var CompositionFieldSourceSchema = discriminatedUnion("kind", [
|
|
|
12002
12127
|
"omit",
|
|
12003
12128
|
"offline"
|
|
12004
12129
|
])
|
|
12130
|
+
}),
|
|
12131
|
+
object({
|
|
12132
|
+
kind: literal("series"),
|
|
12133
|
+
read: CompositionFieldReadSchema,
|
|
12134
|
+
/** `value` is the statistic or the integral. The others are the gap counts. */
|
|
12135
|
+
publish: _enum([
|
|
12136
|
+
"value",
|
|
12137
|
+
"included",
|
|
12138
|
+
"excluded",
|
|
12139
|
+
"total"
|
|
12140
|
+
]),
|
|
12141
|
+
/**
|
|
12142
|
+
* What an unanswered `value` does. Counts ignore this. `offline` leaves the
|
|
12143
|
+
* device unseeded until history answers, so a restart cannot publish 0.
|
|
12144
|
+
*/
|
|
12145
|
+
empty: _enum([
|
|
12146
|
+
"null",
|
|
12147
|
+
"omit",
|
|
12148
|
+
"offline"
|
|
12149
|
+
])
|
|
12005
12150
|
})
|
|
12006
12151
|
]);
|
|
12007
12152
|
var CompositionCommandTargetSchema = discriminatedUnion("kind", [object({
|
|
@@ -18195,7 +18340,8 @@ var CompositionProblemSchema = object({
|
|
|
18195
18340
|
"native-capability-replace",
|
|
18196
18341
|
"mixed-quantity",
|
|
18197
18342
|
"helper-mismatch",
|
|
18198
|
-
"member-constraint"
|
|
18343
|
+
"member-constraint",
|
|
18344
|
+
"retention"
|
|
18199
18345
|
]),
|
|
18200
18346
|
path: string(),
|
|
18201
18347
|
message: string()
|
|
@@ -18435,7 +18581,7 @@ Object.freeze({
|
|
|
18435
18581
|
* One catalog row per base reading a group helper can build (D944 §3).
|
|
18436
18582
|
* Data, not a form default written into the block.
|
|
18437
18583
|
*/
|
|
18438
|
-
var NOW = {
|
|
18584
|
+
var NOW$1 = {
|
|
18439
18585
|
fieldPath: "lastFetchedAt",
|
|
18440
18586
|
expr: "now"
|
|
18441
18587
|
};
|
|
@@ -18481,7 +18627,7 @@ var GROUP_TEMPLATES = [
|
|
|
18481
18627
|
quantity: "temperature",
|
|
18482
18628
|
defaultAggregate: "mean",
|
|
18483
18629
|
empty: "null",
|
|
18484
|
-
companions: [NOW]
|
|
18630
|
+
companions: [NOW$1]
|
|
18485
18631
|
}),
|
|
18486
18632
|
numeric({
|
|
18487
18633
|
id: "humidity",
|
|
@@ -18492,7 +18638,7 @@ var GROUP_TEMPLATES = [
|
|
|
18492
18638
|
quantity: "humidity",
|
|
18493
18639
|
defaultAggregate: "mean",
|
|
18494
18640
|
empty: "null",
|
|
18495
|
-
companions: [NOW]
|
|
18641
|
+
companions: [NOW$1]
|
|
18496
18642
|
}),
|
|
18497
18643
|
numeric({
|
|
18498
18644
|
id: "pressure",
|
|
@@ -18503,7 +18649,7 @@ var GROUP_TEMPLATES = [
|
|
|
18503
18649
|
quantity: "pressure",
|
|
18504
18650
|
defaultAggregate: "mean",
|
|
18505
18651
|
empty: "null",
|
|
18506
|
-
companions: [NOW]
|
|
18652
|
+
companions: [NOW$1]
|
|
18507
18653
|
}),
|
|
18508
18654
|
numeric({
|
|
18509
18655
|
id: "illuminance",
|
|
@@ -18514,7 +18660,7 @@ var GROUP_TEMPLATES = [
|
|
|
18514
18660
|
quantity: "illuminance",
|
|
18515
18661
|
defaultAggregate: "mean",
|
|
18516
18662
|
empty: "null",
|
|
18517
|
-
companions: [NOW]
|
|
18663
|
+
companions: [NOW$1]
|
|
18518
18664
|
}),
|
|
18519
18665
|
numeric({
|
|
18520
18666
|
id: "power",
|
|
@@ -18525,7 +18671,7 @@ var GROUP_TEMPLATES = [
|
|
|
18525
18671
|
quantity: "power",
|
|
18526
18672
|
defaultAggregate: "sum",
|
|
18527
18673
|
empty: "omit",
|
|
18528
|
-
companions: [NOW]
|
|
18674
|
+
companions: [NOW$1]
|
|
18529
18675
|
}),
|
|
18530
18676
|
numeric({
|
|
18531
18677
|
id: "energy",
|
|
@@ -18536,7 +18682,7 @@ var GROUP_TEMPLATES = [
|
|
|
18536
18682
|
quantity: "energy",
|
|
18537
18683
|
defaultAggregate: "sum",
|
|
18538
18684
|
empty: "omit",
|
|
18539
|
-
companions: [NOW]
|
|
18685
|
+
companions: [NOW$1]
|
|
18540
18686
|
}),
|
|
18541
18687
|
numeric({
|
|
18542
18688
|
id: "battery",
|
|
@@ -18571,7 +18717,7 @@ var GROUP_TEMPLATES = [
|
|
|
18571
18717
|
quantity: "device",
|
|
18572
18718
|
defaultAggregate: "mean",
|
|
18573
18719
|
empty: "null",
|
|
18574
|
-
companions: [NOW]
|
|
18720
|
+
companions: [NOW$1]
|
|
18575
18721
|
}),
|
|
18576
18722
|
binary({
|
|
18577
18723
|
id: "motion",
|
|
@@ -18700,6 +18846,7 @@ function actuator(input) {
|
|
|
18700
18846
|
}
|
|
18701
18847
|
new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
|
|
18702
18848
|
DeviceFeature.LightColorRgb, DeviceFeature.LightColorHsv, DeviceFeature.LightColorMired;
|
|
18849
|
+
DeviceType.Camera;
|
|
18703
18850
|
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
18704
18851
|
/**
|
|
18705
18852
|
* What a composition may BUILD on a device type (G2, D676): the caps a new
|
|
@@ -59491,6 +59638,11 @@ DeviceType.Lock, method(object({
|
|
|
59491
59638
|
kind: "mutation",
|
|
59492
59639
|
auth: "protected"
|
|
59493
59640
|
});
|
|
59641
|
+
object({
|
|
59642
|
+
value: number().nullable().meta(readingMeta("device", { label: "Total" })),
|
|
59643
|
+
lastFetchedAt: number()
|
|
59644
|
+
});
|
|
59645
|
+
DeviceType.Sensor;
|
|
59494
59646
|
/**
|
|
59495
59647
|
* Media-player cap. Models HA `media_player.*` (Sonos, Chromecast,
|
|
59496
59648
|
* Apple TV, Spotify, Roku, generic OTT receivers, …) on
|
|
@@ -61408,7 +61560,7 @@ object({
|
|
|
61408
61560
|
/** Ms epoch when the slice was last updated. */
|
|
61409
61561
|
lastFetchedAt: number()
|
|
61410
61562
|
});
|
|
61411
|
-
DeviceType.Sensor;
|
|
61563
|
+
DeviceType.Sensor, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
|
|
61412
61564
|
/**
|
|
61413
61565
|
* Presence cap. Models HA `person.*` and `device_tracker.*` entities
|
|
61414
61566
|
* on `DeviceType.Presence`. Read-only — no setters: presence is
|
|
@@ -61855,7 +62007,7 @@ object({
|
|
|
61855
62007
|
phase: string().nullable()
|
|
61856
62008
|
});
|
|
61857
62009
|
Object.values(DeviceType);
|
|
61858
|
-
DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
62010
|
+
DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
61859
62011
|
DeviceType.Camera, DeviceType.Sensor, DeviceType.Switch, method(object({ deviceId: number().int().nonnegative() }), object({ success: literal(true) }), {
|
|
61860
62012
|
kind: "mutation",
|
|
61861
62013
|
auth: "admin"
|
|
@@ -65689,7 +65841,7 @@ var trainingCapability = {
|
|
|
65689
65841
|
}
|
|
65690
65842
|
};
|
|
65691
65843
|
SOURCE_CAPS.filter((cap) => cap !== "switch" && cap !== "motion");
|
|
65692
|
-
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Camera, DeviceType.Camera, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
65844
|
+
DeviceType.Camera, DeviceType.Sensor, DeviceType.Button, DeviceType.Switch, DeviceType.PetFeeder, DeviceType.Container, DeviceType.Thermostat, DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer, DeviceType.Camera, DeviceType.Camera, DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.MediaPlayer, DeviceType.WaterHeater, DeviceType.Humidifier, DeviceType.Fan, DeviceType.Climate, DeviceType.Thermostat, DeviceType.PetFeeder;
|
|
65693
65845
|
String.raw`rose\(active(\d+), changed(\d+), (\d+(?:\.\d+)?)\)`;
|
|
65694
65846
|
DeviceRole.BinarySensor, DeviceRole.MotionSensor;
|
|
65695
65847
|
new Set(CAP_NAMES);
|
|
@@ -65742,7 +65894,7 @@ var AccessoryKind = {
|
|
|
65742
65894
|
PrivacyMask: DeviceRole.PrivacyMask
|
|
65743
65895
|
};
|
|
65744
65896
|
AccessoryKind.Siren, AccessoryKind.Floodlight, AccessoryKind.Spotlight, AccessoryKind.PirSensor, AccessoryKind.Chime, AccessoryKind.Autotrack, AccessoryKind.Nightvision, AccessoryKind.PrivacyMask;
|
|
65745
|
-
DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
|
|
65897
|
+
DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Camera, DeviceType.Hub, DeviceType.Switch, DeviceType.Siren, DeviceType.Light, DeviceType.Fan, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer;
|
|
65746
65898
|
new Set(Object.values(DeviceType));
|
|
65747
65899
|
Object.freeze({
|
|
65748
65900
|
"accessories.getStatus": {
|
|
@@ -69931,6 +70083,13 @@ Object.freeze({
|
|
|
69931
70083
|
access: "create",
|
|
69932
70084
|
role: "admin"
|
|
69933
70085
|
},
|
|
70086
|
+
"meter.getStatus": {
|
|
70087
|
+
capName: "meter",
|
|
70088
|
+
capScope: "device",
|
|
70089
|
+
addonId: null,
|
|
70090
|
+
access: "view",
|
|
70091
|
+
role: "viewer"
|
|
70092
|
+
},
|
|
69934
70093
|
"metricsProvider.collectSnapshot": {
|
|
69935
70094
|
capName: "metrics-provider",
|
|
69936
70095
|
capScope: "system",
|
|
@@ -78029,7 +78188,39 @@ var APPLIANCE_CAP_VOCABULARY = {
|
|
|
78029
78188
|
phrase: t("When {device} finishes", "Quando {device} finisce"),
|
|
78030
78189
|
icon: "square"
|
|
78031
78190
|
}
|
|
78032
|
-
}
|
|
78191
|
+
},
|
|
78192
|
+
overrides: { byType: {
|
|
78193
|
+
[DeviceType.Washer]: {
|
|
78194
|
+
state: { running: {
|
|
78195
|
+
whenTrue: t("When the washing machine starts", "Quando la lavatrice inizia"),
|
|
78196
|
+
whenFalse: t("When the washing machine has finished", "Quando la lavatrice ha finito")
|
|
78197
|
+
} },
|
|
78198
|
+
events: {
|
|
78199
|
+
onStarted: { phrase: t("When the washing machine starts", "Quando la lavatrice inizia") },
|
|
78200
|
+
onFinished: { phrase: t("When the washing machine has finished", "Quando la lavatrice ha finito") }
|
|
78201
|
+
}
|
|
78202
|
+
},
|
|
78203
|
+
[DeviceType.Dryer]: {
|
|
78204
|
+
state: { running: {
|
|
78205
|
+
whenTrue: t("When the dryer starts", "Quando l'asciugatrice inizia"),
|
|
78206
|
+
whenFalse: t("When the dryer has finished", "Quando l'asciugatrice ha finito")
|
|
78207
|
+
} },
|
|
78208
|
+
events: {
|
|
78209
|
+
onStarted: { phrase: t("When the dryer starts", "Quando l'asciugatrice inizia") },
|
|
78210
|
+
onFinished: { phrase: t("When the dryer has finished", "Quando l'asciugatrice ha finito") }
|
|
78211
|
+
}
|
|
78212
|
+
},
|
|
78213
|
+
[DeviceType.Dishwasher]: {
|
|
78214
|
+
state: { running: {
|
|
78215
|
+
whenTrue: t("When the dishwasher starts", "Quando la lavastoviglie inizia"),
|
|
78216
|
+
whenFalse: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito")
|
|
78217
|
+
} },
|
|
78218
|
+
events: {
|
|
78219
|
+
onStarted: { phrase: t("When the dishwasher starts", "Quando la lavastoviglie inizia") },
|
|
78220
|
+
onFinished: { phrase: t("When the dishwasher has finished", "Quando la lavastoviglie ha finito") }
|
|
78221
|
+
}
|
|
78222
|
+
}
|
|
78223
|
+
} }
|
|
78033
78224
|
},
|
|
78034
78225
|
update: {
|
|
78035
78226
|
scope: "device",
|
|
@@ -78857,6 +79048,17 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78857
79048
|
}],
|
|
78858
79049
|
events: { onMotionChanged: { notOperatorFacing: "the `detected` state trigger phrases both edges, from the mirror that survives a dropped event (D49)" } }
|
|
78859
79050
|
},
|
|
79051
|
+
meter: {
|
|
79052
|
+
scope: "device",
|
|
79053
|
+
noun: t("Meter", "Contatore"),
|
|
79054
|
+
state: [{
|
|
79055
|
+
kind: "numeric",
|
|
79056
|
+
field: "value",
|
|
79057
|
+
quantity: t("the total", "il totale"),
|
|
79058
|
+
label: t("Total", "Totale"),
|
|
79059
|
+
icon: "gauge"
|
|
79060
|
+
}]
|
|
79061
|
+
},
|
|
78860
79062
|
"numeric-sensor": {
|
|
78861
79063
|
scope: "device",
|
|
78862
79064
|
noun: t("Sensor", "Sensore"),
|
|
@@ -79329,8 +79531,47 @@ function projectAction(cap, action) {
|
|
|
79329
79531
|
};
|
|
79330
79532
|
}
|
|
79331
79533
|
Object.entries(CAP_VOCABULARY_BY_NAME).flatMap(([cap, entry]) => entry.scope === "device" ? (entry.actions ?? []).map((a) => projectAction(cap, a)) : []);
|
|
79332
|
-
DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher;
|
|
79534
|
+
DeviceType.Camera, DeviceType.Hub, DeviceType.Light, DeviceType.Siren, DeviceType.Switch, DeviceType.Sensor, DeviceType.Thermostat, DeviceType.Climate, DeviceType.Button, DeviceType.EventEmitter, DeviceType.Update, DeviceType.Generic, DeviceType.Notifier, DeviceType.Script, DeviceType.Automation, DeviceType.Lock, DeviceType.Cover, DeviceType.Valve, DeviceType.Humidifier, DeviceType.WaterHeater, DeviceType.Fan, DeviceType.MediaPlayer, DeviceType.AlarmPanel, DeviceType.Control, DeviceType.Presence, DeviceType.Weather, DeviceType.Vacuum, DeviceType.LawnMower, DeviceType.Container, DeviceType.Image, DeviceType.PetFeeder, DeviceType.Dishwasher, DeviceType.Washer, DeviceType.Dryer;
|
|
79333
79535
|
DeviceFeature.BatteryOperated;
|
|
79536
|
+
DeviceType.Washer, DeviceType.Dryer, DeviceType.Dishwasher;
|
|
79537
|
+
var HA_AS = "a power sensor (device_class power). Home Assistant has no laundry domain. running-state stays unexported until a null reading can be published as unavailable.";
|
|
79538
|
+
var HOMEKIT_REASON = "HomeKit has no laundry-appliance service. The export tab would pair an accessory with nothing on it: running-state is withheld until a null reading can be unavailable, and power is not a HomeKit service this export honours.";
|
|
79539
|
+
var ALEXA_REASON = "Alexa has no laundry category in this export, and neither power nor running has an Alexa interface.";
|
|
79540
|
+
var GOOGLE_REASON = "Google WASHER, DRYER and DISHWASHER require RunCycle. A power threshold is not that trait, and this export does not publish RunCycle.";
|
|
79541
|
+
var MATTER_REASON = "No Matter export is built. The closest device types are Laundry Washer (0x0073) and Laundry Dryer (0x0074); a power threshold is not the Laundry Washer Mode cluster.";
|
|
79542
|
+
function withheld(reason) {
|
|
79543
|
+
return {
|
|
79544
|
+
[DeviceType.Washer]: {
|
|
79545
|
+
exported: false,
|
|
79546
|
+
reason
|
|
79547
|
+
},
|
|
79548
|
+
[DeviceType.Dryer]: {
|
|
79549
|
+
exported: false,
|
|
79550
|
+
reason
|
|
79551
|
+
},
|
|
79552
|
+
[DeviceType.Dishwasher]: {
|
|
79553
|
+
exported: false,
|
|
79554
|
+
reason
|
|
79555
|
+
}
|
|
79556
|
+
};
|
|
79557
|
+
}
|
|
79558
|
+
function offered(received) {
|
|
79559
|
+
return {
|
|
79560
|
+
[DeviceType.Washer]: {
|
|
79561
|
+
exported: true,
|
|
79562
|
+
as: received
|
|
79563
|
+
},
|
|
79564
|
+
[DeviceType.Dryer]: {
|
|
79565
|
+
exported: true,
|
|
79566
|
+
as: received
|
|
79567
|
+
},
|
|
79568
|
+
[DeviceType.Dishwasher]: {
|
|
79569
|
+
exported: true,
|
|
79570
|
+
as: received
|
|
79571
|
+
}
|
|
79572
|
+
};
|
|
79573
|
+
}
|
|
79574
|
+
offered(HA_AS), withheld(HOMEKIT_REASON), withheld(ALEXA_REASON), withheld(GOOGLE_REASON), withheld(MATTER_REASON);
|
|
79334
79575
|
Object.freeze({
|
|
79335
79576
|
"accessories.getStatus": [{
|
|
79336
79577
|
name: "deviceId",
|
|
@@ -80507,6 +80748,11 @@ Object.freeze({
|
|
|
80507
80748
|
form: "single",
|
|
80508
80749
|
optional: false
|
|
80509
80750
|
}],
|
|
80751
|
+
"meter.getStatus": [{
|
|
80752
|
+
name: "deviceId",
|
|
80753
|
+
form: "single",
|
|
80754
|
+
optional: false
|
|
80755
|
+
}],
|
|
80510
80756
|
"motion.getStatus": [{
|
|
80511
80757
|
name: "deviceId",
|
|
80512
80758
|
form: "single",
|
|
@@ -82114,7 +82360,6 @@ Object.freeze({
|
|
|
82114
82360
|
"network-access": "ingress",
|
|
82115
82361
|
"smtp-provider": "email"
|
|
82116
82362
|
});
|
|
82117
|
-
DeviceType.Camera;
|
|
82118
82363
|
/**
|
|
82119
82364
|
* A saved Customize assignment (D936). The schema is the type: callers use
|
|
82120
82365
|
* `z.infer`, they do not restate the shape.
|