@camstack/addon-provider-tuya 0.2.16 → 0.2.17
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 +76 -8
- package/dist/addon.mjs +76 -8
- package/package.json +1 -1
package/dist/addon.js
CHANGED
|
@@ -14052,11 +14052,33 @@ var NotificationFormatSchema = _enum([
|
|
|
14052
14052
|
* Named by INTENT, never by glyph. "check" would tie the vocabulary to one
|
|
14053
14053
|
* renderer's icon set; "acknowledge" survives an adapter that draws it
|
|
14054
14054
|
* differently.
|
|
14055
|
+
*
|
|
14056
|
+
* ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
|
|
14057
|
+
*
|
|
14058
|
+
* These names are for US. **No adapter may forward one verbatim.** Each maps
|
|
14059
|
+
* the whole set onto its own renderer's vocabulary through a
|
|
14060
|
+
* `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
|
|
14061
|
+
* fallback, so adding a member here fails every adapter's build until someone
|
|
14062
|
+
* decides its glyph, which is the only place that decision can be made
|
|
14063
|
+
* honestly.
|
|
14064
|
+
*
|
|
14065
|
+
* This paragraph is the bug. Zentik declared `actionIcons: true` and passed
|
|
14066
|
+
* `disarm` straight through; iOS feeds that string to
|
|
14067
|
+
* `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
|
|
14068
|
+
* and every snooze and alarm button arrived BLANK. A pass-through is not a
|
|
14069
|
+
* mapping, and "the field is documented" is not "the value renders".
|
|
14070
|
+
*
|
|
14071
|
+
* Adding a member is TRAIN-BOUND. The enum lives in the published
|
|
14072
|
+
* `@camstack/server` closure and the cap seam validates against the HUB's copy,
|
|
14073
|
+
* so an addon that emits a token the running hub does not know does not lose an
|
|
14074
|
+
* icon — its whole `send` fails Zod validation and the notification never
|
|
14075
|
+
* arrives. Never emit a new token from an addon before the train carrying it.
|
|
14055
14076
|
*/
|
|
14056
14077
|
var NotificationActionIconSchema = _enum([
|
|
14057
14078
|
"acknowledge",
|
|
14058
14079
|
"dismiss",
|
|
14059
14080
|
"silence",
|
|
14081
|
+
"snooze",
|
|
14060
14082
|
"view",
|
|
14061
14083
|
"play",
|
|
14062
14084
|
"open",
|
|
@@ -14064,9 +14086,13 @@ var NotificationActionIconSchema = _enum([
|
|
|
14064
14086
|
"lock",
|
|
14065
14087
|
"unlock",
|
|
14066
14088
|
"arm",
|
|
14089
|
+
"arm-home",
|
|
14090
|
+
"arm-away",
|
|
14091
|
+
"arm-night",
|
|
14067
14092
|
"disarm",
|
|
14068
14093
|
"light",
|
|
14069
|
-
"alert"
|
|
14094
|
+
"alert",
|
|
14095
|
+
"camera"
|
|
14070
14096
|
]);
|
|
14071
14097
|
/** A single tap-through action button. */
|
|
14072
14098
|
var NotificationActionSchema = object({
|
|
@@ -14266,6 +14292,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
|
|
|
14266
14292
|
targetId: string(),
|
|
14267
14293
|
enabled: boolean()
|
|
14268
14294
|
}), _void(), { kind: "mutation" });
|
|
14295
|
+
new Set([
|
|
14296
|
+
{
|
|
14297
|
+
id: "person",
|
|
14298
|
+
name: "Person"
|
|
14299
|
+
},
|
|
14300
|
+
{
|
|
14301
|
+
id: "vehicle",
|
|
14302
|
+
name: "Vehicle"
|
|
14303
|
+
},
|
|
14304
|
+
{
|
|
14305
|
+
id: "animal",
|
|
14306
|
+
name: "Animal"
|
|
14307
|
+
},
|
|
14308
|
+
{
|
|
14309
|
+
id: "package",
|
|
14310
|
+
name: "Package"
|
|
14311
|
+
}
|
|
14312
|
+
].map((l) => l.id));
|
|
14269
14313
|
var COCO_TO_MACRO = {
|
|
14270
14314
|
mapping: {
|
|
14271
14315
|
person: "person",
|
|
@@ -15101,6 +15145,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15101
15145
|
"alarm-triggered",
|
|
15102
15146
|
"alarm-armed",
|
|
15103
15147
|
"alarm-disarmed",
|
|
15148
|
+
"alarm-arming",
|
|
15149
|
+
"alarm-arm-refused",
|
|
15104
15150
|
"camera-online",
|
|
15105
15151
|
"camera-offline",
|
|
15106
15152
|
"camera-disabled",
|
|
@@ -18373,6 +18419,22 @@ var detectionFpsField = {
|
|
|
18373
18419
|
default: 10,
|
|
18374
18420
|
step: 1
|
|
18375
18421
|
};
|
|
18422
|
+
/**
|
|
18423
|
+
* The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
|
|
18424
|
+
*
|
|
18425
|
+
* The recheck is now on by default (a parked car is invisible to occupancy
|
|
18426
|
+
* rules until the stationary registry has been rebuilt by motion, which after a
|
|
18427
|
+
* restart may be never on a quiet camera). Each cycle re-subscribes a detection
|
|
18428
|
+
* session — an RTSP re-dial — so the switch is only affordable at a WIDE
|
|
18429
|
+
* interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
|
|
18430
|
+
* 30 s. A parked car is therefore counted within 5 minutes of a restart.
|
|
18431
|
+
*
|
|
18432
|
+
* Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
|
|
18433
|
+
* the host validates `attachCamera` against ITS copy of this schema, so a
|
|
18434
|
+
* runner asked for 600 would be rejected by the hub until a `@camstack/server`
|
|
18435
|
+
* carrying the wider bound is installed everywhere. 300 is the widest value
|
|
18436
|
+
* that ships with an addon deploy.
|
|
18437
|
+
*/
|
|
18376
18438
|
var occupancyRecheckSecField = {
|
|
18377
18439
|
min: 0,
|
|
18378
18440
|
max: 300,
|
|
@@ -18574,15 +18636,21 @@ var RunnerCameraConfigSchema = object({
|
|
|
18574
18636
|
*/
|
|
18575
18637
|
onboardMotionDrivesAnalyzer: boolean().default(true),
|
|
18576
18638
|
/**
|
|
18577
|
-
* Master toggle for the occupancy re-check. When `false`
|
|
18578
|
-
*
|
|
18579
|
-
* this is off by default because the recheck re-subscribes a detection session
|
|
18580
|
-
* every N seconds while `watching`, a major source of pull-decoder re-dial
|
|
18581
|
-
* churn (each cycle creates+tears a session → RTSP re-dial → latency). The
|
|
18639
|
+
* Master toggle for the occupancy re-check. When `false` the runner never arms
|
|
18640
|
+
* the periodic recheck timer, regardless of `occupancyRecheckSec`; the
|
|
18582
18641
|
* `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
|
|
18583
18642
|
* (and only render) when this is enabled.
|
|
18584
|
-
|
|
18585
|
-
|
|
18643
|
+
*
|
|
18644
|
+
* DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
|
|
18645
|
+
* recheck re-subscribes a detection session every N seconds while `watching`
|
|
18646
|
+
* — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
|
|
18647
|
+
* pull-decoder churn source. What that bought was a blind spot: a STATIONARY
|
|
18648
|
+
* object is counted only while the stationary registry holds it, and the
|
|
18649
|
+
* registry rebuilds from motion, so after a restart a parked car was invisible
|
|
18650
|
+
* to every occupancy rule until something moved in front of it. The churn is
|
|
18651
|
+
* now paid on the interval instead — see `occupancyRecheckSecField`.
|
|
18652
|
+
*/
|
|
18653
|
+
occupancyRecheckEnabled: boolean().default(true),
|
|
18586
18654
|
occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
|
|
18587
18655
|
occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
|
|
18588
18656
|
/**
|
package/dist/addon.mjs
CHANGED
|
@@ -14051,11 +14051,33 @@ var NotificationFormatSchema = _enum([
|
|
|
14051
14051
|
* Named by INTENT, never by glyph. "check" would tie the vocabulary to one
|
|
14052
14052
|
* renderer's icon set; "acknowledge" survives an adapter that draws it
|
|
14053
14053
|
* differently.
|
|
14054
|
+
*
|
|
14055
|
+
* ── A TOKEN IS NOT A WIRE VALUE ─────────────────────────────────────
|
|
14056
|
+
*
|
|
14057
|
+
* These names are for US. **No adapter may forward one verbatim.** Each maps
|
|
14058
|
+
* the whole set onto its own renderer's vocabulary through a
|
|
14059
|
+
* `Record<NotificationActionIcon, string>` — a Record, never a lookup with a
|
|
14060
|
+
* fallback, so adding a member here fails every adapter's build until someone
|
|
14061
|
+
* decides its glyph, which is the only place that decision can be made
|
|
14062
|
+
* honestly.
|
|
14063
|
+
*
|
|
14064
|
+
* This paragraph is the bug. Zentik declared `actionIcons: true` and passed
|
|
14065
|
+
* `disarm` straight through; iOS feeds that string to
|
|
14066
|
+
* `UNNotificationActionIcon(systemImageName:)`, `disarm` is not an SF Symbol,
|
|
14067
|
+
* and every snooze and alarm button arrived BLANK. A pass-through is not a
|
|
14068
|
+
* mapping, and "the field is documented" is not "the value renders".
|
|
14069
|
+
*
|
|
14070
|
+
* Adding a member is TRAIN-BOUND. The enum lives in the published
|
|
14071
|
+
* `@camstack/server` closure and the cap seam validates against the HUB's copy,
|
|
14072
|
+
* so an addon that emits a token the running hub does not know does not lose an
|
|
14073
|
+
* icon — its whole `send` fails Zod validation and the notification never
|
|
14074
|
+
* arrives. Never emit a new token from an addon before the train carrying it.
|
|
14054
14075
|
*/
|
|
14055
14076
|
var NotificationActionIconSchema = _enum([
|
|
14056
14077
|
"acknowledge",
|
|
14057
14078
|
"dismiss",
|
|
14058
14079
|
"silence",
|
|
14080
|
+
"snooze",
|
|
14059
14081
|
"view",
|
|
14060
14082
|
"play",
|
|
14061
14083
|
"open",
|
|
@@ -14063,9 +14085,13 @@ var NotificationActionIconSchema = _enum([
|
|
|
14063
14085
|
"lock",
|
|
14064
14086
|
"unlock",
|
|
14065
14087
|
"arm",
|
|
14088
|
+
"arm-home",
|
|
14089
|
+
"arm-away",
|
|
14090
|
+
"arm-night",
|
|
14066
14091
|
"disarm",
|
|
14067
14092
|
"light",
|
|
14068
|
-
"alert"
|
|
14093
|
+
"alert",
|
|
14094
|
+
"camera"
|
|
14069
14095
|
]);
|
|
14070
14096
|
/** A single tap-through action button. */
|
|
14071
14097
|
var NotificationActionSchema = object({
|
|
@@ -14265,6 +14291,24 @@ method(object({}), array(TargetKindSchema)), method(object({}), array(TargetSche
|
|
|
14265
14291
|
targetId: string(),
|
|
14266
14292
|
enabled: boolean()
|
|
14267
14293
|
}), _void(), { kind: "mutation" });
|
|
14294
|
+
new Set([
|
|
14295
|
+
{
|
|
14296
|
+
id: "person",
|
|
14297
|
+
name: "Person"
|
|
14298
|
+
},
|
|
14299
|
+
{
|
|
14300
|
+
id: "vehicle",
|
|
14301
|
+
name: "Vehicle"
|
|
14302
|
+
},
|
|
14303
|
+
{
|
|
14304
|
+
id: "animal",
|
|
14305
|
+
name: "Animal"
|
|
14306
|
+
},
|
|
14307
|
+
{
|
|
14308
|
+
id: "package",
|
|
14309
|
+
name: "Package"
|
|
14310
|
+
}
|
|
14311
|
+
].map((l) => l.id));
|
|
14268
14312
|
var COCO_TO_MACRO = {
|
|
14269
14313
|
mapping: {
|
|
14270
14314
|
person: "person",
|
|
@@ -15100,6 +15144,8 @@ var NcSystemEventKindSchema = _enum([
|
|
|
15100
15144
|
"alarm-triggered",
|
|
15101
15145
|
"alarm-armed",
|
|
15102
15146
|
"alarm-disarmed",
|
|
15147
|
+
"alarm-arming",
|
|
15148
|
+
"alarm-arm-refused",
|
|
15103
15149
|
"camera-online",
|
|
15104
15150
|
"camera-offline",
|
|
15105
15151
|
"camera-disabled",
|
|
@@ -18372,6 +18418,22 @@ var detectionFpsField = {
|
|
|
18372
18418
|
default: 10,
|
|
18373
18419
|
step: 1
|
|
18374
18420
|
};
|
|
18421
|
+
/**
|
|
18422
|
+
* The occupancy re-check interval. DEFAULT 300 s (2026-08-13 — was 30 s).
|
|
18423
|
+
*
|
|
18424
|
+
* The recheck is now on by default (a parked car is invisible to occupancy
|
|
18425
|
+
* rules until the stationary registry has been rebuilt by motion, which after a
|
|
18426
|
+
* restart may be never on a quiet camera). Each cycle re-subscribes a detection
|
|
18427
|
+
* session — an RTSP re-dial — so the switch is only affordable at a WIDE
|
|
18428
|
+
* interval: 300 s is ~12 re-dials an hour per camera, against 120 at the old
|
|
18429
|
+
* 30 s. A parked car is therefore counted within 5 minutes of a restart.
|
|
18430
|
+
*
|
|
18431
|
+
* Why not wider: `max` is 300 and raising it is TRAIN-BOUND, not addon-bound —
|
|
18432
|
+
* the host validates `attachCamera` against ITS copy of this schema, so a
|
|
18433
|
+
* runner asked for 600 would be rejected by the hub until a `@camstack/server`
|
|
18434
|
+
* carrying the wider bound is installed everywhere. 300 is the widest value
|
|
18435
|
+
* that ships with an addon deploy.
|
|
18436
|
+
*/
|
|
18375
18437
|
var occupancyRecheckSecField = {
|
|
18376
18438
|
min: 0,
|
|
18377
18439
|
max: 300,
|
|
@@ -18573,15 +18635,21 @@ var RunnerCameraConfigSchema = object({
|
|
|
18573
18635
|
*/
|
|
18574
18636
|
onboardMotionDrivesAnalyzer: boolean().default(true),
|
|
18575
18637
|
/**
|
|
18576
|
-
* Master toggle for the occupancy re-check. When `false`
|
|
18577
|
-
*
|
|
18578
|
-
* this is off by default because the recheck re-subscribes a detection session
|
|
18579
|
-
* every N seconds while `watching`, a major source of pull-decoder re-dial
|
|
18580
|
-
* churn (each cycle creates+tears a session → RTSP re-dial → latency). The
|
|
18638
|
+
* Master toggle for the occupancy re-check. When `false` the runner never arms
|
|
18639
|
+
* the periodic recheck timer, regardless of `occupancyRecheckSec`; the
|
|
18581
18640
|
* `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
|
|
18582
18641
|
* (and only render) when this is enabled.
|
|
18583
|
-
|
|
18584
|
-
|
|
18642
|
+
*
|
|
18643
|
+
* DEFAULT `true` since 2026-08-13 (was `false`). It was off because the
|
|
18644
|
+
* recheck re-subscribes a detection session every N seconds while `watching`
|
|
18645
|
+
* — each cycle creates+tears a session ⇒ an RTSP re-dial ⇒ latency, a major
|
|
18646
|
+
* pull-decoder churn source. What that bought was a blind spot: a STATIONARY
|
|
18647
|
+
* object is counted only while the stationary registry holds it, and the
|
|
18648
|
+
* registry rebuilds from motion, so after a restart a parked car was invisible
|
|
18649
|
+
* to every occupancy rule until something moved in front of it. The churn is
|
|
18650
|
+
* now paid on the interval instead — see `occupancyRecheckSecField`.
|
|
18651
|
+
*/
|
|
18652
|
+
occupancyRecheckEnabled: boolean().default(true),
|
|
18585
18653
|
occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
|
|
18586
18654
|
occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
|
|
18587
18655
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camstack/addon-provider-tuya",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.17",
|
|
4
4
|
"description": "Tuya / Smart Life device-provider addon for CamStack — account-onboarded (Tuya IoT cloud fetch of device localKeys) + LOCAL DP control via the @apocaliss92/nodetuya encrypted-LAN client, exposing switch / water-heater-family kettle entities",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"camstack",
|