@camstack/addon-post-analysis 1.2.634 → 1.2.635
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/THIRD_PARTY_MODELS.md +1 -1
- package/dist/{clip-model-registry-3bxa67Bp.js → clip-model-registry-BHSAAWz-.js} +6342 -10602
- package/dist/{clip-model-registry-BP3Klg3J.mjs → clip-model-registry-CySP4L5r.mjs} +6337 -10603
- package/dist/embedding-encoder/index.js +1 -1
- package/dist/embedding-encoder/index.mjs +1 -1
- package/dist/pipeline-analytics/_stub.js +1 -1
- package/dist/pipeline-analytics/{_virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-BVWmFXOZ.mjs → _virtual_mf-localSharedImportMap___mfe_internal__addon_pipeline_analytics_widgets-Cnd14w_u.mjs} +3 -3
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-j6sD2jfA.mjs +26 -0
- package/dist/pipeline-analytics/{hostInit-DdkLvWFM.mjs → hostInit-DxMujleG.mjs} +3 -3
- package/dist/pipeline-analytics/index.js +166 -1957
- package/dist/pipeline-analytics/index.mjs +165 -1956
- package/dist/pipeline-analytics/remoteEntry.js +1 -1
- package/package.json +1 -1
- package/dist/pipeline-analytics/_virtual_mf___mfe_internal__addon_pipeline_analytics_widgets__loadShare___mf_0_camstack_mf_1_types__loadShare__.js-DhEtuamJ.mjs +0 -26
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as MediaFileKindEnum, $i as
|
|
1
|
+
import { $ as MediaFileKindEnum, $i as CAP_ADVANCE_FIELDS, $n as cloneAlarmSettings, $r as paintHex, $t as OpsLogEntrySchema, A as DeclaredDevices, Aa as EventCategory, Ai as subKindsOf, An as TrackSideSchema, Ar as isAudioClassName, At as NcAlarmSensorsInputSchema, B as FULL_IMAGE_BBOX, Bi as templateCarriesSummary, Bn as applyModeDelaysEdits, Br as isRootSuppliableStepId, Bt as NcRuleUpdateInputSchema, C as ClearTrackRelationResultSchema, Ca as record, Ci as ruleKindOf, Cn as TimelapseRuleInputSchema, Cr as failureContributionCapability, Ct as NC_SNOOZE_MAX_MINUTES, D as DEFAULT_TIMELAPSE_PREVIEW_TEXT, Da as tuple, Di as servedTemplateVars, Dn as TrackPuritySchema, Dr as isAlertEpisodeOpen, Dt as NC_TEMPLATE_VARS, E as DEFAULT_EVENT_COLOR, Ea as templateLiteral, Ei as sensorRaisedOf, En as TrackPlacementSchema, Er as isAlarmControllableCap, Et as NC_TAXONOMY, F as EVENT_DENSITY_BATCH_MAX, Fi as systemEventDeliveryProblems, Fn as alarmPanelCapability, Fr as isEventOwnerType, Ft as NcRuleActionSchema, G as ListTrackRelationsResultSchema, Gi as zoneAnalyticsCapability, Gn as audioMetricsCapability, Gr as kebabToCamel, Gt as NcSnoozeSuppressedSchema, H as LABEL_SUPPLY_MACRO, Hi as vectorDimFromBase64, Hn as applySecureOnArmEdit, Hr as isSystemDelivery, Ht as NcSharedSequenceSchema, I as EVENT_KIND_BY_CAP, Ii as systemEventFamilyProblems, In as alertEpisodeId, Ir as isKnownTemplateVar, It as NcRuleInputSchema, J as MAX_BIRTH_DECISION_RECORDS, Ji as evaluateSensorEdge, Jn as buildSubjectPath, Jr as memoizePinnedFfmpeg, Jt as NcTaxonomySchema, K as LockStateSchema, Ki as DEFAULT_FIRST_SIGHTING_FRESHNESS_MS, Kn as audioModeOf, Kr as linkedStepOf, Kt as NcStateSummarySectionIdSchema, L as EVENT_OWNER_TYPES, Li as systemEventFilterApplies, Ln as alertEpisodeKind, Lr as isLabelSupplyStepId, Lt as NcRulePatchSchema, M as EMBEDDING_MODEL_FAILED, Mi as subjectPathSvgPoints, Mn as activateAlarmProfile, Mr as isDetectionMacroClass, Mt as NcAlarmSettingsPatchSchema, N as EMBEDDING_REQUIREMENTS_FAILED, Ni as summarizeReview, Nn as addonWidgetsSourceCapability, Nr as isDrawableSubjectPath, Nt as NcConditionDescriptorSchema, O as DETECTION_MACRO_CLASSES, Oa as union, Oi as startMoverUnderClearance, On as TrackRelationKindSchema, Or as isAlertEpisodeSeverity, Ot as NcAlarmConfigSchema, P as EMBEDDING_REQUIREMENTS_UNAVAILABLE, Pi as syncActiveAlarmProfileSettings, Pn as alarmDeviceSecureOnArm, Pr as isEventKindLabelKey, Pt as NcConditionsSchema, Q as MOTION_CLOSE_AFTER_MS, Qi as BaseAddon, Qn as classifyRetrainReview, Qr as occupancyScope, Qt as OPS_LOG_DEFAULT_LIMIT, R as EXPORT_DENSE_MAX_RANGES, Ri as systemEventSummaryScheduleOf, Rn as alertEpisodePayload, Rr as isMediaOwnerType, Rt as NcRuleSchema, S as ClearTrackRelationInputSchema, Sa as partialRecord, Si as ruleGroupingApplies, Sn as TRACK_RELATIONS_DEFAULT_LIMIT, Sr as faceGalleryCapability, St as NC_SENSOR_TRANSITION_KINDS, T as DEFAULT_DETAIL_CROP_CONVENTION, Ta as string, Ti as secureActuationFor, Tn as TimelapseRuleSchema, Tr as gifFromMp4Args, Tt as NC_SYSTEM_EVENT_KIND_GROUP_SPECS, U as LabelAttributionSchema, Ui as viewerLinkBaseOf, Un as armRemovalReconcile, Ur as isSystemEventSummaryRule, Ut as NcSnoozeInputSchema, V as FailureCounters, Vi as templateVarsFor, Vn as applyNonBlockingEdit, Vr as isScheduleActive, Vt as NcScheduleSchema, W as ListTrackRelationsInputSchema, Wi as withSystemEventClasses, Wn as assertTimelapseCadences, Wr as isVectorIndexDimConflict, Wt as NcSnoozeSchema, X as MAX_TRACK_PURITIES, Xi as DeviceType, Xn as bundledCamstack, Xr as normalizeNcMediaPolicy, Xt as NcTemplatePreviewSchema, Y as MAX_BIRTH_LATENCY_PROXY_MS, Yi as isSourceCap, Yn as buildViewerLink, Yr as ncMediaPolicyError, Yt as NcTemplatePreviewInputSchema, Z as MAX_TRACK_RELATIONS, Zi as errMsg, Zn as calendarEventLocalSpan, Zr as notificationRulesCapability, Zt as NcTemplateVarDescriptorSchema, _ as BIRTH_DECISION_DEFAULT_LIMIT, _a as discriminatedUnion, _i as retrainRevisionConflictMessage, _n as SceneMonitorSchema, _t as NC_CONSUMABLE_SYSTEM_EVENT_KINDS, a as CLIP_EMBEDDING_STEP_ID, aa as customAction, ai as plateGalleryCapability, an as RetrainDismissedSchema, ar as deleteAlarmProfile, at as NC_ALARM_NOTIFY_FIELDS, b as BucketAccumulator, ba as number, bi as ruleBelongsToAlarm$1, bn as SetTrackRelationInputSchema, br as eventKindLabel, bt as NC_GROUPING_MAX_SEC, c as readClusterModelPinStrict, ca as hydrateSchema, ci as readMotionTriggeredBy, cn as SCENE_CONFIRM_DEFAULT_MAX_IMAGE_PX, cr as deriveRecordingMode, ct as NC_AUDIO_CONFIRM_HITS_DEFAULT, d as APPEARANCE_BLOCKS, di as resolveClipSearchMinScore, dn as SCENE_DEFAULT_CHECK_INTERVAL_SEC, dr as deviceAttentionKind, dt as NC_CLIP_PRE_ROLL_DEFAULT_SEC, ea as CamProfileSchema, ei as paletteResultSchema, en as PackageLlmVerdictSchema, er as consumableFormOf, et as MotionTriggeredBySchema, f as APPEARANCE_RESOLVES_AMBIGUITY_DEFAULT, fa as sleep$1, fi as resolveLocationMode, fn as SCENE_DEFAULT_OBSERVATION_SPACING_SEC, fr as deviceRemovalHookCapability, ft as NC_CLIP_RETENTION_MAX_SEC, g as ArchivedDebugNoteSchema, ga as boolean, gn as SCENE_RESET_RECAPTURES, gt as NC_CONSUMABLE_LOW_PERCENT_DEFAULT, h as AlarmArmModeSchema, ha as array, hi as resolveNcMediaImage, hn as SCENE_DIVERGED, hr as embeddingRefusalOf, ht as NC_CONFIRM_DEFAULT_TIMEOUT_MS, ia as createEvent, ii as pipelineAnalyticsCapability, in as RebuildObjectEmbeddingsRefusalSchema, ir as createAlarmProfile, it as NC_ALARM_DELAY_MAX_SEC, j as DetectionSourceSchema, ji as subjectPathSampleFromBox, jn as TrackSourceSchema, jr as isDefaultAlarmProfileId, jt as NcAlarmSensorsSchema, k as DETECTION_PIPELINE_CAP_NAME, ka as unknown, ki as storageOccupancyCapability, kn as TrackRelationSchema, kr as isAppLinkBase, kt as NcAlarmPostTriggeredActionSchema, l as resolveClusterModelPin, la as isDeviceScopedCap, li as readTimelapseGeneratedAt, ln as SCENE_CONFIRM_DEFAULT_TIMEOUT_MS, lr as describeSystemEventDeliveryProblem, lt as NC_AUDIO_CONFIRM_WINDOW_SEC_DEFAULT, m as AUDIO_MACRO_LABELS, ma as _enum, mi as resolveModeNotifyPolicy, mn as SCENE_DEFAULT_UNCOVERED_POLICY, mt as NC_CONFIRM_DEFAULT_MAX_IMAGE_PX, na as RECORD_MAX_DATA_BYTES, nn as RECORDING_EXPORT_MAX_READ_BYTES, nr as coreBlockIdFromAddonId, nt as NC_ALARM_DEFAULT_TRIGGERED_DURATION_SEC, o as CLUSTER_MODEL_OWNER_ADDON_ID, oa as defineCustomActions, oi as projectSubjectPath, on as RetrainOriginSchema, or as deriveDetailCropRect, ot as NC_ALARM_SYSTEM_EVENT_KINDS, p as ARCHIVED_DEBUG_NOTES_DEFAULT_LIMIT, pa as ZodObject, pi as resolveModeDelays, pn as SCENE_DEFAULT_QUIET_SECONDS, pt as NC_CONDITION_CATALOG, q as MAX_ARCHIVED_DEBUG_NOTES, qi as canonicalHash, qn as buildEventKindDescriptor, qr as mayWriteToLocation, qt as NcSystemEventKindSchema, ra as RECORD_QUERY_MAX, ri as pickFaceRescoreIntervalMinutes, rn as RECORDING_SOURCE_CAMSTACK_ADDON, rr as cosineSimilarity$1, rt as NC_ALARM_DELAY_FIELDS, s as FACE_EMBEDDING_STEP_ID, sa as defineRecordKinds, si as readDeviceStateFrom, sn as RetrainStatusSchema, sr as derivePostTriggeredAction, st as NC_ALARM_TRIGGERED_MAX_SEC, t as BUILTIN_CLIP_MODELS, ta as InvalidRecordError, ti as parseAlertEpisodePayload, tr as consumableLowPercentOf, tt as NC_ALARM_DEFAULT_PROFILE_ID, u as APPEARANCE_BIN_COUNT, ua as nodePin, ui as renameAlarmProfile, un as SCENE_DEFAULT_ANCHOR_THRESHOLD, ur as describeSystemEventFamilyProblem, ut as NC_CLIP_POST_ROLL_DEFAULT_SEC, v as BaseDevice, va as literal, vi as rootSupplyServes, vn as SetTrackPurityInputSchema, vr as encodeVectorBase64, vt as NC_DEFAULT_SNOOZE_MINUTES, w as CoverStateSchema, wa as strictObject, wi as sceneMonitorCapability, wn as TimelapseRulePatchSchema, wr as gifDeriveSpeed, wt as NC_STATE_SUMMARY_SECTION_IDS, x as COCO_TO_MACRO, xa as object, xi as ruleDeviceCompatCapQueries, xn as TIMELAPSE_DENSE_FLOOR_SEC, xr as evictionPolicyOfLocation, xt as NC_GROUPING_MIN_SEC, y as BirthDecisionRecordSchema, ya as looseObject, yi as ruleAutoTriggersAlarm, yn as SetTrackPurityResultSchema, yr as ensureAlarmProfiles, yt as NC_GROUPING_DEFAULT_SEC, z as FIRST_LEVEL_MACRO_CLASSES, zi as systemEventSummarySplitOf, zn as applyBlockingEdit, zr as isRetiredClearKey, zt as NcRuleTargetSchema } from "../clip-model-registry-CySP4L5r.mjs";
|
|
2
2
|
import { t as __exportAll } from "../embedding-encoder/index.mjs";
|
|
3
3
|
import * as fs$1 from "node:fs";
|
|
4
4
|
import { createWriteStream, promises } from "node:fs";
|
|
@@ -307,7 +307,7 @@ function buildArmAnnouncement(coverage, deviceName, bypassed = []) {
|
|
|
307
307
|
};
|
|
308
308
|
}
|
|
309
309
|
/**
|
|
310
|
-
* "Attivi: Porta retro, Cancello — Bypassati: Finestra
|
|
310
|
+
* "Attivi: Porta retro, Cancello — Bypassati: Finestra porch."
|
|
311
311
|
*
|
|
312
312
|
* Both halves are named: the bypassed sensors are why the operator pressed
|
|
313
313
|
* Arm anyway, and the remaining ones are what is still promised. An
|
|
@@ -344,7 +344,7 @@ function armedWithBypass(coverage, bypassed, deviceName) {
|
|
|
344
344
|
};
|
|
345
345
|
}
|
|
346
346
|
/**
|
|
347
|
-
* "Aperti: Finestra
|
|
347
|
+
* "Aperti: Finestra porch, Porta retro" + where the Arm anyway is.
|
|
348
348
|
*
|
|
349
349
|
* The one alarm sentence about something that did not happen, so it has to
|
|
350
350
|
* carry both halves an operator needs to act: WHICH devices are open, and —
|
|
@@ -472,7 +472,7 @@ function buildArmingAnnouncement(coverage, seconds, deviceName, bypassed = []) {
|
|
|
472
472
|
};
|
|
473
473
|
}
|
|
474
474
|
/**
|
|
475
|
-
* "Attivi: Porta retro, Cancello — Bypassati: Finestra
|
|
475
|
+
* "Attivi: Porta retro, Cancello — Bypassati: Finestra porch" while the exit
|
|
476
476
|
* delay still runs — same halves as {@link armedWithBypass}, with `seconds`
|
|
477
477
|
* frozen for the title.
|
|
478
478
|
*/
|
|
@@ -1614,7 +1614,7 @@ function artifactRowBody(record, ownerUserId) {
|
|
|
1614
1614
|
*
|
|
1615
1615
|
* Every node runs this addon, so every node resolved that path and tried to
|
|
1616
1616
|
* create it. On the Mac agent `/media-fast` does not exist (`ENOENT`); on
|
|
1617
|
-
* `
|
|
1617
|
+
* `agent-a` it exists and is not ours (`EACCES`). Both logged
|
|
1618
1618
|
* `nc-artifact data-plane failed to serve` on a loop, and the EACCES one is the
|
|
1619
1619
|
* worse of the two: a path of the same name on another machine is not the same
|
|
1620
1620
|
* directory, and `mkdir -p` of somebody else's mount point is precisely the
|
|
@@ -6756,7 +6756,7 @@ function patchDisplayLabel(patch) {
|
|
|
6756
6756
|
* machine step and the operator override of each family are listed, because a
|
|
6757
6757
|
* hand-assigned identity is still an identity.
|
|
6758
6758
|
*
|
|
6759
|
-
* Callers use it to pick a SENTENCE: "
|
|
6759
|
+
* Callers use it to pick a SENTENCE: "Alice è arrivato" and "Veicolo AB123CD"
|
|
6760
6760
|
* are different keys in the notification text catalog, and a single
|
|
6761
6761
|
* `{{label}}` slot cannot word both.
|
|
6762
6762
|
*/
|
|
@@ -10691,7 +10691,7 @@ var LABEL_MAX_CHARS = 32;
|
|
|
10691
10691
|
* A camera name, reduced to a LABEL.
|
|
10692
10692
|
*
|
|
10693
10693
|
* Looser than {@link plainVocabulary} — two words survive instead of one, so
|
|
10694
|
-
* "
|
|
10694
|
+
* "Front door cancello" and "Front door" still read as themselves — and that
|
|
10695
10695
|
* looseness is the whole design question, because a device name is only
|
|
10696
10696
|
* SEMI-trusted: the operator can rename a camera, but the name it was adopted
|
|
10697
10697
|
* with came from the camera itself.
|
|
@@ -11459,7 +11459,7 @@ function stateToRow(key, state, updatedAt) {
|
|
|
11459
11459
|
* That is not a corner case, it is the ORDINARY way a rule begins: an operator
|
|
11460
11460
|
* writes an occupancy rule about a thing they can see, which means the thing is
|
|
11461
11461
|
* usually there when they press save. Live on 2026-08-12 a became-occupied rule
|
|
11462
|
-
* on zone "
|
|
11462
|
+
* on zone "Parking pat'" (device 102, class `car`) was authored with the car
|
|
11463
11463
|
* already parked, and the next analysis pass would have announced its arrival.
|
|
11464
11464
|
*
|
|
11465
11465
|
* The invariant, stated once: AN EDGE MAY ONLY ARISE FROM A TRANSITION BETWEEN
|
|
@@ -12536,7 +12536,7 @@ var NcSummaryFiltersSchema = object({
|
|
|
12536
12536
|
* summaries still include an enormous number of stationary tracks". Since
|
|
12537
12537
|
* D161 a track promoted to the stationary registry is persisted rather than
|
|
12538
12538
|
* dropped (it owns media the retention sweep has to reach), so the car parked
|
|
12539
|
-
* in front of camera
|
|
12539
|
+
* in front of camera 102 now enters every window it overlaps and, ranked on
|
|
12540
12540
|
* importance and dwell, wins tiles from the passages the digest is about. The
|
|
12541
12541
|
* measured effect on the live hub was 1-2 tiles becoming 10.
|
|
12542
12542
|
*
|
|
@@ -12942,7 +12942,7 @@ var NcTestEventInputSchema = object({
|
|
|
12942
12942
|
*/
|
|
12943
12943
|
systemEvent: object({
|
|
12944
12944
|
kind: NcSystemEventKindSchema,
|
|
12945
|
-
/** The dedup subject (`device:
|
|
12945
|
+
/** The dedup subject (`device:102`, `node:agent-1`, …). */
|
|
12946
12946
|
subject: string().min(1),
|
|
12947
12947
|
titleKey: string().min(1),
|
|
12948
12948
|
bodyKey: string().min(1),
|
|
@@ -14996,7 +14996,7 @@ function isRetentionExemptOwnerKind(kind) {
|
|
|
14996
14996
|
* ## What happened
|
|
14997
14997
|
*
|
|
14998
14998
|
* On 2026-08-02 media writes started failing with
|
|
14999
|
-
* `ENOSPC: no space left on device, mkdir '/recordings/
|
|
14999
|
+
* `ENOSPC: no space left on device, mkdir '/recordings/102/events/track/…'`.
|
|
15000
15000
|
* For roughly five hours every new track was recorded with positions, a class,
|
|
15001
15001
|
* a `bestEventId` and **zero snapshots** — a track that looks complete in the
|
|
15002
15002
|
* list and has no picture behind it. The operator found it by noticing the
|
|
@@ -15133,7 +15133,7 @@ var OWNER_KINDS = [
|
|
|
15133
15133
|
* already documents two paragraphs up, verbatim, one owner kind later — and
|
|
15134
15134
|
* D476 moved it to `'object'`, its own docblock flagging the choice as
|
|
15135
15135
|
* pragmatic. Both are ids in a namespace the writer does not own, and the
|
|
15136
|
-
* consequence was measured: 675 delivered mosaics (271 MiB on camera
|
|
15136
|
+
* consequence was measured: 675 delivered mosaics (271 MiB on camera 101, one
|
|
15137
15137
|
* rule, growing ~27 MiB/day) that no probe could resolve and no sweep could
|
|
15138
15138
|
* ever collect.
|
|
15139
15139
|
*
|
|
@@ -17843,7 +17843,7 @@ var MAX_CENSUS_SITES = 200;
|
|
|
17843
17843
|
/**
|
|
17844
17844
|
* How many evidence candidates one camera may return.
|
|
17845
17845
|
*
|
|
17846
|
-
* A device is capped at `EVIDENCE_MAX_CANDIDATES_PER_DEVICE` (512) and
|
|
17846
|
+
* A device is capped at `EVIDENCE_MAX_CANDIDATES_PER_DEVICE` (512) and 102 was
|
|
17847
17847
|
* carrying ~497 of them when the mis-binding was found, so the default has to
|
|
17848
17848
|
* be a page, not the archive.
|
|
17849
17849
|
*/
|
|
@@ -18253,7 +18253,7 @@ var DEBUG_RETENTION_NOTE = "A `debug` mark does not pin retention. A track with
|
|
|
18253
18253
|
function debugArchiveFilename(nowMs) {
|
|
18254
18254
|
return `camstack-debug-${new Date(nowMs).toISOString().replace(/[:.]/g, "-")}.zip`.replace(/[\r\n"]/g, "");
|
|
18255
18255
|
}
|
|
18256
|
-
/** Parse `?deviceIds=
|
|
18256
|
+
/** Parse `?deviceIds=101,102` — empty means every camera. */
|
|
18257
18257
|
function parseDebugDeviceIds(url) {
|
|
18258
18258
|
const query = url.includes("?") ? url.slice(url.indexOf("?") + 1) : "";
|
|
18259
18259
|
const raw = new URLSearchParams(query).get("deviceIds");
|
|
@@ -19446,7 +19446,7 @@ var TrackIdsSchema = array(string());
|
|
|
19446
19446
|
* True when the SQLite settings backend would hand `text` back DECODED: it
|
|
19447
19447
|
* parses any TEXT that starts with `[` or `{` and is valid JSON
|
|
19448
19448
|
* (`decodeColumnValue` decodes by content, not by declared type). Free text
|
|
19449
|
-
* like that cannot round-trip through a TEXT column (follow-up
|
|
19449
|
+
* like that cannot round-trip through a TEXT column (follow-up 102, review M2).
|
|
19450
19450
|
*/
|
|
19451
19451
|
function decodesAsJson(text) {
|
|
19452
19452
|
if (!(text.startsWith("[") || text.startsWith("{"))) return false;
|
|
@@ -19471,7 +19471,7 @@ function freeText(raw) {
|
|
|
19471
19471
|
* that starts with `[` on read (`decodeColumnValue`), so the store sees the
|
|
19472
19472
|
* ARRAY it wrote; a string is parsed here only for a backend (or an old row)
|
|
19473
19473
|
* that hands the text back as written. `JSON.parse(String(array))` threw on the
|
|
19474
|
-
* decoded array and every promoted row was skipped as malformed (follow-up
|
|
19474
|
+
* decoded array and every promoted row was skipped as malformed (follow-up 102).
|
|
19475
19475
|
* `null` = unreadable, absent included (the column is NOT NULL, so absence is
|
|
19476
19476
|
* corruption) — the row is reported, never repaired.
|
|
19477
19477
|
*/
|
|
@@ -19591,7 +19591,7 @@ var TapeStatusOutputSchema = object({ cameras: array(TapeStatusRowSchema).readon
|
|
|
19591
19591
|
var TapeLightingInputSchema = _enum(["day", "ir"]);
|
|
19592
19592
|
/**
|
|
19593
19593
|
* Free text the settings store would hand back decoded is refused by name
|
|
19594
|
-
* (follow-up
|
|
19594
|
+
* (follow-up 102, review M2): whole JSON array/object text in a TEXT column
|
|
19595
19595
|
* comes back as an array or object, and the index could not read the row.
|
|
19596
19596
|
*/
|
|
19597
19597
|
var NOT_JSON_TEXT = "must not be JSON array/object text — the settings store would hand it back decoded";
|
|
@@ -20653,7 +20653,7 @@ var FACE_ALIGNMENT_SCRFD_V2 = "scrfd-v2";
|
|
|
20653
20653
|
/**
|
|
20654
20654
|
* The moment every node was running the fixed detector.
|
|
20655
20655
|
*
|
|
20656
|
-
* `addon-pipeline` landed on the hub at 12:08:18Z and on
|
|
20656
|
+
* `addon-pipeline` landed on the hub at 12:08:18Z and on agent-a at
|
|
20657
20657
|
* 12:08:27Z on 2026-09-26 (package.json mtimes, read 2026-09-26); the Mac agent
|
|
20658
20658
|
* was deployed in the same run. 12:30Z leaves margin for the Mac and for a
|
|
20659
20659
|
* runner respawn.
|
|
@@ -22097,7 +22097,7 @@ function embeddingMagnitudeVerdict(magnitude, bound) {
|
|
|
22097
22097
|
* A photograph has no camera, and `MediaStore.put` requires a number for the
|
|
22098
22098
|
* blob path. `0` is the ABSENCE of a camera, not a camera — so it appears in a
|
|
22099
22099
|
* media path and never in `tags: { deviceId }`, which is the key that answers
|
|
22100
|
-
* "why is
|
|
22100
|
+
* "why is 102 worse than 101?" and which a photo cannot answer.
|
|
22101
22101
|
*/
|
|
22102
22102
|
var PHOTO_ENROLL_DEVICE_ID = 0;
|
|
22103
22103
|
/** The step tree analysis runs: a face detector ROOT with the embedder nested. */
|
|
@@ -24610,7 +24610,7 @@ var FaceStore = class {
|
|
|
24610
24610
|
*
|
|
24611
24611
|
* This exists because the loss it reports ran for weeks without a single log
|
|
24612
24612
|
* line: the prune only ever logged an aggregate count with no `deviceId`, so
|
|
24613
|
-
* "why did camera
|
|
24613
|
+
* "why did camera 108 forget the person it asked me about" could not be asked
|
|
24614
24614
|
* of the logs at all. One line per camera (not per row) keeps the volume sane
|
|
24615
24615
|
* while still answering the per-camera question.
|
|
24616
24616
|
*
|
|
@@ -25242,7 +25242,7 @@ var FaceStore = class {
|
|
|
25242
25242
|
* which is what a mis-enrolment actually looks like.
|
|
25243
25243
|
*
|
|
25244
25244
|
* `suspicion` is the EXCESS — `bestForeign − selfMean` — because that is the
|
|
25245
|
-
* only one of the two that discriminates on real data. Measured on
|
|
25245
|
+
* only one of the two that discriminates on real data. Measured on Bob's
|
|
25246
25246
|
* 106 samples, 2026-09-08: `selfMean` has a median of 0.188 and a p90 of 0.235,
|
|
25247
25247
|
* so ANY absolute reading of "does not look like itself" fires on the whole
|
|
25248
25248
|
* gallery. The first version of this module scored `(1 − selfMean) / 2` and
|
|
@@ -27629,7 +27629,7 @@ function intersection(a, b) {
|
|
|
27629
27629
|
* consumer that cuts pixels from `TrackedDetectionOut.bbox` — the best-shot
|
|
27630
27630
|
* thumbnail, `wideCentralSquareLayout`'s central square, the close-time
|
|
27631
27631
|
* keyFrame→thumbnail derive — framed a motorcycle with its rider's head cut
|
|
27632
|
-
* off. Operator, device
|
|
27632
|
+
* off. Operator, device 102, tracks `7f50622b` and `9cbc4791`, three minutes
|
|
27633
27633
|
* apart: "motocicli e veicoli a due ruote devono includere il conducente nel
|
|
27634
27634
|
* keyframe" [motorcycles and two-wheeled vehicles must include the rider in the keyframe] (D407).
|
|
27635
27635
|
*
|
|
@@ -27717,7 +27717,7 @@ var MAX_PREDICTION_MS = 1e3;
|
|
|
27717
27717
|
/**
|
|
27718
27718
|
* A frame more than `maxMissedMs` behind the latest is a CLOCK STEP only as
|
|
27719
27719
|
* the K-th such frame in a row, each in order with the one before (follow-up
|
|
27720
|
-
*
|
|
27720
|
+
* 102, fix round 3; D49: a read that would destroy work needs another to
|
|
27721
27721
|
* agree). A step ends every track on the camera; one stray timestamp — a
|
|
27722
27722
|
* backlog spike 4.5 s late — or two runner clocks delivering interleaved
|
|
27723
27723
|
* (a camera migrating between runners) must not. Three is the least that a
|
|
@@ -27866,7 +27866,7 @@ var SpawnRefusalSampler = class {
|
|
|
27866
27866
|
* How far back the "did this thing actually go anywhere" question looks.
|
|
27867
27867
|
*
|
|
27868
27868
|
* Long enough to span several breaths of a flickering box (the measured cycle
|
|
27869
|
-
* on
|
|
27869
|
+
* on 102 runs about five analysed frames), short enough that a car which stops
|
|
27870
27870
|
* is called stopped while the operator is still watching it.
|
|
27871
27871
|
*/
|
|
27872
27872
|
var DEFAULT_STILL_WINDOW_MS = 6e3;
|
|
@@ -27874,7 +27874,7 @@ var DEFAULT_STILL_WINDOW_MS = 6e3;
|
|
|
27874
27874
|
* The span the centroid may wander inside that window and still count as
|
|
27875
27875
|
* still, as a fraction of the subject's smaller side.
|
|
27876
27876
|
*
|
|
27877
|
-
* Measured on
|
|
27877
|
+
* Measured on 102: the parked car's centroid band is 105 px on a 461x536 box —
|
|
27878
27878
|
* 0.23 of the short side. A car crossing the frame covers roughly 1.8 box
|
|
27879
27879
|
* widths in the same window. 0.35 sits in the gap with room on both sides, and
|
|
27880
27880
|
* scaling by the subject means one number serves a 40 px person and a 461 px
|
|
@@ -28618,7 +28618,7 @@ var arcKey = (from, to) => `${from}\u0000${to}`;
|
|
|
28618
28618
|
/**
|
|
28619
28619
|
* The rejections that mean "geometry or appearance said no to a plausible
|
|
28620
28620
|
* continuation" of a confirmed predecessor — a track the operator sees break
|
|
28621
|
-
* (follow-up
|
|
28621
|
+
* (follow-up 102, F5). Every one of them is past `hardRejection`, so the
|
|
28622
28622
|
* predecessor is confirmed. NOT here (fix round 1): `unconfirmed`;
|
|
28623
28623
|
* `has-successor` (continued elsewhere); `concurrent` and `identity-conflict`
|
|
28624
28624
|
* (two subjects — the normal case, and the most frequent); `dropped` (an
|
|
@@ -28722,7 +28722,7 @@ var DeferredLinker = class {
|
|
|
28722
28722
|
else seen.add(p.identity);
|
|
28723
28723
|
}
|
|
28724
28724
|
/**
|
|
28725
|
-
* A clock step (follow-up
|
|
28725
|
+
* A clock step (follow-up 102, fix round 2): every piece still undecided is
|
|
28726
28726
|
* decided `new`, so nothing that existed before the step can be absorbed
|
|
28727
28727
|
* across it — whatever was ready was committed just before. The facade
|
|
28728
28728
|
* rebases its clock past `LINK_MAX_GAP_MS`, so no later piece can continue
|
|
@@ -29496,7 +29496,7 @@ var Tracklet = class {
|
|
|
29496
29496
|
* frames reach the tracker out of capture order, up to 1.2 s back) is
|
|
29497
29497
|
* `stale`: it changes nothing. A rewound tracklet would be measured from a
|
|
29498
29498
|
* box its subject left a second ago, and L2 refused a link by reach on
|
|
29499
|
-
* exactly that (follow-up
|
|
29499
|
+
* exactly that (follow-up 102, F1). The caller reports it.
|
|
29500
29500
|
*/
|
|
29501
29501
|
observeConfident(det, t, faceBearing) {
|
|
29502
29502
|
if (t < this.lastSeenAt) return "stale";
|
|
@@ -29958,7 +29958,7 @@ var TrackerV2 = class {
|
|
|
29958
29958
|
return step.emissions.map((e) => this.emit(e, t));
|
|
29959
29959
|
}
|
|
29960
29960
|
/**
|
|
29961
|
-
* A frame stamped before the latest one already taken (follow-up
|
|
29961
|
+
* A frame stamped before the latest one already taken (follow-up 102, F1;
|
|
29962
29962
|
* ~1 % of frames, up to 1.2 s back). It is decided ONCE, for the whole
|
|
29963
29963
|
* frame (fix round 1, H1): matched against the tracklets' NEWEST boxes, a
|
|
29964
29964
|
* stale box can land on another subject — a walker's old box on the walker
|
|
@@ -31558,7 +31558,7 @@ var UPDATE_MIN_CROP_AREA_GROWTH = .15;
|
|
|
31558
31558
|
* the async detail plane and writes it to the row (`applyLabelCandidate`) —
|
|
31559
31559
|
* never into a frame patch — so a signal reading only the patch can never
|
|
31560
31560
|
* fire the identity trigger for a recognised face. Measured on the live hub
|
|
31561
|
-
* (2026-09-05, device
|
|
31561
|
+
* (2026-09-05, device 104): six of six face identities reached Home
|
|
31562
31562
|
* Assistant only on the `end` event at track close + sweep (~lastSeen+33 s),
|
|
31563
31563
|
* zero during the track's life, while the subject was still on camera.
|
|
31564
31564
|
*/
|
|
@@ -32417,8 +32417,8 @@ var TrackCloser = class {
|
|
|
32417
32417
|
*
|
|
32418
32418
|
* One message, one `reason` field, so the rate is a single Loki query and the
|
|
32419
32419
|
* breakdown is a `sum by (reason)` rather than five differently-worded lines
|
|
32420
|
-
* nobody thinks to correlate. Always tagged with the device: "why is
|
|
32421
|
-
* worse than
|
|
32420
|
+
* nobody thinks to correlate. Always tagged with the device: "why is 102
|
|
32421
|
+
* worse than 101" is the only form this question has ever been asked in.
|
|
32422
32422
|
*/
|
|
32423
32423
|
logNoThumbnailAtClose(t, reason, extra) {
|
|
32424
32424
|
this.deps.logger.info("track closed with no thumbnail (last preview chance missed)", {
|
|
@@ -32655,7 +32655,7 @@ function trackProvenanceOf(frame) {
|
|
|
32655
32655
|
*
|
|
32656
32656
|
* ×1.2 → ×1.05 (operator, 2026-09-03: "riduci e proviamo"). The complaint was
|
|
32657
32657
|
* that a best shot carries too much surrounding scene, and the measurement says
|
|
32658
|
-
* where it goes. On 26 148 person samples from camera
|
|
32658
|
+
* where it goes. On 26 148 person samples from camera 102 the median bbox is
|
|
32659
32659
|
* 1.44× taller than wide, so the square is driven by HEIGHT and half its width
|
|
32660
32660
|
* is empty before the 16:9 extension adds any:
|
|
32661
32661
|
*
|
|
@@ -32734,7 +32734,7 @@ function squareSubjectCropRegion(bbox, frame) {
|
|
|
32734
32734
|
* appears in the lateral thirds. It is deliberately given up in ONE case: a
|
|
32735
32735
|
* subject against the edge of the SCENE, whose square is clamped by the frame
|
|
32736
32736
|
* border. There the slack is zero, no crop can both contain and avoid a fill,
|
|
32737
|
-
* and the operator ruled (2026-07-31, device
|
|
32737
|
+
* and the operator ruled (2026-07-31, device 102, a pram) that real pixels
|
|
32738
32738
|
* off-centre beat a synthesized blurred band. The full history of that bound —
|
|
32739
32739
|
* imposed, dropped, and re-imposed with this exception on 2026-08-20 after
|
|
32740
32740
|
* 7.7% of best shots measured mis-framed — is written at the slide itself.
|
|
@@ -32863,7 +32863,7 @@ function wideCentralSquareLayout(bbox, frame, options = {}) {
|
|
|
32863
32863
|
* {@link deliveredWideCentralSquareLayout} (when the whole track never offered
|
|
32864
32864
|
* one, delivery falls back to the contained layout). Measured 2026-08-21 over
|
|
32865
32865
|
* 48h / 2133 tracks: 3.4% of best shots fell under this line, 23% on the worst
|
|
32866
|
-
* camera (
|
|
32866
|
+
* camera (102) — and the operator-reported track carried 6.8%.
|
|
32867
32867
|
*/
|
|
32868
32868
|
var CENTRAL_SQUARE_CONTAINMENT_MIN = .5;
|
|
32869
32869
|
/**
|
|
@@ -34528,7 +34528,7 @@ var TrackerSweep = class {
|
|
|
34528
34528
|
* The gate ALREADY logs every decision. `logs.query` is an in-memory ring that
|
|
34529
34529
|
* measured 40 000 entries covering 38 MINUTES of fleet traffic on 2026-09-08 —
|
|
34530
34530
|
* so a fourteenth field on that line answers nothing the next morning, and the
|
|
34531
|
-
* questions this data exists for ("what fraction of births on
|
|
34531
|
+
* questions this data exists for ("what fraction of births on 102 were decided
|
|
34532
34532
|
* on a coasted frame, over the week the operator complained about") are all
|
|
34533
34533
|
* multi-day. A previous investigation in this repo was blocked for exactly
|
|
34534
34534
|
* this.
|
|
@@ -40785,7 +40785,7 @@ function isAfterCursor(row, cursor) {
|
|
|
40785
40785
|
* few to accumulate the repeated evidence a stationary ENTRY needs, so nothing
|
|
40786
40786
|
* suppresses them. Events reads `listRecentTracks`, which hides only
|
|
40787
40787
|
* `closedReason = stationary-promotion`. Stamping that reason on THIS class of
|
|
40788
|
-
* close is what keeps the six
|
|
40788
|
+
* close is what keeps the six 102/3829 re-fires out of the gallery.
|
|
40789
40789
|
*
|
|
40790
40790
|
* Net displacement, not walk: `1e073359` walked 6 px of jitter and was labelled
|
|
40791
40791
|
* moving; its start→end net was 0.5 px. Walk is the wrong "did it go anywhere".
|
|
@@ -43238,7 +43238,7 @@ var TrackStore = class {
|
|
|
43238
43238
|
* and the store has no column projection, so each row carries its ~8.5 KB
|
|
43239
43239
|
* `positions`/`snapshots` JSON through the sort. PER PAGE. Draining 17 940
|
|
43240
43240
|
* rows took 36 such pages: measured on a copy of the live database, 36 full
|
|
43241
|
-
* scans, and on the hub itself single statements of 1 196–1
|
|
43241
|
+
* scans, and on the hub itself single statements of 1 196–1 101 ms each,
|
|
43242
43242
|
* every one of them blocking the one synchronous thread the whole cluster
|
|
43243
43243
|
* reads configuration through. `listDeviceIds` has ~10 callers.
|
|
43244
43244
|
*
|
|
@@ -45010,8 +45010,8 @@ var StillnessSettingsSchema = object({
|
|
|
45010
45010
|
* The camera's "not travelling" bar: centroid speed as a fraction of the
|
|
45011
45011
|
* SUBJECT's own box diagonal, per second. `0` = not calibrated (see above).
|
|
45012
45012
|
*
|
|
45013
|
-
* Measured p50 on the live hub 2026-09-19, for scale: 0.0136 (device
|
|
45014
|
-
* close view, mostly parked subjects) to 0.3081 (device
|
|
45013
|
+
* Measured p50 on the live hub 2026-09-19, for scale: 0.0136 (device 107,
|
|
45014
|
+
* close view, mostly parked subjects) to 0.3081 (device 101, far view, only
|
|
45015
45015
|
* transits).
|
|
45016
45016
|
*/
|
|
45017
45017
|
stillnessSpeedFracPerSec: number().min(0).max(STILLNESS_BAR_MAX).default(0),
|
|
@@ -47398,7 +47398,7 @@ function describeTapeStatus(input) {
|
|
|
47398
47398
|
/**
|
|
47399
47399
|
* Long side of the gif.
|
|
47400
47400
|
*
|
|
47401
|
-
* 640, against the 480 the notification used to ask for. Measured on a real
|
|
47401
|
+
* 640, against the 480 the notification used to ask for. Measured on a real 101
|
|
47402
47402
|
* clip: 480 px at 8 fps is 195 KB and 640 px is 324 KB — both far under the
|
|
47403
47403
|
* smallest cap any notifier declares (pushover's 5 MiB), and the difference is
|
|
47404
47404
|
* the one an operator notices on a phone.
|
|
@@ -47435,7 +47435,7 @@ var NC_GIF_SPEED = 4;
|
|
|
47435
47435
|
* copied — it is a `libx264` burst. The OPERATOR priced that and took it. It is
|
|
47436
47436
|
* one encode per event over a ~12 s window, not a permanent transcode child
|
|
47437
47437
|
* ([D84](../../../../../../docs/decisions/adr-0084.md) is about the latter), and
|
|
47438
|
-
* it was measured on a real
|
|
47438
|
+
* it was measured on a real 101 720p cut before being chosen: **0.23 s of
|
|
47439
47439
|
* encode, 254 KB out**, against the 922 KB the copy of the same window carried.
|
|
47440
47440
|
* The re-encode is smaller than what it replaces.
|
|
47441
47441
|
*
|
|
@@ -48227,7 +48227,7 @@ function checkTimelapsePacing(input) {
|
|
|
48227
48227
|
* listed, before anything is rendered.
|
|
48228
48228
|
*
|
|
48229
48229
|
* Every log line here carries `tags: { deviceId }`. A miss is always asked
|
|
48230
|
-
* per-camera ("why is 1441 worse than
|
|
48230
|
+
* per-camera ("why is 1441 worse than 101?") and a line without the tag cannot
|
|
48231
48231
|
* answer it.
|
|
48232
48232
|
*/
|
|
48233
48233
|
/** `part / whole` to two decimals — the shape a log line is read in. An empty
|
|
@@ -50833,7 +50833,7 @@ function observeLevel(state, sample, cfg) {
|
|
|
50833
50833
|
* ON by default (`enabled` defaults to TRUE). An earlier version of this line
|
|
50834
50834
|
* said "Ships DORMANT: `enabled` defaults to `false`" — that was stale, and on
|
|
50835
50835
|
* 2026-07-30 it nearly produced the conclusion that the gate was not running at
|
|
50836
|
-
* all. It is: it suppressed several phantom births on device
|
|
50836
|
+
* all. It is: it suppressed several phantom births on device 101 that same day.
|
|
50837
50837
|
* Read the schema, not this paragraph.
|
|
50838
50838
|
*
|
|
50839
50839
|
* The gate is fail-DEFERRED, not fail-open (changed 2026-08-01). Anything that
|
|
@@ -51490,7 +51490,7 @@ var EmbeddingDispatcher = class {
|
|
|
51490
51490
|
*
|
|
51491
51491
|
* The line is deliberately NOT tagged with a single `deviceId`: it is not
|
|
51492
51492
|
* about one camera, it is about all of them at once. The per-camera question
|
|
51493
|
-
* the tag exists to answer ("why is
|
|
51493
|
+
* the tag exists to answer ("why is 102 different from 101?") is answered by
|
|
51494
51494
|
* `meta.perDevice`, which carries the numeric id and count for every camera
|
|
51495
51495
|
* in the window.
|
|
51496
51496
|
*/
|
|
@@ -52437,7 +52437,7 @@ function deriveSuggestionMinCosine(similarityThreshold) {
|
|
|
52437
52437
|
*
|
|
52438
52438
|
* `bufferMaxPerDevice` evicts oldest-first, and a row the recognizer put a
|
|
52439
52439
|
* `suggestedIdentityId` on was exempt from nothing. Measured 2026-08-25: 15 of
|
|
52440
|
-
* 24 live cameras sat at EXACTLY the cap, and on camera
|
|
52440
|
+
* 24 live cameras sat at EXACTLY the cap, and on camera 108 (59 faces in 25 h)
|
|
52441
52441
|
* a suggestion survived roughly one day. A question the system asked was
|
|
52442
52442
|
* deleted before the operator could answer it, silently.
|
|
52443
52443
|
*
|
|
@@ -52563,7 +52563,7 @@ function planStoredMinFaceConfidencePurge(raw) {
|
|
|
52563
52563
|
* Both come from the live hub, 2026-09-07, three hours, 20 cameras with gate
|
|
52564
52564
|
* traffic:
|
|
52565
52565
|
*
|
|
52566
|
-
* - `BIRTH_EVIDENCE_SLOTS_PER_CAMERA = 8`. The busiest camera (`
|
|
52566
|
+
* - `BIRTH_EVIDENCE_SLOTS_PER_CAMERA = 8`. The busiest camera (`hall`, 369
|
|
52567
52567
|
* gate verdicts) held at most FIVE distinct birth candidates in any 4 s
|
|
52568
52568
|
* window; the next busiest held four. Eight is that worst case with margin.
|
|
52569
52569
|
* - `BIRTH_EVIDENCE_TTL_MS = 4 000`. `confirmationGateMaxDeferralMs` defaults
|
|
@@ -52987,7 +52987,7 @@ var SUPPRESS_IOU = .6;
|
|
|
52987
52987
|
* rather than a DIFFERENT vehicle. Below this floor a detection can neither
|
|
52988
52988
|
* confirm nor wake the entry (it is a different object).
|
|
52989
52989
|
*
|
|
52990
|
-
* This overlap gate is the fix for the
|
|
52990
|
+
* This overlap gate is the fix for the 102 parking-lot flood: the previous
|
|
52991
52991
|
* wake test used a centroid-distance radius of half the frame diagonal, so any
|
|
52992
52992
|
* other vehicle merely PRESENT in the lot (a car driving through, or a second
|
|
52993
52993
|
* car parked ~120px away) satisfied "near + moved" and retired the parked
|
|
@@ -53003,7 +53003,7 @@ var WAKE_ASSOC_IOU = .1;
|
|
|
53003
53003
|
* long IS a parked object" — and it was measuring the wrong thing: it rewarded
|
|
53004
53004
|
* an object seen well and often, while the parked cars that actually need
|
|
53005
53005
|
* suppressing are re-discovered as dozens of short tracks that never live this
|
|
53006
|
-
* long (device
|
|
53006
|
+
* long (device 102: 140 tracks for one car, median life 6.8 s). Birth moved to
|
|
53007
53007
|
* repetition — see `stationary-evidence.ts`.
|
|
53008
53008
|
*
|
|
53009
53009
|
* The stillness test survives because it was doing TWO jobs and only one of
|
|
@@ -53013,7 +53013,7 @@ var WAKE_ASSOC_IOU = .1;
|
|
|
53013
53013
|
* closes early and the next motion re-opens it — so one recent stillness read
|
|
53014
53014
|
* is the right amount of proof. Without this valve, removing promotion would
|
|
53015
53015
|
* leave every session containing a parked car pinned to `maxSessionHoldMs`
|
|
53016
|
-
* (120 s) forever:
|
|
53016
|
+
* (120 s) forever: 102 measured 504 sessions in 24 h, which is 70% detection
|
|
53017
53017
|
* uptime on one camera, and three cameras are already above 50%.
|
|
53018
53018
|
*/
|
|
53019
53019
|
var SESSION_STILLNESS_WINDOW_MS = 3e4;
|
|
@@ -53029,7 +53029,7 @@ var ENTRY_TTL_MS = 5 * 6e4;
|
|
|
53029
53029
|
* D49 says a destructive one-shot needs a second read that agrees. Until
|
|
53030
53030
|
* 2026-08-28 this registry satisfied that by counting to two, and the two reads
|
|
53031
53031
|
* it counted were consecutive frames of the SAME optical event — which is one
|
|
53032
|
-
* read reported twice. Measured on device
|
|
53032
|
+
* read reported twice. Measured on device 102 that day: the same two parked
|
|
53033
53033
|
* cars were promoted five times in 17 minutes and retired three times as
|
|
53034
53034
|
* `departed`, while the stored images prove neither car moved.
|
|
53035
53035
|
*
|
|
@@ -53077,7 +53077,7 @@ var DEPARTURE_STRIKE_TTL_MS = 3e4;
|
|
|
53077
53077
|
* absence may confirm a pending departure.
|
|
53078
53078
|
*
|
|
53079
53079
|
* A miss is not a read of the object; it is the absence of one, and on this
|
|
53080
|
-
* fleet it is the single most common non-signal — media capture on
|
|
53080
|
+
* fleet it is the single most common non-signal — media capture on 102 fails
|
|
53081
53081
|
* ~25% of the time, the detector drops boxes at night, and the pipeline has a
|
|
53082
53082
|
* whole dropout-skip mechanism because detector dropouts come in bursts. So an
|
|
53083
53083
|
* absence confirms only when it is SUSTAINED: five consecutive unassociated
|
|
@@ -53095,7 +53095,7 @@ var DEPARTURE_ABSENCE_MIN_READS = 5;
|
|
|
53095
53095
|
*
|
|
53096
53096
|
* At 5.9–7.9 fps a 5 s gap is 30–40 missing frames, far beyond any dropout
|
|
53097
53097
|
* hiccup, and far below the minutes that separate two motion sessions on a
|
|
53098
|
-
* session-dispatch camera (the observed re-promotions on
|
|
53098
|
+
* session-dispatch camera (the observed re-promotions on 102 were 2–6 min
|
|
53099
53099
|
* apart). Crossing it resets the warm-up and discards every pending strike:
|
|
53100
53100
|
* evidence gathered in one session may not settle a question raised in another.
|
|
53101
53101
|
*/
|
|
@@ -53105,7 +53105,7 @@ var GATE_SESSION_GAP_MS = 5e3;
|
|
|
53105
53105
|
*
|
|
53106
53106
|
* The first frames of a session are the least trustworthy pixels the pipeline
|
|
53107
53107
|
* ever sees — a cold h265 decoder emits loose, half-built boxes — and one of the
|
|
53108
|
-
* three observed
|
|
53108
|
+
* three observed 102 retirements fired on the session's first two frames, which
|
|
53109
53109
|
* were **0.9 s apart**. Two seconds is more than twice that, and at the ~1.1 fps
|
|
53110
53110
|
* those cold frames actually arrived it covers the first two or three of them.
|
|
53111
53111
|
*
|
|
@@ -53140,7 +53140,7 @@ var DEFAULT_MATCH_CONFIG = {
|
|
|
53140
53140
|
* EVERY detection on a live parked object is suppressed, not just the one
|
|
53141
53141
|
* the entry matched best (D275) — the operator's requirement is stated over
|
|
53142
53142
|
* detections ("a detection matching type AND box must not open a track"),
|
|
53143
|
-
* and the entry-driven reading of it leaked 13 of 23 tracks on device
|
|
53143
|
+
* and the entry-driven reading of it leaked 13 of 23 tracks on device 102.
|
|
53144
53144
|
*
|
|
53145
53145
|
* 2. `trackIsStill` — given a track's recent centroid path, decides whether it
|
|
53146
53146
|
* has stopped moving. Reuses the static-track-gate metrics (net
|
|
@@ -53221,14 +53221,14 @@ function centroidInside(b, p) {
|
|
|
53221
53221
|
* 0.30, down from the 0.55 that was measured against 3829's SUV (~0.78 of 4K,
|
|
53222
53222
|
* where centroid-inside is true for almost every vehicle in view). The SUV is
|
|
53223
53223
|
* far above both numbers and is unaffected. What sits in the band [0.30, 0.55)
|
|
53224
|
-
* on this fleet is
|
|
53224
|
+
* on this fleet is 102's own parked car at 0.36 — and the dawn "envelope
|
|
53225
53225
|
* exploded" ghost at 0.361 that ate a genuinely different parked motorcycle
|
|
53226
53226
|
* as a "fragment" of itself (D495, D497). D497 answered that by refusing the
|
|
53227
53227
|
* BIRTH on area, which cannot separate the car from the ghost (0.360 against
|
|
53228
53228
|
* 0.361, twelve refusals of the car in twelve hours). This answers it where
|
|
53229
53229
|
* the damage is: an oversize entry may be born, and may not REACH.
|
|
53230
53230
|
*
|
|
53231
|
-
* The cost was measured before the number moved.
|
|
53231
|
+
* The cost was measured before the number moved. 102, 2026-09-16, 03:26 to
|
|
53232
53232
|
* 06:50, with the 0.353 car as the camera's only entry: 1 717 detections
|
|
53233
53233
|
* absorbed and `continuable: 0` — not one weak hold. Every read of an oversize
|
|
53234
53234
|
* parked object is strong, so it loses nothing by being held that way; the
|
|
@@ -53270,7 +53270,7 @@ function detectionSwallowsEntry(det, parked) {
|
|
|
53270
53270
|
* entry and sitting (almost) wholly inside it.
|
|
53271
53271
|
*
|
|
53272
53272
|
* The mirror of {@link detectionSwallowsEntry}, and the case neither IoU
|
|
53273
|
-
* threshold can see. Measured on
|
|
53273
|
+
* threshold can see. Measured on 102: a 34x137 box inside a 452x420 parked
|
|
53274
53274
|
* motorcycle scores IoU 0.024 — BELOW `wakeAssocIou` (0.1), so the filter read
|
|
53275
53275
|
* it as "no detection overlaps this entry" and let it open a track, accumulate
|
|
53276
53276
|
* its own evidence and promote into a registry entry of its own. The camera
|
|
@@ -53331,7 +53331,7 @@ function bboxMatchesParkedEntry(bbox, className, entries, suppressIou = SUPPRESS
|
|
|
53331
53331
|
* It is deliberately the same predicate the per-frame filter uses
|
|
53332
53332
|
* ({@link parkedEntryHoldsDetection}): a box the filter would suppress as a
|
|
53333
53333
|
* parked object's own must not be able to become a second parked object. Device
|
|
53334
|
-
*
|
|
53334
|
+
* 102 held four rows for one car and a fifth for a fragment of a motorcycle
|
|
53335
53335
|
* because the birth path asked nothing at all.
|
|
53336
53336
|
*/
|
|
53337
53337
|
function findParkedOccupant(entries, className, bbox, suppressIou = SUPPRESS_IOU, wakeAssocIou = WAKE_ASSOC_IOU) {
|
|
@@ -53364,7 +53364,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
|
|
|
53364
53364
|
*
|
|
53365
53365
|
* Matching is ASSOCIATION-GATED by box overlap so an entry can only ever be
|
|
53366
53366
|
* confirmed or woken by ITS OWN object — never by a different same-class
|
|
53367
|
-
* vehicle merely present elsewhere in the frame (the
|
|
53367
|
+
* vehicle merely present elsewhere in the frame (the 102 parking-lot flood:
|
|
53368
53368
|
* passing/neighbouring cars used to retire parked entries, forcing endless
|
|
53369
53369
|
* re-spawns). Per entry, over the best-overlapping same-class detection:
|
|
53370
53370
|
*
|
|
@@ -53389,7 +53389,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
|
|
|
53389
53389
|
* requires a second read that agrees — and until 2026-08-28 this file satisfied
|
|
53390
53390
|
* that requirement while completely defeating it, because the two reads it
|
|
53391
53391
|
* counted were **consecutive frames of the same optical event**. One retirement
|
|
53392
|
-
* on device
|
|
53392
|
+
* on device 102 fired on the session's first two frames, 0.9 s apart, off a
|
|
53393
53393
|
* cold h265 decode; another off a passing car occluding the parked one (IoU
|
|
53394
53394
|
* 0.36, centroid outside — a textbook departing read, twice, 150 ms apart).
|
|
53395
53395
|
* Correlated evidence is not confirmation. The result: the same two parked cars
|
|
@@ -53439,7 +53439,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
|
|
|
53439
53439
|
* absorbed ONE detection per frame and released every other detection sitting on
|
|
53440
53440
|
* the very same parked box to the tracker, where it opened a track — precisely
|
|
53441
53441
|
* the operator's report ("many tracks on parked cars") and precisely the
|
|
53442
|
-
* measurement: over 2 h on device
|
|
53442
|
+
* measurement: over 2 h on device 102, **13 of 23 tracks sat on one of the three
|
|
53443
53443
|
* stationary boxes at IoU ≥ 0.5**. IoU 0.5 clears the association floor (0.1)
|
|
53444
53444
|
* and the centroid test, so those detections were eligible for suppression by
|
|
53445
53445
|
* every geometric criterion in this file, and were released anyway.
|
|
@@ -53454,7 +53454,7 @@ function thumbnailWouldShowParkedNotSubject(input) {
|
|
|
53454
53454
|
*
|
|
53455
53455
|
* D275 predicted that a moving vehicle overlapping a parked one "loses a frame
|
|
53456
53456
|
* or two while it passes" and coasts through on `maxAge`. Measured on device
|
|
53457
|
-
*
|
|
53457
|
+
* 102 on 2026-09-08 it lost the whole pass: the parked cars sit at the frame
|
|
53458
53458
|
* edge, so a car driving across their front is held on every frame from the
|
|
53459
53459
|
* first overlap to the moment it leaves the frame, and the tracker — which had
|
|
53460
53460
|
* followed it for 5–10 frames — coasts `maxMissedMs` on nothing and drops it.
|
|
@@ -53663,7 +53663,7 @@ function trackIsStill(input) {
|
|
|
53663
53663
|
*
|
|
53664
53664
|
* The generic `StationaryObjectRegistry` used to promote a track that recorded
|
|
53665
53665
|
* 4 positions inside a 30 s window — a criterion built for a car parking in
|
|
53666
|
-
* device
|
|
53666
|
+
* device 102's lot and observed on EVERY frame. (It has since moved to repeated
|
|
53667
53667
|
* evidence across many sightings, `stationary-evidence.ts`; the impossibility
|
|
53668
53668
|
* below is what forced this path to exist, and the class SKIP in the generic
|
|
53669
53669
|
* loop is what keeps it separate now.)
|
|
@@ -53675,7 +53675,7 @@ function trackIsStill(input) {
|
|
|
53675
53675
|
* why `PackageDropDetector` never fired once in its life (0 `pa-pkg-*` rows on
|
|
53676
53676
|
* every camera, ever, verified 2026-08-13).
|
|
53677
53677
|
*
|
|
53678
|
-
* Measured on device
|
|
53678
|
+
* Measured on device 101 (the only camera that has ever produced a `package`
|
|
53679
53679
|
* box): three separate tracks at 02:01:08, 02:03:14 and 02:05:29, each alive
|
|
53680
53680
|
* for 4–5 s, each carrying TWO frames ~1.2 s apart, each on a NEW trackId. The
|
|
53681
53681
|
* facts to accommodate are therefore:
|
|
@@ -53689,7 +53689,7 @@ function trackIsStill(input) {
|
|
|
53689
53689
|
* is given (IoU re-association across looks, not tracker minHits);
|
|
53690
53690
|
* - a settle burst of three frames ~400 ms apart is still three hits in
|
|
53691
53691
|
* tests and when the step runs that often; at governor cadence each look
|
|
53692
|
-
* is one hit. Device
|
|
53692
|
+
* is one hit. Device 101 2026-08-24 13:40: a real parcel expired at
|
|
53693
53693
|
* rounds=1 / dwell 1458 ms vs 15 s — the 5 s round-gap plus 15 s dwell
|
|
53694
53694
|
* were the miss.
|
|
53695
53695
|
*
|
|
@@ -53719,7 +53719,7 @@ function trackIsStill(input) {
|
|
|
53719
53719
|
* and re-sights a parcel that is still there before the expiry is judged.
|
|
53720
53720
|
*
|
|
53721
53721
|
* `sweep` judges the same TTL off a timer, so a pick-up is not held until the
|
|
53722
|
-
* next frame happens to arrive (
|
|
53722
|
+
* next frame happens to arrive (101, 2026-09-30: 29 s). It concludes ONLY a
|
|
53723
53723
|
* promoted parcel with an ABSENCE READ since its last sighting — a frame on
|
|
53724
53724
|
* which the package step LOOKED (`looked`) and found no box at that place,
|
|
53725
53725
|
* with no person or vehicle box over it (`occluders`). A parcel nobody looked
|
|
@@ -53742,14 +53742,14 @@ var PACKAGE_STILLNESS_ROUND_GAP_MS = 5e3;
|
|
|
53742
53742
|
/**
|
|
53743
53743
|
* How long a candidate survives without being re-associated, in OBSERVED time.
|
|
53744
53744
|
* Must comfortably outlast several governor polls — the real inter-round gap
|
|
53745
|
-
* measured on
|
|
53745
|
+
* measured on 101 was ~2 minutes, not the nominal 45 s, because a
|
|
53746
53746
|
* session-dispatch camera decodes nothing between motion sessions.
|
|
53747
53747
|
*/
|
|
53748
53748
|
var PACKAGE_STILLNESS_TTL_MS = 5 * 6e4;
|
|
53749
53749
|
/**
|
|
53750
53750
|
* Association floor. Deliberately looser than the registry's `SUPPRESS_IOU`
|
|
53751
53751
|
* (0.6): a box re-detected minutes later by a fresh track jitters more than one
|
|
53752
|
-
* confirmed frame-to-frame. Measured jitter on
|
|
53752
|
+
* confirmed frame-to-frame. Measured jitter on 101's doormat across 4 minutes
|
|
53753
53753
|
* was IoU ≈ 0.98, so 0.3 is generous without being meaningless.
|
|
53754
53754
|
*/
|
|
53755
53755
|
var PACKAGE_STILLNESS_ASSOC_IOU = .3;
|
|
@@ -54225,7 +54225,7 @@ function injectSecondarySubjects(frame, pending) {
|
|
|
54225
54225
|
* Memory of births whose ritual has already RUN, per device+source.
|
|
54226
54226
|
*
|
|
54227
54227
|
* A birth is a decision, and a decision is taken once. Until 2026-09-07 it
|
|
54228
|
-
* could be taken twice, on camera
|
|
54228
|
+
* could be taken twice, on camera 101 it routinely was, and the second vote
|
|
54229
54229
|
* won:
|
|
54230
54230
|
*
|
|
54231
54231
|
* 04:59:38.335Z confirmation gate: birth confirmed {trackId=f585b2ee…
|
|
@@ -54308,7 +54308,7 @@ var RETIRED_REJECTIONS_PER_DEVICE = 256;
|
|
|
54308
54308
|
* resurrection. So a rejected birth has already been written by the time the
|
|
54309
54309
|
* verdict exists. It correctly gets no `start`, no media and no notification —
|
|
54310
54310
|
* but the record stayed, and surfaced in `listRecentTracks`. On 2026-07-31 six
|
|
54311
|
-
* full-frame phantoms on device
|
|
54311
|
+
* full-frame phantoms on device 101 in nine minutes were every one of them
|
|
54312
54312
|
* suppressed AND listed.
|
|
54313
54313
|
*
|
|
54314
54314
|
* Retracting once is not enough. The tracker keeps carrying a rejected id for
|
|
@@ -54856,8 +54856,8 @@ function openRetrainUploadSink(target) {
|
|
|
54856
54856
|
* set of paths under one `cwd`. This is a different job. A track's media lives
|
|
54857
54857
|
* across several storage LOCATION roots (`eventMedia` and whatever else the
|
|
54858
54858
|
* operator relocated to), under paths that encode nothing a training set wants —
|
|
54859
|
-
* `
|
|
54860
|
-
* the way in, to `tracks/
|
|
54859
|
+
* `101/events/track/<uuid>/keyFrame.jpg` — and every entry has to be RENAMED on
|
|
54860
|
+
* the way in, to `tracks/101/<trackId>/keyFrame.jpg`. `tar.create` takes a list
|
|
54861
54861
|
* of paths relative to a single cwd and gives no rename hook, so using it would
|
|
54862
54862
|
* mean staging a whole shadow tree on disk first: a full second copy of the
|
|
54863
54863
|
* dataset, written and then deleted, to avoid writing 100 lines.
|
|
@@ -56277,7 +56277,7 @@ async function reembedFaceGallery(deps, options) {
|
|
|
56277
56277
|
* Per IDENTITY and not just in total, because the total is the number that
|
|
56278
56278
|
* misleads: a gallery 80% re-embedded can still have one person at zero, and
|
|
56279
56279
|
* `minIdentitySamples` means that person simply stops being recognised. On
|
|
56280
|
-
* 2026-08-20 that person would have been
|
|
56280
|
+
* 2026-08-20 that person would have been Carol, with 64 recognitions that day.
|
|
56281
56281
|
* Pure — the operator surface reads it, the pass does not.
|
|
56282
56282
|
*
|
|
56283
56283
|
* ## Why `unrecoverable` is an INPUT and not derived here
|
|
@@ -56959,14 +56959,14 @@ var OverlayDetailStateStore = class {
|
|
|
56959
56959
|
* docs/superpowers/specs/2026-07-17-detection-config-exposure-design.md
|
|
56960
56960
|
* (surface C). Confirmation is N frames (default 3); dwell default is 0
|
|
56961
56961
|
* (an extra bar). The 15 s dwell plus a 5 s round-gap missed a real
|
|
56962
|
-
* parcel on device
|
|
56962
|
+
* parcel on device 101 (2026-08-24 13:40).
|
|
56963
56963
|
*/
|
|
56964
56964
|
var PackageDropSettingsSchema = object({
|
|
56965
56965
|
/**
|
|
56966
56966
|
* Explicit per-camera OFF. **On by default: the ZONE RULE is what enables
|
|
56967
56967
|
* package detection**, not a second switch.
|
|
56968
56968
|
*
|
|
56969
|
-
* As an opt-in default-false this was a parallel source of truth. Device
|
|
56969
|
+
* As an opt-in default-false this was a parallel source of truth. Device 101
|
|
56970
56970
|
* on 2026-07-30 had the zone (`Uscio`), an enabled `package`-stage zone rule
|
|
56971
56971
|
* (`Pacchetti`, classFilter `['package']`), and a notification rule on
|
|
56972
56972
|
* `delivery: 'package-event'` — three layers of operator intent, all defeated
|
|
@@ -56984,7 +56984,7 @@ var PackageDropSettingsSchema = object({
|
|
|
56984
56984
|
* Same bar as tracker `minHits`: one frame is a flicker, two can still
|
|
56985
56985
|
* be a passer-by's bag, three is "it stayed". A settle burst of three
|
|
56986
56986
|
* frames in ~1 s is enough; no second governor round after the courier
|
|
56987
|
-
* left. Device
|
|
56987
|
+
* left. Device 101 2026-08-24 13:40 expired at 1 round / 1.5 s dwell.
|
|
56988
56988
|
*/
|
|
56989
56989
|
packageDropMinFrames: number().int().min(1).max(20).default(3),
|
|
56990
56990
|
/**
|
|
@@ -56999,7 +56999,7 @@ var PackageDropSettingsSchema = object({
|
|
|
56999
56999
|
/**
|
|
57000
57000
|
* Reject near-scene-sized blobs: MAX bbox area as a fraction of the frame.
|
|
57001
57001
|
*
|
|
57002
|
-
* Measured on device
|
|
57002
|
+
* Measured on device 101 (2026-08-21 analysis): 348/350 package false
|
|
57003
57003
|
* positives were ONE static object — the streetlight's light wedge on the
|
|
57004
57004
|
* granite paving — at 7.96–9.47% of the frame, scoring up to 0.877.
|
|
57005
57005
|
* Confidence cannot separate it (the one true parcel scored 0.885); area
|
|
@@ -57014,7 +57014,7 @@ var PackageDropSettingsSchema = object({
|
|
|
57014
57014
|
* package step spanning ≥ 10 s that found the doormat empty and unoccluded,
|
|
57015
57015
|
* with somebody in the drop-off zone around the disappearance — instead of
|
|
57016
57016
|
* waiting out the 300 s TTL. OFF by default: the one pick-up the stored data
|
|
57017
|
-
* could replay (
|
|
57017
|
+
* could replay (101, 2026-09-30) is no sample to judge the false-departure
|
|
57018
57018
|
* risk by. Silence always keeps the TTL.
|
|
57019
57019
|
*/
|
|
57020
57020
|
packageDropEarlyPickupEnabled: boolean().default(false),
|
|
@@ -57025,7 +57025,7 @@ var PackageDropSettingsSchema = object({
|
|
|
57025
57025
|
* box first appeared — and a departure only counts as `picked-up` with
|
|
57026
57026
|
* somebody in that zone around the disappearance. Whole-camera motion (a
|
|
57027
57027
|
* walker at the far gate) does not count. 0 disables both gates. Device
|
|
57028
|
-
*
|
|
57028
|
+
* 101's streetlight wedge cycled delivered→picked-up ~23×/night with
|
|
57029
57029
|
* nobody in the drop-off zone. Default 300 s: wide enough to absorb the
|
|
57030
57030
|
* motion-settle governor's cadence (the box is often first SEEN minutes
|
|
57031
57031
|
* after the courier left).
|
|
@@ -57227,7 +57227,7 @@ function shouldSkipDropoutFrame(activeTrackCount, detectionCount, consecutiveSki
|
|
|
57227
57227
|
*
|
|
57228
57228
|
* Until D665 the skip counted `frame.detections` only, so a frame whose sole
|
|
57229
57229
|
* box was a person at 0.5 read as a detector glitch and never reached the
|
|
57230
|
-
* tracker — on camera
|
|
57230
|
+
* tracker — on camera 104 more than half the frames of a re-split gap were
|
|
57231
57231
|
* dropout-skipped. A frame with a continuable box is not empty; `floor` is the
|
|
57232
57232
|
* camera's low-score floor, `null` when the tier is off.
|
|
57233
57233
|
*/
|
|
@@ -58942,7 +58942,7 @@ var NEAR_FULL_DIMENSION = .95;
|
|
|
58942
58942
|
/**
|
|
58943
58943
|
* Detection score at/above which a near-full-frame box is trusted as a REAL
|
|
58944
58944
|
* close subject rather than an exploded envelope/artifact. Live evidence
|
|
58945
|
-
* 2026-07-23 (
|
|
58945
|
+
* 2026-07-23 (dev101, near-top-down driveway camera): cars passing diagonally
|
|
58946
58946
|
* right under the lens produce GENUINE 0,0→640,341 boxes at score 0.45-0.9 —
|
|
58947
58947
|
* the size-only guard rejected every frame of every such track, so those
|
|
58948
58948
|
* tracks never landed a best `thumbnail` or `keyFrame` at all. The observed
|
|
@@ -59001,7 +59001,7 @@ function isPlausibleRetryBox(current, bestSeen, minFractionOfBest = RETRY_MIN_FR
|
|
|
59001
59001
|
* burst. Both are gone, for measured reasons:
|
|
59002
59002
|
*
|
|
59003
59003
|
* - The area bar separated nothing. The operator's own parked car on device
|
|
59004
|
-
*
|
|
59004
|
+
* 102 measures 0.360 of the frame; the dawn "envelope exploded" ghost that
|
|
59005
59005
|
* motivated the bar measured 0.361. Twelve refusals in twelve hours were
|
|
59006
59006
|
* the car, in a band nine thousandths wide.
|
|
59007
59007
|
* - The burst door was built on a mislabel. The runner filed every LIVE
|
|
@@ -59017,7 +59017,7 @@ function isPlausibleRetryBox(current, bestSeen, minFractionOfBest = RETRY_MIN_FR
|
|
|
59017
59017
|
* (D495's loss). That is answered where the reach is decided: at or above
|
|
59018
59018
|
* `OVERSIZE_AREA_FRAC` (`stationary-match.ts`) an entry holds a detection on a
|
|
59019
59019
|
* STRONG read only — no jitter hold, no fragment hold — exactly as the
|
|
59020
|
-
* scene-sized SUV on 3829 always has. Measured on
|
|
59020
|
+
* scene-sized SUV on 3829 always has. Measured on 102 between 03:26 and 06:50
|
|
59021
59021
|
* on 2026-09-16, with the 0.353 car as the only entry: 1 717 detections
|
|
59022
59022
|
* absorbed, `continuable: 0` — every read of an oversize parked car is strong,
|
|
59023
59023
|
* so the object loses nothing by being held that way.
|
|
@@ -59055,7 +59055,7 @@ function isPlausibleStationaryBirthBox(bbox, frameWidth, frameHeight) {
|
|
|
59055
59055
|
//#endregion
|
|
59056
59056
|
//#region src/pipeline-analytics/pipeline/stationary/stationary-evidence.ts
|
|
59057
59057
|
/**
|
|
59058
|
-
* `vehicle` and its kin. Every number below is read off device
|
|
59058
|
+
* `vehicle` and its kin. Every number below is read off device 102 over 24 h
|
|
59059
59059
|
* (18 402 vehicle observations, 290 tracks) with the three parked cars the
|
|
59060
59060
|
* operator can see out of the window as the bench.
|
|
59061
59061
|
*
|
|
@@ -59066,7 +59066,7 @@ function isPlausibleStationaryBirthBox(bbox, frameWidth, frameHeight) {
|
|
|
59066
59066
|
* - `minAgreementRatio` **0.6** — the measured gap is [0.29, 0.90]; 0.6 is the
|
|
59067
59067
|
* middle of it. Raising it to 0.95 starts dropping real parked cars.
|
|
59068
59068
|
* - `minAgreed` **8** — a floor, not a discriminator: sweeping it 3→60 changes
|
|
59069
|
-
* nothing on
|
|
59069
|
+
* nothing on 102 (the smallest true positive promotes with N=15). Set well
|
|
59070
59070
|
* below that so a rarely-seen object is never excluded for being rare, which
|
|
59071
59071
|
* is the entire point of using a ratio.
|
|
59072
59072
|
* - `minSpanMs` **120 000** — the real discriminator. True positives span
|
|
@@ -59083,7 +59083,7 @@ var VEHICLE_EVIDENCE_POLICY = {
|
|
|
59083
59083
|
* strictest numbers in the file, because these are MEASURED, not cautious.
|
|
59084
59084
|
*
|
|
59085
59085
|
* This is not caution, it is a measurement. Replaying 24 h of person
|
|
59086
|
-
* observations from devices
|
|
59086
|
+
* observations from devices 102, 111, 104 and 107 through this exact ledger:
|
|
59087
59087
|
*
|
|
59088
59088
|
* | ratio | minAgreed | minSpanMs | promotions / 24 h across 4 cameras |
|
|
59089
59089
|
* | ----- | --------- | --------- | ---------------------------------- |
|
|
@@ -59091,9 +59091,9 @@ var VEHICLE_EVIDENCE_POLICY = {
|
|
|
59091
59091
|
* | 0.95 | 40 | 1800 s | 10 |
|
|
59092
59092
|
* | 0.99 | 80 | 1800 s | **6** |
|
|
59093
59093
|
*
|
|
59094
|
-
* There is no setting that reaches zero. Device
|
|
59094
|
+
* There is no setting that reaches zero. Device 104 holds a person-shaped thing
|
|
59095
59095
|
* that agrees with itself 1292 times out of 1654 (0.78) across 26 tracks over
|
|
59096
|
-
* ten hours, and device
|
|
59096
|
+
* ten hours, and device 107 produced eleven candidates at ratio 1.00 between
|
|
59097
59097
|
* 02:00 and 05:00 — a statue, a poster, an IR artifact; the ledger cannot tell
|
|
59098
59098
|
* those from a person standing still, because they look identical to it.
|
|
59099
59099
|
*
|
|
@@ -59130,7 +59130,7 @@ function evidencePolicyFor(className) {
|
|
|
59130
59130
|
* How long a candidate survives without being touched.
|
|
59131
59131
|
*
|
|
59132
59132
|
* Six hours. Derived from the WORST case this criterion has to serve — a camera
|
|
59133
|
-
* whose only producer is occasion A. The busiest parking spot on
|
|
59133
|
+
* whose only producer is occasion A. The busiest parking spot on 102 is
|
|
59134
59134
|
* rediscovered ~0.5 times per hour at night, so evidence has to survive a
|
|
59135
59135
|
* multi-hour gap between sessions or it can never accumulate at all.
|
|
59136
59136
|
*
|
|
@@ -59140,7 +59140,7 @@ function evidencePolicyFor(className) {
|
|
|
59140
59140
|
*/
|
|
59141
59141
|
var EVIDENCE_WINDOW_MS = 360 * 6e4;
|
|
59142
59142
|
/** Per-device candidate cap. A camera producing detections in novel places
|
|
59143
|
-
* forever must not decide how much of hub-main's heap this uses.
|
|
59143
|
+
* forever must not decide how much of hub-main's heap this uses. 102, the
|
|
59144
59144
|
* busiest lot in the fleet, holds 8. */
|
|
59145
59145
|
var EVIDENCE_MAX_CANDIDATES_PER_DEVICE = 512;
|
|
59146
59146
|
/**
|
|
@@ -59150,7 +59150,7 @@ var EVIDENCE_MAX_CANDIDATES_PER_DEVICE = 512;
|
|
|
59150
59150
|
* A track binds at its first emitted frame and, until 2026-08-28, never
|
|
59151
59151
|
* re-bound. A track emitted on a settling box therefore captured whichever of
|
|
59152
59152
|
* a device's ~497 accumulated candidates it happened to touch first and stayed
|
|
59153
|
-
* there for its whole life. The arithmetic from the
|
|
59153
|
+
* there for its whole life. The arithmetic from the 102 audit: a promotion
|
|
59154
59154
|
* carried `agreed: 240 / seen: 240` — exactly one track's 239 observations plus
|
|
59155
59155
|
* the candidate's birth — while a second track's **267 observations of the same
|
|
59156
59156
|
* spot** were folded into a different row entirely. Had they landed together
|
|
@@ -59168,7 +59168,7 @@ var EVIDENCE_REBIND_MAX_BOUND_OVERLAP = .05;
|
|
|
59168
59168
|
* these, sliding.
|
|
59169
59169
|
*
|
|
59170
59170
|
* Fifteen minutes, chosen against the two failure modes it sits between. Too
|
|
59171
|
-
* short and a parked car that nobody observes for a while —
|
|
59171
|
+
* short and a parked car that nobody observes for a while — 102's busiest spot
|
|
59172
59172
|
* is rediscovered ~0.5 times an hour at night — arrives at an empty window and
|
|
59173
59173
|
* cannot answer at all. Too long and it becomes the lifetime counter it is
|
|
59174
59174
|
* replacing. Fifteen minutes holds several motion sessions on a daytime camera
|
|
@@ -59324,7 +59324,7 @@ function stillnessVerdictFor(source, trackState) {
|
|
|
59324
59324
|
* `stationaryThresholdSec` had not elapsed — `moving` in name only. On a
|
|
59325
59325
|
* session-dispatched camera those frames are a third of every 36 s track, and
|
|
59326
59326
|
* a session cut short by a passer-by is made of nothing else. Measured on
|
|
59327
|
-
* device
|
|
59327
|
+
* device 102 (DNRG309, 2026-09-19 20:32 → 09-20 07:53): 13 of the 21 tracks
|
|
59328
59328
|
* bound to the candidate never reached `idle`, the ledger's ratio was 0.493
|
|
59329
59329
|
* against 0.6, and a parked car took 11.3 h and 19 tracks to be censused.
|
|
59330
59330
|
*
|
|
@@ -59556,8 +59556,8 @@ function computeStationaryEntryZones(entry, zones, minOverlap) {
|
|
|
59556
59556
|
*
|
|
59557
59557
|
* It used to be `source === 'pipeline'`, in five places, each explaining that
|
|
59558
59558
|
* the gate "runs on that plane". The reason given was WHERE the flood it was
|
|
59559
|
-
* written for had been measured (
|
|
59560
|
-
* firmware's boxes were unfit. The cost of the accident, on device
|
|
59559
|
+
* written for had been measured (102, the ML plane), never an argument that the
|
|
59560
|
+
* firmware's boxes were unfit. The cost of the accident, on device 106: a still
|
|
59561
59561
|
* object is never promoted, so it holds `hasLiveTrack` true for as long as it
|
|
59562
59562
|
* sits there, and every detection session runs to its 120 s cap instead of
|
|
59563
59563
|
* closing on cooldown — `closed at the max-hold cap with a subject still
|
|
@@ -61710,7 +61710,7 @@ var StationaryEvidenceLedger = class {
|
|
|
61710
61710
|
/**
|
|
61711
61711
|
* Which candidate each of a device's live tracks is bound to.
|
|
61712
61712
|
*
|
|
61713
|
-
* The
|
|
61713
|
+
* The 102 audit could not answer this — the binding map was private, and the
|
|
61714
61714
|
* whole D280 defect is invisible without it: a promotion's `agreed`/`seen`
|
|
61715
61715
|
* tell you a row was fed, never WHICH track fed it or which track went
|
|
61716
61716
|
* somewhere else. Read-only, and the only reason it is public.
|
|
@@ -61989,7 +61989,7 @@ var StationaryEvidenceLedger = class {
|
|
|
61989
61989
|
* so it confirms and never re-anchors. Letting a weak box move the anchor would
|
|
61990
61990
|
* let a passing lorry drag a parked car's reference across the frame.
|
|
61991
61991
|
*
|
|
61992
|
-
* It has one failure mode, and device
|
|
61992
|
+
* It has one failure mode, and device 102 sat in it for eight and a half hours.
|
|
61993
61993
|
* Entry `02e6bf01` was anchored, at promotion, on its source track's last box:
|
|
61994
61994
|
* **406x1103**. The car's real reading is **399x814** — same object, same
|
|
61995
61995
|
* place, a box inflated by a merged frame. IoU ≈ 0.58 against a `suppressIou`
|
|
@@ -62003,7 +62003,7 @@ var StationaryEvidenceLedger = class {
|
|
|
62003
62003
|
* - worse, a weak hold is CONTINUABLE, so a passer-by's coasting track latches
|
|
62004
62004
|
* onto the parked car's box, its velocity drops below the still threshold,
|
|
62005
62005
|
* and the predicted box freezes there. Measured over 12 h: 18 198 weak holds
|
|
62006
|
-
* on
|
|
62006
|
+
* on 102 of which **1 330 were consumed by a confirmed track**, against
|
|
62007
62007
|
* **0** on a healthy camera. Four moving vehicles were provably captured
|
|
62008
62008
|
* this way, each sitting 33-35 s of its 35-38 s life on the parked car's box.
|
|
62009
62009
|
*
|
|
@@ -62022,7 +62022,7 @@ var StationaryEvidenceLedger = class {
|
|
|
62022
62022
|
* How much the repeated box must still OVERLAP the anchor it is correcting.
|
|
62023
62023
|
*
|
|
62024
62024
|
* The time bound alone is not enough, and the first hour in production proved
|
|
62025
|
-
* it: on `
|
|
62025
|
+
* it: on `Camera studio` a `person` entry of 236x568 was re-anchored onto
|
|
62026
62026
|
* a 1094x1406 box — eleven times the area, IoU 0.087. That is not an anchor
|
|
62027
62027
|
* that is slightly wrong, it is a different object standing in front of the
|
|
62028
62028
|
* entry long enough to steal it. The rule this replaces refused exactly that,
|
|
@@ -62031,7 +62031,7 @@ var StationaryEvidenceLedger = class {
|
|
|
62031
62031
|
* So the correction is bounded at BOTH ends. Above `suppressIou` (0.60) a read
|
|
62032
62032
|
* already re-anchors on the spot and needs none of this. Below this floor the
|
|
62033
62033
|
* two boxes are not the same object and no amount of patience makes them one.
|
|
62034
|
-
* 0.45 sits between: it admits
|
|
62034
|
+
* 0.45 sits between: it admits 102's 0.58 — the two-hundredths case this exists
|
|
62035
62035
|
* for — and refuses the 0.087 that broke the studio.
|
|
62036
62036
|
*/
|
|
62037
62037
|
var STALE_ANCHOR_MIN_IOU = .45;
|
|
@@ -62229,7 +62229,7 @@ var StationaryObjectRegistry = class {
|
|
|
62229
62229
|
* produced plenty and none of them was this car. The first says nothing
|
|
62230
62230
|
* about the object; the second says it is gone.
|
|
62231
62231
|
*
|
|
62232
|
-
* Measured on device
|
|
62232
|
+
* Measured on device 102: a motorcycle parked for 29 HOURS was retired by TTL
|
|
62233
62233
|
* after 6.2 minutes of observed time without a confirmation, while it was
|
|
62234
62234
|
* still physically there — a debug-flagged track two hours later sat on its
|
|
62235
62235
|
* exact spot with a median centroid displacement of 0.0 px. Losing the entry
|
|
@@ -62512,7 +62512,7 @@ var StationaryObjectRegistry = class {
|
|
|
62512
62512
|
* predicate the per-frame filter uses (`findParkedOccupant`): a box the
|
|
62513
62513
|
* filter would suppress as a parked object's own can never become a second
|
|
62514
62514
|
* parked object. Until 2026-09-14 this method minted whatever it was handed,
|
|
62515
|
-
* and device
|
|
62515
|
+
* and device 102 reported EIGHT parked vehicles — four of them one car, the
|
|
62516
62516
|
* same box to the decimal, promoted again roughly once an hour because the
|
|
62517
62517
|
* weak-continuation path (D410) keeps feeding the ledger from a track riding
|
|
62518
62518
|
* a parked object. The re-promotion is not the anomaly and is not worth
|
|
@@ -62520,7 +62520,7 @@ var StationaryObjectRegistry = class {
|
|
|
62520
62520
|
* still there. It just must not produce a neighbour.
|
|
62521
62521
|
*
|
|
62522
62522
|
* A merge never DOWNGRADES the tenant: it advances the clock and adopts an
|
|
62523
|
-
* identity the tenant lacks (the
|
|
62523
|
+
* identity the tenant lacks (the 102 duplicates arrived unlabelled while the
|
|
62524
62524
|
* row they belonged to was already `Car`), and it never overwrites one it
|
|
62525
62525
|
* has.
|
|
62526
62526
|
*/
|
|
@@ -62599,8 +62599,8 @@ var StationaryObjectRegistry = class {
|
|
|
62599
62599
|
* ONLY for the cameras this node analyses ({@link analyses}). Every node runs
|
|
62600
62600
|
* this addon and every node hydrates the SAME table in {@link load}, so a
|
|
62601
62601
|
* sweep over every hydrated device judges — and mutates — cameras it has no
|
|
62602
|
-
* frames for. Measured 2026-09-14: the duplicate collapse for device
|
|
62603
|
-
* logged by `MacMiniAgent.localdomain` and by `
|
|
62602
|
+
* frames for. Measured 2026-09-14: the duplicate collapse for device 102 was
|
|
62603
|
+
* logged by `MacMiniAgent.localdomain` and by `agent-a`, the same
|
|
62604
62604
|
* rows, seven seconds apart.
|
|
62605
62605
|
*
|
|
62606
62606
|
* Expiry is measured against the device's latest processed-frame timestamp
|
|
@@ -64456,7 +64456,7 @@ function buildOrphanScopes(collections = auditableCollections()) {
|
|
|
64456
64456
|
/**
|
|
64457
64457
|
* Deliberately unhurried. One hour of grace is ~24× the shortest measured
|
|
64458
64458
|
* retention window's resolution and far under the shortest window itself
|
|
64459
|
-
* (1 day on
|
|
64459
|
+
* (1 day on 104), so it can protect the write/index race without ever
|
|
64460
64460
|
* shadowing a real prune.
|
|
64461
64461
|
*/
|
|
64462
64462
|
var DEFAULT_ORPHAN_LIMITS = {
|
|
@@ -65737,7 +65737,7 @@ var RetentionSweepRunner = class {
|
|
|
65737
65737
|
* every entity the track owns goes with it.
|
|
65738
65738
|
*
|
|
65739
65739
|
* **One sweep does not mean one cutoff.** Retention is per device and that is
|
|
65740
|
-
* deliberate: measured 1 day on
|
|
65740
|
+
* deliberate: measured 1 day on 104 against 7 on 101/102. What is singular is
|
|
65741
65741
|
* the SELECTION — one entity kind, one clock, one cascade — not the number.
|
|
65742
65742
|
*
|
|
65743
65743
|
* `deviceIds` is passed in so the whole pass shares one device set and one
|
|
@@ -66979,7 +66979,7 @@ var FAMILY_PLATE_OCR = "plate-ocr";
|
|
|
66979
66979
|
* The "failure" here is NOT suppressed and must not be — a person standing over
|
|
66980
66980
|
* a car is a real person, and this repo will not trade that away for a cleaner
|
|
66981
66981
|
* count (D275 made the same choice for stationary suppression). It is counted so
|
|
66982
|
-
* the phantom rate is a number instead of an impression: 4 of 23 on camera
|
|
66982
|
+
* the phantom rate is a number instead of an impression: 4 of 23 on camera 102
|
|
66983
66983
|
* in two hours, measured by hand on 2026-08-28.
|
|
66984
66984
|
*/
|
|
66985
66985
|
var FAMILY_PERSON_BIRTH = "person-birth";
|
|
@@ -67255,7 +67255,7 @@ function isFullFrameBbox(bbox) {
|
|
|
67255
67255
|
var NATIVE_CROP_METRIC_INTERVAL_MS = 3e4;
|
|
67256
67256
|
/**
|
|
67257
67257
|
* Above this `maxWidth`, a full-frame fetch is a NATIVE full frame (~1–1.5 MB
|
|
67258
|
-
* on a 4K camera) rather than a boxed timeline tile or a pinned ≤
|
|
67258
|
+
* on a 4K camera) rather than a boxed timeline tile or a pinned ≤106 detection
|
|
67259
67259
|
* frame (tens of kB). The two belong in different counters or the window line
|
|
67260
67260
|
* says "full frames" and means two payload classes three orders of magnitude
|
|
67261
67261
|
* apart. (D470) No caller asks for that rung since D422 (the key frame) and
|
|
@@ -68277,7 +68277,7 @@ var CameraIndexUnknownDrops = class {
|
|
|
68277
68277
|
* Mapped sensor/control caps that a CAMERA must NOT contribute for ITSELF.
|
|
68278
68278
|
*
|
|
68279
68279
|
* A sensor cap bound on a camera makes the camera both the source and the
|
|
68280
|
-
* subject — a composed doorbell on camera
|
|
68280
|
+
* subject — a composed doorbell on camera 101 (D671), a native Reolink
|
|
68281
68281
|
* doorbell, a camera-side button. Those have no other route into the per-camera event
|
|
68282
68282
|
* substrate, so the camera includes itself.
|
|
68283
68283
|
*
|
|
@@ -68548,9 +68548,9 @@ var LinkedCamerasCache = class {
|
|
|
68548
68548
|
* every consumer of a device-event attributes it to the same cameras.
|
|
68549
68549
|
*
|
|
68550
68550
|
* It is shared on purpose. The self-camera half (a doorbell bound on camera
|
|
68551
|
-
*
|
|
68551
|
+
* 101 makes 101 both source and subject) was added to the history-row
|
|
68552
68552
|
* ingest on 2026-08-07 and NOT to the synthetic-track projection beside it,
|
|
68553
|
-
* which kept resolving `camerasFor` alone. The result: camera
|
|
68553
|
+
* which kept resolving `camerasFor` alone. The result: camera 101's real
|
|
68554
68554
|
* doorbell press on 2026-08-08 06:59Z produced a `SensorEvent` row and no
|
|
68555
68555
|
* timeline marker, for weeks, with the divergence invisible in both codepaths.
|
|
68556
68556
|
* Two derivations of "which cameras" is one too many.
|
|
@@ -68637,7 +68637,7 @@ function isSliceRecord(slice) {
|
|
|
68637
68637
|
* One `DeviceStateChanged` → N history rows, one per camera the event belongs
|
|
68638
68638
|
* to: the emitting device's LINKED cameras, plus the emitting device ITSELF
|
|
68639
68639
|
* when it is a camera carrying the sensor cap (a doorbell bound on camera
|
|
68640
|
-
*
|
|
68640
|
+
* 101 — see `SELF_CAMERA_EXCLUDED_CAPS` for the one cap that is not
|
|
68641
68641
|
* self-ingested). The EVENT_KIND_BY_CAP gate exits first so non-sensor cap
|
|
68642
68642
|
* churn costs one map lookup. Returns the number of rows inserted (0 when
|
|
68643
68643
|
* unmapped, or when no camera takes a row for the device — a non-camera
|
|
@@ -69852,9 +69852,9 @@ var EventMediaDispatcher = class {
|
|
|
69852
69852
|
* `camerasFor` alone — LINKED cameras only — while the history-row ingest
|
|
69853
69853
|
* beside it had gained the self-camera half on 2026-08-07. A doorbell can be
|
|
69854
69854
|
* served on the CAMERA itself (a composed doorbell, D671, writes the `doorbell`
|
|
69855
|
-
* slice onto camera
|
|
69856
|
-
* `camerasFor(
|
|
69857
|
-
* projection returned on a `debug` line nobody runs at. Camera
|
|
69855
|
+
* slice onto camera 101; Reolink registers it at camera level), so
|
|
69856
|
+
* `camerasFor(101)` answered `[]` and the
|
|
69857
|
+
* projection returned on a `debug` line nobody runs at. Camera 101's real
|
|
69858
69858
|
* press at 2026-08-08 06:59Z therefore produced a `SensorEvent` row, a HomeKit
|
|
69859
69859
|
* ring, an Alexa post and a matched notification rule — and no track. Both
|
|
69860
69860
|
* halves now derive their cameras from {@link resolveSensorEventCameras}.
|
|
@@ -69870,7 +69870,7 @@ var EventMediaDispatcher = class {
|
|
|
69870
69870
|
* **Nothing here is silent.** A marker that lands emits one `info` line; every
|
|
69871
69871
|
* branch that lands none emits one line carrying the reason. Both carry
|
|
69872
69872
|
* `tags: { deviceId }` with the CAMERA id, because the question always arrives
|
|
69873
|
-
* as "why did
|
|
69873
|
+
* as "why did 102 get a marker and 101 not".
|
|
69874
69874
|
*
|
|
69875
69875
|
* **The marker is also the notification's PICTURE.** A doorbell press has no
|
|
69876
69876
|
* detection behind it, so nothing else on the notification path owns a frame of
|
|
@@ -69888,7 +69888,7 @@ var EventMediaDispatcher = class {
|
|
|
69888
69888
|
/**
|
|
69889
69889
|
* The bound a sensor marker's snapshot gets: 2.5 s.
|
|
69890
69890
|
*
|
|
69891
|
-
* Measured rather than guessed — a `snapshot.getSnapshot` on camera
|
|
69891
|
+
* Measured rather than guessed — a `snapshot.getSnapshot` on camera 101 answers
|
|
69892
69892
|
* in ~0.6 s end-to-end from OUTSIDE the hub (the cap serves a ≤10 s cached
|
|
69893
69893
|
* frame; `force` is never set here). 2.5 s leaves four times the observed cost
|
|
69894
69894
|
* and still bounds what the doorbell notification waits for.
|
|
@@ -70307,1797 +70307,6 @@ Object.freeze({
|
|
|
70307
70307
|
"readClipBytes"
|
|
70308
70308
|
]
|
|
70309
70309
|
});
|
|
70310
|
-
/** cap name -> the numeric state field whose strict advance IS the cap's one-shot event. */
|
|
70311
|
-
var CAP_ADVANCE_FIELDS = Object.freeze({ "doorbell": "lastPressedAt" });
|
|
70312
|
-
Object.freeze({
|
|
70313
|
-
"air-quality-sensor": [
|
|
70314
|
-
{
|
|
70315
|
-
"path": "co2Ppm",
|
|
70316
|
-
"valueType": "number"
|
|
70317
|
-
},
|
|
70318
|
-
{
|
|
70319
|
-
"path": "vocPpb",
|
|
70320
|
-
"valueType": "number"
|
|
70321
|
-
},
|
|
70322
|
-
{
|
|
70323
|
-
"path": "pm25",
|
|
70324
|
-
"valueType": "number"
|
|
70325
|
-
},
|
|
70326
|
-
{
|
|
70327
|
-
"path": "pm10",
|
|
70328
|
-
"valueType": "number"
|
|
70329
|
-
},
|
|
70330
|
-
{
|
|
70331
|
-
"path": "aqi",
|
|
70332
|
-
"valueType": "number"
|
|
70333
|
-
},
|
|
70334
|
-
{
|
|
70335
|
-
"path": "unit",
|
|
70336
|
-
"valueType": "string"
|
|
70337
|
-
},
|
|
70338
|
-
{
|
|
70339
|
-
"path": "precision",
|
|
70340
|
-
"valueType": "number"
|
|
70341
|
-
}
|
|
70342
|
-
],
|
|
70343
|
-
"alarm-panel": [
|
|
70344
|
-
{
|
|
70345
|
-
"path": "state",
|
|
70346
|
-
"valueType": "enum",
|
|
70347
|
-
"enumValues": [
|
|
70348
|
-
"disarmed",
|
|
70349
|
-
"armed_home",
|
|
70350
|
-
"armed_away",
|
|
70351
|
-
"armed_night",
|
|
70352
|
-
"armed_vacation",
|
|
70353
|
-
"armed_custom_bypass",
|
|
70354
|
-
"arming",
|
|
70355
|
-
"disarming",
|
|
70356
|
-
"pending",
|
|
70357
|
-
"triggered"
|
|
70358
|
-
]
|
|
70359
|
-
},
|
|
70360
|
-
{
|
|
70361
|
-
"path": "targetMode",
|
|
70362
|
-
"valueType": "enum",
|
|
70363
|
-
"enumValues": [
|
|
70364
|
-
"home",
|
|
70365
|
-
"away",
|
|
70366
|
-
"night",
|
|
70367
|
-
"vacation",
|
|
70368
|
-
"custom_bypass"
|
|
70369
|
-
]
|
|
70370
|
-
},
|
|
70371
|
-
{
|
|
70372
|
-
"path": "requiresCode",
|
|
70373
|
-
"valueType": "boolean"
|
|
70374
|
-
}
|
|
70375
|
-
],
|
|
70376
|
-
"ambient-light-sensor": [
|
|
70377
|
-
{
|
|
70378
|
-
"path": "lux",
|
|
70379
|
-
"valueType": "number"
|
|
70380
|
-
},
|
|
70381
|
-
{
|
|
70382
|
-
"path": "unit",
|
|
70383
|
-
"valueType": "string"
|
|
70384
|
-
},
|
|
70385
|
-
{
|
|
70386
|
-
"path": "precision",
|
|
70387
|
-
"valueType": "number"
|
|
70388
|
-
}
|
|
70389
|
-
],
|
|
70390
|
-
"audio-metrics": [
|
|
70391
|
-
{
|
|
70392
|
-
"path": "ts",
|
|
70393
|
-
"valueType": "number"
|
|
70394
|
-
},
|
|
70395
|
-
{
|
|
70396
|
-
"path": "windowSec",
|
|
70397
|
-
"valueType": "number"
|
|
70398
|
-
},
|
|
70399
|
-
{
|
|
70400
|
-
"path": "level.rms",
|
|
70401
|
-
"valueType": "number"
|
|
70402
|
-
},
|
|
70403
|
-
{
|
|
70404
|
-
"path": "level.dbfs",
|
|
70405
|
-
"valueType": "number"
|
|
70406
|
-
},
|
|
70407
|
-
{
|
|
70408
|
-
"path": "peakDbfs",
|
|
70409
|
-
"valueType": "number"
|
|
70410
|
-
},
|
|
70411
|
-
{
|
|
70412
|
-
"path": "avgDbfs",
|
|
70413
|
-
"valueType": "number"
|
|
70414
|
-
},
|
|
70415
|
-
{
|
|
70416
|
-
"path": "current.className",
|
|
70417
|
-
"valueType": "string"
|
|
70418
|
-
},
|
|
70419
|
-
{
|
|
70420
|
-
"path": "current.score",
|
|
70421
|
-
"valueType": "number"
|
|
70422
|
-
},
|
|
70423
|
-
{
|
|
70424
|
-
"path": "current.timestamp",
|
|
70425
|
-
"valueType": "number"
|
|
70426
|
-
}
|
|
70427
|
-
],
|
|
70428
|
-
"automation-control": [
|
|
70429
|
-
{
|
|
70430
|
-
"path": "enabled",
|
|
70431
|
-
"valueType": "boolean"
|
|
70432
|
-
},
|
|
70433
|
-
{
|
|
70434
|
-
"path": "isRunning",
|
|
70435
|
-
"valueType": "boolean"
|
|
70436
|
-
},
|
|
70437
|
-
{
|
|
70438
|
-
"path": "lastTriggeredAt",
|
|
70439
|
-
"valueType": "number"
|
|
70440
|
-
},
|
|
70441
|
-
{
|
|
70442
|
-
"path": "lastError",
|
|
70443
|
-
"valueType": "string"
|
|
70444
|
-
}
|
|
70445
|
-
],
|
|
70446
|
-
"battery": [
|
|
70447
|
-
{
|
|
70448
|
-
"path": "percentage",
|
|
70449
|
-
"valueType": "number"
|
|
70450
|
-
},
|
|
70451
|
-
{
|
|
70452
|
-
"path": "charging",
|
|
70453
|
-
"valueType": "enum",
|
|
70454
|
-
"enumValues": [
|
|
70455
|
-
"dc",
|
|
70456
|
-
"solar",
|
|
70457
|
-
"none",
|
|
70458
|
-
"unknown"
|
|
70459
|
-
]
|
|
70460
|
-
},
|
|
70461
|
-
{
|
|
70462
|
-
"path": "sleeping",
|
|
70463
|
-
"valueType": "boolean"
|
|
70464
|
-
},
|
|
70465
|
-
{
|
|
70466
|
-
"path": "lastUpdated",
|
|
70467
|
-
"valueType": "number"
|
|
70468
|
-
},
|
|
70469
|
-
{
|
|
70470
|
-
"path": "lastContactAt",
|
|
70471
|
-
"valueType": "number"
|
|
70472
|
-
},
|
|
70473
|
-
{
|
|
70474
|
-
"path": "lastFullRefreshAt",
|
|
70475
|
-
"valueType": "number"
|
|
70476
|
-
},
|
|
70477
|
-
{
|
|
70478
|
-
"path": "binary",
|
|
70479
|
-
"valueType": "boolean"
|
|
70480
|
-
}
|
|
70481
|
-
],
|
|
70482
|
-
"binary": [{
|
|
70483
|
-
"path": "on",
|
|
70484
|
-
"valueType": "boolean"
|
|
70485
|
-
}],
|
|
70486
|
-
"brightness": [{
|
|
70487
|
-
"path": "percentage",
|
|
70488
|
-
"valueType": "number"
|
|
70489
|
-
}],
|
|
70490
|
-
"broker": [{
|
|
70491
|
-
"path": "brokerCount",
|
|
70492
|
-
"valueType": "number"
|
|
70493
|
-
}, {
|
|
70494
|
-
"path": "connectedCount",
|
|
70495
|
-
"valueType": "number"
|
|
70496
|
-
}],
|
|
70497
|
-
"camera-credentials": [
|
|
70498
|
-
{
|
|
70499
|
-
"path": "host",
|
|
70500
|
-
"valueType": "string"
|
|
70501
|
-
},
|
|
70502
|
-
{
|
|
70503
|
-
"path": "port",
|
|
70504
|
-
"valueType": "number"
|
|
70505
|
-
},
|
|
70506
|
-
{
|
|
70507
|
-
"path": "onvifPort",
|
|
70508
|
-
"valueType": "number"
|
|
70509
|
-
},
|
|
70510
|
-
{
|
|
70511
|
-
"path": "rtspPort",
|
|
70512
|
-
"valueType": "number"
|
|
70513
|
-
},
|
|
70514
|
-
{
|
|
70515
|
-
"path": "https",
|
|
70516
|
-
"valueType": "boolean"
|
|
70517
|
-
},
|
|
70518
|
-
{
|
|
70519
|
-
"path": "hasUsername",
|
|
70520
|
-
"valueType": "boolean"
|
|
70521
|
-
},
|
|
70522
|
-
{
|
|
70523
|
-
"path": "hasPassword",
|
|
70524
|
-
"valueType": "boolean"
|
|
70525
|
-
},
|
|
70526
|
-
{
|
|
70527
|
-
"path": "onvifProfile",
|
|
70528
|
-
"valueType": "string"
|
|
70529
|
-
}
|
|
70530
|
-
],
|
|
70531
|
-
"camera-streams": [
|
|
70532
|
-
{
|
|
70533
|
-
"path": "online",
|
|
70534
|
-
"valueType": "boolean"
|
|
70535
|
-
},
|
|
70536
|
-
{
|
|
70537
|
-
"path": "slotStatuses.high",
|
|
70538
|
-
"valueType": "enum",
|
|
70539
|
-
"enumValues": [
|
|
70540
|
-
"unassigned",
|
|
70541
|
-
"idle",
|
|
70542
|
-
"connecting",
|
|
70543
|
-
"streaming",
|
|
70544
|
-
"error"
|
|
70545
|
-
]
|
|
70546
|
-
},
|
|
70547
|
-
{
|
|
70548
|
-
"path": "slotStatuses.mid",
|
|
70549
|
-
"valueType": "enum",
|
|
70550
|
-
"enumValues": [
|
|
70551
|
-
"unassigned",
|
|
70552
|
-
"idle",
|
|
70553
|
-
"connecting",
|
|
70554
|
-
"streaming",
|
|
70555
|
-
"error"
|
|
70556
|
-
]
|
|
70557
|
-
},
|
|
70558
|
-
{
|
|
70559
|
-
"path": "slotStatuses.low",
|
|
70560
|
-
"valueType": "enum",
|
|
70561
|
-
"enumValues": [
|
|
70562
|
-
"unassigned",
|
|
70563
|
-
"idle",
|
|
70564
|
-
"connecting",
|
|
70565
|
-
"streaming",
|
|
70566
|
-
"error"
|
|
70567
|
-
]
|
|
70568
|
-
},
|
|
70569
|
-
{
|
|
70570
|
-
"path": "slotErrors.high",
|
|
70571
|
-
"valueType": "string"
|
|
70572
|
-
},
|
|
70573
|
-
{
|
|
70574
|
-
"path": "slotErrors.mid",
|
|
70575
|
-
"valueType": "string"
|
|
70576
|
-
},
|
|
70577
|
-
{
|
|
70578
|
-
"path": "slotErrors.low",
|
|
70579
|
-
"valueType": "string"
|
|
70580
|
-
}
|
|
70581
|
-
],
|
|
70582
|
-
"carbon-monoxide": [{
|
|
70583
|
-
"path": "detected",
|
|
70584
|
-
"valueType": "boolean"
|
|
70585
|
-
}],
|
|
70586
|
-
"climate-control": [
|
|
70587
|
-
{
|
|
70588
|
-
"path": "mode",
|
|
70589
|
-
"valueType": "enum",
|
|
70590
|
-
"enumValues": [
|
|
70591
|
-
"off",
|
|
70592
|
-
"heat",
|
|
70593
|
-
"cool",
|
|
70594
|
-
"auto",
|
|
70595
|
-
"heat_cool",
|
|
70596
|
-
"fan_only",
|
|
70597
|
-
"dry"
|
|
70598
|
-
]
|
|
70599
|
-
},
|
|
70600
|
-
{
|
|
70601
|
-
"path": "fanMode",
|
|
70602
|
-
"valueType": "string"
|
|
70603
|
-
},
|
|
70604
|
-
{
|
|
70605
|
-
"path": "preset",
|
|
70606
|
-
"valueType": "string"
|
|
70607
|
-
},
|
|
70608
|
-
{
|
|
70609
|
-
"path": "target",
|
|
70610
|
-
"valueType": "number"
|
|
70611
|
-
},
|
|
70612
|
-
{
|
|
70613
|
-
"path": "targetHigh",
|
|
70614
|
-
"valueType": "number"
|
|
70615
|
-
},
|
|
70616
|
-
{
|
|
70617
|
-
"path": "targetLow",
|
|
70618
|
-
"valueType": "number"
|
|
70619
|
-
},
|
|
70620
|
-
{
|
|
70621
|
-
"path": "targetHumidity",
|
|
70622
|
-
"valueType": "number"
|
|
70623
|
-
},
|
|
70624
|
-
{
|
|
70625
|
-
"path": "currentTemp",
|
|
70626
|
-
"valueType": "number"
|
|
70627
|
-
},
|
|
70628
|
-
{
|
|
70629
|
-
"path": "currentHumidity",
|
|
70630
|
-
"valueType": "number"
|
|
70631
|
-
},
|
|
70632
|
-
{
|
|
70633
|
-
"path": "swingVertical",
|
|
70634
|
-
"valueType": "boolean"
|
|
70635
|
-
},
|
|
70636
|
-
{
|
|
70637
|
-
"path": "swingHorizontal",
|
|
70638
|
-
"valueType": "boolean"
|
|
70639
|
-
},
|
|
70640
|
-
{
|
|
70641
|
-
"path": "minTemp",
|
|
70642
|
-
"valueType": "number"
|
|
70643
|
-
},
|
|
70644
|
-
{
|
|
70645
|
-
"path": "maxTemp",
|
|
70646
|
-
"valueType": "number"
|
|
70647
|
-
},
|
|
70648
|
-
{
|
|
70649
|
-
"path": "tempStep",
|
|
70650
|
-
"valueType": "number"
|
|
70651
|
-
}
|
|
70652
|
-
],
|
|
70653
|
-
"color": [
|
|
70654
|
-
{
|
|
70655
|
-
"path": "mode",
|
|
70656
|
-
"valueType": "enum",
|
|
70657
|
-
"enumValues": [
|
|
70658
|
-
"rgb",
|
|
70659
|
-
"hsv",
|
|
70660
|
-
"mired"
|
|
70661
|
-
]
|
|
70662
|
-
},
|
|
70663
|
-
{
|
|
70664
|
-
"path": "rgb.r",
|
|
70665
|
-
"valueType": "number"
|
|
70666
|
-
},
|
|
70667
|
-
{
|
|
70668
|
-
"path": "rgb.g",
|
|
70669
|
-
"valueType": "number"
|
|
70670
|
-
},
|
|
70671
|
-
{
|
|
70672
|
-
"path": "rgb.b",
|
|
70673
|
-
"valueType": "number"
|
|
70674
|
-
},
|
|
70675
|
-
{
|
|
70676
|
-
"path": "hsv.h",
|
|
70677
|
-
"valueType": "number"
|
|
70678
|
-
},
|
|
70679
|
-
{
|
|
70680
|
-
"path": "hsv.s",
|
|
70681
|
-
"valueType": "number"
|
|
70682
|
-
},
|
|
70683
|
-
{
|
|
70684
|
-
"path": "hsv.v",
|
|
70685
|
-
"valueType": "number"
|
|
70686
|
-
},
|
|
70687
|
-
{
|
|
70688
|
-
"path": "mireds",
|
|
70689
|
-
"valueType": "number"
|
|
70690
|
-
}
|
|
70691
|
-
],
|
|
70692
|
-
"connectivity": [{
|
|
70693
|
-
"path": "connected",
|
|
70694
|
-
"valueType": "boolean"
|
|
70695
|
-
}],
|
|
70696
|
-
"contact": [{
|
|
70697
|
-
"path": "entryOpen",
|
|
70698
|
-
"valueType": "boolean"
|
|
70699
|
-
}],
|
|
70700
|
-
"control": [
|
|
70701
|
-
{
|
|
70702
|
-
"path": "kind",
|
|
70703
|
-
"valueType": "enum",
|
|
70704
|
-
"enumValues": [
|
|
70705
|
-
"numeric",
|
|
70706
|
-
"select",
|
|
70707
|
-
"text",
|
|
70708
|
-
"datetime"
|
|
70709
|
-
]
|
|
70710
|
-
},
|
|
70711
|
-
{
|
|
70712
|
-
"path": "unit",
|
|
70713
|
-
"valueType": "string"
|
|
70714
|
-
},
|
|
70715
|
-
{
|
|
70716
|
-
"path": "min",
|
|
70717
|
-
"valueType": "number"
|
|
70718
|
-
},
|
|
70719
|
-
{
|
|
70720
|
-
"path": "max",
|
|
70721
|
-
"valueType": "number"
|
|
70722
|
-
},
|
|
70723
|
-
{
|
|
70724
|
-
"path": "step",
|
|
70725
|
-
"valueType": "number"
|
|
70726
|
-
},
|
|
70727
|
-
{
|
|
70728
|
-
"path": "precision",
|
|
70729
|
-
"valueType": "number"
|
|
70730
|
-
},
|
|
70731
|
-
{
|
|
70732
|
-
"path": "format",
|
|
70733
|
-
"valueType": "enum",
|
|
70734
|
-
"enumValues": [
|
|
70735
|
-
"date",
|
|
70736
|
-
"time",
|
|
70737
|
-
"datetime"
|
|
70738
|
-
]
|
|
70739
|
-
}
|
|
70740
|
-
],
|
|
70741
|
-
"cover": [
|
|
70742
|
-
{
|
|
70743
|
-
"path": "state",
|
|
70744
|
-
"valueType": "enum",
|
|
70745
|
-
"enumValues": [
|
|
70746
|
-
"open",
|
|
70747
|
-
"opening",
|
|
70748
|
-
"closing",
|
|
70749
|
-
"closed",
|
|
70750
|
-
"stopped"
|
|
70751
|
-
]
|
|
70752
|
-
},
|
|
70753
|
-
{
|
|
70754
|
-
"path": "position",
|
|
70755
|
-
"valueType": "number"
|
|
70756
|
-
},
|
|
70757
|
-
{
|
|
70758
|
-
"path": "tiltPosition",
|
|
70759
|
-
"valueType": "number"
|
|
70760
|
-
}
|
|
70761
|
-
],
|
|
70762
|
-
"day-night": [
|
|
70763
|
-
{
|
|
70764
|
-
"path": "mode",
|
|
70765
|
-
"valueType": "enum",
|
|
70766
|
-
"enumValues": [
|
|
70767
|
-
"auto",
|
|
70768
|
-
"day",
|
|
70769
|
-
"night",
|
|
70770
|
-
"schedule"
|
|
70771
|
-
]
|
|
70772
|
-
},
|
|
70773
|
-
{
|
|
70774
|
-
"path": "sensitivity",
|
|
70775
|
-
"valueType": "number"
|
|
70776
|
-
},
|
|
70777
|
-
{
|
|
70778
|
-
"path": "switchDelaySec",
|
|
70779
|
-
"valueType": "number"
|
|
70780
|
-
}
|
|
70781
|
-
],
|
|
70782
|
-
"device-adoption": [
|
|
70783
|
-
{
|
|
70784
|
-
"path": "lastDiscoveryAt",
|
|
70785
|
-
"valueType": "number"
|
|
70786
|
-
},
|
|
70787
|
-
{
|
|
70788
|
-
"path": "candidateCount",
|
|
70789
|
-
"valueType": "number"
|
|
70790
|
-
},
|
|
70791
|
-
{
|
|
70792
|
-
"path": "adoptedCount",
|
|
70793
|
-
"valueType": "number"
|
|
70794
|
-
},
|
|
70795
|
-
{
|
|
70796
|
-
"path": "lastError",
|
|
70797
|
-
"valueType": "string"
|
|
70798
|
-
}
|
|
70799
|
-
],
|
|
70800
|
-
"device-discovery": [{
|
|
70801
|
-
"path": "lastDiscoveryAt",
|
|
70802
|
-
"valueType": "number"
|
|
70803
|
-
}, {
|
|
70804
|
-
"path": "lastError",
|
|
70805
|
-
"valueType": "string"
|
|
70806
|
-
}],
|
|
70807
|
-
"device-export": [
|
|
70808
|
-
{
|
|
70809
|
-
"path": "linkState",
|
|
70810
|
-
"valueType": "enum",
|
|
70811
|
-
"enumValues": [
|
|
70812
|
-
"unlinked",
|
|
70813
|
-
"linked",
|
|
70814
|
-
"error"
|
|
70815
|
-
]
|
|
70816
|
-
},
|
|
70817
|
-
{
|
|
70818
|
-
"path": "exposedDeviceCount",
|
|
70819
|
-
"valueType": "number"
|
|
70820
|
-
},
|
|
70821
|
-
{
|
|
70822
|
-
"path": "error",
|
|
70823
|
-
"valueType": "string"
|
|
70824
|
-
},
|
|
70825
|
-
{
|
|
70826
|
-
"path": "setup.qr",
|
|
70827
|
-
"valueType": "string"
|
|
70828
|
-
},
|
|
70829
|
-
{
|
|
70830
|
-
"path": "setup.note",
|
|
70831
|
-
"valueType": "string"
|
|
70832
|
-
}
|
|
70833
|
-
],
|
|
70834
|
-
"device-status": [{
|
|
70835
|
-
"path": "online",
|
|
70836
|
-
"valueType": "boolean"
|
|
70837
|
-
}],
|
|
70838
|
-
"dishwasher": [
|
|
70839
|
-
{
|
|
70840
|
-
"path": "availability",
|
|
70841
|
-
"valueType": "enum",
|
|
70842
|
-
"enumValues": [
|
|
70843
|
-
"available",
|
|
70844
|
-
"offline",
|
|
70845
|
-
"description-missing"
|
|
70846
|
-
]
|
|
70847
|
-
},
|
|
70848
|
-
{
|
|
70849
|
-
"path": "state",
|
|
70850
|
-
"valueType": "enum",
|
|
70851
|
-
"enumValues": [
|
|
70852
|
-
"idle",
|
|
70853
|
-
"running",
|
|
70854
|
-
"paused",
|
|
70855
|
-
"finished",
|
|
70856
|
-
"error",
|
|
70857
|
-
"unavailable"
|
|
70858
|
-
]
|
|
70859
|
-
},
|
|
70860
|
-
{
|
|
70861
|
-
"path": "operationState",
|
|
70862
|
-
"valueType": "enum",
|
|
70863
|
-
"enumValues": [
|
|
70864
|
-
"Inactive",
|
|
70865
|
-
"Ready",
|
|
70866
|
-
"DelayedStart",
|
|
70867
|
-
"Run",
|
|
70868
|
-
"Pause",
|
|
70869
|
-
"ActionRequired",
|
|
70870
|
-
"Finished",
|
|
70871
|
-
"Error",
|
|
70872
|
-
"Aborting"
|
|
70873
|
-
]
|
|
70874
|
-
},
|
|
70875
|
-
{
|
|
70876
|
-
"path": "program",
|
|
70877
|
-
"valueType": "string"
|
|
70878
|
-
},
|
|
70879
|
-
{
|
|
70880
|
-
"path": "selectedProgram",
|
|
70881
|
-
"valueType": "string"
|
|
70882
|
-
},
|
|
70883
|
-
{
|
|
70884
|
-
"path": "remainingSeconds",
|
|
70885
|
-
"valueType": "number"
|
|
70886
|
-
},
|
|
70887
|
-
{
|
|
70888
|
-
"path": "delayedStartSeconds",
|
|
70889
|
-
"valueType": "number"
|
|
70890
|
-
},
|
|
70891
|
-
{
|
|
70892
|
-
"path": "progressPercent",
|
|
70893
|
-
"valueType": "number"
|
|
70894
|
-
},
|
|
70895
|
-
{
|
|
70896
|
-
"path": "doorOpen",
|
|
70897
|
-
"valueType": "boolean"
|
|
70898
|
-
},
|
|
70899
|
-
{
|
|
70900
|
-
"path": "doorLocked",
|
|
70901
|
-
"valueType": "boolean"
|
|
70902
|
-
},
|
|
70903
|
-
{
|
|
70904
|
-
"path": "remoteStartAllowed",
|
|
70905
|
-
"valueType": "boolean"
|
|
70906
|
-
},
|
|
70907
|
-
{
|
|
70908
|
-
"path": "remoteControlActive",
|
|
70909
|
-
"valueType": "boolean"
|
|
70910
|
-
},
|
|
70911
|
-
{
|
|
70912
|
-
"path": "localControlActive",
|
|
70913
|
-
"valueType": "boolean"
|
|
70914
|
-
},
|
|
70915
|
-
{
|
|
70916
|
-
"path": "powerOn",
|
|
70917
|
-
"valueType": "boolean"
|
|
70918
|
-
},
|
|
70919
|
-
{
|
|
70920
|
-
"path": "powerState",
|
|
70921
|
-
"valueType": "string"
|
|
70922
|
-
},
|
|
70923
|
-
{
|
|
70924
|
-
"path": "filterCleaningDue",
|
|
70925
|
-
"valueType": "boolean"
|
|
70926
|
-
},
|
|
70927
|
-
{
|
|
70928
|
-
"path": "machineCareDue",
|
|
70929
|
-
"valueType": "boolean"
|
|
70930
|
-
},
|
|
70931
|
-
{
|
|
70932
|
-
"path": "machineCareRemainingRuns",
|
|
70933
|
-
"valueType": "number"
|
|
70934
|
-
},
|
|
70935
|
-
{
|
|
70936
|
-
"path": "halfLoad",
|
|
70937
|
-
"valueType": "boolean"
|
|
70938
|
-
},
|
|
70939
|
-
{
|
|
70940
|
-
"path": "hygienePlus",
|
|
70941
|
-
"valueType": "boolean"
|
|
70942
|
-
},
|
|
70943
|
-
{
|
|
70944
|
-
"path": "extraDry",
|
|
70945
|
-
"valueType": "boolean"
|
|
70946
|
-
},
|
|
70947
|
-
{
|
|
70948
|
-
"path": "intensiveZone",
|
|
70949
|
-
"valueType": "boolean"
|
|
70950
|
-
},
|
|
70951
|
-
{
|
|
70952
|
-
"path": "varioSpeedPlus",
|
|
70953
|
-
"valueType": "boolean"
|
|
70954
|
-
},
|
|
70955
|
-
{
|
|
70956
|
-
"path": "childLock",
|
|
70957
|
-
"valueType": "boolean"
|
|
70958
|
-
},
|
|
70959
|
-
{
|
|
70960
|
-
"path": "errorCode",
|
|
70961
|
-
"valueType": "number"
|
|
70962
|
-
},
|
|
70963
|
-
{
|
|
70964
|
-
"path": "errorLabel",
|
|
70965
|
-
"valueType": "string"
|
|
70966
|
-
}
|
|
70967
|
-
],
|
|
70968
|
-
"doorbell": [{
|
|
70969
|
-
"path": "lastPressedAt",
|
|
70970
|
-
"valueType": "number"
|
|
70971
|
-
}, {
|
|
70972
|
-
"path": "pressCountSinceStart",
|
|
70973
|
-
"valueType": "number"
|
|
70974
|
-
}],
|
|
70975
|
-
"enum-sensor": [{
|
|
70976
|
-
"path": "value",
|
|
70977
|
-
"valueType": "string"
|
|
70978
|
-
}, {
|
|
70979
|
-
"path": "format",
|
|
70980
|
-
"valueType": "enum",
|
|
70981
|
-
"enumValues": [
|
|
70982
|
-
"date",
|
|
70983
|
-
"time",
|
|
70984
|
-
"datetime"
|
|
70985
|
-
]
|
|
70986
|
-
}],
|
|
70987
|
-
"event-emitter": [
|
|
70988
|
-
{
|
|
70989
|
-
"path": "lastEvent.deviceId",
|
|
70990
|
-
"valueType": "number"
|
|
70991
|
-
},
|
|
70992
|
-
{
|
|
70993
|
-
"path": "lastEvent.eventType",
|
|
70994
|
-
"valueType": "string"
|
|
70995
|
-
},
|
|
70996
|
-
{
|
|
70997
|
-
"path": "lastEvent.timestamp",
|
|
70998
|
-
"valueType": "number"
|
|
70999
|
-
},
|
|
71000
|
-
{
|
|
71001
|
-
"path": "lastEvent.seq",
|
|
71002
|
-
"valueType": "number"
|
|
71003
|
-
},
|
|
71004
|
-
{
|
|
71005
|
-
"path": "eventCountSinceStart",
|
|
71006
|
-
"valueType": "number"
|
|
71007
|
-
}
|
|
71008
|
-
],
|
|
71009
|
-
"fan-control": [
|
|
71010
|
-
{
|
|
71011
|
-
"path": "percentage",
|
|
71012
|
-
"valueType": "number"
|
|
71013
|
-
},
|
|
71014
|
-
{
|
|
71015
|
-
"path": "percentageStep",
|
|
71016
|
-
"valueType": "number"
|
|
71017
|
-
},
|
|
71018
|
-
{
|
|
71019
|
-
"path": "preset",
|
|
71020
|
-
"valueType": "string"
|
|
71021
|
-
},
|
|
71022
|
-
{
|
|
71023
|
-
"path": "direction",
|
|
71024
|
-
"valueType": "enum",
|
|
71025
|
-
"enumValues": ["forward", "reverse"]
|
|
71026
|
-
},
|
|
71027
|
-
{
|
|
71028
|
-
"path": "oscillating",
|
|
71029
|
-
"valueType": "boolean"
|
|
71030
|
-
}
|
|
71031
|
-
],
|
|
71032
|
-
"feature-probe": [
|
|
71033
|
-
{
|
|
71034
|
-
"path": "deviceType",
|
|
71035
|
-
"valueType": "string"
|
|
71036
|
-
},
|
|
71037
|
-
{
|
|
71038
|
-
"path": "model",
|
|
71039
|
-
"valueType": "string"
|
|
71040
|
-
},
|
|
71041
|
-
{
|
|
71042
|
-
"path": "channelCount",
|
|
71043
|
-
"valueType": "number"
|
|
71044
|
-
},
|
|
71045
|
-
{
|
|
71046
|
-
"path": "lastProbedAt",
|
|
71047
|
-
"valueType": "number"
|
|
71048
|
-
}
|
|
71049
|
-
],
|
|
71050
|
-
"flood": [{
|
|
71051
|
-
"path": "flooded",
|
|
71052
|
-
"valueType": "boolean"
|
|
71053
|
-
}],
|
|
71054
|
-
"gas": [{
|
|
71055
|
-
"path": "detected",
|
|
71056
|
-
"valueType": "boolean"
|
|
71057
|
-
}],
|
|
71058
|
-
"heating-valve": [{
|
|
71059
|
-
"path": "position",
|
|
71060
|
-
"valueType": "number"
|
|
71061
|
-
}],
|
|
71062
|
-
"humidifier": [
|
|
71063
|
-
{
|
|
71064
|
-
"path": "on",
|
|
71065
|
-
"valueType": "boolean"
|
|
71066
|
-
},
|
|
71067
|
-
{
|
|
71068
|
-
"path": "currentHumidity",
|
|
71069
|
-
"valueType": "number"
|
|
71070
|
-
},
|
|
71071
|
-
{
|
|
71072
|
-
"path": "targetHumidity",
|
|
71073
|
-
"valueType": "number"
|
|
71074
|
-
},
|
|
71075
|
-
{
|
|
71076
|
-
"path": "mode",
|
|
71077
|
-
"valueType": "string"
|
|
71078
|
-
},
|
|
71079
|
-
{
|
|
71080
|
-
"path": "action",
|
|
71081
|
-
"valueType": "string"
|
|
71082
|
-
},
|
|
71083
|
-
{
|
|
71084
|
-
"path": "minHumidity",
|
|
71085
|
-
"valueType": "number"
|
|
71086
|
-
},
|
|
71087
|
-
{
|
|
71088
|
-
"path": "maxHumidity",
|
|
71089
|
-
"valueType": "number"
|
|
71090
|
-
}
|
|
71091
|
-
],
|
|
71092
|
-
"humidity-sensor": [
|
|
71093
|
-
{
|
|
71094
|
-
"path": "percent",
|
|
71095
|
-
"valueType": "number"
|
|
71096
|
-
},
|
|
71097
|
-
{
|
|
71098
|
-
"path": "unit",
|
|
71099
|
-
"valueType": "string"
|
|
71100
|
-
},
|
|
71101
|
-
{
|
|
71102
|
-
"path": "precision",
|
|
71103
|
-
"valueType": "number"
|
|
71104
|
-
}
|
|
71105
|
-
],
|
|
71106
|
-
"image": [{
|
|
71107
|
-
"path": "url",
|
|
71108
|
-
"valueType": "string"
|
|
71109
|
-
}, {
|
|
71110
|
-
"path": "lastUpdated",
|
|
71111
|
-
"valueType": "number"
|
|
71112
|
-
}],
|
|
71113
|
-
"image-settings": [
|
|
71114
|
-
{
|
|
71115
|
-
"path": "brightness",
|
|
71116
|
-
"valueType": "number"
|
|
71117
|
-
},
|
|
71118
|
-
{
|
|
71119
|
-
"path": "contrast",
|
|
71120
|
-
"valueType": "number"
|
|
71121
|
-
},
|
|
71122
|
-
{
|
|
71123
|
-
"path": "saturation",
|
|
71124
|
-
"valueType": "number"
|
|
71125
|
-
},
|
|
71126
|
-
{
|
|
71127
|
-
"path": "sharpness",
|
|
71128
|
-
"valueType": "number"
|
|
71129
|
-
},
|
|
71130
|
-
{
|
|
71131
|
-
"path": "mirror",
|
|
71132
|
-
"valueType": "boolean"
|
|
71133
|
-
},
|
|
71134
|
-
{
|
|
71135
|
-
"path": "flip",
|
|
71136
|
-
"valueType": "boolean"
|
|
71137
|
-
},
|
|
71138
|
-
{
|
|
71139
|
-
"path": "rotate",
|
|
71140
|
-
"valueType": "enum",
|
|
71141
|
-
"enumValues": [
|
|
71142
|
-
"0",
|
|
71143
|
-
"90",
|
|
71144
|
-
"180",
|
|
71145
|
-
"270"
|
|
71146
|
-
]
|
|
71147
|
-
},
|
|
71148
|
-
{
|
|
71149
|
-
"path": "whiteBalance",
|
|
71150
|
-
"valueType": "enum",
|
|
71151
|
-
"enumValues": ["auto", "manual"]
|
|
71152
|
-
},
|
|
71153
|
-
{
|
|
71154
|
-
"path": "warmth",
|
|
71155
|
-
"valueType": "number"
|
|
71156
|
-
},
|
|
71157
|
-
{
|
|
71158
|
-
"path": "exposureMode",
|
|
71159
|
-
"valueType": "enum",
|
|
71160
|
-
"enumValues": ["auto", "manual"]
|
|
71161
|
-
},
|
|
71162
|
-
{
|
|
71163
|
-
"path": "backlightMode",
|
|
71164
|
-
"valueType": "enum",
|
|
71165
|
-
"enumValues": [
|
|
71166
|
-
"off",
|
|
71167
|
-
"blc",
|
|
71168
|
-
"wdr",
|
|
71169
|
-
"hlc"
|
|
71170
|
-
]
|
|
71171
|
-
}
|
|
71172
|
-
],
|
|
71173
|
-
"intercom": [
|
|
71174
|
-
{
|
|
71175
|
-
"path": "talking",
|
|
71176
|
-
"valueType": "boolean"
|
|
71177
|
-
},
|
|
71178
|
-
{
|
|
71179
|
-
"path": "lastSessionAt",
|
|
71180
|
-
"valueType": "number"
|
|
71181
|
-
},
|
|
71182
|
-
{
|
|
71183
|
-
"path": "ability.sampleRate",
|
|
71184
|
-
"valueType": "number"
|
|
71185
|
-
},
|
|
71186
|
-
{
|
|
71187
|
-
"path": "ability.duplex",
|
|
71188
|
-
"valueType": "enum",
|
|
71189
|
-
"enumValues": ["half", "full"]
|
|
71190
|
-
},
|
|
71191
|
-
{
|
|
71192
|
-
"path": "ability.maxBacklogMs",
|
|
71193
|
-
"valueType": "number"
|
|
71194
|
-
}
|
|
71195
|
-
],
|
|
71196
|
-
"lawn-mower-control": [
|
|
71197
|
-
{
|
|
71198
|
-
"path": "activity",
|
|
71199
|
-
"valueType": "enum",
|
|
71200
|
-
"enumValues": [
|
|
71201
|
-
"idle",
|
|
71202
|
-
"mowing",
|
|
71203
|
-
"paused",
|
|
71204
|
-
"docked",
|
|
71205
|
-
"error"
|
|
71206
|
-
]
|
|
71207
|
-
},
|
|
71208
|
-
{
|
|
71209
|
-
"path": "batteryLevel",
|
|
71210
|
-
"valueType": "number"
|
|
71211
|
-
},
|
|
71212
|
-
{
|
|
71213
|
-
"path": "progressPercent",
|
|
71214
|
-
"valueType": "number"
|
|
71215
|
-
},
|
|
71216
|
-
{
|
|
71217
|
-
"path": "currentCode",
|
|
71218
|
-
"valueType": "number"
|
|
71219
|
-
},
|
|
71220
|
-
{
|
|
71221
|
-
"path": "currentCodeLabel",
|
|
71222
|
-
"valueType": "string"
|
|
71223
|
-
},
|
|
71224
|
-
{
|
|
71225
|
-
"path": "severity",
|
|
71226
|
-
"valueType": "enum",
|
|
71227
|
-
"enumValues": [
|
|
71228
|
-
"info",
|
|
71229
|
-
"warning",
|
|
71230
|
-
"error"
|
|
71231
|
-
]
|
|
71232
|
-
}
|
|
71233
|
-
],
|
|
71234
|
-
"lock-control": [{
|
|
71235
|
-
"path": "state",
|
|
71236
|
-
"valueType": "enum",
|
|
71237
|
-
"enumValues": [
|
|
71238
|
-
"locked",
|
|
71239
|
-
"unlocked",
|
|
71240
|
-
"locking",
|
|
71241
|
-
"unlocking",
|
|
71242
|
-
"jammed"
|
|
71243
|
-
]
|
|
71244
|
-
}],
|
|
71245
|
-
"media-player": [
|
|
71246
|
-
{
|
|
71247
|
-
"path": "state",
|
|
71248
|
-
"valueType": "enum",
|
|
71249
|
-
"enumValues": [
|
|
71250
|
-
"off",
|
|
71251
|
-
"on",
|
|
71252
|
-
"idle",
|
|
71253
|
-
"playing",
|
|
71254
|
-
"paused",
|
|
71255
|
-
"buffering",
|
|
71256
|
-
"standby"
|
|
71257
|
-
]
|
|
71258
|
-
},
|
|
71259
|
-
{
|
|
71260
|
-
"path": "volumeLevel",
|
|
71261
|
-
"valueType": "number"
|
|
71262
|
-
},
|
|
71263
|
-
{
|
|
71264
|
-
"path": "isMuted",
|
|
71265
|
-
"valueType": "boolean"
|
|
71266
|
-
},
|
|
71267
|
-
{
|
|
71268
|
-
"path": "source",
|
|
71269
|
-
"valueType": "string"
|
|
71270
|
-
},
|
|
71271
|
-
{
|
|
71272
|
-
"path": "currentMedia.type",
|
|
71273
|
-
"valueType": "string"
|
|
71274
|
-
},
|
|
71275
|
-
{
|
|
71276
|
-
"path": "currentMedia.title",
|
|
71277
|
-
"valueType": "string"
|
|
71278
|
-
},
|
|
71279
|
-
{
|
|
71280
|
-
"path": "currentMedia.artist",
|
|
71281
|
-
"valueType": "string"
|
|
71282
|
-
},
|
|
71283
|
-
{
|
|
71284
|
-
"path": "currentMedia.album",
|
|
71285
|
-
"valueType": "string"
|
|
71286
|
-
},
|
|
71287
|
-
{
|
|
71288
|
-
"path": "currentMedia.imageUrl",
|
|
71289
|
-
"valueType": "string"
|
|
71290
|
-
},
|
|
71291
|
-
{
|
|
71292
|
-
"path": "positionMs",
|
|
71293
|
-
"valueType": "number"
|
|
71294
|
-
},
|
|
71295
|
-
{
|
|
71296
|
-
"path": "durationMs",
|
|
71297
|
-
"valueType": "number"
|
|
71298
|
-
},
|
|
71299
|
-
{
|
|
71300
|
-
"path": "shuffle",
|
|
71301
|
-
"valueType": "boolean"
|
|
71302
|
-
},
|
|
71303
|
-
{
|
|
71304
|
-
"path": "repeat",
|
|
71305
|
-
"valueType": "enum",
|
|
71306
|
-
"enumValues": [
|
|
71307
|
-
"off",
|
|
71308
|
-
"all",
|
|
71309
|
-
"one"
|
|
71310
|
-
]
|
|
71311
|
-
}
|
|
71312
|
-
],
|
|
71313
|
-
"motion": [
|
|
71314
|
-
{
|
|
71315
|
-
"path": "detected",
|
|
71316
|
-
"valueType": "boolean"
|
|
71317
|
-
},
|
|
71318
|
-
{
|
|
71319
|
-
"path": "lastDetectedAt",
|
|
71320
|
-
"valueType": "number"
|
|
71321
|
-
},
|
|
71322
|
-
{
|
|
71323
|
-
"path": "autoClearAfterMs",
|
|
71324
|
-
"valueType": "number"
|
|
71325
|
-
}
|
|
71326
|
-
],
|
|
71327
|
-
"motion-trigger": [{
|
|
71328
|
-
"path": "enabled",
|
|
71329
|
-
"valueType": "boolean"
|
|
71330
|
-
}],
|
|
71331
|
-
"motion-zones": [{
|
|
71332
|
-
"path": "enabled",
|
|
71333
|
-
"valueType": "boolean"
|
|
71334
|
-
}, {
|
|
71335
|
-
"path": "sensitivity",
|
|
71336
|
-
"valueType": "number"
|
|
71337
|
-
}],
|
|
71338
|
-
"mqtt-broker": [{
|
|
71339
|
-
"path": "brokerCount",
|
|
71340
|
-
"valueType": "number"
|
|
71341
|
-
}, {
|
|
71342
|
-
"path": "embeddedRunning",
|
|
71343
|
-
"valueType": "boolean"
|
|
71344
|
-
}],
|
|
71345
|
-
"native-object-detection": [{
|
|
71346
|
-
"path": "enabled",
|
|
71347
|
-
"valueType": "boolean"
|
|
71348
|
-
}],
|
|
71349
|
-
"navigation": [
|
|
71350
|
-
{
|
|
71351
|
-
"path": "mode",
|
|
71352
|
-
"valueType": "enum",
|
|
71353
|
-
"enumValues": [
|
|
71354
|
-
"idle",
|
|
71355
|
-
"cleaning",
|
|
71356
|
-
"spot",
|
|
71357
|
-
"following",
|
|
71358
|
-
"goto",
|
|
71359
|
-
"returning",
|
|
71360
|
-
"paused",
|
|
71361
|
-
"unknown"
|
|
71362
|
-
]
|
|
71363
|
-
},
|
|
71364
|
-
{
|
|
71365
|
-
"path": "following",
|
|
71366
|
-
"valueType": "boolean"
|
|
71367
|
-
},
|
|
71368
|
-
{
|
|
71369
|
-
"path": "flash",
|
|
71370
|
-
"valueType": "boolean"
|
|
71371
|
-
},
|
|
71372
|
-
{
|
|
71373
|
-
"path": "lightMode",
|
|
71374
|
-
"valueType": "enum",
|
|
71375
|
-
"enumValues": ["auto", "manual"]
|
|
71376
|
-
},
|
|
71377
|
-
{
|
|
71378
|
-
"path": "lightLevel",
|
|
71379
|
-
"valueType": "number"
|
|
71380
|
-
}
|
|
71381
|
-
],
|
|
71382
|
-
"network-link": [
|
|
71383
|
-
{
|
|
71384
|
-
"path": "type",
|
|
71385
|
-
"valueType": "enum",
|
|
71386
|
-
"enumValues": [
|
|
71387
|
-
"wifi",
|
|
71388
|
-
"ethernet",
|
|
71389
|
-
"cellular",
|
|
71390
|
-
"unknown"
|
|
71391
|
-
]
|
|
71392
|
-
},
|
|
71393
|
-
{
|
|
71394
|
-
"path": "signalPercent",
|
|
71395
|
-
"valueType": "number"
|
|
71396
|
-
},
|
|
71397
|
-
{
|
|
71398
|
-
"path": "rssiDbm",
|
|
71399
|
-
"valueType": "number"
|
|
71400
|
-
},
|
|
71401
|
-
{
|
|
71402
|
-
"path": "ssid",
|
|
71403
|
-
"valueType": "string"
|
|
71404
|
-
},
|
|
71405
|
-
{
|
|
71406
|
-
"path": "lastUpdated",
|
|
71407
|
-
"valueType": "number"
|
|
71408
|
-
}
|
|
71409
|
-
],
|
|
71410
|
-
"notifier": [
|
|
71411
|
-
{
|
|
71412
|
-
"path": "lastSentAt",
|
|
71413
|
-
"valueType": "number"
|
|
71414
|
-
},
|
|
71415
|
-
{
|
|
71416
|
-
"path": "lastError",
|
|
71417
|
-
"valueType": "string"
|
|
71418
|
-
},
|
|
71419
|
-
{
|
|
71420
|
-
"path": "queueDepth",
|
|
71421
|
-
"valueType": "number"
|
|
71422
|
-
},
|
|
71423
|
-
{
|
|
71424
|
-
"path": "supports.image",
|
|
71425
|
-
"valueType": "boolean"
|
|
71426
|
-
},
|
|
71427
|
-
{
|
|
71428
|
-
"path": "supports.priority",
|
|
71429
|
-
"valueType": "boolean"
|
|
71430
|
-
},
|
|
71431
|
-
{
|
|
71432
|
-
"path": "supports.data",
|
|
71433
|
-
"valueType": "boolean"
|
|
71434
|
-
},
|
|
71435
|
-
{
|
|
71436
|
-
"path": "supports.actions",
|
|
71437
|
-
"valueType": "boolean"
|
|
71438
|
-
},
|
|
71439
|
-
{
|
|
71440
|
-
"path": "supports.recipients",
|
|
71441
|
-
"valueType": "boolean"
|
|
71442
|
-
}
|
|
71443
|
-
],
|
|
71444
|
-
"numeric-sensor": [
|
|
71445
|
-
{
|
|
71446
|
-
"path": "value",
|
|
71447
|
-
"valueType": "number"
|
|
71448
|
-
},
|
|
71449
|
-
{
|
|
71450
|
-
"path": "unit",
|
|
71451
|
-
"valueType": "string"
|
|
71452
|
-
},
|
|
71453
|
-
{
|
|
71454
|
-
"path": "precision",
|
|
71455
|
-
"valueType": "number"
|
|
71456
|
-
}
|
|
71457
|
-
],
|
|
71458
|
-
"pet-feeder": [
|
|
71459
|
-
{
|
|
71460
|
-
"path": "foodLevel",
|
|
71461
|
-
"valueType": "number"
|
|
71462
|
-
},
|
|
71463
|
-
{
|
|
71464
|
-
"path": "food1",
|
|
71465
|
-
"valueType": "number"
|
|
71466
|
-
},
|
|
71467
|
-
{
|
|
71468
|
-
"path": "food2",
|
|
71469
|
-
"valueType": "number"
|
|
71470
|
-
},
|
|
71471
|
-
{
|
|
71472
|
-
"path": "lowFood",
|
|
71473
|
-
"valueType": "boolean"
|
|
71474
|
-
},
|
|
71475
|
-
{
|
|
71476
|
-
"path": "batteryPower",
|
|
71477
|
-
"valueType": "number"
|
|
71478
|
-
},
|
|
71479
|
-
{
|
|
71480
|
-
"path": "desiccantLeftDays",
|
|
71481
|
-
"valueType": "number"
|
|
71482
|
-
},
|
|
71483
|
-
{
|
|
71484
|
-
"path": "feeding",
|
|
71485
|
-
"valueType": "boolean"
|
|
71486
|
-
},
|
|
71487
|
-
{
|
|
71488
|
-
"path": "status",
|
|
71489
|
-
"valueType": "enum",
|
|
71490
|
-
"enumValues": [
|
|
71491
|
-
"normal",
|
|
71492
|
-
"offline",
|
|
71493
|
-
"on_batteries"
|
|
71494
|
-
]
|
|
71495
|
-
},
|
|
71496
|
-
{
|
|
71497
|
-
"path": "error",
|
|
71498
|
-
"valueType": "string"
|
|
71499
|
-
},
|
|
71500
|
-
{
|
|
71501
|
-
"path": "errorCode",
|
|
71502
|
-
"valueType": "number"
|
|
71503
|
-
},
|
|
71504
|
-
{
|
|
71505
|
-
"path": "isDualHopper",
|
|
71506
|
-
"valueType": "boolean"
|
|
71507
|
-
},
|
|
71508
|
-
{
|
|
71509
|
-
"path": "childLock",
|
|
71510
|
-
"valueType": "boolean"
|
|
71511
|
-
},
|
|
71512
|
-
{
|
|
71513
|
-
"path": "indicatorLight",
|
|
71514
|
-
"valueType": "boolean"
|
|
71515
|
-
},
|
|
71516
|
-
{
|
|
71517
|
-
"path": "feedSound",
|
|
71518
|
-
"valueType": "boolean"
|
|
71519
|
-
},
|
|
71520
|
-
{
|
|
71521
|
-
"path": "volume",
|
|
71522
|
-
"valueType": "number"
|
|
71523
|
-
}
|
|
71524
|
-
],
|
|
71525
|
-
"power-meter": [
|
|
71526
|
-
{
|
|
71527
|
-
"path": "watts",
|
|
71528
|
-
"valueType": "number"
|
|
71529
|
-
},
|
|
71530
|
-
{
|
|
71531
|
-
"path": "kwhTotal",
|
|
71532
|
-
"valueType": "number"
|
|
71533
|
-
},
|
|
71534
|
-
{
|
|
71535
|
-
"path": "volts",
|
|
71536
|
-
"valueType": "number"
|
|
71537
|
-
},
|
|
71538
|
-
{
|
|
71539
|
-
"path": "amps",
|
|
71540
|
-
"valueType": "number"
|
|
71541
|
-
},
|
|
71542
|
-
{
|
|
71543
|
-
"path": "va",
|
|
71544
|
-
"valueType": "number"
|
|
71545
|
-
},
|
|
71546
|
-
{
|
|
71547
|
-
"path": "powerFactor",
|
|
71548
|
-
"valueType": "number"
|
|
71549
|
-
},
|
|
71550
|
-
{
|
|
71551
|
-
"path": "unit",
|
|
71552
|
-
"valueType": "string"
|
|
71553
|
-
},
|
|
71554
|
-
{
|
|
71555
|
-
"path": "precision",
|
|
71556
|
-
"valueType": "number"
|
|
71557
|
-
}
|
|
71558
|
-
],
|
|
71559
|
-
"presence": [
|
|
71560
|
-
{
|
|
71561
|
-
"path": "state",
|
|
71562
|
-
"valueType": "string"
|
|
71563
|
-
},
|
|
71564
|
-
{
|
|
71565
|
-
"path": "location",
|
|
71566
|
-
"valueType": "string"
|
|
71567
|
-
},
|
|
71568
|
-
{
|
|
71569
|
-
"path": "gps.latitude",
|
|
71570
|
-
"valueType": "number"
|
|
71571
|
-
},
|
|
71572
|
-
{
|
|
71573
|
-
"path": "gps.longitude",
|
|
71574
|
-
"valueType": "number"
|
|
71575
|
-
},
|
|
71576
|
-
{
|
|
71577
|
-
"path": "gps.accuracyMeters",
|
|
71578
|
-
"valueType": "number"
|
|
71579
|
-
},
|
|
71580
|
-
{
|
|
71581
|
-
"path": "batteryPercent",
|
|
71582
|
-
"valueType": "number"
|
|
71583
|
-
}
|
|
71584
|
-
],
|
|
71585
|
-
"pressure-sensor": [
|
|
71586
|
-
{
|
|
71587
|
-
"path": "hpa",
|
|
71588
|
-
"valueType": "number"
|
|
71589
|
-
},
|
|
71590
|
-
{
|
|
71591
|
-
"path": "unit",
|
|
71592
|
-
"valueType": "string"
|
|
71593
|
-
},
|
|
71594
|
-
{
|
|
71595
|
-
"path": "precision",
|
|
71596
|
-
"valueType": "number"
|
|
71597
|
-
}
|
|
71598
|
-
],
|
|
71599
|
-
"privacy-mask": [{
|
|
71600
|
-
"path": "enabled",
|
|
71601
|
-
"valueType": "boolean"
|
|
71602
|
-
}, {
|
|
71603
|
-
"path": "audioEnabled",
|
|
71604
|
-
"valueType": "boolean"
|
|
71605
|
-
}],
|
|
71606
|
-
"ptz": [
|
|
71607
|
-
{
|
|
71608
|
-
"path": "pan",
|
|
71609
|
-
"valueType": "number"
|
|
71610
|
-
},
|
|
71611
|
-
{
|
|
71612
|
-
"path": "tilt",
|
|
71613
|
-
"valueType": "number"
|
|
71614
|
-
},
|
|
71615
|
-
{
|
|
71616
|
-
"path": "zoom",
|
|
71617
|
-
"valueType": "number"
|
|
71618
|
-
},
|
|
71619
|
-
{
|
|
71620
|
-
"path": "autofocus",
|
|
71621
|
-
"valueType": "boolean"
|
|
71622
|
-
}
|
|
71623
|
-
],
|
|
71624
|
-
"ptz-autotrack": [
|
|
71625
|
-
{
|
|
71626
|
-
"path": "enabled",
|
|
71627
|
-
"valueType": "boolean"
|
|
71628
|
-
},
|
|
71629
|
-
{
|
|
71630
|
-
"path": "currentSettings.targetType",
|
|
71631
|
-
"valueType": "string"
|
|
71632
|
-
},
|
|
71633
|
-
{
|
|
71634
|
-
"path": "currentSettings.stopDelaySeconds",
|
|
71635
|
-
"valueType": "number"
|
|
71636
|
-
},
|
|
71637
|
-
{
|
|
71638
|
-
"path": "currentSettings.disappearDelaySeconds",
|
|
71639
|
-
"valueType": "number"
|
|
71640
|
-
}
|
|
71641
|
-
],
|
|
71642
|
-
"recording-archive": [
|
|
71643
|
-
{
|
|
71644
|
-
"path": "deviceId",
|
|
71645
|
-
"valueType": "number"
|
|
71646
|
-
},
|
|
71647
|
-
{
|
|
71648
|
-
"path": "enabled",
|
|
71649
|
-
"valueType": "boolean"
|
|
71650
|
-
},
|
|
71651
|
-
{
|
|
71652
|
-
"path": "activeMode",
|
|
71653
|
-
"valueType": "enum",
|
|
71654
|
-
"enumValues": [
|
|
71655
|
-
"off",
|
|
71656
|
-
"events",
|
|
71657
|
-
"continuous",
|
|
71658
|
-
"on-device-decision"
|
|
71659
|
-
]
|
|
71660
|
-
},
|
|
71661
|
-
{
|
|
71662
|
-
"path": "nodeId",
|
|
71663
|
-
"valueType": "string"
|
|
71664
|
-
},
|
|
71665
|
-
{
|
|
71666
|
-
"path": "storageBytes",
|
|
71667
|
-
"valueType": "number"
|
|
71668
|
-
}
|
|
71669
|
-
],
|
|
71670
|
-
"recording-onboard": [
|
|
71671
|
-
{
|
|
71672
|
-
"path": "primaryTrackId",
|
|
71673
|
-
"valueType": "string"
|
|
71674
|
-
},
|
|
71675
|
-
{
|
|
71676
|
-
"path": "enabled",
|
|
71677
|
-
"valueType": "boolean"
|
|
71678
|
-
},
|
|
71679
|
-
{
|
|
71680
|
-
"path": "overwriteWhenFull",
|
|
71681
|
-
"valueType": "boolean"
|
|
71682
|
-
},
|
|
71683
|
-
{
|
|
71684
|
-
"path": "preRecordSec",
|
|
71685
|
-
"valueType": "number"
|
|
71686
|
-
},
|
|
71687
|
-
{
|
|
71688
|
-
"path": "postRecordSec",
|
|
71689
|
-
"valueType": "number"
|
|
71690
|
-
},
|
|
71691
|
-
{
|
|
71692
|
-
"path": "segmentMinutes",
|
|
71693
|
-
"valueType": "number"
|
|
71694
|
-
},
|
|
71695
|
-
{
|
|
71696
|
-
"path": "unreadableWindows",
|
|
71697
|
-
"valueType": "number"
|
|
71698
|
-
},
|
|
71699
|
-
{
|
|
71700
|
-
"path": "recordingToNowhere",
|
|
71701
|
-
"valueType": "boolean"
|
|
71702
|
-
}
|
|
71703
|
-
],
|
|
71704
|
-
"recording-signal": [{
|
|
71705
|
-
"path": "active",
|
|
71706
|
-
"valueType": "boolean"
|
|
71707
|
-
}, {
|
|
71708
|
-
"path": "reason",
|
|
71709
|
-
"valueType": "string"
|
|
71710
|
-
}],
|
|
71711
|
-
"running-state": [
|
|
71712
|
-
{
|
|
71713
|
-
"path": "running",
|
|
71714
|
-
"valueType": "boolean"
|
|
71715
|
-
},
|
|
71716
|
-
{
|
|
71717
|
-
"path": "since",
|
|
71718
|
-
"valueType": "number"
|
|
71719
|
-
},
|
|
71720
|
-
{
|
|
71721
|
-
"path": "source",
|
|
71722
|
-
"valueType": "enum",
|
|
71723
|
-
"enumValues": ["native", "assigned"]
|
|
71724
|
-
},
|
|
71725
|
-
{
|
|
71726
|
-
"path": "phase",
|
|
71727
|
-
"valueType": "string"
|
|
71728
|
-
}
|
|
71729
|
-
],
|
|
71730
|
-
"script-runner": [
|
|
71731
|
-
{
|
|
71732
|
-
"path": "isRunning",
|
|
71733
|
-
"valueType": "boolean"
|
|
71734
|
-
},
|
|
71735
|
-
{
|
|
71736
|
-
"path": "lastRunAt",
|
|
71737
|
-
"valueType": "number"
|
|
71738
|
-
},
|
|
71739
|
-
{
|
|
71740
|
-
"path": "lastRunSuccess",
|
|
71741
|
-
"valueType": "boolean"
|
|
71742
|
-
},
|
|
71743
|
-
{
|
|
71744
|
-
"path": "lastError",
|
|
71745
|
-
"valueType": "string"
|
|
71746
|
-
}
|
|
71747
|
-
],
|
|
71748
|
-
"smoke": [{
|
|
71749
|
-
"path": "detected",
|
|
71750
|
-
"valueType": "boolean"
|
|
71751
|
-
}],
|
|
71752
|
-
"snapshot": [
|
|
71753
|
-
{
|
|
71754
|
-
"path": "lastCapturedAt",
|
|
71755
|
-
"valueType": "number"
|
|
71756
|
-
},
|
|
71757
|
-
{
|
|
71758
|
-
"path": "cacheAgeMs",
|
|
71759
|
-
"valueType": "number"
|
|
71760
|
-
},
|
|
71761
|
-
{
|
|
71762
|
-
"path": "lastBytes",
|
|
71763
|
-
"valueType": "number"
|
|
71764
|
-
},
|
|
71765
|
-
{
|
|
71766
|
-
"path": "lastStreamId",
|
|
71767
|
-
"valueType": "string"
|
|
71768
|
-
}
|
|
71769
|
-
],
|
|
71770
|
-
"stream-params": [
|
|
71771
|
-
{
|
|
71772
|
-
"path": "main.width",
|
|
71773
|
-
"valueType": "number"
|
|
71774
|
-
},
|
|
71775
|
-
{
|
|
71776
|
-
"path": "main.height",
|
|
71777
|
-
"valueType": "number"
|
|
71778
|
-
},
|
|
71779
|
-
{
|
|
71780
|
-
"path": "main.codec",
|
|
71781
|
-
"valueType": "enum",
|
|
71782
|
-
"enumValues": ["h264", "h265"]
|
|
71783
|
-
},
|
|
71784
|
-
{
|
|
71785
|
-
"path": "main.framerate",
|
|
71786
|
-
"valueType": "number"
|
|
71787
|
-
},
|
|
71788
|
-
{
|
|
71789
|
-
"path": "main.bitrate",
|
|
71790
|
-
"valueType": "number"
|
|
71791
|
-
},
|
|
71792
|
-
{
|
|
71793
|
-
"path": "main.bitrateMode",
|
|
71794
|
-
"valueType": "enum",
|
|
71795
|
-
"enumValues": ["vbr", "cbr"]
|
|
71796
|
-
},
|
|
71797
|
-
{
|
|
71798
|
-
"path": "main.encoderProfile",
|
|
71799
|
-
"valueType": "enum",
|
|
71800
|
-
"enumValues": [
|
|
71801
|
-
"high",
|
|
71802
|
-
"main",
|
|
71803
|
-
"baseline"
|
|
71804
|
-
]
|
|
71805
|
-
},
|
|
71806
|
-
{
|
|
71807
|
-
"path": "main.gop",
|
|
71808
|
-
"valueType": "number"
|
|
71809
|
-
},
|
|
71810
|
-
{
|
|
71811
|
-
"path": "main.audio",
|
|
71812
|
-
"valueType": "boolean"
|
|
71813
|
-
},
|
|
71814
|
-
{
|
|
71815
|
-
"path": "sub.width",
|
|
71816
|
-
"valueType": "number"
|
|
71817
|
-
},
|
|
71818
|
-
{
|
|
71819
|
-
"path": "sub.height",
|
|
71820
|
-
"valueType": "number"
|
|
71821
|
-
},
|
|
71822
|
-
{
|
|
71823
|
-
"path": "sub.codec",
|
|
71824
|
-
"valueType": "enum",
|
|
71825
|
-
"enumValues": ["h264", "h265"]
|
|
71826
|
-
},
|
|
71827
|
-
{
|
|
71828
|
-
"path": "sub.framerate",
|
|
71829
|
-
"valueType": "number"
|
|
71830
|
-
},
|
|
71831
|
-
{
|
|
71832
|
-
"path": "sub.bitrate",
|
|
71833
|
-
"valueType": "number"
|
|
71834
|
-
},
|
|
71835
|
-
{
|
|
71836
|
-
"path": "sub.bitrateMode",
|
|
71837
|
-
"valueType": "enum",
|
|
71838
|
-
"enumValues": ["vbr", "cbr"]
|
|
71839
|
-
},
|
|
71840
|
-
{
|
|
71841
|
-
"path": "sub.encoderProfile",
|
|
71842
|
-
"valueType": "enum",
|
|
71843
|
-
"enumValues": [
|
|
71844
|
-
"high",
|
|
71845
|
-
"main",
|
|
71846
|
-
"baseline"
|
|
71847
|
-
]
|
|
71848
|
-
},
|
|
71849
|
-
{
|
|
71850
|
-
"path": "sub.gop",
|
|
71851
|
-
"valueType": "number"
|
|
71852
|
-
},
|
|
71853
|
-
{
|
|
71854
|
-
"path": "sub.audio",
|
|
71855
|
-
"valueType": "boolean"
|
|
71856
|
-
},
|
|
71857
|
-
{
|
|
71858
|
-
"path": "ext.width",
|
|
71859
|
-
"valueType": "number"
|
|
71860
|
-
},
|
|
71861
|
-
{
|
|
71862
|
-
"path": "ext.height",
|
|
71863
|
-
"valueType": "number"
|
|
71864
|
-
},
|
|
71865
|
-
{
|
|
71866
|
-
"path": "ext.codec",
|
|
71867
|
-
"valueType": "enum",
|
|
71868
|
-
"enumValues": ["h264", "h265"]
|
|
71869
|
-
},
|
|
71870
|
-
{
|
|
71871
|
-
"path": "ext.framerate",
|
|
71872
|
-
"valueType": "number"
|
|
71873
|
-
},
|
|
71874
|
-
{
|
|
71875
|
-
"path": "ext.bitrate",
|
|
71876
|
-
"valueType": "number"
|
|
71877
|
-
},
|
|
71878
|
-
{
|
|
71879
|
-
"path": "ext.bitrateMode",
|
|
71880
|
-
"valueType": "enum",
|
|
71881
|
-
"enumValues": ["vbr", "cbr"]
|
|
71882
|
-
},
|
|
71883
|
-
{
|
|
71884
|
-
"path": "ext.encoderProfile",
|
|
71885
|
-
"valueType": "enum",
|
|
71886
|
-
"enumValues": [
|
|
71887
|
-
"high",
|
|
71888
|
-
"main",
|
|
71889
|
-
"baseline"
|
|
71890
|
-
]
|
|
71891
|
-
},
|
|
71892
|
-
{
|
|
71893
|
-
"path": "ext.gop",
|
|
71894
|
-
"valueType": "number"
|
|
71895
|
-
},
|
|
71896
|
-
{
|
|
71897
|
-
"path": "ext.audio",
|
|
71898
|
-
"valueType": "boolean"
|
|
71899
|
-
}
|
|
71900
|
-
],
|
|
71901
|
-
"switch": [{
|
|
71902
|
-
"path": "on",
|
|
71903
|
-
"valueType": "boolean"
|
|
71904
|
-
}],
|
|
71905
|
-
"tamper": [{
|
|
71906
|
-
"path": "tampered",
|
|
71907
|
-
"valueType": "boolean"
|
|
71908
|
-
}],
|
|
71909
|
-
"temperature-sensor": [
|
|
71910
|
-
{
|
|
71911
|
-
"path": "celsius",
|
|
71912
|
-
"valueType": "number"
|
|
71913
|
-
},
|
|
71914
|
-
{
|
|
71915
|
-
"path": "unit",
|
|
71916
|
-
"valueType": "string"
|
|
71917
|
-
},
|
|
71918
|
-
{
|
|
71919
|
-
"path": "precision",
|
|
71920
|
-
"valueType": "number"
|
|
71921
|
-
}
|
|
71922
|
-
],
|
|
71923
|
-
"update": [
|
|
71924
|
-
{
|
|
71925
|
-
"path": "currentVersion",
|
|
71926
|
-
"valueType": "string"
|
|
71927
|
-
},
|
|
71928
|
-
{
|
|
71929
|
-
"path": "availableVersion",
|
|
71930
|
-
"valueType": "string"
|
|
71931
|
-
},
|
|
71932
|
-
{
|
|
71933
|
-
"path": "updatable",
|
|
71934
|
-
"valueType": "boolean"
|
|
71935
|
-
},
|
|
71936
|
-
{
|
|
71937
|
-
"path": "state",
|
|
71938
|
-
"valueType": "string"
|
|
71939
|
-
},
|
|
71940
|
-
{
|
|
71941
|
-
"path": "inProgress",
|
|
71942
|
-
"valueType": "boolean"
|
|
71943
|
-
}
|
|
71944
|
-
],
|
|
71945
|
-
"vacuum-control": [
|
|
71946
|
-
{
|
|
71947
|
-
"path": "state",
|
|
71948
|
-
"valueType": "enum",
|
|
71949
|
-
"enumValues": [
|
|
71950
|
-
"idle",
|
|
71951
|
-
"cleaning",
|
|
71952
|
-
"paused",
|
|
71953
|
-
"returning",
|
|
71954
|
-
"docked",
|
|
71955
|
-
"drying",
|
|
71956
|
-
"error"
|
|
71957
|
-
]
|
|
71958
|
-
},
|
|
71959
|
-
{
|
|
71960
|
-
"path": "batteryLevel",
|
|
71961
|
-
"valueType": "number"
|
|
71962
|
-
},
|
|
71963
|
-
{
|
|
71964
|
-
"path": "fanSpeed",
|
|
71965
|
-
"valueType": "string"
|
|
71966
|
-
},
|
|
71967
|
-
{
|
|
71968
|
-
"path": "progressPercent",
|
|
71969
|
-
"valueType": "number"
|
|
71970
|
-
},
|
|
71971
|
-
{
|
|
71972
|
-
"path": "errorCode",
|
|
71973
|
-
"valueType": "number"
|
|
71974
|
-
},
|
|
71975
|
-
{
|
|
71976
|
-
"path": "errorLabel",
|
|
71977
|
-
"valueType": "string"
|
|
71978
|
-
}
|
|
71979
|
-
],
|
|
71980
|
-
"valve": [{
|
|
71981
|
-
"path": "state",
|
|
71982
|
-
"valueType": "enum",
|
|
71983
|
-
"enumValues": [
|
|
71984
|
-
"open",
|
|
71985
|
-
"opening",
|
|
71986
|
-
"closing",
|
|
71987
|
-
"closed",
|
|
71988
|
-
"stopped"
|
|
71989
|
-
]
|
|
71990
|
-
}, {
|
|
71991
|
-
"path": "position",
|
|
71992
|
-
"valueType": "number"
|
|
71993
|
-
}],
|
|
71994
|
-
"vibration": [{
|
|
71995
|
-
"path": "detected",
|
|
71996
|
-
"valueType": "boolean"
|
|
71997
|
-
}],
|
|
71998
|
-
"water-heater": [
|
|
71999
|
-
{
|
|
72000
|
-
"path": "currentTemp",
|
|
72001
|
-
"valueType": "number"
|
|
72002
|
-
},
|
|
72003
|
-
{
|
|
72004
|
-
"path": "targetTemp",
|
|
72005
|
-
"valueType": "number"
|
|
72006
|
-
},
|
|
72007
|
-
{
|
|
72008
|
-
"path": "operationMode",
|
|
72009
|
-
"valueType": "string"
|
|
72010
|
-
},
|
|
72011
|
-
{
|
|
72012
|
-
"path": "away",
|
|
72013
|
-
"valueType": "boolean"
|
|
72014
|
-
},
|
|
72015
|
-
{
|
|
72016
|
-
"path": "minTemp",
|
|
72017
|
-
"valueType": "number"
|
|
72018
|
-
},
|
|
72019
|
-
{
|
|
72020
|
-
"path": "maxTemp",
|
|
72021
|
-
"valueType": "number"
|
|
72022
|
-
}
|
|
72023
|
-
],
|
|
72024
|
-
"weather": [
|
|
72025
|
-
{
|
|
72026
|
-
"path": "condition",
|
|
72027
|
-
"valueType": "string"
|
|
72028
|
-
},
|
|
72029
|
-
{
|
|
72030
|
-
"path": "temperature",
|
|
72031
|
-
"valueType": "number"
|
|
72032
|
-
},
|
|
72033
|
-
{
|
|
72034
|
-
"path": "temperatureUnit",
|
|
72035
|
-
"valueType": "string"
|
|
72036
|
-
},
|
|
72037
|
-
{
|
|
72038
|
-
"path": "humidity",
|
|
72039
|
-
"valueType": "number"
|
|
72040
|
-
},
|
|
72041
|
-
{
|
|
72042
|
-
"path": "pressure",
|
|
72043
|
-
"valueType": "number"
|
|
72044
|
-
},
|
|
72045
|
-
{
|
|
72046
|
-
"path": "pressureUnit",
|
|
72047
|
-
"valueType": "string"
|
|
72048
|
-
},
|
|
72049
|
-
{
|
|
72050
|
-
"path": "windSpeed",
|
|
72051
|
-
"valueType": "number"
|
|
72052
|
-
},
|
|
72053
|
-
{
|
|
72054
|
-
"path": "windSpeedUnit",
|
|
72055
|
-
"valueType": "string"
|
|
72056
|
-
},
|
|
72057
|
-
{
|
|
72058
|
-
"path": "windBearing",
|
|
72059
|
-
"valueType": "number"
|
|
72060
|
-
}
|
|
72061
|
-
],
|
|
72062
|
-
"zone-analytics": [
|
|
72063
|
-
{
|
|
72064
|
-
"path": "ts",
|
|
72065
|
-
"valueType": "number"
|
|
72066
|
-
},
|
|
72067
|
-
{
|
|
72068
|
-
"path": "frameWidth",
|
|
72069
|
-
"valueType": "number"
|
|
72070
|
-
},
|
|
72071
|
-
{
|
|
72072
|
-
"path": "frameHeight",
|
|
72073
|
-
"valueType": "number"
|
|
72074
|
-
},
|
|
72075
|
-
{
|
|
72076
|
-
"path": "frame.totalObjects",
|
|
72077
|
-
"valueType": "number"
|
|
72078
|
-
},
|
|
72079
|
-
{
|
|
72080
|
-
"path": "frame.standingObjects",
|
|
72081
|
-
"valueType": "number"
|
|
72082
|
-
},
|
|
72083
|
-
{
|
|
72084
|
-
"path": "frame.transientObjects",
|
|
72085
|
-
"valueType": "number"
|
|
72086
|
-
},
|
|
72087
|
-
{
|
|
72088
|
-
"path": "unzoned.totalObjects",
|
|
72089
|
-
"valueType": "number"
|
|
72090
|
-
},
|
|
72091
|
-
{
|
|
72092
|
-
"path": "unzoned.standingObjects",
|
|
72093
|
-
"valueType": "number"
|
|
72094
|
-
},
|
|
72095
|
-
{
|
|
72096
|
-
"path": "unzoned.transientObjects",
|
|
72097
|
-
"valueType": "number"
|
|
72098
|
-
}
|
|
72099
|
-
]
|
|
72100
|
-
});
|
|
72101
70310
|
//#endregion
|
|
72102
70311
|
//#region src/pipeline-analytics/services/sensor-transition-gate.ts
|
|
72103
70312
|
/**
|
|
@@ -72114,7 +70323,7 @@ Object.freeze({
|
|
|
72114
70323
|
* and downstream it became a `SensorEvent` row and a synthetic `contact` track
|
|
72115
70324
|
* on the linked camera's timeline.
|
|
72116
70325
|
*
|
|
72117
|
-
* Measured on camera
|
|
70326
|
+
* Measured on camera 101 / contact sensor 4131, 2026-08-29→30: **30 of 35**
|
|
72118
70327
|
* contact events were one of two non-events.
|
|
72119
70328
|
*
|
|
72120
70329
|
* - The RECOVERY family. The Zigbee entity flaps `off → unavailable → off`
|
|
@@ -72157,7 +70366,7 @@ Object.freeze({
|
|
|
72157
70366
|
* ten that have a boolean whose edge means something. `button`, `presence`,
|
|
72158
70367
|
* `enum-sensor` and `event-emitter` are NOT levels — their ARRIVAL is the
|
|
72159
70368
|
* event, and three presses in a row are three markers. Gating them would
|
|
72160
|
-
* re-ship the failure of 2026-08-08, when camera
|
|
70369
|
+
* re-ship the failure of 2026-08-08, when camera 101's press produced a row, a
|
|
72161
70370
|
* ring, a matched rule and no marker. (`doorbell` is not a level either, but
|
|
72162
70371
|
* it is not "arrival" any more: three presses are three ADVANCES of its stamp
|
|
72163
70372
|
* — see "A press is a stamp that ADVANCES" below.)
|
|
@@ -72167,7 +70376,7 @@ Object.freeze({
|
|
|
72167
70376
|
* "Arrival is the event" held only while every emission of a `doorbell` slice
|
|
72168
70377
|
* was a press. It is not: the slice is restored durable state (the cap's
|
|
72169
70378
|
* `durability: 'restored'`), and it is re-emitted by everything that rebuilds
|
|
72170
|
-
* or re-claims it. Camera
|
|
70379
|
+
* or re-claims it. Camera 101's composed doorbell (D670, HA
|
|
72171
70380
|
* `switch.doorbell_bussano`) rang on 2026-10-04 19:22:46 and 2026-10-06
|
|
72172
70381
|
* 08:10:56 with `{ lastPressedAt: null, pressCountSinceStart: <unchanged> }`:
|
|
72173
70382
|
* the HA provider was being redeployed, the composer marked the field
|
|
@@ -72448,7 +70657,7 @@ var StationarySettingsSchema = object({
|
|
|
72448
70657
|
suppressIou: number().min(.3).max(.9).default(SUPPRESS_IOU),
|
|
72449
70658
|
/** Minimum IoU for a detection to be ASSOCIATED with an entry (confirm or
|
|
72450
70659
|
* wake it) — the overlap gate that stops a different vehicle from waking a
|
|
72451
|
-
* parked entry (the
|
|
70660
|
+
* parked entry (the 102 flood fix). `WAKE_ASSOC_IOU`. */
|
|
72452
70661
|
wakeAssocIou: number().min(.02).max(.5).default(WAKE_ASSOC_IOU),
|
|
72453
70662
|
/** Recent-window stillness after which a track stops holding its motion
|
|
72454
70663
|
* session open (also the minimum track age). Creates nothing — birth is
|
|
@@ -77498,7 +75707,7 @@ var NcAlarmPanelDevice = class extends BaseDevice {
|
|
|
77498
75707
|
}
|
|
77499
75708
|
/**
|
|
77500
75709
|
* What became of a match that pressed the panel during its entry delay (D705).
|
|
77501
|
-
* Tagged with the CAMERA the match was about — "why is
|
|
75710
|
+
* Tagged with the CAMERA the match was about — "why is 101 not in the alarm
|
|
77502
75711
|
* picture" is asked per camera. A kept follower and a dropped one are both
|
|
77503
75712
|
* stated: the drop is work the operator would otherwise never see go missing.
|
|
77504
75713
|
*/
|
|
@@ -79671,7 +77880,7 @@ var TrackDetailDispatcher = class {
|
|
|
79671
77880
|
*
|
|
79672
77881
|
* Per camera and per interval rather than per frame: a coasting track offers
|
|
79673
77882
|
* one of these several times a second, and the question this answers is
|
|
79674
|
-
* always "why is
|
|
77883
|
+
* always "why is 102 worse than 101?".
|
|
79675
77884
|
*/
|
|
79676
77885
|
reportCoasted(deviceId, dev, now) {
|
|
79677
77886
|
const ignored = dev.coastedFramesIgnored - dev.coastedReportedAt.count;
|
|
@@ -81356,7 +79565,7 @@ function discardedSystemEvent(event, lookup) {
|
|
|
81356
79565
|
* `reason` is the verdict itself: `seeded` (the first observation of a
|
|
81357
79566
|
* subject — the state was recorded, nothing was said) or `no-flip` (the
|
|
81358
79567
|
* subject is already in this state). Both are answers to the operator's
|
|
81359
|
-
* question "why did
|
|
79568
|
+
* question "why did 102 not notify", and neither may be silent — a boot that
|
|
81360
79569
|
* suppressed fifteen notifications and logged nothing would be
|
|
81361
79570
|
* indistinguishable from a notification centre that had stopped working.
|
|
81362
79571
|
*/
|
|
@@ -82304,7 +80513,7 @@ function unique(values) {
|
|
|
82304
80513
|
* The COMBINED row's two keys, or null when this transition is not one.
|
|
82305
80514
|
*
|
|
82306
80515
|
* D706 (2026-10-06) changed the BODY: a rule-caused trigger now says WHERE the intrusion
|
|
82307
|
-
* went — `alarm.intrusion.body`, "Intrusion:
|
|
80516
|
+
* went — `alarm.intrusion.body`, "Intrusion: Front door, Hallway, Hall", the locations of
|
|
82308
80517
|
* the source and of every follower (D705), frozen as `{{locations}}`. The paragraphs below
|
|
82309
80518
|
* describe the D126 title, which stands; the detection sentence they defend is now the
|
|
82310
80519
|
* body of the alarm rules' own INTRUSION pushes (titled with the location) instead.
|
|
@@ -82317,14 +80526,14 @@ function unique(values) {
|
|
|
82317
80526
|
* class, identity and zones.
|
|
82318
80527
|
*
|
|
82319
80528
|
* The alarm used to write its own prose here ("The alarm was triggered by
|
|
82320
|
-
* Person at gate on
|
|
80529
|
+
* Person at gate on Front door"), which made the one notification that matters
|
|
82321
80530
|
* the only one in the system that did not look like the rule's others: no
|
|
82322
80531
|
* identity, no zone, a different subject. The prefix carries the severity; the
|
|
82323
80532
|
* familiar line carries the meaning.
|
|
82324
80533
|
*
|
|
82325
80534
|
* **Gated on the detection vocabulary, not on the source.** `detection.body`
|
|
82326
80535
|
* renders `{{subject}}`, and a fire ref with no class composes it from the
|
|
82327
|
-
* system event's dedup slot — "alarm:42 su
|
|
80536
|
+
* system event's dedup slot — "alarm:42 su Front door". A source without a class
|
|
82328
80537
|
* therefore keeps the alarm's own sentence, which is also what every row
|
|
82329
80538
|
* enqueued before this deploy carries.
|
|
82330
80539
|
*/
|
|
@@ -82395,7 +80604,7 @@ function alarmSubjectDevice(transition, panelDeviceId) {
|
|
|
82395
80604
|
* **WHOSE event it is.** With no attribution the event is about the PANEL —
|
|
82396
80605
|
* an operator pressed a button, and the panel is the only device involved.
|
|
82397
80606
|
* With one, it is about the CAMERA that set it off: that is the media owner,
|
|
82398
|
-
* the name the body reads out ("ALLARME —
|
|
80607
|
+
* the name the body reads out ("ALLARME — Front door"), and the device a rule
|
|
82399
80608
|
* scoping `deviceIds` means. One sentence, and both halves of it are testable.
|
|
82400
80609
|
* A SENSOR BYPASS is about the sensor — its name is the title.
|
|
82401
80610
|
*/
|
|
@@ -83331,7 +81540,7 @@ function providerSupplyReading(item) {
|
|
|
83331
81540
|
* recheck's own lag (D279). Its clip is therefore anchored well in the past,
|
|
83332
81541
|
* and the other source cannot take that moment over yet: measured against
|
|
83333
81542
|
* `recording.getAvailability` for a 10 s window at several anchors, full
|
|
83334
|
-
* coverage arrived at −18 s on device
|
|
81543
|
+
* coverage arrived at −18 s on device 104 and −26 s on 101 and 102 — the
|
|
83335
81544
|
* recordings' edge is a PHASE of the 10-second segment cycle, not a number. So
|
|
83336
81545
|
* the ring has to bridge from the event to the point the recordings can serve
|
|
83337
81546
|
* it: the worst measured phase (26 s) plus the confirmation lag (29 s) is 55 s,
|
|
@@ -85114,7 +83323,7 @@ var NODE_UPDATE_KINDS = new Set(["server-update-available", "wrapper-update-avai
|
|
|
85114
83323
|
* because "did it really come back, and what did it do while it was gone" is
|
|
85115
83324
|
* an action and the page that answers it is the one the down-notification
|
|
85116
83325
|
* already opened. On 2026-08-30 the operator's phone showed "Il dispositivo
|
|
85117
|
-
*
|
|
83326
|
+
* Camera sala feste è online" with `tapAction.value: null` — the same
|
|
85118
83327
|
* camera's `device-offline` an hour earlier opened the Stream Broker tab, and
|
|
85119
83328
|
* the recovery opened nothing, purely because `device-online` had no entry
|
|
85120
83329
|
* here.
|
|
@@ -85335,8 +83544,8 @@ async function downscaleFullFrameJpeg(jpeg, maxWidth = FULL_FRAME_MAX_WIDTH, max
|
|
|
85335
83544
|
* emptied zone ten seconds apart are two claims about one scene.
|
|
85336
83545
|
*
|
|
85337
83546
|
* Nothing here is silent: a capture that lands and a camera that refuses each
|
|
85338
|
-
* emit one line carrying `tags: { deviceId }`, because "why did
|
|
85339
|
-
* and
|
|
83547
|
+
* emit one line carrying `tags: { deviceId }`, because "why did 102 get a photo
|
|
83548
|
+
* and 101 not" is the only form that question is ever asked in.
|
|
85340
83549
|
*/
|
|
85341
83550
|
/**
|
|
85342
83551
|
* The owner-id namespace. It is what routes a lookup here instead of to the
|
|
@@ -85585,7 +83794,7 @@ var TITLE_MIN_PX = 16;
|
|
|
85585
83794
|
* number and the same reasoning as `preview-frame.ts#fitTitle` — deliberately
|
|
85586
83795
|
* GENEROUS, because a label that shrank slightly more than it had to is
|
|
85587
83796
|
* invisible and one that overflowed runs into the tile beside it. The first
|
|
85588
|
-
* live mosaic did exactly that: `
|
|
83797
|
+
* live mosaic did exactly that: `Camera cortile · 07:49 · animal` was cut
|
|
85589
83798
|
* to `…· anima` at the tile edge, mid-word.
|
|
85590
83799
|
*/
|
|
85591
83800
|
var GLYPH_ADVANCE = .56;
|
|
@@ -87461,7 +85670,7 @@ var NcNotificationImageStage = class {
|
|
|
87461
85670
|
* Below, and not above as the digest does it, and the difference is what gets
|
|
87462
85671
|
* truncated. A digest's counts are the part you check afterwards, so its
|
|
87463
85672
|
* sentence leads. A detection body's first line is the fact ("Persona su
|
|
87464
|
-
*
|
|
85673
|
+
* Front door") and a lock screen cuts from the end — putting a paragraph in front
|
|
87465
85674
|
* of it would push the fact off the screen on exactly the notifications that
|
|
87466
85675
|
* matter most.
|
|
87467
85676
|
*/
|
|
@@ -87513,7 +85722,7 @@ var NC_CLIP_RING_RETENTION_SEC = 20;
|
|
|
87513
85722
|
*
|
|
87514
85723
|
* The notification is HELD for this: a notifier is one-shot, so the footage
|
|
87515
85724
|
* rides the single message or does not ride at all. Measured on the
|
|
87516
|
-
* 2026-09-30 pick-up on
|
|
85725
|
+
* 2026-09-30 pick-up on 101: export 1 s, derive 262 ms — so the bound is
|
|
87517
85726
|
* almost never reached, and when it is the render is queued behind something
|
|
87518
85727
|
* that holds the recorder's one ffmpeg lane for minutes (a timelapse), which
|
|
87519
85728
|
* no wait worth holding a notification for would outlast.
|
|
@@ -87531,7 +85740,7 @@ var NC_RECORDED_FOOTAGE_WAIT_MS = 3e4;
|
|
|
87531
85740
|
/**
|
|
87532
85741
|
* The bounded wait for a still when the rule asked for NO footage.
|
|
87533
85742
|
*
|
|
87534
|
-
* Track media lands 1.5–5.5 s after the trigger (device
|
|
85743
|
+
* Track media lands 1.5–5.5 s after the trigger (device 101, 2026-08-12), so a
|
|
87535
85744
|
* notification built at the instant of the trigger routinely resolves nothing.
|
|
87536
85745
|
* A rule that also wants footage gets this for free — the render already blocks
|
|
87537
85746
|
* 7–8 s and the still is re-resolved after it. A rule that wants only a picture
|
|
@@ -87557,7 +85766,7 @@ var NC_STILL_WAIT_INTERVAL_MS = 500;
|
|
|
87557
85766
|
*
|
|
87558
85767
|
* It is NOT the ladder's top rung that has to be in band — that rung is the
|
|
87559
85768
|
* native keyFrame, whose capture misses and retries (36 misses over 105 track
|
|
87560
|
-
* starts on device
|
|
85769
|
+
* starts on device 101 in 6 h), so it is in band only 46% of the time. Holding
|
|
87561
85770
|
* out for the KIND the rule asked for would wait for the late frame. The gate
|
|
87562
85771
|
* is the instant; the ladder then runs among the frames that are about it.
|
|
87563
85772
|
*/
|
|
@@ -88909,7 +87118,7 @@ var NcDispatcher = class {
|
|
|
88909
87118
|
* A notifier is one-shot. The earlier design (D682) sent the alert first and
|
|
88910
87119
|
* the recorded footage as a SECOND send with the same `tag`, on the promise
|
|
88911
87120
|
* that "a phone collapses the two" — Zentik honours no tag, so every such
|
|
88912
|
-
* row reached the operator as two messages (
|
|
87121
|
+
* row reached the operator as two messages (101, 2026-09-30). A moment that
|
|
88913
87122
|
* reaches this path is already older than the ring (a pick-up is concluded
|
|
88914
87123
|
* minutes after it happened), so waiting a few more seconds costs nothing;
|
|
88915
87124
|
* a second message costs the operator a duplicate every time.
|
|
@@ -91472,7 +89681,7 @@ var DeviceLivenessHoldoff = class {
|
|
|
91472
89681
|
var NC_LIVENESS_COLLECTION = "notification-center:liveness";
|
|
91473
89682
|
var NC_LIVENESS_COLUMNS = [
|
|
91474
89683
|
(
|
|
91475
|
-
/** The subject the intake minted (`device:
|
|
89684
|
+
/** The subject the intake minted (`device:102`, `node:agent-1`) — one row
|
|
91476
89685
|
* each, so the two families can never collide on a key. */
|
|
91477
89686
|
{
|
|
91478
89687
|
name: "subject",
|
|
@@ -91490,7 +89699,7 @@ var NC_LIVENESS_COLUMNS = [
|
|
|
91490
89699
|
}),
|
|
91491
89700
|
(
|
|
91492
89701
|
/** The kind that last wrote the row. Telemetry: it makes the table readable
|
|
91493
|
-
* when someone asks "why did
|
|
89702
|
+
* when someone asks "why did 102 not notify". */
|
|
91494
89703
|
{
|
|
91495
89704
|
name: "kind",
|
|
91496
89705
|
type: "TEXT",
|
|
@@ -91628,7 +89837,7 @@ var NcLivenessLedger = class {
|
|
|
91628
89837
|
* all, so its FIRST observation ever seeds silently — and if that first
|
|
91629
89838
|
* observation is the camera DYING, the outage is thrown away. Live cost,
|
|
91630
89839
|
* 2026-08-13 21:36 CEST: the operator unplugged four cameras and received two
|
|
91631
|
-
* notifications. `device:
|
|
89840
|
+
* notifications. `device:103` and `device:112` had never spoken; their
|
|
91632
89841
|
* unplugging was recorded and never announced. A camera that is quiet until
|
|
91633
89842
|
* it dies is a camera whose death is silent, indefinitely.
|
|
91634
89843
|
*
|
|
@@ -95056,7 +93265,7 @@ function findNextWindowOpen(input) {
|
|
|
95056
93265
|
*
|
|
95057
93266
|
* ## Why this exists
|
|
95058
93267
|
*
|
|
95059
|
-
* Measured on
|
|
93268
|
+
* Measured on 102 the night of 2026-09-16, on the stills actually sent: every
|
|
95060
93269
|
* one of them contained a SECOND vehicle, and nothing in the image or the
|
|
95061
93270
|
* prompt said which one was the subject. The model did what anyone would — it
|
|
95062
93271
|
* invented the relationship between them ("passing a parked car"). The
|
|
@@ -95441,7 +93650,7 @@ function buildSummaryOutboxInputs(input) {
|
|
|
95441
93650
|
* This is not a movement heuristic and deliberately so: `totalDistance` and
|
|
95442
93651
|
* `state` were both measured against live traffic and both hide real passages.
|
|
95443
93652
|
* What they cannot see is the shape this gate is for — a row whose whole life
|
|
95444
|
-
* is one or two frames. Measured on device
|
|
93653
|
+
* is one or two frames. Measured on device 102 (2026-08-19 04:12): two rows,
|
|
95445
93654
|
* `closedReason` NULL so the parked pass is blind to them, dwell 53 ms,
|
|
95446
93655
|
* `totalDistance` 0, two recorded sightings each. And `minImportance` cannot
|
|
95447
93656
|
* cover it either, structurally: the static-track gate that demotes a frozen
|
|
@@ -95609,7 +93818,7 @@ function remainingSummaryCandidates(kept, taken, rank) {
|
|
|
95609
93818
|
* clean whole scene (`keyFrame` → `keyFrameSmall` → `fullFrame`).
|
|
95610
93819
|
*
|
|
95611
93820
|
* ⚠ The whole-scene rungs are a FALLBACK and stay on the ladder. Measured on
|
|
95612
|
-
* 60 real tracks (
|
|
93821
|
+
* 60 real tracks (101/102, 24 h): 52 carry a crop, 43 carry a scene rung, and
|
|
95613
93822
|
* 2 carry a scene rung and NO crop — dropping the fallback would delete those
|
|
95614
93823
|
* two tiles for nothing. A track with neither is dropped, never drawn as an
|
|
95615
93824
|
* empty cell (see `NcSummaryProducer.loadTiles`).
|
|
@@ -97426,7 +95635,7 @@ function timelapseTemplateVars(input) {
|
|
|
97426
95635
|
* **No coverage sentence.** It used to end with one whenever the window was
|
|
97427
95636
|
* short, and it was removed on the operator's instruction: the clause fired on
|
|
97428
95637
|
* every night the recorder had stumbled at all — including once at a printed
|
|
97429
|
-
* *100%* (2026-08-12, device
|
|
95638
|
+
* *100%* (2026-08-12, device 101: 141 s missing out of 10 h, so the window was
|
|
97430
95639
|
* incomplete while the rounded figure was 100) — and a line that cries wolf is
|
|
97431
95640
|
* a line the reader skips, which costs the clauses beside it too. The figure
|
|
97432
95641
|
* is not lost: it rides the `timelapse produced` log line as `coveragePct`,
|
|
@@ -97659,7 +95868,7 @@ var TimelapseScheduler = class {
|
|
|
97659
95868
|
* Eligibility is scanned under a short `scanning` lock so two ticks do not
|
|
97660
95869
|
* double-launch the same pair. Renders themselves are started together —
|
|
97661
95870
|
* awaiting them one-by-one made camera B wait for camera A's ffmpeg
|
|
97662
|
-
* (live: 1441 until 08:39,
|
|
95871
|
+
* (live: 1441 until 08:39, 101 until 08:46, both windows closed at 07:00).
|
|
97663
95872
|
* A later tick that meets a pair already in `inFlight` counts it and
|
|
97664
95873
|
* moves on, so a 30-minute render does not make the producer go deaf.
|
|
97665
95874
|
*/
|
|
@@ -104053,7 +102262,7 @@ function observeAudio(host, deviceId, sample) {
|
|
|
104053
102262
|
* {@link reportOccupancyWatch}, which the audio side simply never had.
|
|
104054
102263
|
*
|
|
104055
102264
|
* Two shapes, deliberately. The summary answers "what does this hub listen
|
|
104056
|
-
* for at all"; the per-camera line answers "why is
|
|
102265
|
+
* for at all"; the per-camera line answers "why is 102 not notifying" — and
|
|
104057
102266
|
* that question is ALWAYS asked per camera, so the line carries
|
|
104058
102267
|
* `tags.deviceId` and a rule scoped to no camera is reported as watching
|
|
104059
102268
|
* every one rather than silently omitted — every one EXCEPT its
|
|
@@ -104104,7 +102313,7 @@ function reportAudioWatch(host, entries) {
|
|
|
104104
102313
|
* sustain: ask the orchestrator for ONE look then. The session that armed
|
|
104105
102314
|
* it often closes first (a car drives off, motion clears) and the next
|
|
104106
102315
|
* sample would otherwise be the 300 s parked-object cadence — 4 min 52 s
|
|
104107
|
-
* late on
|
|
102316
|
+
* late on 102, 2026-10-01. Fire-and-forget: a refusal or a failure costs
|
|
104108
102317
|
* the early commit, never the edge (the cadence still commits it), and is
|
|
104109
102318
|
* said per camera.
|
|
104110
102319
|
*/
|
|
@@ -104247,7 +102456,7 @@ async function persistOccupancyRow(host, row, now) {
|
|
|
104247
102456
|
* **Only an edge that owns NOBODY.** `chooseOccupancyMediaOwner` names a
|
|
104248
102457
|
* member track whenever the scope holds one, and that picture is of the
|
|
104249
102458
|
* counted object itself; a photograph is strictly the stand-in for not having
|
|
104250
|
-
* one. The case this exists for is "posto libero" (camera
|
|
102459
|
+
* one. The case this exists for is "posto libero" (camera 102): the vehicle
|
|
104251
102460
|
* whose departure IS the notification has left, so the scope is empty, the
|
|
104252
102461
|
* ladder resolves nothing and the delivery logged `no still could be resolved
|
|
104253
102462
|
* … owners=[]`. A became-free edge has no owner BY CONSTRUCTION, and a
|
|
@@ -106580,7 +104789,7 @@ function onAlarmPublish(host, report) {
|
|
|
106580
104789
|
*
|
|
106581
104790
|
* `tags.deviceId` carries the SUBJECT's numeric device id (the system
|
|
106582
104791
|
* subject's own `deviceId` is the sentinel {@link NC_SYSTEM_DEVICE_ID}), so
|
|
106583
|
-
* "why is
|
|
104792
|
+
* "why is 102 louder than 2018?" is answerable by grouping. A node- or
|
|
106584
104793
|
* package-scoped exclusion is about no device and carries no tag.
|
|
106585
104794
|
*/
|
|
106586
104795
|
function reportSystemFilterExclusion(host, rule, subject, filter) {
|
|
@@ -109320,7 +107529,7 @@ var NC_TRACKS_AT_INSTANT_LIMIT = 25;
|
|
|
109320
107529
|
* The box TOLERANCE (`toleranceMs`, 750 ms) is about how sparse a trail is —
|
|
109321
107530
|
* a live track keeps a position every few frames — and it must never stretch
|
|
109322
107531
|
* a LIFE. A track born after the frame was not on it: on 2026-10-22 the
|
|
109323
|
-
* tracker split a dog on camera
|
|
107532
|
+
* tracker split a dog on camera 101 and the second piece, born 676 ms after
|
|
109324
107533
|
* the key frame, was drawn at its first box as a second box on the dog. One
|
|
109325
107534
|
* tick (~110–150 ms at that camera's detection rate, rounded up) absorbs the
|
|
109326
107535
|
* gap between a frame and the detection that confirmed it, and nothing more.
|
|
@@ -112468,7 +110677,7 @@ var ObjectEmbeddingStore = class {
|
|
|
112468
110677
|
* own. Both were wrong in the same way, and the second only less obviously:
|
|
112469
110678
|
* a vector's row id IS the trackId — exactly one row per track — so a vector
|
|
112470
110679
|
* is owned by its track completely, and giving it a second clock could only
|
|
112471
|
-
* ever produce disagreement. It did: measured on device
|
|
110680
|
+
* ever produce disagreement. It did: measured on device 104, events back 1.0
|
|
112472
110681
|
* day and embeddings back 22.1, with 1,446 of 2,222 rows pointing at nothing
|
|
112473
110682
|
* that could be rendered.
|
|
112474
110683
|
*
|
|
@@ -116575,7 +114784,7 @@ var SyntheticTrackMaterializer = class {
|
|
|
116575
114784
|
* Like {@link materialize}, but a call inside an open window answers the
|
|
116576
114785
|
* window's OWN marker (awaiting it while it is still landing) with kind
|
|
116577
114786
|
* `debounced`. Two state changes of one doorbell press are one event: the
|
|
116578
|
-
* second must name the same media owner, not none (2026-09-29, camera
|
|
114787
|
+
* second must name the same media owner, not none (2026-09-29, camera 101 —
|
|
116579
114788
|
* the notification that won the rule was the debounced one, and shipped
|
|
116580
114789
|
* without a still).
|
|
116581
114790
|
*/
|
|
@@ -117995,7 +116204,7 @@ var TITLE_LINE_HEIGHT = 1.18;
|
|
|
117995
116204
|
* written — so the fit has to be estimated. It is deliberately generous: a
|
|
117996
116205
|
* title that shrinks slightly more than it had to is invisible, one that
|
|
117997
116206
|
* over-estimates its fit runs off the edge, which is exactly what the first
|
|
117998
|
-
* live preview did (`Timelapse
|
|
116207
|
+
* live preview did (`Timelapse Camera front door 21:00→07:00` touched the
|
|
117999
116208
|
* frame border at 640 px).
|
|
118000
116209
|
*/
|
|
118001
116210
|
var TITLE_GLYPH_ADVANCE = .62;
|
|
@@ -118732,7 +116941,7 @@ var BuildNotificationPorts = class extends BuildNotificationPortsBase {
|
|
|
118732
116941
|
* gates destroy a track before it is written — the confirmation gate
|
|
118733
116942
|
* retracting a suspected false birth, stationary promotion dropping a
|
|
118734
116943
|
* parked object, zero-media suppression cascading a thumbnail-less track
|
|
118735
|
-
* away — and on 2026-08-13 they left camera
|
|
116944
|
+
* away — and on 2026-08-13 they left camera 101 with zero persisted tracks
|
|
118736
116945
|
* across a ten-hour night that held a person pass at 23:31. These rows
|
|
118737
116946
|
* survive all three.
|
|
118738
116947
|
*
|
|
@@ -121199,7 +119408,7 @@ async function streamDataset(deps) {
|
|
|
121199
119408
|
//#region src/pipeline-analytics/training-export/training-export-handler.ts
|
|
121200
119409
|
var TRAINING_EXPORT_PREFIX = "training-export";
|
|
121201
119410
|
/**
|
|
121202
|
-
* Parse `?deviceIds=
|
|
119411
|
+
* Parse `?deviceIds=101,102` into a device list. An absent or unparseable value
|
|
121203
119412
|
* yields `[]`, which the caller reads as "every device with marked tracks" —
|
|
121204
119413
|
* stated here rather than left to the reader because the empty array is doing
|
|
121205
119414
|
* two jobs and only one of them is obvious.
|
|
@@ -121565,7 +119774,7 @@ var TRACKER_FACT_LOG_SAMPLE_EVERY = 10;
|
|
|
121565
119774
|
* positive spawns (review M1: ~1 750 `new` decisions per camera per hour) —
|
|
121566
119775
|
* are sampled harder; the per-minute summary carries their exact counts. */
|
|
121567
119776
|
var TRACKER_PIECE_LOG_SAMPLE_EVERY = 50;
|
|
121568
|
-
/** Out-of-order frames (follow-up
|
|
119777
|
+
/** Out-of-order frames (follow-up 102, F1: ~1 % of frames) log the first N,
|
|
121569
119778
|
* then one in this many — every line carries the count; the per-minute
|
|
121570
119779
|
* summary carries the exact `outOfOrderFrames`. */
|
|
121571
119780
|
var TRACKER_OUT_OF_ORDER_LOG_SAMPLE_EVERY = 50;
|
|
@@ -122315,7 +120524,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
122315
120524
|
* The zone catalogue every OCCUPANCY path reads (live frames, snapshot
|
|
122316
120525
|
* hydration, the parked-object baseline sampler). Mirror-first with a
|
|
122317
120526
|
* capability fallback — see `device-zone-resolver.ts` for why the mirror
|
|
122318
|
-
* alone is not enough (device
|
|
120527
|
+
* alone is not enough (device 102 had a zone the mirror had never heard of).
|
|
122319
120528
|
*/
|
|
122320
120529
|
deviceZones = new DeviceZoneResolver({
|
|
122321
120530
|
readMirror: (deviceId) => this.proxies.get(deviceId)?.state.zones.value?.zones,
|
|
@@ -126566,7 +124775,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
126566
124775
|
*
|
|
126567
124776
|
* The stationary registry answers a different question (is this object parked,
|
|
126568
124777
|
* and should it be suppressed?). This one raises a spawn bar. The dead
|
|
126569
|
-
* ornamental grass on device
|
|
124778
|
+
* ornamental grass on device 101 produced tracks of 3.8 s,
|
|
126570
124779
|
* 4.1 s, 6.5 s and 19.0 s with 0-2.5 px of total displacement, roughly
|
|
126571
124780
|
* fifteen of them in a day, all at the same spot. Each one is individually
|
|
126572
124781
|
* innocent; the RECURRENCE is the signal, and nothing survives a track death
|
|
@@ -128270,8 +126479,8 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
128270
126479
|
* read, then goes through the SAME resolver the live frame path uses.
|
|
128271
126480
|
*
|
|
128272
126481
|
* `readSliceOnce(proxy.state.zones)` used to be the whole body, and it is
|
|
128273
|
-
* exactly what could not answer for device
|
|
128274
|
-
* hub-side (`deviceState.getCapSlice {
|
|
126482
|
+
* exactly what could not answer for device 102: the mirror slice was absent
|
|
126483
|
+
* hub-side (`deviceState.getCapSlice {102,'zones'}` → `null`), so the one
|
|
128275
126484
|
* permitted refresh brought back nothing and hydration fell to `[]` forever.
|
|
128276
126485
|
*/
|
|
128277
126486
|
async resolveDeviceZones(deviceId) {
|
|
@@ -128782,7 +126991,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
128782
126991
|
*
|
|
128783
126992
|
* - `camera-native-cap` is EVERY camera's `motion` slice. Every provider
|
|
128784
126993
|
* binds a native `motion` cap on the camera device and motion churns
|
|
128785
|
-
* continuously (camera
|
|
126994
|
+
* continuously (camera 104 flaps at ~2 Hz), so an `info` here would be a
|
|
128786
126995
|
* log flood measured in millions of lines a day — its own outage.
|
|
128787
126996
|
* - `no-camera` is every sensor in the fleet that no camera links. Since
|
|
128788
126997
|
* D630 §6 it is still EVALUATED by the notification rules (through
|
|
@@ -128791,7 +127000,7 @@ var PipelineAnalyticsAddon = class PipelineAnalyticsAddon extends BaseAddon {
|
|
|
128791
127000
|
*
|
|
128792
127001
|
* What must never happen again is the branch being INVISIBLE: a doorbell
|
|
128793
127002
|
* press that ingested nothing produced not one line for months. A debug line
|
|
128794
|
-
* carrying `deviceId`, `capName`, `kind` and `reason` answers "why is
|
|
127003
|
+
* carrying `deviceId`, `capName`, `kind` and `reason` answers "why is 101
|
|
128795
127004
|
* dark" the moment anyone asks it.
|
|
128796
127005
|
*/
|
|
128797
127006
|
logSensorIngestDrop(data, reason, kind) {
|