@camstack/addon-provider-homeassistant 1.2.658 → 1.2.660

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.
@@ -11996,7 +11996,7 @@ object({
11996
11996
  params: record(string(), union([string(), number()])).optional()
11997
11997
  });
11998
11998
  //#endregion
11999
- //#region ../types/dist/composition-CRNwcFYY.mjs
11999
+ //#region ../types/dist/composition-pOHbTzRB.mjs
12000
12000
  /**
12001
12001
  * The ffmpeg build every CamStack node downloads, per platform and arch.
12002
12002
  *
@@ -50855,6 +50855,9 @@ var RunningProposalEvidenceSchema = object({
50855
50855
  runsFound: number().int().nonnegative(),
50856
50856
  pausesFound: number().int().nonnegative(),
50857
50857
  longestPauseMs: number().nonnegative(),
50858
+ /** Episodes shorter than ~90 s (an anti-crease pulse, a display waking): never a run, never a pause. */
50859
+ pulsesFound: number().int().nonnegative(),
50860
+ longestPulseMs: number().nonnegative(),
50858
50861
  idleFloorW: number(),
50859
50862
  noiseCeilingW: number(),
50860
50863
  plateauW: number(),
@@ -81310,11 +81313,15 @@ function runningFromMediaPlayer(state, previous, fetchedAt, transitionAt) {
81310
81313
  * 1. idle floor F = time-weighted median; noise ceiling N = highest value seen
81311
81314
  * near F. A device that is not near one level most of the time has no floor.
81312
81315
  * 2. coarse activity = above max(2N, N + 5 W); consecutive stretches are episodes.
81313
- * 3. gaps between episodes split in two by the largest log-scale jump (>= 3x):
81314
- * the short ones are pauses INSIDE a run (a soak), the long ones separate runs.
81316
+ * 3. an episode shorter than `PULSE_MAX_MS` is a PULSE (an anti-crease tumble, a
81317
+ * display waking): it is neither a run nor a pause. Among the remaining
81318
+ * episodes, gaps over `PAUSE_MAX_MS` always separate runs; the rest split in
81319
+ * two by the largest log-scale jump (>= 3x): the short ones are pauses INSIDE
81320
+ * a run (a soak), the long ones separate runs. A stretch under `MIN_RUN_MS`
81321
+ * is no run.
81315
81322
  * 4. T = geometric mean of N and the plateau's 10th percentile, snapped to a
81316
- * grid a person would type; stop dwell covers the longest pause; start dwell
81317
- * covers the longest standby blip above T.
81323
+ * grid a person would type; stop dwell covers the longest pause and the
81324
+ * kind's floor; start dwell covers the longest pulse and standby blip above T.
81318
81325
  * 5. the numbers are proved by REPLAY through the real `dwell` evaluation: each
81319
81326
  * run must hold exactly one true interval and nothing may flap outside.
81320
81327
  */
@@ -81325,6 +81332,10 @@ var MINUTE_MS$1 = 60 * SECOND_MS;
81325
81332
  30 * SECOND_MS;
81326
81333
  60 * SECOND_MS;
81327
81334
  20 * MINUTE_MS$1;
81335
+ 90 * SECOND_MS;
81336
+ 30 * MINUTE_MS$1;
81337
+ 10 * MINUTE_MS$1;
81338
+ DeviceType.Dryer, 3 * MINUTE_MS$1, DeviceType.Dishwasher, 3 * MINUTE_MS$1, DeviceType.Washer, 10 * MINUTE_MS$1;
81328
81339
  10 * SECOND_MS;
81329
81340
  10 * SECOND_MS;
81330
81341
  DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverStoppable, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
@@ -98417,6 +98428,17 @@ function haInstanceSettingsPortsOver(api) {
98417
98428
  skipRestart: true
98418
98429
  });
98419
98430
  return true;
98431
+ },
98432
+ clearInstanceSettingsKeys: async (integrationId, keys) => {
98433
+ if (!(await api.list.query()).some((i) => i.id === integrationId && i.addonId === "provider-homeassistant")) return false;
98434
+ const stored = await api.getSettings.query({ id: integrationId });
98435
+ const drop = new Set(keys);
98436
+ await api.setSettings.mutate({
98437
+ id: integrationId,
98438
+ settings: Object.fromEntries(Object.entries(stored).filter(([key]) => !drop.has(key))),
98439
+ skipRestart: true
98440
+ });
98441
+ return true;
98420
98442
  }
98421
98443
  };
98422
98444
  }
@@ -11997,7 +11997,7 @@ object({
11997
11997
  params: record(string(), union([string(), number()])).optional()
11998
11998
  });
11999
11999
  //#endregion
