@camstack/addon-export-google 0.1.73 → 0.1.75

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.
@@ -5438,7 +5438,7 @@ var ZodIssueCode = {
5438
5438
  var ZodFirstPartyTypeKind;
5439
5439
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5440
5440
  //#endregion
5441
- //#region ../types/dist/sleep-BDR76Ykr.mjs
5441
+ //#region ../types/dist/sleep-B1y0Fo1U.mjs
5442
5442
  /**
5443
5443
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5444
5444
  * window to float samples (D455).
@@ -28994,14 +28994,81 @@ DeviceType.Camera, method(object({ deviceId: number() }), PrivacyMaskOptionsSche
28994
28994
  kind: "mutation",
28995
28995
  auth: "admin"
28996
28996
  });
28997
+ /**
28998
+ * What a preset id DOES on this camera.
28999
+ *
29000
+ * On several PTZ firmwares the preset namespace is shared: low ids are stored
29001
+ * positions, a reserved band triggers camera FUNCTIONS. The dispensa camera
29002
+ * (Hikvision) returns its own reserved band in the preset list, named by the
29003
+ * firmware:
29004
+ *
29005
+ * 34 Back to origin · 39 Day mode · 40 Night mode · 46 Day/Night Auto Mode
29006
+ * 92 Set manual limits · 93 Save manual limits · 94 Remote reboot
29007
+ * 95 Call OSD menu
29008
+ *
29009
+ * We used to hand all of these to the UI as ordinary presets. Saving over one
29010
+ * is what produced `PUT /ISAPI/PTZCtrl/channels/1/presets/34 -> HTTP 500`: the
29011
+ * camera refusing to let "Back to origin" be overwritten, surfaced to the
29012
+ * operator as a transport failure.
29013
+ *
29014
+ * A function preset stays fully usable as a DESTINATION -- `goToPreset('34')`
29015
+ * is the single most useful thing that camera can do. Only `savePreset` and
29016
+ * `deletePreset` are gated.
29017
+ */
29018
+ var PtzPresetFunctionSchema = _enum([
29019
+ "home",
29020
+ "day-mode",
29021
+ "night-mode",
29022
+ "day-night-auto",
29023
+ "set-limits",
29024
+ "save-limits",
29025
+ "reboot",
29026
+ "osd-menu"
29027
+ ]);
28997
29028
  var PtzPresetSchema = object({
28998
29029
  id: string(),
28999
- name: string()
29030
+ name: string(),
29031
+ /**
29032
+ * The firmware function this id performs, when the provider KNOWS the id is
29033
+ * reserved. `null` = an ordinary stored position, OR a reserved id this
29034
+ * provider does not recognise -- the two are told apart by `writable`.
29035
+ */
29036
+ fn: PtzPresetFunctionSchema.nullable(),
29037
+ /**
29038
+ * Whether `savePreset` / `deletePreset` may target this id. A provider sets
29039
+ * it false only for a band it KNOWS is reserved; where the firmware is not
29040
+ * documented it stays true and a refusal comes from the camera, named.
29041
+ */
29042
+ writable: boolean()
29000
29043
  });
29044
+ /**
29045
+ * Where the head is pointing -- per axis, and `null` when the driver cannot
29046
+ * read it.
29047
+ *
29048
+ * It used to be three REQUIRED numbers, which left a provider that cannot read
29049
+ * position no way to say so. All four said `0`:
29050
+ *
29051
+ * reolink `return { pan: 0, tilt: 0, zoom: 0 }` "until a position-query
29052
+ * path lands upstream"
29053
+ * hikvision stub, "firmware-dependent and frequently absent"
29054
+ * amcrest stub, "no generic absolute-position read for this model family"
29055
+ * onvif throws
29056
+ *
29057
+ * So every consumer asking where a camera points was told "perfectly centred"
29058
+ * by four cameras that had never looked. That is D393 -- a measurement that
29059
+ * FAILED is `null`, never `0`, and the type says so all the way to the
29060
+ * decision -- the same shape as the unreadable `statfs` folded into "0 bytes of
29061
+ * headroom", which evacuated a healthy disk.
29062
+ *
29063
+ * D393 also says to check for a narrower structural TWIN of the result type.
29064
+ * There is one: `PtzStatusSchema` extends this, so the lie had already
29065
+ * propagated into `getStatus`, which is the surface `getPosition`'s own comment
29066
+ * tells callers to migrate to.
29067
+ */
29001
29068
  var PtzPositionSchema = object({
29002
- pan: number(),
29003
- tilt: number(),
29004
- zoom: number()
29069
+ pan: number().nullable(),
29070
+ tilt: number().nullable(),
29071
+ zoom: number().nullable()
29005
29072
  });
29006
29073
  var PtzMoveCommandSchema = object({
29007
29074
  pan: number().optional(),
@@ -29020,7 +29087,72 @@ var PtzOptionsSchema = object({
29020
29087
  maxPresets: number().optional(),
29021
29088
  /** Whether the camera exposes a controllable autofocus toggle
29022
29089
  * (boolean `hasX` per the getOptions availability convention). */
29023
- hasAutofocus: boolean()
29090
+ hasAutofocus: boolean(),
29091
+ /**
29092
+ * How many distinct speeds this camera's NATIVE scale offers.
29093
+ *
29094
+ * The cap's `speed` is normalized 0..1 and each provider maps it down --
29095
+ * Baichuan 1..63, Dahua 1..8, ISAPI's percentage -100..100. The normalized
29096
+ * value hides how coarse that really is: asking an amcrest for `0.37` is
29097
+ * meaningless, because it has eight steps and three of them round to the
29098
+ * same one. A loop that tunes its own gain has to know the granularity of
29099
+ * the knob it is turning.
29100
+ *
29101
+ * `null` = the driver does not know, or the scale is continuous (ONVIF takes
29102
+ * a float). Never a made-up number.
29103
+ */
29104
+ speedSteps: number().int().positive().nullable(),
29105
+ /**
29106
+ * How long ONE `move` pulse runs on this driver, ms.
29107
+ *
29108
+ * `move` is a self-terminating burst everywhere, but every provider hardcoded
29109
+ * its own duration in private -- 200 reolink, 350 amcrest, 500 hikvision,
29110
+ * 1000 onvif -- so no caller could read it. It is the DENOMINATOR of "how far
29111
+ * did the head travel per pulse": without it a measured displacement has no
29112
+ * gain to be divided into.
29113
+ *
29114
+ * `null` = the driver cannot say.
29115
+ */
29116
+ moveImpulseMs: number().int().positive().nullable()
29117
+ });
29118
+ /**
29119
+ * Which preset `goHome` goes to, and WHO decided.
29120
+ *
29121
+ * `goHome` used to be three vendor "conventions" written in three comments --
29122
+ * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
29123
+ * not one of the three cameras honours its own:
29124
+ *
29125
+ * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
29126
+ * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
29127
+ * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
29128
+ *
29129
+ * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
29130
+ * and two of the three swallowed the failure in a bare `catch`. For autotrack
29131
+ * this is the HOTTEST path -- it runs every time a subject is released -- so it
29132
+ * needs an answer that is true per camera and audible when it is missing.
29133
+ *
29134
+ * `source` is what makes it honest:
29135
+ * - `operator` -- picked in the UI, stored by the provider.
29136
+ * - `firmware` -- the camera itself named a preset `fn: 'home'` (Hikvision's
29137
+ * "Back to origin"), adopted as the default with nothing to configure.
29138
+ * - `native` -- the driver homes WITHOUT a preset at all. ONVIF does:
29139
+ * `goHome` is `ptzAbsoluteMove({x:0, y:0, zoom:0})`. `presetId` is null and
29140
+ * that is not a failure -- there is nothing to pick, and the UI must offer
29141
+ * no picker.
29142
+ * - `none` -- nothing is configured and the camera names nothing.
29143
+ * `goHome` REFUSES rather than moving the head somewhere arbitrary.
29144
+ *
29145
+ * `source === 'none'` is the refusal condition, NOT `presetId === null`: the
29146
+ * native case has no preset and homes perfectly well.
29147
+ */
29148
+ var PtzHomePresetSchema = object({
29149
+ presetId: string().nullable(),
29150
+ source: _enum([
29151
+ "operator",
29152
+ "firmware",
29153
+ "native",
29154
+ "none"
29155
+ ])
29024
29156
  });
29025
29157
  DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(PtzPresetSchema)), method(object({
29026
29158
  deviceId: number(),
@@ -29038,7 +29170,13 @@ DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _
29038
29170
  }), _void(), {
29039
29171
  kind: "mutation",
29040
29172
  auth: "admin"
29041
- }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
29173
+ }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzHomePresetSchema), method(object({
29174
+ deviceId: number(),
29175
+ presetId: string().nullable()
29176
+ }), _void(), {
29177
+ kind: "mutation",
29178
+ auth: "admin"
29179
+ }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
29042
29180
  deviceId: number(),
29043
29181
  enabled: boolean()
29044
29182
  }), _void(), { kind: "mutation" });
