@camstack/addon-provider-rademacher 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/addon.js CHANGED
@@ -5627,7 +5627,7 @@ function preprocess(fn, schema) {
5627
5627
  });
5628
5628
  }
5629
5629
  //#endregion
5630
- //#region ../types/dist/sleep-BiDFW0E7.mjs
5630
+ //#region ../types/dist/sleep-CZDdRBua.mjs
5631
5631
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
5632
5632
  EventCategory["SystemBoot"] = "system.boot";
5633
5633
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -8238,7 +8238,16 @@ var DecoderStatsSchema = object({
8238
8238
  inputFps: number(),
8239
8239
  outputFps: number(),
8240
8240
  avgDecodeTimeMs: number(),
8241
- droppedFrames: number()
8241
+ droppedFrames: number(),
8242
+ /**
8243
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
8244
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
8245
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
8246
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
8247
+ */
8248
+ lagMs: number().optional(),
8249
+ effectiveFps: number().optional(),
8250
+ adaptiveFps: number().optional()
8242
8251
  });
8243
8252
  var DecoderSessionConfigSchema = object({
8244
8253
  codec: string(),
@@ -8279,7 +8288,15 @@ var DecoderSessionConfigSchema = object({
8279
8288
  * other — `pullFrames` returns nothing for an `'shm'` session and
8280
8289
  * `pullHandles` returns nothing for a `'callback'` session.
8281
8290
  */
8282
- frameSink: _enum(["callback", "shm"]).default("callback")
8291
+ frameSink: _enum(["callback", "shm"]).default("callback"),
8292
+ /**
8293
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
8294
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
8295
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
8296
+ * stream-broker's `streamingDebug` gate — off by default so production logs
8297
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
8298
+ */
8299
+ debug: boolean().optional()
8283
8300
  });
8284
8301
  var EncodeProfileSchema = object({
8285
8302
  video: object({
@@ -11304,6 +11321,100 @@ var coverCapability = {
11304
11321
  runtimeState: CoverStatusSchema
11305
11322
  };
11306
11323
  /**
11324
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
11325
+ * shared by reolink / hikvision / amcrest. Models the common firmware
11326
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
11327
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
11328
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
11329
+ * the shape so ONE derived-form renders every camera.
11330
+ *
11331
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
11332
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
11333
+ * injected from `status`) reports the live values, and a single
11334
+ * `setSettings` mutation applies a partial change. No hand-written
11335
+ * settings-contribution methods — the framework derives the UI + save
11336
+ * routing from this surface.
11337
+ */
11338
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
11339
+ var DayNightModeSchema = _enum([
11340
+ "auto",
11341
+ "day",
11342
+ "night",
11343
+ "schedule"
11344
+ ]);
11345
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
11346
+ * getOptions availability convention. Normalized values are 0–100. */
11347
+ var NormalizedRangeSchema$1 = object({
11348
+ min: number(),
11349
+ max: number(),
11350
+ step: number()
11351
+ });
11352
+ /**
11353
+ * Current day/night state. Optional fields are absent when the camera
11354
+ * does not expose that knob (a photocell-less model reports no
11355
+ * `sensitivity`). `lastFetchedAt` feeds the runtime-state bridge.
11356
+ */
11357
+ var DayNightStatusSchema = object({
11358
+ mode: DayNightModeSchema,
11359
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
11360
+ sensitivity: number().optional(),
11361
+ /** Delay before the IR-cut filter flips, in seconds. */
11362
+ switchDelaySec: number().optional(),
11363
+ lastFetchedAt: number()
11364
+ });
11365
+ /**
11366
+ * Per-camera availability descriptor — drives which controls the admin UI
11367
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
11368
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
11369
+ * honest, camera-probed values — never hardcoded.
11370
+ */
11371
+ var DayNightOptionsSchema = object({
11372
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
11373
+ modes: array(DayNightModeSchema),
11374
+ supportsSensitivity: boolean(),
11375
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
11376
+ sensitivity: NormalizedRangeSchema$1.optional(),
11377
+ supportsSwitchDelay: boolean(),
11378
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
11379
+ switchDelaySec: NormalizedRangeSchema$1.optional()
11380
+ });
11381
+ /**
11382
+ * Partial change to the day/night config — every field optional. A
11383
+ * provider ignores fields it does not support.
11384
+ */
11385
+ var DayNightSettingsPatchSchema = object({
11386
+ mode: DayNightModeSchema.optional(),
11387
+ sensitivity: number().optional(),
11388
+ switchDelaySec: number().optional()
11389
+ });
11390
+ var dayNightCapability = {
11391
+ name: "day-night",
11392
+ scope: "device",
11393
+ deviceNative: true,
11394
+ mode: "singleton",
11395
+ deviceTypes: [DeviceType.Camera],
11396
+ deviceConfig: { ui: {
11397
+ kind: "derived-form",
11398
+ builderId: "day-night",
11399
+ tab: "image"
11400
+ } },
11401
+ methods: {
11402
+ getOptions: method(object({ deviceId: number() }), DayNightOptionsSchema),
11403
+ setSettings: method(object({
11404
+ deviceId: number(),
11405
+ settings: DayNightSettingsPatchSchema
11406
+ }), _void(), {
11407
+ kind: "mutation",
11408
+ auth: "admin"
11409
+ })
11410
+ },
11411
+ status: {
11412
+ schema: DayNightStatusSchema,
11413
+ kind: "poll"
11414
+ },
11415
+ runtimeState: DayNightStatusSchema
11416
+ };
11417
+ /**
11307
11418
  * Identity envelope for a device's upstream-system metadata.
11308
11419
  *
11309
11420
  * Two jobs:
@@ -11962,6 +12073,155 @@ var imageCapability = {
11962
12073
  runtimeState: ImageStatusSchema
11963
12074
  };
11964
12075
  /**
12076
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
12077
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
12078
+ * surface: the four picture sliders (brightness / contrast / saturation /
12079
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
12080
+ * exposure and backlight-compensation modes.
12081
+ *
12082
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
12083
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
12084
+ * its native range to/from this normalized 0–100 space so the cap surface
12085
+ * (and the derived form) is identical across cameras. `warmth` (manual
12086
+ * white-balance) is likewise normalized 0–100.
12087
+ *
12088
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
12089
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
12090
+ * injected from `status`) reports the live values, and a single
12091
+ * `setSettings` mutation applies a partial change. No hand-written
12092
+ * settings-contribution methods — the framework derives the UI + save
12093
+ * routing from this surface.
12094
+ */
12095
+ /** Sensor/image rotation, degrees clockwise. */
12096
+ var ImageRotateSchema = _enum([
12097
+ "0",
12098
+ "90",
12099
+ "180",
12100
+ "270"
12101
+ ]);
12102
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
12103
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
12104
+ /** Exposure mode. */
12105
+ var ExposureModeSchema = _enum(["auto", "manual"]);
12106
+ /**
12107
+ * Backlight-compensation mode:
12108
+ * - `off` — disabled
12109
+ * - `blc` — backlight compensation
12110
+ * - `wdr` — wide dynamic range
12111
+ * - `hlc` — highlight compensation
12112
+ */
12113
+ var BacklightModeSchema = _enum([
12114
+ "off",
12115
+ "blc",
12116
+ "wdr",
12117
+ "hlc"
12118
+ ]);
12119
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
12120
+ * getOptions availability convention. Slider values are normalized 0–100. */
12121
+ var NormalizedRangeSchema = object({
12122
+ min: number(),
12123
+ max: number(),
12124
+ step: number()
12125
+ });
12126
+ /**
12127
+ * Current image-adjustment state. Every field optional — absent when the
12128
+ * camera does not expose that control. Slider values are NORMALIZED 0–100.
12129
+ * `lastFetchedAt` feeds the runtime-state bridge.
12130
+ */
12131
+ var ImageSettingsStatusSchema = object({
12132
+ /** Normalized 0–100. */
12133
+ brightness: number().optional(),
12134
+ /** Normalized 0–100. */
12135
+ contrast: number().optional(),
12136
+ /** Normalized 0–100. */
12137
+ saturation: number().optional(),
12138
+ /** Normalized 0–100. */
12139
+ sharpness: number().optional(),
12140
+ mirror: boolean().optional(),
12141
+ flip: boolean().optional(),
12142
+ rotate: ImageRotateSchema.optional(),
12143
+ whiteBalance: WhiteBalanceModeSchema.optional(),
12144
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
12145
+ warmth: number().optional(),
12146
+ exposureMode: ExposureModeSchema.optional(),
12147
+ backlightMode: BacklightModeSchema.optional(),
12148
+ lastFetchedAt: number()
12149
+ });
12150
+ /**
12151
+ * Per-camera availability descriptor — drives which controls the admin UI
12152
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
12153
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
12154
+ * array → control hidden). A provider returns honest, camera-probed values
12155
+ * — never hardcoded.
12156
+ */
12157
+ var ImageSettingsOptionsSchema = object({
12158
+ supportsBrightness: boolean(),
12159
+ brightness: NormalizedRangeSchema.optional(),
12160
+ supportsContrast: boolean(),
12161
+ contrast: NormalizedRangeSchema.optional(),
12162
+ supportsSaturation: boolean(),
12163
+ saturation: NormalizedRangeSchema.optional(),
12164
+ supportsSharpness: boolean(),
12165
+ sharpness: NormalizedRangeSchema.optional(),
12166
+ supportsMirror: boolean(),
12167
+ supportsFlip: boolean(),
12168
+ /** Supported rotation values. Empty → rotation not configurable. */
12169
+ rotateOptions: array(ImageRotateSchema),
12170
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
12171
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
12172
+ supportsWarmth: boolean(),
12173
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
12174
+ warmth: NormalizedRangeSchema.optional(),
12175
+ /** Supported exposure modes. Empty → exposure not configurable. */
12176
+ exposureModes: array(ExposureModeSchema),
12177
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
12178
+ backlightModes: array(BacklightModeSchema)
12179
+ });
12180
+ /**
12181
+ * Partial change to the image config — every field optional. Slider values
12182
+ * are normalized 0–100. A provider ignores fields it does not support.
12183
+ */
12184
+ var ImageSettingsPatchSchema = object({
12185
+ brightness: number().optional(),
12186
+ contrast: number().optional(),
12187
+ saturation: number().optional(),
12188
+ sharpness: number().optional(),
12189
+ mirror: boolean().optional(),
12190
+ flip: boolean().optional(),
12191
+ rotate: ImageRotateSchema.optional(),
12192
+ whiteBalance: WhiteBalanceModeSchema.optional(),
12193
+ warmth: number().optional(),
12194
+ exposureMode: ExposureModeSchema.optional(),
12195
+ backlightMode: BacklightModeSchema.optional()
12196
+ });
12197
+ var imageSettingsCapability = {
12198
+ name: "image-settings",
12199
+ scope: "device",
12200
+ deviceNative: true,
12201
+ mode: "singleton",
12202
+ deviceTypes: [DeviceType.Camera],
12203
+ deviceConfig: { ui: {
12204
+ kind: "derived-form",
12205
+ builderId: "image-settings",
12206
+ tab: "image"
12207
+ } },
12208
+ methods: {
12209
+ getOptions: method(object({ deviceId: number() }), ImageSettingsOptionsSchema),
12210
+ setSettings: method(object({
12211
+ deviceId: number(),
12212
+ settings: ImageSettingsPatchSchema
12213
+ }), _void(), {
12214
+ kind: "mutation",
12215
+ auth: "admin"
12216
+ })
12217
+ },
12218
+ status: {
12219
+ schema: ImageSettingsStatusSchema,
12220
+ kind: "poll"
12221
+ },
12222
+ runtimeState: ImageSettingsStatusSchema
12223
+ };
12224
+ /**
11965
12225
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
11966
12226
  * with a mowing lifecycle plus a dock action.
11967
12227
  *
@@ -12960,6 +13220,16 @@ var RunnerCameraConfigSchema = object({
12960
13220
  * this gate is bypassed.
12961
13221
  */
12962
13222
  onboardMotionDrivesAnalyzer: boolean().default(true),
13223
+ /**
13224
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
13225
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
13226
+ * this is off by default because the recheck re-subscribes a detection session
13227
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
13228
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
13229
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
13230
+ * (and only render) when this is enabled.
13231
+ */
13232
+ occupancyRecheckEnabled: boolean().default(false),
12963
13233
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
12964
13234
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
12965
13235
  /**
@@ -14965,6 +15235,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
14965
15235
  contact: contactCapability,
14966
15236
  control: controlCapability,
14967
15237
  cover: coverCapability,
15238
+ dayNight: dayNightCapability,
14968
15239
  deviceDiscovery: deviceDiscoveryCapability,
14969
15240
  deviceStatus: deviceStatusCapability,
14970
15241
  doorbell: doorbellCapability,
@@ -14977,6 +15248,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
14977
15248
  humidifier: humidifierCapability,
14978
15249
  humiditySensor: humiditySensorCapability,
14979
15250
  image: imageCapability,
15251
+ imageSettings: imageSettingsCapability,
14980
15252
  lawnMowerControl: lawnMowerControlCapability,
14981
15253
  lockControl: lockControlCapability,
14982
15254
  mediaPlayer: mediaPlayerCapability,
@@ -16891,7 +17163,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
16891
17163
  id: string(),
16892
17164
  name: string(),
16893
17165
  isPullMode: boolean().optional(),
16894
- priority: number().optional()
17166
+ priority: number().optional(),
17167
+ hwaccel: string().optional(),
17168
+ probedBestHwaccel: string().optional()
16895
17169
  })), method(DecoderSessionConfigSchema, object({
16896
17170
  sessionId: string(),
16897
17171
  nodeId: string()
@@ -22883,6 +23157,18 @@ Object.freeze({
22883
23157
  addonId: null,
22884
23158
  access: "view"
22885
23159
  },
23160
+ "dayNight.getOptions": {
23161
+ capName: "day-night",
23162
+ capScope: "device",
23163
+ addonId: null,
23164
+ access: "view"
23165
+ },
23166
+ "dayNight.setSettings": {
23167
+ capName: "day-night",
23168
+ capScope: "device",
23169
+ addonId: null,
23170
+ access: "create"
23171
+ },
22886
23172
  "decoder.createSession": {
22887
23173
  capName: "decoder",
22888
23174
  capScope: "system",
@@ -23813,6 +24099,18 @@ Object.freeze({
23813
24099
  addonId: null,
23814
24100
  access: "create"
23815
24101
  },
24102
+ "imageSettings.getOptions": {
24103
+ capName: "image-settings",
24104
+ capScope: "device",
24105
+ addonId: null,
24106
+ access: "view"
24107
+ },
24108
+ "imageSettings.setSettings": {
24109
+ capName: "image-settings",
24110
+ capScope: "device",
24111
+ addonId: null,
24112
+ access: "create"
24113
+ },
23816
24114
  "integrations.create": {
23817
24115
  capName: "integrations",
23818
24116
  capScope: "system",
package/dist/addon.mjs CHANGED
@@ -5626,7 +5626,7 @@ function preprocess(fn, schema) {
5626
5626
  });
5627
5627
  }
5628
5628
  //#endregion
5629
- //#region ../types/dist/sleep-BiDFW0E7.mjs
5629
+ //#region ../types/dist/sleep-CZDdRBua.mjs
5630
5630
  var EventCategory = /* @__PURE__ */ function(EventCategory) {
5631
5631
  EventCategory["SystemBoot"] = "system.boot";
5632
5632
  EventCategory["SystemAddonsReady"] = "system.addons-ready";
@@ -8237,7 +8237,16 @@ var DecoderStatsSchema = object({
8237
8237
  inputFps: number(),
8238
8238
  outputFps: number(),
8239
8239
  avgDecodeTimeMs: number(),
8240
- droppedFrames: number()
8240
+ droppedFrames: number(),
8241
+ /**
8242
+ * Pull-mode adaptive-fps telemetry (optional — only pull sessions run the
8243
+ * lag-driven controller; push sessions omit these). `lagMs` is the EWMA of
8244
+ * the decoder's real-time drift (rising = falling behind live); `adaptiveFps`
8245
+ * is the current lag-throttled emit rate (≤ `effectiveFps` ceiling).
8246
+ */
8247
+ lagMs: number().optional(),
8248
+ effectiveFps: number().optional(),
8249
+ adaptiveFps: number().optional()
8241
8250
  });
8242
8251
  var DecoderSessionConfigSchema = object({
8243
8252
  codec: string(),
@@ -8278,7 +8287,15 @@ var DecoderSessionConfigSchema = object({
8278
8287
  * other — `pullFrames` returns nothing for an `'shm'` session and
8279
8288
  * `pullHandles` returns nothing for a `'callback'` session.
8280
8289
  */
8281
- frameSink: _enum(["callback", "shm"]).default("callback")
8290
+ frameSink: _enum(["callback", "shm"]).default("callback"),
8291
+ /**
8292
+ * Per-camera decoder DEBUG facility. When `true`, a pull-mode session emits
8293
+ * a throttled (~1Hz) structured `decoder debug` line (effective/adaptive fps,
8294
+ * real-time lag, dropped-frame delta, avg decode time, hwaccel). Mirrors the
8295
+ * stream-broker's `streamingDebug` gate — off by default so production logs
8296
+ * stay quiet and the emit path pays zero per-frame cost when disabled.
8297
+ */
8298
+ debug: boolean().optional()
8282
8299
  });
8283
8300
  var EncodeProfileSchema = object({
8284
8301
  video: object({
@@ -11303,6 +11320,100 @@ var coverCapability = {
11303
11320
  runtimeState: CoverStatusSchema
11304
11321
  };
11305
11322
  /**
11323
+ * Vendor-neutral day/night (IR-cut) control — the per-camera config cap
11324
+ * shared by reolink / hikvision / amcrest. Models the common firmware
11325
+ * surface: the IR-cut switching MODE plus the two knobs that gate it
11326
+ * (photocell `sensitivity` + `switchDelaySec`). Each vendor maps these
11327
+ * onto its own ISAPI / Baichuan / Dahua-CGI fields; the cap standardises
11328
+ * the shape so ONE derived-form renders every camera.
11329
+ *
11330
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
11331
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
11332
+ * injected from `status`) reports the live values, and a single
11333
+ * `setSettings` mutation applies a partial change. No hand-written
11334
+ * settings-contribution methods — the framework derives the UI + save
11335
+ * routing from this surface.
11336
+ */
11337
+ /** IR-cut switching mode. `schedule` = time-of-day table configured on the camera. */
11338
+ var DayNightModeSchema = _enum([
11339
+ "auto",
11340
+ "day",
11341
+ "night",
11342
+ "schedule"
11343
+ ]);
11344
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
11345
+ * getOptions availability convention. Normalized values are 0–100. */
11346
+ var NormalizedRangeSchema$1 = object({
11347
+ min: number(),
11348
+ max: number(),
11349
+ step: number()
11350
+ });
11351
+ /**
11352
+ * Current day/night state. Optional fields are absent when the camera
11353
+ * does not expose that knob (a photocell-less model reports no
11354
+ * `sensitivity`). `lastFetchedAt` feeds the runtime-state bridge.
11355
+ */
11356
+ var DayNightStatusSchema = object({
11357
+ mode: DayNightModeSchema,
11358
+ /** IR-cut trigger sensitivity, NORMALIZED 0–100 (higher = switches to night sooner). */
11359
+ sensitivity: number().optional(),
11360
+ /** Delay before the IR-cut filter flips, in seconds. */
11361
+ switchDelaySec: number().optional(),
11362
+ lastFetchedAt: number()
11363
+ });
11364
+ /**
11365
+ * Per-camera availability descriptor — drives which controls the admin UI
11366
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
11367
+ * (normalized 0–100); the mode choice-set as an array. A provider returns
11368
+ * honest, camera-probed values — never hardcoded.
11369
+ */
11370
+ var DayNightOptionsSchema = object({
11371
+ /** Modes this camera accepts. Empty → the camera has no configurable day/night mode. */
11372
+ modes: array(DayNightModeSchema),
11373
+ supportsSensitivity: boolean(),
11374
+ /** Present when `supportsSensitivity` — the normalized 0–100 range. */
11375
+ sensitivity: NormalizedRangeSchema$1.optional(),
11376
+ supportsSwitchDelay: boolean(),
11377
+ /** Present when `supportsSwitchDelay` — the allowed delay range in seconds. */
11378
+ switchDelaySec: NormalizedRangeSchema$1.optional()
11379
+ });
11380
+ /**
11381
+ * Partial change to the day/night config — every field optional. A
11382
+ * provider ignores fields it does not support.
11383
+ */
11384
+ var DayNightSettingsPatchSchema = object({
11385
+ mode: DayNightModeSchema.optional(),
11386
+ sensitivity: number().optional(),
11387
+ switchDelaySec: number().optional()
11388
+ });
11389
+ var dayNightCapability = {
11390
+ name: "day-night",
11391
+ scope: "device",
11392
+ deviceNative: true,
11393
+ mode: "singleton",
11394
+ deviceTypes: [DeviceType.Camera],
11395
+ deviceConfig: { ui: {
11396
+ kind: "derived-form",
11397
+ builderId: "day-night",
11398
+ tab: "image"
11399
+ } },
11400
+ methods: {
11401
+ getOptions: method(object({ deviceId: number() }), DayNightOptionsSchema),
11402
+ setSettings: method(object({
11403
+ deviceId: number(),
11404
+ settings: DayNightSettingsPatchSchema
11405
+ }), _void(), {
11406
+ kind: "mutation",
11407
+ auth: "admin"
11408
+ })
11409
+ },
11410
+ status: {
11411
+ schema: DayNightStatusSchema,
11412
+ kind: "poll"
11413
+ },
11414
+ runtimeState: DayNightStatusSchema
11415
+ };
11416
+ /**
11306
11417
  * Identity envelope for a device's upstream-system metadata.
11307
11418
  *
11308
11419
  * Two jobs:
@@ -11961,6 +12072,155 @@ var imageCapability = {
11961
12072
  runtimeState: ImageStatusSchema
11962
12073
  };
11963
12074
  /**
12075
+ * Vendor-neutral image / picture-adjustment cap — the per-camera config
12076
+ * cap shared by reolink / hikvision / amcrest. Models the common ISP
12077
+ * surface: the four picture sliders (brightness / contrast / saturation /
12078
+ * sharpness), orientation (mirror / flip / rotate), white-balance,
12079
+ * exposure and backlight-compensation modes.
12080
+ *
12081
+ * NORMALIZATION: every slider is a normalized int 0–100. Vendors expose
12082
+ * these natively as 0–100 or 0–255 (or other ranges); each provider maps
12083
+ * its native range to/from this normalized 0–100 space so the cap surface
12084
+ * (and the derived form) is identical across cameras. `warmth` (manual
12085
+ * white-balance) is likewise normalized 0–100.
12086
+ *
12087
+ * Follows the D14 `deviceConfig` archetype (see `stream-params.cap.ts`):
12088
+ * `getOptions` advertises per-camera availability, `getStatus` (auto-
12089
+ * injected from `status`) reports the live values, and a single
12090
+ * `setSettings` mutation applies a partial change. No hand-written
12091
+ * settings-contribution methods — the framework derives the UI + save
12092
+ * routing from this surface.
12093
+ */
12094
+ /** Sensor/image rotation, degrees clockwise. */
12095
+ var ImageRotateSchema = _enum([
12096
+ "0",
12097
+ "90",
12098
+ "180",
12099
+ "270"
12100
+ ]);
12101
+ /** White-balance mode. `manual` unlocks the normalized `warmth` knob. */
12102
+ var WhiteBalanceModeSchema = _enum(["auto", "manual"]);
12103
+ /** Exposure mode. */
12104
+ var ExposureModeSchema = _enum(["auto", "manual"]);
12105
+ /**
12106
+ * Backlight-compensation mode:
12107
+ * - `off` — disabled
12108
+ * - `blc` — backlight compensation
12109
+ * - `wdr` — wide dynamic range
12110
+ * - `hlc` — highlight compensation
12111
+ */
12112
+ var BacklightModeSchema = _enum([
12113
+ "off",
12114
+ "blc",
12115
+ "wdr",
12116
+ "hlc"
12117
+ ]);
12118
+ /** Normalized numeric range descriptor — `{ min, max, step }` per the
12119
+ * getOptions availability convention. Slider values are normalized 0–100. */
12120
+ var NormalizedRangeSchema = object({
12121
+ min: number(),
12122
+ max: number(),
12123
+ step: number()
12124
+ });
12125
+ /**
12126
+ * Current image-adjustment state. Every field optional — absent when the
12127
+ * camera does not expose that control. Slider values are NORMALIZED 0–100.
12128
+ * `lastFetchedAt` feeds the runtime-state bridge.
12129
+ */
12130
+ var ImageSettingsStatusSchema = object({
12131
+ /** Normalized 0–100. */
12132
+ brightness: number().optional(),
12133
+ /** Normalized 0–100. */
12134
+ contrast: number().optional(),
12135
+ /** Normalized 0–100. */
12136
+ saturation: number().optional(),
12137
+ /** Normalized 0–100. */
12138
+ sharpness: number().optional(),
12139
+ mirror: boolean().optional(),
12140
+ flip: boolean().optional(),
12141
+ rotate: ImageRotateSchema.optional(),
12142
+ whiteBalance: WhiteBalanceModeSchema.optional(),
12143
+ /** Manual white-balance warmth, NORMALIZED 0–100. Meaningful only when `whiteBalance === 'manual'`. */
12144
+ warmth: number().optional(),
12145
+ exposureMode: ExposureModeSchema.optional(),
12146
+ backlightMode: BacklightModeSchema.optional(),
12147
+ lastFetchedAt: number()
12148
+ });
12149
+ /**
12150
+ * Per-camera availability descriptor — drives which controls the admin UI
12151
+ * renders. Booleans as `supportsX`; numeric ranges as `{ min, max, step }`
12152
+ * (the normalized 0–100 range); enums as arrays of supported values (empty
12153
+ * array → control hidden). A provider returns honest, camera-probed values
12154
+ * — never hardcoded.
12155
+ */
12156
+ var ImageSettingsOptionsSchema = object({
12157
+ supportsBrightness: boolean(),
12158
+ brightness: NormalizedRangeSchema.optional(),
12159
+ supportsContrast: boolean(),
12160
+ contrast: NormalizedRangeSchema.optional(),
12161
+ supportsSaturation: boolean(),
12162
+ saturation: NormalizedRangeSchema.optional(),
12163
+ supportsSharpness: boolean(),
12164
+ sharpness: NormalizedRangeSchema.optional(),
12165
+ supportsMirror: boolean(),
12166
+ supportsFlip: boolean(),
12167
+ /** Supported rotation values. Empty → rotation not configurable. */
12168
+ rotateOptions: array(ImageRotateSchema),
12169
+ /** Supported white-balance modes. Empty → white-balance not configurable. */
12170
+ whiteBalanceModes: array(WhiteBalanceModeSchema),
12171
+ supportsWarmth: boolean(),
12172
+ /** Present when `supportsWarmth` — the normalized 0–100 range. */
12173
+ warmth: NormalizedRangeSchema.optional(),
12174
+ /** Supported exposure modes. Empty → exposure not configurable. */
12175
+ exposureModes: array(ExposureModeSchema),
12176
+ /** Supported backlight modes. Empty → backlight-compensation not configurable. */
12177
+ backlightModes: array(BacklightModeSchema)
12178
+ });
12179
+ /**
12180
+ * Partial change to the image config — every field optional. Slider values
12181
+ * are normalized 0–100. A provider ignores fields it does not support.
12182
+ */
12183
+ var ImageSettingsPatchSchema = object({
12184
+ brightness: number().optional(),
12185
+ contrast: number().optional(),
12186
+ saturation: number().optional(),
12187
+ sharpness: number().optional(),
12188
+ mirror: boolean().optional(),
12189
+ flip: boolean().optional(),
12190
+ rotate: ImageRotateSchema.optional(),
12191
+ whiteBalance: WhiteBalanceModeSchema.optional(),
12192
+ warmth: number().optional(),
12193
+ exposureMode: ExposureModeSchema.optional(),
12194
+ backlightMode: BacklightModeSchema.optional()
12195
+ });
12196
+ var imageSettingsCapability = {
12197
+ name: "image-settings",
12198
+ scope: "device",
12199
+ deviceNative: true,
12200
+ mode: "singleton",
12201
+ deviceTypes: [DeviceType.Camera],
12202
+ deviceConfig: { ui: {
12203
+ kind: "derived-form",
12204
+ builderId: "image-settings",
12205
+ tab: "image"
12206
+ } },
12207
+ methods: {
12208
+ getOptions: method(object({ deviceId: number() }), ImageSettingsOptionsSchema),
12209
+ setSettings: method(object({
12210
+ deviceId: number(),
12211
+ settings: ImageSettingsPatchSchema
12212
+ }), _void(), {
12213
+ kind: "mutation",
12214
+ auth: "admin"
12215
+ })
12216
+ },
12217
+ status: {
12218
+ schema: ImageSettingsStatusSchema,
12219
+ kind: "poll"
12220
+ },
12221
+ runtimeState: ImageSettingsStatusSchema
12222
+ };
12223
+ /**
11964
12224
  * Robotic lawn-mower cap. Models HA `lawn_mower.*` entities — anything
11965
12225
  * with a mowing lifecycle plus a dock action.
11966
12226
  *
@@ -12959,6 +13219,16 @@ var RunnerCameraConfigSchema = object({
12959
13219
  * this gate is bypassed.
12960
13220
  */
12961
13221
  onboardMotionDrivesAnalyzer: boolean().default(true),
13222
+ /**
13223
+ * Master toggle for the occupancy re-check. When `false` (DEFAULT) the runner
13224
+ * never arms the periodic recheck timer, regardless of `occupancyRecheckSec` —
13225
+ * this is off by default because the recheck re-subscribes a detection session
13226
+ * every N seconds while `watching`, a major source of pull-decoder re-dial
13227
+ * churn (each cycle creates+tears a session → RTSP re-dial → latency). The
13228
+ * `occupancyRecheckSec` / `occupancyRecheckFrames` sliders only take effect
13229
+ * (and only render) when this is enabled.
13230
+ */
13231
+ occupancyRecheckEnabled: boolean().default(false),
12962
13232
  occupancyRecheckSec: number().min(occupancyRecheckSecField.min).max(occupancyRecheckSecField.max).default(occupancyRecheckSecField.default),
12963
13233
  occupancyRecheckFrames: number().min(occupancyRecheckFramesField.min).max(occupancyRecheckFramesField.max).default(occupancyRecheckFramesField.default),
12964
13234
  /**
@@ -14964,6 +15234,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
14964
15234
  contact: contactCapability,
14965
15235
  control: controlCapability,
14966
15236
  cover: coverCapability,
15237
+ dayNight: dayNightCapability,
14967
15238
  deviceDiscovery: deviceDiscoveryCapability,
14968
15239
  deviceStatus: deviceStatusCapability,
14969
15240
  doorbell: doorbellCapability,
@@ -14976,6 +15247,7 @@ var DEVICE_LOCAL_STATE_CAPS = {
14976
15247
  humidifier: humidifierCapability,
14977
15248
  humiditySensor: humiditySensorCapability,
14978
15249
  image: imageCapability,
15250
+ imageSettings: imageSettingsCapability,
14979
15251
  lawnMowerControl: lawnMowerControlCapability,
14980
15252
  lockControl: lockControlCapability,
14981
15253
  mediaPlayer: mediaPlayerCapability,
@@ -16890,7 +17162,9 @@ method(object({ codec: string() }), boolean()), method(_void(), object({
16890
17162
  id: string(),
16891
17163
  name: string(),
16892
17164
  isPullMode: boolean().optional(),
16893
- priority: number().optional()
17165
+ priority: number().optional(),
17166
+ hwaccel: string().optional(),
17167
+ probedBestHwaccel: string().optional()
16894
17168
  })), method(DecoderSessionConfigSchema, object({
16895
17169
  sessionId: string(),
16896
17170
  nodeId: string()
@@ -22882,6 +23156,18 @@ Object.freeze({
22882
23156
  addonId: null,
22883
23157
  access: "view"
22884
23158
  },
23159
+ "dayNight.getOptions": {
23160
+ capName: "day-night",
23161
+ capScope: "device",
23162
+ addonId: null,
23163
+ access: "view"
23164
+ },
23165
+ "dayNight.setSettings": {
23166
+ capName: "day-night",
23167
+ capScope: "device",
23168
+ addonId: null,
23169
+ access: "create"
23170
+ },
22885
23171
  "decoder.createSession": {
22886
23172
  capName: "decoder",
22887
23173
  capScope: "system",
@@ -23812,6 +24098,18 @@ Object.freeze({
23812
24098
  addonId: null,
23813
24099
  access: "create"
23814
24100
  },
24101
+ "imageSettings.getOptions": {
24102
+ capName: "image-settings",
24103
+ capScope: "device",
24104
+ addonId: null,
24105
+ access: "view"
24106
+ },
24107
+ "imageSettings.setSettings": {
24108
+ capName: "image-settings",
24109
+ capScope: "device",
24110
+ addonId: null,
24111
+ access: "create"
24112
+ },
23815
24113
  "integrations.create": {
23816
24114
  capName: "integrations",
23817
24115
  capScope: "system",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-rademacher",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Rademacher HomePilot device-provider addon for CamStack — wraps the @apocaliss92/noderademacher local-hub client (roller shutters over the cover cap)",
5
5
  "keywords": [
6
6
  "camstack",