12000
- //#region ../types/dist/composition-CRNwcFYY.mjs
12000
+ //#region ../types/dist/composition-pOHbTzRB.mjs
12001
12001
  /**
12002
12002
  * The ffmpeg build every CamStack node downloads, per platform and arch.
12003
12003
  *
@@ -50856,6 +50856,9 @@ var RunningProposalEvidenceSchema = object({
50856
50856
  runsFound: number().int().nonnegative(),
50857
50857
  pausesFound: number().int().nonnegative(),
50858
50858
  longestPauseMs: number().nonnegative(),
50859
+ /** Episodes shorter than ~90 s (an anti-crease pulse, a display waking): never a run, never a pause. */
50860
+ pulsesFound: number().int().nonnegative(),
50861
+ longestPulseMs: number().nonnegative(),
50859
50862
  idleFloorW: number(),
50860
50863
  noiseCeilingW: number(),
50861
50864
  plateauW: number(),
@@ -81311,11 +81314,15 @@ function runningFromMediaPlayer(state, previous, fetchedAt, transitionAt) {
81311
81314
  * 1. idle floor F = time-weighted median; noise ceiling N = highest value seen
81312
81315
  * near F. A device that is not near one level most of the time has no floor.
81313
81316
  * 2. coarse activity = above max(2N, N + 5 W); consecutive stretches are episodes.
81314
- * 3. gaps between episodes split in two by the largest log-scale jump (>= 3x):
81315
- * the short ones are pauses INSIDE a run (a soak), the long ones separate runs.
81317
+ * 3. an episode shorter than `PULSE_MAX_MS` is a PULSE (an anti-crease tumble, a
81318
+ * display waking): it is neither a run nor a pause. Among the remaining
81319
+ * episodes, gaps over `PAUSE_MAX_MS` always separate runs; the rest split in
81320
+ * two by the largest log-scale jump (>= 3x): the short ones are pauses INSIDE
81321
+ * a run (a soak), the long ones separate runs. A stretch under `MIN_RUN_MS`
81322
+ * is no run.
81316
81323
  * 4. T = geometric mean of N and the plateau's 10th percentile, snapped to a
81317
- * grid a person would type; stop dwell covers the longest pause; start dwell
81318
- * covers the longest standby blip above T.
81324
+ * grid a person would type; stop dwell covers the longest pause and the
81325
+ * kind's floor; start dwell covers the longest pulse and standby blip above T.
81319
81326
  * 5. the numbers are proved by REPLAY through the real `dwell` evaluation: each
81320
81327
  * run must hold exactly one true interval and nothing may flap outside.
81321
81328
  */
@@ -81326,6 +81333,10 @@ var MINUTE_MS$1 = 60 * SECOND_MS;
81326
81333
  30 * SECOND_MS;
81327
81334
  60 * SECOND_MS;
81328
81335
  20 * MINUTE_MS$1;
81336
+ 90 * SECOND_MS;
81337
+ 30 * MINUTE_MS$1;
81338
+ 10 * MINUTE_MS$1;
81339
+ DeviceType.Dryer, 3 * MINUTE_MS$1, DeviceType.Dishwasher, 3 * MINUTE_MS$1, DeviceType.Washer, 10 * MINUTE_MS$1;
81329
81340
  10 * SECOND_MS;
81330
81341
  10 * SECOND_MS;
81331
81342
  DeviceFeature.FanSpeed, DeviceFeature.FanPreset, DeviceFeature.FanDirection, DeviceFeature.FanOscillating, DeviceFeature.CoverStoppable, DeviceFeature.CoverPositionable, DeviceFeature.CoverTilt, DeviceFeature.ValvePositionable, DeviceFeature.MediaPlayerVolume, DeviceFeature.ClimateFanMode;
@@ -98418,6 +98429,17 @@ function haInstanceSettingsPortsOver(api) {
98418
98429
  skipRestart: true
98419
98430
  });
98420
98431
  return true;
98432
+ },
98433
+ clearInstanceSettingsKeys: async (integrationId, keys) => {
98434
+ if (!(await api.list.query()).some((i) => i.id === integrationId && i.addonId === "provider-homeassistant")) return false;
98435
+ const stored = await api.getSettings.query({ id: integrationId });
98436
+ const drop = new Set(keys);
98437
+ await api.setSettings.mutate({
98438
+ id: integrationId,
98439
+ settings: Object.fromEntries(Object.entries(stored).filter(([key]) => !drop.has(key))),
98440
+ skipRestart: true
98441
+ });
98442
+ return true;
98421
98443
  }
98422
98444
  };
98423
98445
  }
package/i18n/en.json CHANGED
@@ -11,9 +11,6 @@
11
11
  "haBrokerSettings.s_ha-broker-credentials.baseUrl.label": "HA base URL",
12
12
  "haBrokerSettings.s_ha-broker-credentials.accessToken.label": "Long-lived access token",
13
13
  "haBrokerSettings.s_ha-broker-credentials.supervisorToken.label": "Supervisor token",