@@ -36060,6 +36198,12 @@ Object.freeze({
36060
36198
  addonId: null,
36061
36199
  access: "delete"
36062
36200
  },
36201
+ "ptz.getHomePreset": {
36202
+ capName: "ptz",
36203
+ capScope: "device",
36204
+ addonId: null,
36205
+ access: "view"
36206
+ },
36063
36207
  "ptz.getOptions": {
36064
36208
  capName: "ptz",
36065
36209
  capScope: "device",
@@ -36108,6 +36252,12 @@ Object.freeze({
36108
36252
  addonId: null,
36109
36253
  access: "create"
36110
36254
  },
36255
+ "ptz.setHomePreset": {
36256
+ capName: "ptz",
36257
+ capScope: "device",
36258
+ addonId: null,
36259
+ access: "create"
36260
+ },
36111
36261
  "ptz.stop": {
36112
36262
  capName: "ptz",
36113
36263
  capScope: "device",
@@ -39281,6 +39431,11 @@ Object.freeze({
39281
39431
  form: "single",
39282
39432
  optional: false
39283
39433
  }],
39434
+ "ptz.getHomePreset": [{
39435
+ name: "deviceId",
39436
+ form: "single",
39437
+ optional: false
39438
+ }],
39284
39439
  "ptz.getOptions": [{
39285
39440
  name: "deviceId",
39286
39441
  form: "single",
@@ -39321,6 +39476,11 @@ Object.freeze({
39321
39476
  form: "single",
39322
39477
  optional: false
39323
39478
  }],
39479
+ "ptz.setHomePreset": [{
39480
+ name: "deviceId",
39481
+ form: "single",
39482
+ optional: false
39483
+ }],
39324
39484
  "ptz.stop": [{
39325
39485
  name: "deviceId",
39326
39486
  form: "single",
@@ -5434,7 +5434,7 @@ var ZodIssueCode = {
5434
5434
  var ZodFirstPartyTypeKind;
5435
5435
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5436
5436
  //#endregion
5437
- //#region ../types/dist/sleep-BDR76Ykr.mjs
5437
+ //#region ../types/dist/sleep-B1y0Fo1U.mjs
5438
5438
  /**
5439
5439
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5440
5440
  * window to float samples (D455).
@@ -28990,14 +28990,81 @@ DeviceType.Camera, method(object({ deviceId: number() }), PrivacyMaskOptionsSche
28990
28990
  kind: "mutation",
28991
28991
  auth: "admin"
28992
28992
  });
28993
+ /**
28994
+ * What a preset id DOES on this camera.
28995
+ *
28996
+ * On several PTZ firmwares the preset namespace is shared: low ids are stored
28997
+ * positions, a reserved band triggers camera FUNCTIONS. The dispensa camera
28998
+ * (Hikvision) returns its own reserved band in the preset list, named by the
28999
+ * firmware:
29000
+ *
29001
+ * 34 Back to origin · 39 Day mode · 40 Night mode · 46 Day/Night Auto Mode
29002
+ * 92 Set manual limits · 93 Save manual limits · 94 Remote reboot
29003
+ * 95 Call OSD menu
29004
+ *
29005
+ * We used to hand all of these to the UI as ordinary presets. Saving over one
29006
+ * is what produced `PUT /ISAPI/PTZCtrl/channels/1/presets/34 -> HTTP 500`: the
29007
+ * camera refusing to let "Back to origin" be overwritten, surfaced to the
29008
+ * operator as a transport failure.
29009
+ *
29010
+ * A function preset stays fully usable as a DESTINATION -- `goToPreset('34')`
29011
+ * is the single most useful thing that camera can do. Only `savePreset` and
29012
+ * `deletePreset` are gated.
29013
+ */
29014
+ var PtzPresetFunctionSchema = _enum([
29015
+ "home",
29016
+ "day-mode",
29017
+ "night-mode",
29018
+ "day-night-auto",
29019
+ "set-limits",
29020
+ "save-limits",
29021
+ "reboot",
29022
+ "osd-menu"
29023
+ ]);
28993
29024
  var PtzPresetSchema = object({
28994
29025
  id: string(),
28995
- name: string()
29026
+ name: string(),
29027
+ /**
29028
+ * The firmware function this id performs, when the provider KNOWS the id is
29029
+ * reserved. `null` = an ordinary stored position, OR a reserved id this
29030
+ * provider does not recognise -- the two are told apart by `writable`.
29031
+ */
29032
+ fn: PtzPresetFunctionSchema.nullable(),
29033
+ /**
29034
+ * Whether `savePreset` / `deletePreset` may target this id. A provider sets
29035
+ * it false only for a band it KNOWS is reserved; where the firmware is not
29036
+ * documented it stays true and a refusal comes from the camera, named.
29037
+ */
29038
+ writable: boolean()
28996
29039
  });
29040
+ /**
29041
+ * Where the head is pointing -- per axis, and `null` when the driver cannot
29042
+ * read it.
29043
+ *
29044
+ * It used to be three REQUIRED numbers, which left a provider that cannot read
29045
+ * position no way to say so. All four said `0`:
29046
+ *
29047
+ * reolink `return { pan: 0, tilt: 0, zoom: 0 }` "until a position-query
29048
+ * path lands upstream"
29049
+ * hikvision stub, "firmware-dependent and frequently absent"
29050
+ * amcrest stub, "no generic absolute-position read for this model family"
29051
+ * onvif throws
29052
+ *
29053
+ * So every consumer asking where a camera points was told "perfectly centred"
29054
+ * by four cameras that had never looked. That is D393 -- a measurement that
29055
+ * FAILED is `null`, never `0`, and the type says so all the way to the
29056
+ * decision -- the same shape as the unreadable `statfs` folded into "0 bytes of
29057
+ * headroom", which evacuated a healthy disk.
29058
+ *
29059
+ * D393 also says to check for a narrower structural TWIN of the result type.
29060
+ * There is one: `PtzStatusSchema` extends this, so the lie had already
29061
+ * propagated into `getStatus`, which is the surface `getPosition`'s own comment
29062
+ * tells callers to migrate to.
29063
+ */
28997
29064
  var PtzPositionSchema = object({
28998
- pan: number(),
28999
- tilt: number(),
29000
- zoom: number()
29065
+ pan: number().nullable(),
29066
+ tilt: number().nullable(),
29067
+ zoom: number().nullable()
29001
29068
  });
29002
29069
  var PtzMoveCommandSchema = object({
29003
29070
  pan: number().optional(),
@@ -29016,7 +29083,72 @@ var PtzOptionsSchema = object({
29016
29083
  maxPresets: number().optional(),
29017
29084
  /** Whether the camera exposes a controllable autofocus toggle
29018
29085
  * (boolean `hasX` per the getOptions availability convention). */
29019
- hasAutofocus: boolean()
29086
+ hasAutofocus: boolean(),
29087
+ /**
29088
+ * How many distinct speeds this camera's NATIVE scale offers.
29089
+ *
29090
+ * The cap's `speed` is normalized 0..1 and each provider maps it down --
29091
+ * Baichuan 1..63, Dahua 1..8, ISAPI's percentage -100..100. The normalized
29092
+ * value hides how coarse that really is: asking an amcrest for `0.37` is
29093
+ * meaningless, because it has eight steps and three of them round to the
29094
+ * same one. A loop that tunes its own gain has to know the granularity of
29095
+ * the knob it is turning.
29096
+ *
29097
+ * `null` = the driver does not know, or the scale is continuous (ONVIF takes
29098
+ * a float). Never a made-up number.
29099
+ */
29100
+ speedSteps: number().int().positive().nullable(),
29101
+ /**
29102
+ * How long ONE `move` pulse runs on this driver, ms.
29103
+ *
29104
+ * `move` is a self-terminating burst everywhere, but every provider hardcoded
29105
+ * its own duration in private -- 200 reolink, 350 amcrest, 500 hikvision,
29106
+ * 1000 onvif -- so no caller could read it. It is the DENOMINATOR of "how far
29107
+ * did the head travel per pulse": without it a measured displacement has no
29108
+ * gain to be divided into.
29109
+ *
29110
+ * `null` = the driver cannot say.
29111
+ */
29112
+ moveImpulseMs: number().int().positive().nullable()
29113
+ });
29114
+ /**
29115
+ * Which preset `goHome` goes to, and WHO decided.
29116
+ *
29117
+ * `goHome` used to be three vendor "conventions" written in three comments --
29118
+ * Reolink preset 0, Hikvision preset '1', Dahua preset 1 -- and on this fleet
29119
+ * not one of the three cameras honours its own:
29120
+ *
29121
+ * 592 Videocamera camera Daniel (reolink) preset 0 holds "stanza"
29122
+ * 1438 Videocamera dispensa (hikvision) preset 1 holds "Credenza"
29123
+ * 3836 Videocamera studio (amcrest) preset 1 holds "Preset1"
29124
+ *
29125
+ * So `goHome` meant "go wherever the operator happened to save in slot 0 or 1",
29126
+ * and two of the three swallowed the failure in a bare `catch`. For autotrack
29127
+ * this is the HOTTEST path -- it runs every time a subject is released -- so it
29128
+ * needs an answer that is true per camera and audible when it is missing.
29129
+ *
29130
+ * `source` is what makes it honest:
29131
+ * - `operator` -- picked in the UI, stored by the provider.
29132
+ * - `firmware` -- the camera itself named a preset `fn: 'home'` (Hikvision's
29133
+ * "Back to origin"), adopted as the default with nothing to configure.
29134
+ * - `native` -- the driver homes WITHOUT a preset at all. ONVIF does:
29135
+ * `goHome` is `ptzAbsoluteMove({x:0, y:0, zoom:0})`. `presetId` is null and
29136
+ * that is not a failure -- there is nothing to pick, and the UI must offer
29137
+ * no picker.
29138
+ * - `none` -- nothing is configured and the camera names nothing.
29139
+ * `goHome` REFUSES rather than moving the head somewhere arbitrary.
29140
+ *
29141
+ * `source === 'none'` is the refusal condition, NOT `presetId === null`: the
29142
+ * native case has no preset and homes perfectly well.
29143
+ */
29144
+ var PtzHomePresetSchema = object({
29145
+ presetId: string().nullable(),
29146
+ source: _enum([
29147
+ "operator",
29148
+ "firmware",
29149
+ "native",
29150
+ "none"
29151
+ ])
29020
29152
  });
29021
29153
  DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(PtzMoveCommandSchema.extend({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), array(PtzPresetSchema)), method(object({
29022
29154
  deviceId: number(),
@@ -29034,7 +29166,13 @@ DeviceType.Camera, method(PtzMoveCommandSchema.extend({ deviceId: number() }), _
29034
29166
  }), _void(), {
29035
29167
  kind: "mutation",
29036
29168
  auth: "admin"
29037
- }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
29169
+ }), method(object({ deviceId: number() }), PtzOptionsSchema), method(object({ deviceId: number() }), _void(), { kind: "mutation" }), method(object({ deviceId: number() }), PtzHomePresetSchema), method(object({
29170
+ deviceId: number(),
29171
+ presetId: string().nullable()
29172
+ }), _void(), {
29173
+ kind: "mutation",
29174
+ auth: "admin"
29175
+ }), method(object({ deviceId: number() }), PtzPositionSchema), method(object({
29038
29176
  deviceId: number(),
29039
29177
  enabled: boolean()
29040
29178
  }), _void(), { kind: "mutation" });
@@ -36056,6 +36194,12 @@ Object.freeze({
36056
36194
  addonId: null,
36057
36195
  access: "delete"
36058
36196
  },
36197
+ "ptz.getHomePreset": {
36198
+ capName: "ptz",
36199
+ capScope: "device",
36200
+ addonId: null,
36201
+ access: "view"
36202
+ },
36059
36203
  "ptz.getOptions": {
36060
36204
  capName: "ptz",
36061
36205
  capScope: "device",
@@ -36104,6 +36248,12 @@ Object.freeze({
36104
36248
  addonId: null,
36105
36249
  access: "create"
36106
36250
  },
36251
+ "ptz.setHomePreset": {
36252
+ capName: "ptz",
36253
+ capScope: "device",
36254
+ addonId: null,
36255
+ access: "create"
36256
+ },
36107
36257
  "ptz.stop": {
36108
36258
  capName: "ptz",
36109
36259
  capScope: "device",
@@ -39277,6 +39427,11 @@ Object.freeze({
39277
39427
  form: "single",
39278
39428
  optional: false
39279
39429
  }],
39430
+ "ptz.getHomePreset": [{
39431
+ name: "deviceId",
39432
+ form: "single",
39433
+ optional: false
39434
+ }],
39280
39435
  "ptz.getOptions": [{
39281
39436
  name: "deviceId",
39282
39437
  form: "single",
@@ -39317,6 +39472,11 @@ Object.freeze({
39317
39472
  form: "single",
39318
39473
  optional: false
39319
39474
  }],
39475
+ "ptz.setHomePreset": [{
39476
+ name: "deviceId",
39477
+ form: "single",
39478
+ optional: false
39479
+ }],
39320
39480
  "ptz.stop": [{
39321
39481
  name: "deviceId",
39322
39482
  form: "single",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-export-google",
3
- "version": "0.1.73",
3
+ "version": "0.1.75",
4
4
  "description": "Google Home export — hub-side smart-home fulfillment (SYNC / QUERY / EXECUTE / DISCONNECT) for the non-camera fleet, served over the hub's own OAuth account link. No Google credential is stored, sent or required.",
5
5
  "keywords": [
6
6
  "camstack",