@camstack/addon-training 0.1.83 → 0.1.85
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-ua7eMlj6.mjs → MotionZonesSettings-DTU9fMJZ.mjs} +2 -2
- package/dist/{PrivacyMaskSettings-tOwuzUR7.mjs → PrivacyMaskSettings-8MmRT5Ow.mjs} +2 -2
- package/dist/{SceneMonitorEditor-D70yDpkr.mjs → SceneMonitorEditor-qbsyyldN.mjs} +1 -1
- package/dist/_stub.js +4552 -4466
- package/dist/{_virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-CX_OmaCS.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_training_page-_MdKeniv.mjs} +3 -3
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CHXZ7Vwy.mjs +26 -0
- package/dist/{dist-BinKWWJ5.js → dist-DIvqaK45.js} +446 -10
- package/dist/{dist-BK5jIqgk.mjs → dist-vmoGj7S3.mjs} +446 -10
- package/dist/{hostInit-DR72gpW3.mjs → hostInit-BKy0E1EU.mjs} +2 -2
- 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-DCStC-vp.mjs → player-overlays-B_I7m2Ml.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-DsQ48pYk.mjs → responsive-BlFhgdjv.mjs} +1 -1
- package/dist/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-BToJVQAB.mjs → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__addon_training_page__remoteEntry_js-BH-X_-uQ.mjs} +1 -1
- package/package.json +1 -1
- package/dist/_virtual_mf___mfe_internal__addon_training_page__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-CF6J142s.mjs +0 -26
|
@@ -5600,7 +5600,7 @@ var ZodIssueCode = {
|
|
|
5600
5600
|
var ZodFirstPartyTypeKind;
|
|
5601
5601
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5602
5602
|
//#endregion
|
|
5603
|
-
//#region ../types/dist/sleep-
|
|
5603
|
+
//#region ../types/dist/sleep-B81gwQuR.mjs
|
|
5604
5604
|
/**
|
|
5605
5605
|
* The audio chunk plane's byte format, and the ONE expansion from a coded
|
|
5606
5606
|
* window to float samples (D455).
|
|
@@ -8374,6 +8374,53 @@ var READING_QUANTITIES = [
|
|
|
8374
8374
|
];
|
|
8375
8375
|
var ReadingQuantitySchema = _enum(READING_QUANTITIES);
|
|
8376
8376
|
new Set(READING_QUANTITIES);
|
|
8377
|
+
/**
|
|
8378
|
+
* Stored unit symbol for a quantity. `none` means the number is dimensionless
|
|
8379
|
+
* (or an index / ratio / count). `device` means the cap has no single unit.
|
|
8380
|
+
*/
|
|
8381
|
+
var QUANTITY_BASE = {
|
|
8382
|
+
temperature: "°C",
|
|
8383
|
+
pressure: "hPa",
|
|
8384
|
+
speed: "m/s",
|
|
8385
|
+
precipitation: "mm",
|
|
8386
|
+
"precipitation-rate": "mm/h",
|
|
8387
|
+
length: "m",
|
|
8388
|
+
area: "m²",
|
|
8389
|
+
illuminance: "lx",
|
|
8390
|
+
irradiance: "W/m²",
|
|
8391
|
+
power: "W",
|
|
8392
|
+
energy: "kWh",
|
|
8393
|
+
voltage: "V",
|
|
8394
|
+
current: "A",
|
|
8395
|
+
"apparent-power": "VA",
|
|
8396
|
+
humidity: "%",
|
|
8397
|
+
percentage: "%",
|
|
8398
|
+
"concentration-volume": "ppm",
|
|
8399
|
+
"concentration-mass": "µg/m³",
|
|
8400
|
+
"concentration-ppb": "ppb",
|
|
8401
|
+
volume: "L",
|
|
8402
|
+
duration: "s",
|
|
8403
|
+
"duration-ms": "ms",
|
|
8404
|
+
information: "B",
|
|
8405
|
+
"sound-level": "dBFS",
|
|
8406
|
+
"signal-level": "dBm",
|
|
8407
|
+
"colour-temperature": "mired",
|
|
8408
|
+
angle: "°",
|
|
8409
|
+
bitrate: "kbps",
|
|
8410
|
+
rate: "fps",
|
|
8411
|
+
mass: "kg",
|
|
8412
|
+
index: "none",
|
|
8413
|
+
ratio: "none",
|
|
8414
|
+
count: "none",
|
|
8415
|
+
none: "none",
|
|
8416
|
+
device: "device"
|
|
8417
|
+
};
|
|
8418
|
+
/** The stored unit, or `undefined` when the quantity has no unit symbol. */
|
|
8419
|
+
function baseUnitOf(quantity) {
|
|
8420
|
+
const symbol = QUANTITY_BASE[quantity];
|
|
8421
|
+
if (symbol === "none" || symbol === "device") return void 0;
|
|
8422
|
+
return symbol;
|
|
8423
|
+
}
|
|
8377
8424
|
function readingMeta(quantity, extras) {
|
|
8378
8425
|
return {
|
|
8379
8426
|
quantity,
|
|
@@ -8923,6 +8970,7 @@ var CAP_NAMES = Object.freeze([
|
|
|
8923
8970
|
"filesystem-browse",
|
|
8924
8971
|
"flood",
|
|
8925
8972
|
"gas",
|
|
8973
|
+
"group-status",
|
|
8926
8974
|
"heating-valve",
|
|
8927
8975
|
"humidifier",
|
|
8928
8976
|
"humidity-sensor",
|
|
@@ -9741,6 +9789,20 @@ Object.freeze({
|
|
|
9741
9789
|
"path": "detected",
|
|
9742
9790
|
"valueType": "boolean"
|
|
9743
9791
|
}],
|
|
9792
|
+
"group-status": [
|
|
9793
|
+
{
|
|
9794
|
+
"path": "included",
|
|
9795
|
+
"valueType": "number"
|
|
9796
|
+
},
|
|
9797
|
+
{
|
|
9798
|
+
"path": "excluded",
|
|
9799
|
+
"valueType": "number"
|
|
9800
|
+
},
|
|
9801
|
+
{
|
|
9802
|
+
"path": "total",
|
|
9803
|
+
"valueType": "number"
|
|
9804
|
+
}
|
|
9805
|
+
],
|
|
9744
9806
|
"heating-valve": [{
|
|
9745
9807
|
"path": "position",
|
|
9746
9808
|
"valueType": "number"
|
|
@@ -11072,7 +11134,7 @@ var DeviceRole = /* @__PURE__ */ function(DeviceRole) {
|
|
|
11072
11134
|
return DeviceRole;
|
|
11073
11135
|
}({});
|
|
11074
11136
|
//#endregion
|
|
11075
|
-
//#region ../types/dist/composition-
|
|
11137
|
+
//#region ../types/dist/composition-B85l9j1M.mjs
|
|
11076
11138
|
/**
|
|
11077
11139
|
* The ffmpeg build every CamStack node downloads, per platform and arch.
|
|
11078
11140
|
*
|
|
@@ -11827,15 +11889,67 @@ function validateExpressionSource(src) {
|
|
|
11827
11889
|
}
|
|
11828
11890
|
return null;
|
|
11829
11891
|
}
|
|
11830
|
-
/**
|
|
11831
|
-
|
|
11832
|
-
|
|
11833
|
-
|
|
11892
|
+
/**
|
|
11893
|
+
* A composition source identity: `(addonId, stableId)`, never a numeric device
|
|
11894
|
+
* id. Split out so helper schemas can name it without a cycle through
|
|
11895
|
+
* `composition.ts` (D659).
|
|
11896
|
+
*/
|
|
11834
11897
|
var CompositionSourceRefSchema = object({
|
|
11835
11898
|
/** The owning addon; `stableId` is unique only within it. */
|
|
11836
11899
|
addonId: string().min(1),
|
|
11837
11900
|
stableId: string().min(1)
|
|
11838
11901
|
});
|
|
11902
|
+
var GROUP_TEMPLATE_IDS = [
|
|
11903
|
+
"temperature",
|
|
11904
|
+
"humidity",
|
|
11905
|
+
"pressure",
|
|
11906
|
+
"illuminance",
|
|
11907
|
+
"power",
|
|
11908
|
+
"energy",
|
|
11909
|
+
"battery",
|
|
11910
|
+
"numeric",
|
|
11911
|
+
"motion",
|
|
11912
|
+
"contact",
|
|
11913
|
+
"leak",
|
|
11914
|
+
"smoke",
|
|
11915
|
+
"occupancy",
|
|
11916
|
+
"binary"
|
|
11917
|
+
];
|
|
11918
|
+
var NUMERIC_AGGREGATES = [
|
|
11919
|
+
"mean",
|
|
11920
|
+
"median",
|
|
11921
|
+
"min",
|
|
11922
|
+
"max",
|
|
11923
|
+
"sum"
|
|
11924
|
+
];
|
|
11925
|
+
var BINARY_AGGREGATES = ["any", "all"];
|
|
11926
|
+
var AGGREGATE_REDUCERS = [
|
|
11927
|
+
"mean",
|
|
11928
|
+
"median",
|
|
11929
|
+
"min",
|
|
11930
|
+
"max",
|
|
11931
|
+
"sum",
|
|
11932
|
+
"any",
|
|
11933
|
+
"all"
|
|
11934
|
+
];
|
|
11935
|
+
var GroupTemplateIdSchema = _enum(GROUP_TEMPLATE_IDS);
|
|
11936
|
+
var AggregateReducerSchema = _enum(AGGREGATE_REDUCERS);
|
|
11937
|
+
/** One member. The field is stored so occupancy can name motion or binary. */
|
|
11938
|
+
var HelperMemberSchema = object({
|
|
11939
|
+
source: CompositionSourceRefSchema,
|
|
11940
|
+
cap: string().min(1),
|
|
11941
|
+
fieldPath: string().min(1)
|
|
11942
|
+
});
|
|
11943
|
+
var HelperSpecSchema = discriminatedUnion("kind", [object({
|
|
11944
|
+
kind: literal("group"),
|
|
11945
|
+
templateId: GroupTemplateIdSchema,
|
|
11946
|
+
aggregate: AggregateReducerSchema,
|
|
11947
|
+
members: array(HelperMemberSchema).min(1).max(64)
|
|
11948
|
+
})]);
|
|
11949
|
+
/** A composed device's stableId is this prefix plus the block id. */
|
|
11950
|
+
var COMPOSED_DEVICE_STABLE_ID_PREFIX = "composed-";
|
|
11951
|
+
/** Longest snippet a `code` source may carry (slice 4). */
|
|
11952
|
+
var MAX_COMPOSITION_CODE_LENGTH = 2e4;
|
|
11839
11953
|
/** One field of one capability of one source device. */
|
|
11840
11954
|
var CompositionFieldReadSchema = object({
|
|
11841
11955
|
source: CompositionSourceRefSchema,
|
|
@@ -11879,7 +11993,33 @@ var CompositionCodeSourceSchema = object({
|
|
|
11879
11993
|
var CompositionFieldSourceSchema = discriminatedUnion("kind", [
|
|
11880
11994
|
CompositionFromSourceSchema,
|
|
11881
11995
|
CompositionExpressionSourceSchema,
|
|
11882
|
-
CompositionCodeSourceSchema
|
|
11996
|
+
CompositionCodeSourceSchema,
|
|
11997
|
+
object({
|
|
11998
|
+
kind: literal("aggregate"),
|
|
11999
|
+
reducer: _enum([
|
|
12000
|
+
"mean",
|
|
12001
|
+
"median",
|
|
12002
|
+
"min",
|
|
12003
|
+
"max",
|
|
12004
|
+
"sum",
|
|
12005
|
+
"any",
|
|
12006
|
+
"all"
|
|
12007
|
+
]),
|
|
12008
|
+
reads: array(CompositionFieldReadSchema).min(1).max(64),
|
|
12009
|
+
/** `value` is the reading; the others are the member counts. */
|
|
12010
|
+
publish: _enum([
|
|
12011
|
+
"value",
|
|
12012
|
+
"included",
|
|
12013
|
+
"excluded",
|
|
12014
|
+
"total"
|
|
12015
|
+
]),
|
|
12016
|
+
/** What a `value` publish does when nobody is included. Counts ignore this. */
|
|
12017
|
+
empty: _enum([
|
|
12018
|
+
"null",
|
|
12019
|
+
"omit",
|
|
12020
|
+
"offline"
|
|
12021
|
+
])
|
|
12022
|
+
})
|
|
11883
12023
|
]);
|
|
11884
12024
|
var CompositionCommandTargetSchema = discriminatedUnion("kind", [object({
|
|
11885
12025
|
kind: literal("forward"),
|
|
@@ -11925,7 +12065,13 @@ var CompositionSchema = object({
|
|
|
11925
12065
|
kind: literal("existing"),
|
|
11926
12066
|
device: CompositionSourceRefSchema
|
|
11927
12067
|
})]),
|
|
11928
|
-
features: array(CompositionFeatureSchema).min(1).max(16)
|
|
12068
|
+
features: array(CompositionFeatureSchema).min(1).max(16),
|
|
12069
|
+
/**
|
|
12070
|
+
* Present when the block is a helper template. Absent on a free
|
|
12071
|
+
* composition (the room example, device 4603). The editor reads this,
|
|
12072
|
+
* never the compiled features.
|
|
12073
|
+
*/
|
|
12074
|
+
helper: HelperSpecSchema.optional()
|
|
11929
12075
|
}).superRefine((composition, ctx) => {
|
|
11930
12076
|
const seen = /* @__PURE__ */ new Set();
|
|
11931
12077
|
composition.features.forEach((feature, index) => {
|
|
@@ -18063,7 +18209,10 @@ var CompositionProblemSchema = object({
|
|
|
18063
18209
|
"target-missing",
|
|
18064
18210
|
"target-unreadable",
|
|
18065
18211
|
"not-replaceable",
|
|
18066
|
-
"native-capability-replace"
|
|
18212
|
+
"native-capability-replace",
|
|
18213
|
+
"mixed-quantity",
|
|
18214
|
+
"helper-mismatch",
|
|
18215
|
+
"member-constraint"
|
|
18067
18216
|
]),
|
|
18068
18217
|
path: string(),
|
|
18069
18218
|
message: string()
|
|
@@ -18084,7 +18233,8 @@ var CompositionUnavailableModeSchema = _enum([
|
|
|
18084
18233
|
"null",
|
|
18085
18234
|
"offline",
|
|
18086
18235
|
"unknown",
|
|
18087
|
-
"release"
|
|
18236
|
+
"release",
|
|
18237
|
+
"omit"
|
|
18088
18238
|
]);
|
|
18089
18239
|
/**
|
|
18090
18240
|
* `derived` reads a source · `clock` reads only `now`, recomputed when a sibling
|
|
@@ -18298,6 +18448,235 @@ Object.freeze({
|
|
|
18298
18448
|
result: ["number", "null"]
|
|
18299
18449
|
}
|
|
18300
18450
|
});
|
|
18451
|
+
/**
|
|
18452
|
+
* One catalog row per base reading a group helper can build (D944 §3).
|
|
18453
|
+
* Data, not a form default written into the block.
|
|
18454
|
+
*/
|
|
18455
|
+
var NOW = {
|
|
18456
|
+
fieldPath: "lastFetchedAt",
|
|
18457
|
+
expr: "now"
|
|
18458
|
+
};
|
|
18459
|
+
var CHANGED = {
|
|
18460
|
+
fieldPath: "lastChangedAt",
|
|
18461
|
+
expr: "now"
|
|
18462
|
+
};
|
|
18463
|
+
function numeric(input) {
|
|
18464
|
+
return {
|
|
18465
|
+
...input,
|
|
18466
|
+
family: "numeric",
|
|
18467
|
+
deviceType: DeviceType.Sensor,
|
|
18468
|
+
memberDeviceType: DeviceType.Sensor,
|
|
18469
|
+
baseUnit: baseUnitOf(input.quantity),
|
|
18470
|
+
aggregates: NUMERIC_AGGREGATES,
|
|
18471
|
+
accept: [{
|
|
18472
|
+
cap: input.outputCap,
|
|
18473
|
+
fieldPath: input.outputField
|
|
18474
|
+
}]
|
|
18475
|
+
};
|
|
18476
|
+
}
|
|
18477
|
+
function binary(input) {
|
|
18478
|
+
return {
|
|
18479
|
+
...input,
|
|
18480
|
+
family: "binary",
|
|
18481
|
+
deviceType: DeviceType.Sensor,
|
|
18482
|
+
memberDeviceType: DeviceType.Sensor,
|
|
18483
|
+
quantity: "none",
|
|
18484
|
+
baseUnit: void 0,
|
|
18485
|
+
aggregates: BINARY_AGGREGATES,
|
|
18486
|
+
empty: "offline"
|
|
18487
|
+
};
|
|
18488
|
+
}
|
|
18489
|
+
var GROUP_TEMPLATES = [
|
|
18490
|
+
numeric({
|
|
18491
|
+
id: "temperature",
|
|
18492
|
+
summary: "Mean, median, min, max or sum of temperatures. Offline and unknown members are left out, never read as 0 °C.",
|
|
18493
|
+
role: DeviceRole.TemperatureSensor,
|
|
18494
|
+
outputCap: "temperature-sensor",
|
|
18495
|
+
outputField: "celsius",
|
|
18496
|
+
quantity: "temperature",
|
|
18497
|
+
defaultAggregate: "mean",
|
|
18498
|
+
empty: "null",
|
|
18499
|
+
companions: [NOW]
|
|
18500
|
+
}),
|
|
18501
|
+
numeric({
|
|
18502
|
+
id: "humidity",
|
|
18503
|
+
summary: "Humidity in percent. Offline and unknown members are left out, never read as 0 %.",
|
|
18504
|
+
role: DeviceRole.HumiditySensor,
|
|
18505
|
+
outputCap: "humidity-sensor",
|
|
18506
|
+
outputField: "percent",
|
|
18507
|
+
quantity: "humidity",
|
|
18508
|
+
defaultAggregate: "mean",
|
|
18509
|
+
empty: "null",
|
|
18510
|
+
companions: [NOW]
|
|
18511
|
+
}),
|
|
18512
|
+
numeric({
|
|
18513
|
+
id: "pressure",
|
|
18514
|
+
summary: "Pressure in hectopascals. Offline and unknown members are left out, never read as 0 hPa.",
|
|
18515
|
+
role: DeviceRole.PressureSensor,
|
|
18516
|
+
outputCap: "pressure-sensor",
|
|
18517
|
+
outputField: "hpa",
|
|
18518
|
+
quantity: "pressure",
|
|
18519
|
+
defaultAggregate: "mean",
|
|
18520
|
+
empty: "null",
|
|
18521
|
+
companions: [NOW]
|
|
18522
|
+
}),
|
|
18523
|
+
numeric({
|
|
18524
|
+
id: "illuminance",
|
|
18525
|
+
summary: "Illuminance in lux. Offline and unknown members are left out, never read as 0 lx.",
|
|
18526
|
+
role: DeviceRole.AmbientLightSensor,
|
|
18527
|
+
outputCap: "ambient-light-sensor",
|
|
18528
|
+
outputField: "lux",
|
|
18529
|
+
quantity: "illuminance",
|
|
18530
|
+
defaultAggregate: "mean",
|
|
18531
|
+
empty: "null",
|
|
18532
|
+
companions: [NOW]
|
|
18533
|
+
}),
|
|
18534
|
+
numeric({
|
|
18535
|
+
id: "power",
|
|
18536
|
+
summary: "Power in watts, summed by default. Nobody reporting omits the key rather than writing 0 W.",
|
|
18537
|
+
role: DeviceRole.PowerSensor,
|
|
18538
|
+
outputCap: "power-meter",
|
|
18539
|
+
outputField: "watts",
|
|
18540
|
+
quantity: "power",
|
|
18541
|
+
defaultAggregate: "sum",
|
|
18542
|
+
empty: "omit",
|
|
18543
|
+
companions: [NOW]
|
|
18544
|
+
}),
|
|
18545
|
+
numeric({
|
|
18546
|
+
id: "energy",
|
|
18547
|
+
summary: "Energy in kilowatt-hours, summed by default. Nobody reporting omits the key rather than writing 0 kWh.",
|
|
18548
|
+
role: DeviceRole.EnergySensor,
|
|
18549
|
+
outputCap: "power-meter",
|
|
18550
|
+
outputField: "kwhTotal",
|
|
18551
|
+
quantity: "energy",
|
|
18552
|
+
defaultAggregate: "sum",
|
|
18553
|
+
empty: "omit",
|
|
18554
|
+
companions: [NOW]
|
|
18555
|
+
}),
|
|
18556
|
+
numeric({
|
|
18557
|
+
id: "battery",
|
|
18558
|
+
summary: "Battery charge in percent. Offline and unknown members are left out, never read as 0 %.",
|
|
18559
|
+
role: DeviceRole.BatterySensor,
|
|
18560
|
+
outputCap: "battery",
|
|
18561
|
+
outputField: "percentage",
|
|
18562
|
+
quantity: "percentage",
|
|
18563
|
+
defaultAggregate: "mean",
|
|
18564
|
+
empty: "null",
|
|
18565
|
+
companions: [
|
|
18566
|
+
{
|
|
18567
|
+
fieldPath: "charging",
|
|
18568
|
+
expr: "\"unknown\""
|
|
18569
|
+
},
|
|
18570
|
+
{
|
|
18571
|
+
fieldPath: "sleeping",
|
|
18572
|
+
expr: "false"
|
|
18573
|
+
},
|
|
18574
|
+
{
|
|
18575
|
+
fieldPath: "lastUpdated",
|
|
18576
|
+
expr: "now"
|
|
18577
|
+
}
|
|
18578
|
+
]
|
|
18579
|
+
}),
|
|
18580
|
+
numeric({
|
|
18581
|
+
id: "numeric",
|
|
18582
|
+
summary: "A numeric reading in the members’ shared quantity. Mixed quantities are refused. Nobody reporting publishes null, not 0.",
|
|
18583
|
+
role: DeviceRole.NumericSensor,
|
|
18584
|
+
outputCap: "numeric-sensor",
|
|
18585
|
+
outputField: "value",
|
|
18586
|
+
quantity: "device",
|
|
18587
|
+
defaultAggregate: "mean",
|
|
18588
|
+
empty: "null",
|
|
18589
|
+
companions: [NOW]
|
|
18590
|
+
}),
|
|
18591
|
+
binary({
|
|
18592
|
+
id: "motion",
|
|
18593
|
+
summary: "Any or all motion. Offline and unknown members are left out, never read as off. Nobody reporting takes the device offline.",
|
|
18594
|
+
role: DeviceRole.MotionSensor,
|
|
18595
|
+
outputCap: "motion",
|
|
18596
|
+
outputField: "detected",
|
|
18597
|
+
defaultAggregate: "any",
|
|
18598
|
+
accept: [{
|
|
18599
|
+
cap: "motion",
|
|
18600
|
+
fieldPath: "detected"
|
|
18601
|
+
}],
|
|
18602
|
+
companions: [{
|
|
18603
|
+
fieldPath: "lastDetectedAt",
|
|
18604
|
+
expr: "null"
|
|
18605
|
+
}, {
|
|
18606
|
+
fieldPath: "autoClearAfterMs",
|
|
18607
|
+
expr: "null"
|
|
18608
|
+
}]
|
|
18609
|
+
}),
|
|
18610
|
+
binary({
|
|
18611
|
+
id: "contact",
|
|
18612
|
+
summary: "Any or all open contacts. Offline and unknown members are left out, never read as closed.",
|
|
18613
|
+
role: DeviceRole.ContactSensor,
|
|
18614
|
+
outputCap: "contact",
|
|
18615
|
+
outputField: "entryOpen",
|
|
18616
|
+
defaultAggregate: "any",
|
|
18617
|
+
accept: [{
|
|
18618
|
+
cap: "contact",
|
|
18619
|
+
fieldPath: "entryOpen"
|
|
18620
|
+
}],
|
|
18621
|
+
companions: [CHANGED]
|
|
18622
|
+
}),
|
|
18623
|
+
binary({
|
|
18624
|
+
id: "leak",
|
|
18625
|
+
summary: "Any or all leak detections. Offline and unknown members are left out, never read as dry.",
|
|
18626
|
+
role: DeviceRole.LeakSensor,
|
|
18627
|
+
outputCap: "flood",
|
|
18628
|
+
outputField: "flooded",
|
|
18629
|
+
defaultAggregate: "any",
|
|
18630
|
+
accept: [{
|
|
18631
|
+
cap: "flood",
|
|
18632
|
+
fieldPath: "flooded"
|
|
18633
|
+
}],
|
|
18634
|
+
companions: [CHANGED]
|
|
18635
|
+
}),
|
|
18636
|
+
binary({
|
|
18637
|
+
id: "smoke",
|
|
18638
|
+
summary: "Any or all smoke detections. Offline and unknown members are left out, never read as clear.",
|
|
18639
|
+
role: DeviceRole.SmokeSensor,
|
|
18640
|
+
outputCap: "smoke",
|
|
18641
|
+
outputField: "detected",
|
|
18642
|
+
defaultAggregate: "any",
|
|
18643
|
+
accept: [{
|
|
18644
|
+
cap: "smoke",
|
|
18645
|
+
fieldPath: "detected"
|
|
18646
|
+
}],
|
|
18647
|
+
companions: [CHANGED]
|
|
18648
|
+
}),
|
|
18649
|
+
binary({
|
|
18650
|
+
id: "occupancy",
|
|
18651
|
+
summary: "Any or all of motion or binary sensors, published as a binary. Presence zones are not aggregated. Nobody reporting is offline, not off.",
|
|
18652
|
+
role: DeviceRole.BinarySensor,
|
|
18653
|
+
outputCap: "binary",
|
|
18654
|
+
outputField: "on",
|
|
18655
|
+
defaultAggregate: "any",
|
|
18656
|
+
accept: [{
|
|
18657
|
+
cap: "motion",
|
|
18658
|
+
fieldPath: "detected"
|
|
18659
|
+
}, {
|
|
18660
|
+
cap: "binary",
|
|
18661
|
+
fieldPath: "on"
|
|
18662
|
+
}],
|
|
18663
|
+
companions: [CHANGED]
|
|
18664
|
+
}),
|
|
18665
|
+
binary({
|
|
18666
|
+
id: "binary",
|
|
18667
|
+
summary: "Any or all generic binary sensors. Offline and unknown members are left out, never read as off.",
|
|
18668
|
+
role: DeviceRole.BinarySensor,
|
|
18669
|
+
outputCap: "binary",
|
|
18670
|
+
outputField: "on",
|
|
18671
|
+
defaultAggregate: "any",
|
|
18672
|
+
accept: [{
|
|
18673
|
+
cap: "binary",
|
|
18674
|
+
fieldPath: "on"
|
|
18675
|
+
}],
|
|
18676
|
+
companions: [CHANGED]
|
|
18677
|
+
})
|
|
18678
|
+
];
|
|
18679
|
+
new Map(GROUP_TEMPLATES.map((template) => [template.id, template]));
|
|
18301
18680
|
`${COMPOSED_DEVICE_STABLE_ID_PREFIX}`;
|
|
18302
18681
|
/**
|
|
18303
18682
|
* What a composition may BUILD on a device type (G2, D676): the caps a new
|
|
@@ -58118,6 +58497,24 @@ object({
|
|
|
58118
58497
|
lastChangedAt: number()
|
|
58119
58498
|
});
|
|
58120
58499
|
DeviceType.Sensor;
|
|
58500
|
+
object({
|
|
58501
|
+
/** Members whose current value entered the aggregate. */
|
|
58502
|
+
included: number().int().nonnegative().meta(readingMeta("count", {
|
|
58503
|
+
precision: 0,
|
|
58504
|
+
label: "Reporting"
|
|
58505
|
+
})),
|
|
58506
|
+
/** Members left out: offline, unknown, or not a finite reading (D393). */
|
|
58507
|
+
excluded: number().int().nonnegative().meta(readingMeta("count", {
|
|
58508
|
+
precision: 0,
|
|
58509
|
+
label: "Excluded"
|
|
58510
|
+
})),
|
|
58511
|
+
/** `included` + `excluded`. */
|
|
58512
|
+
total: number().int().nonnegative().meta(readingMeta("count", {
|
|
58513
|
+
precision: 0,
|
|
58514
|
+
label: "Members"
|
|
58515
|
+
}))
|
|
58516
|
+
});
|
|
58517
|
+
DeviceType.Sensor;
|
|
58121
58518
|
object({
|
|
58122
58519
|
/** Radiator valve opening 0 (closed) .. 100 (open). Null = not yet known. */
|
|
58123
58520
|
position: number().min(0).max(100).nullable().meta(readingMeta("percentage")),
|
|
@@ -68499,6 +68896,13 @@ Object.freeze({
|
|
|
68499
68896
|
access: "view",
|
|
68500
68897
|
role: "viewer"
|
|
68501
68898
|
},
|
|
68899
|
+
"groupStatus.getStatus": {
|
|
68900
|
+
capName: "group-status",
|
|
68901
|
+
capScope: "device",
|
|
68902
|
+
addonId: null,
|
|
68903
|
+
access: "view",
|
|
68904
|
+
role: "viewer"
|
|
68905
|
+
},
|
|
68502
68906
|
"heatingValve.getStatus": {
|
|
68503
68907
|
capName: "heating-valve",
|
|
68504
68908
|
capScope: "device",
|
|
@@ -78321,6 +78725,33 @@ var SENSOR_CAP_VOCABULARY = {
|
|
|
78321
78725
|
icon: "flame"
|
|
78322
78726
|
}]
|
|
78323
78727
|
},
|
|
78728
|
+
"group-status": {
|
|
78729
|
+
scope: "device",
|
|
78730
|
+
noun: t("Group", "Gruppo"),
|
|
78731
|
+
state: [
|
|
78732
|
+
{
|
|
78733
|
+
kind: "numeric",
|
|
78734
|
+
field: "included",
|
|
78735
|
+
quantity: t("the members reporting", "i membri che rispondono"),
|
|
78736
|
+
label: t("Reporting", "Rispondono"),
|
|
78737
|
+
icon: "users"
|
|
78738
|
+
},
|
|
78739
|
+
{
|
|
78740
|
+
kind: "numeric",
|
|
78741
|
+
field: "excluded",
|
|
78742
|
+
quantity: t("the members left out", "i membri esclusi"),
|
|
78743
|
+
label: t("Excluded", "Esclusi"),
|
|
78744
|
+
icon: "users"
|
|
78745
|
+
},
|
|
78746
|
+
{
|
|
78747
|
+
kind: "numeric",
|
|
78748
|
+
field: "total",
|
|
78749
|
+
quantity: t("the member count", "il numero di membri"),
|
|
78750
|
+
label: t("Members", "Membri"),
|
|
78751
|
+
icon: "sigma"
|
|
78752
|
+
}
|
|
78753
|
+
]
|
|
78754
|
+
},
|
|
78324
78755
|
"humidity-sensor": {
|
|
78325
78756
|
scope: "device",
|
|
78326
78757
|
noun: t("Humidity", "Umidità"),
|
|
@@ -79786,6 +80217,11 @@ Object.freeze({
|
|
|
79786
80217
|
form: "single",
|
|
79787
80218
|
optional: false
|
|
79788
80219
|
}],
|
|
80220
|
+
"groupStatus.getStatus": [{
|
|
80221
|
+
name: "deviceId",
|
|
80222
|
+
form: "single",
|
|
80223
|
+
optional: false
|
|
80224
|
+
}],
|
|
79789
80225
|
"heatingValve.getStatus": [{
|
|
79790
80226
|
name: "deviceId",
|
|
79791
80227
|
form: "single",
|