14
- "globalSettings.s_ha-export-brokers.title": "Home Assistant instances",
15
- "globalSettings.s_ha-export-brokers.ha-export___no-brokers.label": "No brokers",
16
- "globalSettings.s_ha-export-transport.title": "Connection",
17
14
  "globalSettings.s_ha-export-advanced.title": "Advanced",
18
15
  "globalSettings.s_ha-export-advanced.reconcileIntervalSec.label": "Reconcile interval (s)",
19
16
  "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Full re-announce and re-push cadence.",
@@ -22,5 +19,22 @@
22
19
  "haConfig.s_connection.service.label": "Notify service",
23
20
  "haConfig.s_connection.service.description": "Loaded from the broker once it is picked. If the list does not load, type the part after `notify.`.",
24
21
  "haConfig.s_connection.brokerId.label": "Broker",
25
- "haConfig.s_connection.brokerId.description": "The Home Assistant connection the notification goes through."
22
+ "haConfig.s_connection.brokerId.description": "The Home Assistant connection the notification goes through.",
23
+ "globalSettings": {
24
+ "s_ha-export-target": {
25
+ "title": "Home Assistant target",
26
+ "description": "Which Home Assistant connection this export feeds, and how it links to images.",
27
+ "name": {
28
+ "label": "Name"
29
+ },
30
+ "connectionId": {
31
+ "label": "Home Assistant connection",
32
+ "description": "The Home Assistant broker this target pushes to. Several targets may share one."
33
+ },
34
+ "mediaRole": {
35
+ "label": "Image links",
36
+ "description": "Which address Home Assistant uses to fetch images."
37
+ }
38
+ }
39
+ }
26
40
  }
package/i18n/it.json CHANGED
@@ -11,9 +11,6 @@
11
11
  "haBrokerSettings.s_ha-broker-credentials.baseUrl.label": "URL base di HA",
12
12
  "haBrokerSettings.s_ha-broker-credentials.accessToken.label": "Token di accesso a lunga durata",
13
13
  "haBrokerSettings.s_ha-broker-credentials.supervisorToken.label": "Token del Supervisor",
14
- "globalSettings.s_ha-export-brokers.title": "Istanze di Home Assistant",
15
- "globalSettings.s_ha-export-brokers.ha-export___no-brokers.label": "Nessun broker",
16
- "globalSettings.s_ha-export-transport.title": "Connessione",
17
14
  "globalSettings.s_ha-export-advanced.title": "Avanzate",
18
15
  "globalSettings.s_ha-export-advanced.reconcileIntervalSec.label": "Intervallo di riconciliazione (s)",
19
16
  "globalSettings.s_ha-export-advanced.reconcileIntervalSec.description": "Cadenza di ri-annuncio e ri-invio completo.",
@@ -22,5 +19,22 @@
22
19
  "haConfig.s_connection.service.label": "Servizio di notifica",
23
20
  "haConfig.s_connection.service.description": "Caricato dal broker una volta scelto. Se l'elenco non si carica, scrivi la parte dopo `notify.`.",
24
21
  "haConfig.s_connection.brokerId.label": "Broker",
25
- "haConfig.s_connection.brokerId.description": "La connessione Home Assistant attraverso cui passa la notifica."
22
+ "haConfig.s_connection.brokerId.description": "La connessione Home Assistant attraverso cui passa la notifica.",
23
+ "globalSettings": {
24
+ "s_ha-export-target": {
25
+ "title": "Destinazione Home Assistant",
26
+ "description": "Quale connessione Home Assistant alimenta questo export e come collega le immagini.",
27
+ "name": {
28
+ "label": "Nome"
29
+ },
30
+ "connectionId": {
31
+ "label": "Connessione Home Assistant",
32
+ "description": "Il broker Home Assistant a cui questa destinazione invia. Più destinazioni possono condividerne uno."
33
+ },
34
+ "mediaRole": {
35
+ "label": "Link alle immagini",
36
+ "description": "Quale indirizzo usa Home Assistant per scaricare le immagini."
37
+ }
38
+ }
39
+ }
26
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-provider-homeassistant",
3
- "version": "1.2.658",
3
+ "version": "1.2.660",
4
4
  "description": "Home Assistant device provider addon for CamStack",
5
5
  "keywords": [
6
6
  "camstack",
@@ -125,6 +125,9 @@
125
125
  },
126
126
  {
127
127
  "name": "oauth-integration"
128
+ },
129
+ {
130
+ "name": "integration-instances"
128
131
  }
129
132
  ]
130
133
  }
@@ -134,7 +137,7 @@
134
137
  "description": "Device provider (import) + native entity export (push). Two addons, one bundle, separate processes."
135
138
  },
136
139
  "requires": {
137
- "server": ">=1.2.766"
140
+ "server": ">=1.2.769"
138
141
  }
139
142
  },
140
143
  "files": [