@smarthome.exchange/integrations 2.0.0 → 4.0.0
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/changelog.md +46 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/core/classes.nativeintegrationowner.d.ts +2 -0
- package/dist_ts/core/classes.nativeintegrationowner.js +5 -1
- package/dist_ts/core/classes.runtimemanager.d.ts +2 -0
- package/dist_ts/core/classes.runtimemanager.js +11 -3
- package/dist_ts/core/types.d.ts +2 -0
- package/dist_ts/integrations/deconz/deconz.classes.client.d.ts +37 -29
- package/dist_ts/integrations/deconz/deconz.classes.client.js +521 -294
- package/dist_ts/integrations/deconz/deconz.classes.configflow.d.ts +6 -1
- package/dist_ts/integrations/deconz/deconz.classes.configflow.js +63 -33
- package/dist_ts/integrations/deconz/deconz.classes.integration.d.ts +4 -3
- package/dist_ts/integrations/deconz/deconz.classes.integration.js +85 -40
- package/dist_ts/integrations/deconz/deconz.mapper.d.ts +1 -0
- package/dist_ts/integrations/deconz/deconz.mapper.js +24 -6
- package/dist_ts/integrations/deconz/deconz.types.d.ts +43 -6
- package/dist_ts/integrations/deconz/deconz.validation.d.ts +7 -1
- package/dist_ts/integrations/deconz/deconz.validation.js +215 -4
- package/dist_ts/integrations/esphome/esphome.classes.client.d.ts +19 -7
- package/dist_ts/integrations/esphome/esphome.classes.client.js +183 -89
- package/dist_ts/integrations/esphome/esphome.classes.configflow.d.ts +5 -2
- package/dist_ts/integrations/esphome/esphome.classes.configflow.js +43 -33
- package/dist_ts/integrations/esphome/esphome.classes.integration.d.ts +8 -6
- package/dist_ts/integrations/esphome/esphome.classes.integration.js +71 -43
- package/dist_ts/integrations/esphome/esphome.discovery.js +4 -12
- package/dist_ts/integrations/esphome/esphome.mapper.d.ts +2 -2
- package/dist_ts/integrations/esphome/esphome.mapper.js +6 -4
- package/dist_ts/integrations/esphome/esphome.types.d.ts +31 -6
- package/dist_ts/integrations/esphome/esphome.types.js +1 -1
- package/dist_ts/integrations/esphome/esphome.validation.d.ts +7 -0
- package/dist_ts/integrations/esphome/esphome.validation.js +66 -0
- package/dist_ts/integrations/homeassistant/homeassistant.classes.client.d.ts +32 -4
- package/dist_ts/integrations/homeassistant/homeassistant.classes.client.js +345 -116
- package/dist_ts/integrations/homeassistant/homeassistant.classes.integration.d.ts +8 -5
- package/dist_ts/integrations/homeassistant/homeassistant.classes.integration.js +34 -8
- package/dist_ts/integrations/homeassistant/homeassistant.classes.runtime.d.ts +7 -4
- package/dist_ts/integrations/homeassistant/homeassistant.classes.runtime.js +44 -56
- package/dist_ts/integrations/homeassistant/homeassistant.types.d.ts +12 -1
- package/dist_ts/integrations/hue/hue.classes.client.d.ts +32 -4
- package/dist_ts/integrations/hue/hue.classes.client.js +331 -57
- package/dist_ts/integrations/hue/hue.classes.configflow.d.ts +6 -1
- package/dist_ts/integrations/hue/hue.classes.configflow.js +79 -27
- package/dist_ts/integrations/hue/hue.classes.integration.d.ts +3 -1
- package/dist_ts/integrations/hue/hue.classes.integration.js +83 -62
- package/dist_ts/integrations/hue/hue.mapper.d.ts +2 -0
- package/dist_ts/integrations/hue/hue.mapper.js +8 -6
- package/dist_ts/integrations/hue/hue.types.d.ts +32 -1
- package/dist_ts/integrations/hue/hue.validation.d.ts +9 -3
- package/dist_ts/integrations/hue/hue.validation.js +112 -11
- package/dist_ts/integrations/mqtt/mqtt.classes.client.d.ts +15 -2
- package/dist_ts/integrations/mqtt/mqtt.classes.client.js +173 -23
- package/dist_ts/integrations/mqtt/mqtt.classes.configflow.d.ts +5 -1
- package/dist_ts/integrations/mqtt/mqtt.classes.configflow.js +53 -33
- package/dist_ts/integrations/mqtt/mqtt.classes.integration.d.ts +4 -1
- package/dist_ts/integrations/mqtt/mqtt.classes.integration.js +127 -56
- package/dist_ts/integrations/mqtt/mqtt.classes.session.d.ts +13 -0
- package/dist_ts/integrations/mqtt/mqtt.classes.session.js +130 -0
- package/dist_ts/integrations/mqtt/mqtt.mapper.d.ts +3 -0
- package/dist_ts/integrations/mqtt/mqtt.mapper.js +44 -1
- package/dist_ts/integrations/mqtt/mqtt.types.d.ts +46 -0
- package/dist_ts/integrations/mqtt/mqtt.validation.d.ts +7 -0
- package/dist_ts/integrations/mqtt/mqtt.validation.js +180 -0
- package/dist_ts/integrations/samsungtv/samsungtv.classes.client.d.ts +4 -2
- package/dist_ts/integrations/samsungtv/samsungtv.classes.client.js +41 -16
- package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.d.ts +5 -0
- package/dist_ts/integrations/samsungtv/samsungtv.classes.configflow.js +20 -7
- package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.d.ts +1 -0
- package/dist_ts/integrations/samsungtv/samsungtv.classes.integration.js +53 -50
- package/dist_ts/integrations/samsungtv/samsungtv.types.d.ts +4 -1
- package/dist_ts/integrations/shelly/shelly.classes.client.d.ts +26 -30
- package/dist_ts/integrations/shelly/shelly.classes.client.js +504 -276
- package/dist_ts/integrations/shelly/shelly.classes.configflow.d.ts +8 -3
- package/dist_ts/integrations/shelly/shelly.classes.configflow.js +43 -38
- package/dist_ts/integrations/shelly/shelly.classes.integration.d.ts +6 -6
- package/dist_ts/integrations/shelly/shelly.classes.integration.js +103 -101
- package/dist_ts/integrations/shelly/shelly.classes.subscription.d.ts +4 -0
- package/dist_ts/integrations/shelly/shelly.classes.subscription.js +24 -2
- package/dist_ts/integrations/shelly/shelly.mapper.d.ts +1 -2
- package/dist_ts/integrations/shelly/shelly.mapper.js +21 -20
- package/dist_ts/integrations/shelly/shelly.rpc.js +4 -1
- package/dist_ts/integrations/shelly/shelly.types.d.ts +42 -2
- package/dist_ts/integrations/shelly/shelly.types.js +11 -2
- package/dist_ts/integrations/shelly/shelly.validation.d.ts +7 -0
- package/dist_ts/integrations/shelly/shelly.validation.js +79 -0
- package/dist_ts/integrations/sonos/sonos.classes.client.d.ts +79 -22
- package/dist_ts/integrations/sonos/sonos.classes.client.js +427 -139
- package/dist_ts/integrations/sonos/sonos.classes.configflow.d.ts +9 -2
- package/dist_ts/integrations/sonos/sonos.classes.configflow.js +26 -28
- package/dist_ts/integrations/sonos/sonos.classes.integration.d.ts +7 -6
- package/dist_ts/integrations/sonos/sonos.classes.integration.js +289 -224
- package/dist_ts/integrations/sonos/sonos.config.d.ts +6 -1
- package/dist_ts/integrations/sonos/sonos.config.js +23 -2
- package/dist_ts/integrations/sonos/sonos.mapper.d.ts +1 -1
- package/dist_ts/integrations/sonos/sonos.mapper.js +14 -9
- package/dist_ts/integrations/sonos/sonos.matchers.js +3 -3
- package/dist_ts/integrations/sonos/sonos.types.d.ts +26 -1
- package/dist_ts/integrations/tasmota/tasmota.classes.integration.d.ts +5 -0
- package/dist_ts/integrations/tasmota/tasmota.classes.integration.js +23 -7
- package/dist_ts/integrations/tasmota/tasmota.classes.runtime.d.ts +19 -5
- package/dist_ts/integrations/tasmota/tasmota.classes.runtime.js +115 -41
- package/dist_ts/integrations/tasmota/tasmota.config.js +23 -1
- package/dist_ts/integrations/tasmota/tasmota.credentials.d.ts +11 -0
- package/dist_ts/integrations/tasmota/tasmota.credentials.js +97 -0
- package/dist_ts/integrations/tasmota/tasmota.discovery.d.ts +7 -1
- package/dist_ts/integrations/tasmota/tasmota.discovery.js +108 -30
- package/dist_ts/integrations/tasmota/tasmota.mapper.d.ts +2 -2
- package/dist_ts/integrations/tasmota/tasmota.mapper.js +7 -7
- package/dist_ts/integrations/tasmota/tasmota.types.d.ts +41 -2
- package/dist_ts/integrations/tuya/tuya.classes.integration.d.ts +4 -1
- package/dist_ts/integrations/tuya/tuya.classes.integration.js +79 -110
- package/dist_ts/integrations/tuya/tuya.classes.runtime.d.ts +5 -2
- package/dist_ts/integrations/tuya/tuya.classes.runtime.js +73 -26
- package/dist_ts/integrations/tuya/tuya.mapper.js +2 -2
- package/dist_ts/integrations/tuya/tuya.types.d.ts +3 -0
- package/dist_ts/integrations/tuya/tuya.validation.d.ts +2 -2
- package/dist_ts/integrations/tuya/tuya.validation.js +6 -11
- package/dist_ts/integrations/webostv/webostv.classes.client.d.ts +6 -5
- package/dist_ts/integrations/webostv/webostv.classes.client.js +147 -76
- package/dist_ts/integrations/webostv/webostv.classes.configflow.d.ts +7 -2
- package/dist_ts/integrations/webostv/webostv.classes.configflow.js +36 -20
- package/dist_ts/integrations/webostv/webostv.classes.integration.d.ts +4 -4
- package/dist_ts/integrations/webostv/webostv.classes.integration.js +46 -54
- package/dist_ts/integrations/webostv/webostv.mapper.js +5 -5
- package/dist_ts/integrations/webostv/webostv.types.d.ts +16 -3
- package/dist_ts/integrations/webostv/webostv.types.js +1 -1
- package/dist_ts/integrations/webostv/webostv.validation.d.ts +3 -1
- package/dist_ts/integrations/webostv/webostv.validation.js +23 -1
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.d.ts +6 -1
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.js +18 -8
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.d.ts +4 -1
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.js +54 -6
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.d.ts +12 -6
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.js +73 -59
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.d.ts +3 -2
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.js +17 -12
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.types.d.ts +31 -2
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.d.ts +9 -1
- package/dist_ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.js +57 -7
- package/dist_ts/integrations/zwave_js/zwave_js.classes.client.d.ts +10 -4
- package/dist_ts/integrations/zwave_js/zwave_js.classes.client.js +167 -31
- package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.d.ts +6 -1
- package/dist_ts/integrations/zwave_js/zwave_js.classes.configflow.js +57 -35
- package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.d.ts +3 -1
- package/dist_ts/integrations/zwave_js/zwave_js.classes.integration.js +59 -37
- package/dist_ts/integrations/zwave_js/zwave_js.discovery.js +3 -3
- package/dist_ts/integrations/zwave_js/zwave_js.mapper.js +41 -24
- package/dist_ts/integrations/zwave_js/zwave_js.types.d.ts +25 -3
- package/dist_ts/integrations/zwave_js/zwave_js.validation.d.ts +6 -2
- package/dist_ts/integrations/zwave_js/zwave_js.validation.js +52 -17
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/package.json +10 -10
- package/readme.md +25 -6
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/core/classes.nativeintegrationowner.ts +5 -0
- package/ts/core/classes.runtimemanager.ts +11 -2
- package/ts/core/types.ts +2 -0
- package/ts/integrations/deconz/deconz.classes.client.ts +348 -252
- package/ts/integrations/deconz/deconz.classes.configflow.ts +57 -29
- package/ts/integrations/deconz/deconz.classes.integration.ts +69 -37
- package/ts/integrations/deconz/deconz.mapper.ts +22 -5
- package/ts/integrations/deconz/deconz.types.ts +49 -6
- package/ts/integrations/deconz/deconz.validation.ts +177 -4
- package/ts/integrations/deconz/readme.md +15 -1
- package/ts/integrations/esphome/esphome.classes.client.ts +179 -94
- package/ts/integrations/esphome/esphome.classes.configflow.ts +40 -33
- package/ts/integrations/esphome/esphome.classes.integration.ts +63 -36
- package/ts/integrations/esphome/esphome.discovery.ts +3 -12
- package/ts/integrations/esphome/esphome.mapper.ts +9 -7
- package/ts/integrations/esphome/esphome.types.ts +35 -6
- package/ts/integrations/esphome/esphome.validation.ts +66 -0
- package/ts/integrations/esphome/readme.md +20 -6
- package/ts/integrations/homeassistant/homeassistant.classes.client.ts +353 -125
- package/ts/integrations/homeassistant/homeassistant.classes.integration.ts +35 -18
- package/ts/integrations/homeassistant/homeassistant.classes.runtime.ts +50 -63
- package/ts/integrations/homeassistant/homeassistant.types.ts +17 -1
- package/ts/integrations/homeassistant/readme.md +22 -6
- package/ts/integrations/hue/hue.classes.client.ts +288 -55
- package/ts/integrations/hue/hue.classes.configflow.ts +68 -25
- package/ts/integrations/hue/hue.classes.integration.ts +75 -54
- package/ts/integrations/hue/hue.mapper.ts +8 -5
- package/ts/integrations/hue/hue.types.ts +37 -1
- package/ts/integrations/hue/hue.validation.ts +102 -13
- package/ts/integrations/hue/readme.md +49 -12
- package/ts/integrations/mqtt/mqtt.classes.client.ts +136 -19
- package/ts/integrations/mqtt/mqtt.classes.configflow.ts +45 -32
- package/ts/integrations/mqtt/mqtt.classes.integration.ts +99 -38
- package/ts/integrations/mqtt/mqtt.classes.session.ts +118 -0
- package/ts/integrations/mqtt/mqtt.mapper.ts +43 -1
- package/ts/integrations/mqtt/mqtt.types.ts +52 -0
- package/ts/integrations/mqtt/mqtt.validation.ts +157 -0
- package/ts/integrations/mqtt/readme.md +12 -3
- package/ts/integrations/samsungtv/readme.md +11 -5
- package/ts/integrations/samsungtv/samsungtv.classes.client.ts +40 -15
- package/ts/integrations/samsungtv/samsungtv.classes.configflow.ts +21 -6
- package/ts/integrations/samsungtv/samsungtv.classes.integration.ts +53 -38
- package/ts/integrations/samsungtv/samsungtv.types.ts +4 -1
- package/ts/integrations/shelly/readme.md +22 -7
- package/ts/integrations/shelly/shelly.classes.client.ts +386 -269
- package/ts/integrations/shelly/shelly.classes.configflow.ts +43 -38
- package/ts/integrations/shelly/shelly.classes.integration.ts +92 -111
- package/ts/integrations/shelly/shelly.classes.subscription.ts +24 -1
- package/ts/integrations/shelly/shelly.mapper.ts +19 -20
- package/ts/integrations/shelly/shelly.rpc.ts +2 -0
- package/ts/integrations/shelly/shelly.types.ts +50 -2
- package/ts/integrations/shelly/shelly.validation.ts +76 -0
- package/ts/integrations/sonos/readme.md +117 -38
- package/ts/integrations/sonos/sonos.classes.client.ts +392 -123
- package/ts/integrations/sonos/sonos.classes.configflow.ts +25 -28
- package/ts/integrations/sonos/sonos.classes.integration.ts +211 -186
- package/ts/integrations/sonos/sonos.config.ts +24 -2
- package/ts/integrations/sonos/sonos.mapper.ts +13 -8
- package/ts/integrations/sonos/sonos.matchers.ts +2 -2
- package/ts/integrations/sonos/sonos.types.ts +30 -1
- package/ts/integrations/tasmota/readme.md +16 -5
- package/ts/integrations/tasmota/tasmota.classes.integration.ts +24 -6
- package/ts/integrations/tasmota/tasmota.classes.runtime.ts +112 -43
- package/ts/integrations/tasmota/tasmota.config.ts +17 -0
- package/ts/integrations/tasmota/tasmota.credentials.ts +92 -0
- package/ts/integrations/tasmota/tasmota.discovery.ts +87 -24
- package/ts/integrations/tasmota/tasmota.mapper.ts +6 -6
- package/ts/integrations/tasmota/tasmota.types.ts +43 -2
- package/ts/integrations/tuya/readme.md +52 -10
- package/ts/integrations/tuya/tuya.classes.integration.ts +69 -98
- package/ts/integrations/tuya/tuya.classes.runtime.ts +70 -24
- package/ts/integrations/tuya/tuya.mapper.ts +1 -1
- package/ts/integrations/tuya/tuya.types.ts +4 -0
- package/ts/integrations/tuya/tuya.validation.ts +5 -8
- package/ts/integrations/webostv/readme.md +115 -22
- package/ts/integrations/webostv/webostv.classes.client.ts +123 -50
- package/ts/integrations/webostv/webostv.classes.configflow.ts +35 -15
- package/ts/integrations/webostv/webostv.classes.integration.ts +44 -37
- package/ts/integrations/webostv/webostv.mapper.ts +4 -4
- package/ts/integrations/webostv/webostv.types.ts +18 -3
- package/ts/integrations/webostv/webostv.validation.ts +22 -1
- package/ts/integrations/zigbee2mqtt/readme.md +22 -27
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.configflow.ts +16 -7
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.integration.ts +53 -6
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.classes.runtime.ts +62 -49
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.mapper.ts +17 -11
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.types.ts +35 -2
- package/ts/integrations/zigbee2mqtt/zigbee2mqtt.validation.ts +53 -7
- package/ts/integrations/zwave_js/readme.md +42 -9
- package/ts/integrations/zwave_js/zwave_js.classes.client.ts +155 -31
- package/ts/integrations/zwave_js/zwave_js.classes.configflow.ts +55 -31
- package/ts/integrations/zwave_js/zwave_js.classes.integration.ts +57 -35
- package/ts/integrations/zwave_js/zwave_js.discovery.ts +2 -2
- package/ts/integrations/zwave_js/zwave_js.mapper.ts +37 -23
- package/ts/integrations/zwave_js/zwave_js.types.ts +26 -3
- package/ts/integrations/zwave_js/zwave_js.validation.ts +52 -18
- package/ts/plugins.ts +2 -1
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { NoSqlConfigStore } from '../../core/classes.configstore.js';
|
|
3
|
+
import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
|
|
4
|
+
import { captureDeconzOptions, deconzCurrentPatch, deconzData, deconzEndpoint, deconzGatewayConfig, deconzGroupActionPatch, deconzLightStatePatch, deconzPort, deconzSensorConfigPatch, deconzSensorStatePatch, deconzSnapshot, deconzText, deconzWebsocketEvent, isDeconzRecord, normalizeDeconzConfig } from './deconz.validation.js';
|
|
2
5
|
export class DeconzRequestError extends Error {
|
|
3
6
|
apiErrorType;
|
|
4
7
|
constructor(messageArg, apiErrorType) {
|
|
@@ -6,334 +9,558 @@ export class DeconzRequestError extends Error {
|
|
|
6
9
|
this.apiErrorType = apiErrorType;
|
|
7
10
|
}
|
|
8
11
|
}
|
|
12
|
+
export class DeconzWriteError extends Error {
|
|
13
|
+
effectOutcome = 'indeterminate';
|
|
14
|
+
constructor() { super('deCONZ command was dispatched; its outcome is indeterminate.'); }
|
|
15
|
+
}
|
|
16
|
+
/** Credentials and persistence resources are supplied by the independently selected host. */
|
|
9
17
|
export class DeconzClient {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
if (
|
|
40
|
-
throw new
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
try {
|
|
49
|
-
this.assertActive(abortSignalArg);
|
|
50
|
-
const snapshot = deconzSnapshot(this.config.snapshot ? structuredClone(this.config.snapshot) : await this.requestJson('GET', '', undefined, abortSignalArg));
|
|
51
|
-
this.assertGatewayIdentity(snapshot.config);
|
|
52
|
-
this.gatewayHealthy = true;
|
|
53
|
-
return snapshot;
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
this.gatewayHealthy = false;
|
|
57
|
-
throw error;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
async getGatewayConfig(abortSignalArg) {
|
|
61
|
-
try {
|
|
62
|
-
this.assertActive(abortSignalArg);
|
|
63
|
-
const config = deconzGatewayConfig(this.config.snapshot ? this.config.snapshot.config : await this.requestJson('GET', '/config', undefined, abortSignalArg));
|
|
64
|
-
this.assertGatewayIdentity(config);
|
|
65
|
-
this.gatewayHealthy = true;
|
|
66
|
-
return config;
|
|
18
|
+
#config;
|
|
19
|
+
#options;
|
|
20
|
+
#context;
|
|
21
|
+
#owner;
|
|
22
|
+
#ownsOwner;
|
|
23
|
+
#endpoint;
|
|
24
|
+
#lifetime;
|
|
25
|
+
#operations = new Set();
|
|
26
|
+
#subscriptions = new Set();
|
|
27
|
+
#callbackFailures = new Set();
|
|
28
|
+
#store;
|
|
29
|
+
#ownsStore;
|
|
30
|
+
#closePromise;
|
|
31
|
+
#retryPromise;
|
|
32
|
+
#streamHealthy = true;
|
|
33
|
+
#gatewayHealthy = false;
|
|
34
|
+
#onAbort;
|
|
35
|
+
constructor(configArg, contextArg, optionsArg = {}, ownerArg) {
|
|
36
|
+
this.#config = normalizeDeconzConfig(configArg);
|
|
37
|
+
this.#options = captureDeconzOptions(optionsArg);
|
|
38
|
+
this.#ownsOwner = !ownerArg;
|
|
39
|
+
this.#owner = ownerArg ?? new NativeIntegrationOwner('deconz', { homeId: this.#options.homeId, capacity: this.#options.capacity });
|
|
40
|
+
this.#context = this.#owner.admission.admit(contextArg, this.#config.homeId);
|
|
41
|
+
if (this.#options.homeId !== undefined && this.#options.homeId !== this.#context.homeId)
|
|
42
|
+
throw new Error('deCONZ constructor home does not match the host home.');
|
|
43
|
+
this.#endpoint = deconzEndpoint(this.#config);
|
|
44
|
+
if (this.#context.configStore && this.#options.db)
|
|
45
|
+
throw new Error('deCONZ requires one selected credential store.');
|
|
46
|
+
this.#ownsStore = !this.#context.configStore && Boolean(this.#options.db);
|
|
47
|
+
if (this.#options.db && !(this.#options.db instanceof plugins.nosqldb.SmartdataDb))
|
|
48
|
+
throw new TypeError('deCONZ requires an actual caller-owned database.');
|
|
49
|
+
this.#store = this.#context.configStore ?? (this.#options.db && this.#options.keyProvider ? new NoSqlConfigStore({ db: this.#options.db, keyProvider: this.#options.keyProvider, homeId: this.#context.homeId, integrationDomain: 'deconz', timeoutMs: this.#config.requestTimeoutMs }) : undefined);
|
|
50
|
+
if (!this.#options.credentialProvider && !this.#store)
|
|
51
|
+
throw new Error('deCONZ requires an explicit credential provider or an actual encrypted config store.');
|
|
52
|
+
this.#lifetime = new AbortController();
|
|
53
|
+
if (this.#context.abortSignal) {
|
|
54
|
+
this.#onAbort = () => { void this.destroy().catch(() => undefined); };
|
|
55
|
+
this.#context.abortSignal.addEventListener('abort', this.#onAbort, { once: true });
|
|
67
56
|
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
this.gatewayHealthy = false;
|
|
70
|
-
throw error;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
async acquireApiKey(deviceTypeArg = 'smarthome.exchange', abortSignalArg) {
|
|
74
|
-
if (typeof deviceTypeArg !== 'string' || !deviceTypeArg || deviceTypeArg.length > 40)
|
|
75
|
-
throw new Error('Invalid deCONZ client name.');
|
|
76
|
-
const result = await this.requestJson('POST', '', { devicetype: deviceTypeArg }, abortSignalArg, true);
|
|
77
|
-
if (!Array.isArray(result) || result.length !== 1 || !isDeconzRecord(result[0]) || !isDeconzRecord(result[0].success) || typeof result[0].success.username !== 'string' || !result[0].success.username.trim()) {
|
|
78
|
-
throw new Error('Invalid deCONZ pairing response.');
|
|
79
|
-
}
|
|
80
|
-
return result[0].success.username;
|
|
81
|
-
}
|
|
82
|
-
async setLightState(idArg, stateArg, signalArg) {
|
|
83
|
-
const patch = deconzLightStatePatch(stateArg);
|
|
84
|
-
await this.put(`/lights/${this.resourceId(idArg)}/state`, patch, signalArg);
|
|
85
57
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
58
|
+
get isHealthy() { return !this.#closePromise && !this.#lifetime.signal.aborted && !this.#context.abortSignal?.aborted && !this.#owner.signal.aborted && this.#streamHealthy && this.#gatewayHealthy; }
|
|
59
|
+
get canCreateCredential() { return Boolean(this.#options.credentialProvider?.create || !this.#options.credentialProvider && this.#store); }
|
|
60
|
+
async getSnapshot(signalArg) { return this.#run((operation) => this.#snapshot(operation), signalArg); }
|
|
61
|
+
async getGatewayConfig(signalArg) { return this.#run(async (operation) => (await this.#snapshot(operation)).config, signalArg); }
|
|
62
|
+
/** Keeps a runtime command, its actual callbacks, and its readback on one shared operation lease. */
|
|
63
|
+
execute(workArg, signalArg) {
|
|
64
|
+
return this.#run(async (operation) => {
|
|
65
|
+
let open = true;
|
|
66
|
+
let written = false;
|
|
67
|
+
let selectedSnapshot;
|
|
68
|
+
let observation;
|
|
69
|
+
const check = (signal) => { if (!open)
|
|
70
|
+
throw new Error('deCONZ command session is closed.'); signal?.throwIfAborted(); this.#active(operation); };
|
|
71
|
+
const write = async (path, patch, signal) => { check(signal); if (written)
|
|
72
|
+
throw new Error('deCONZ command permits one write attempt.'); written = true; observation = await this.#write(operation, path, patch, selectedSnapshot); return observation; };
|
|
73
|
+
const session = Object.freeze({
|
|
74
|
+
isHealthy: this.isHealthy,
|
|
75
|
+
getSnapshot: async (signal) => { check(signal); selectedSnapshot = await this.#snapshot(operation); return structuredClone(selectedSnapshot); },
|
|
76
|
+
setLightState: async (id, patch, signal) => write(`/lights/${this.#resourceId(id)}/state`, deconzLightStatePatch(patch), signal),
|
|
77
|
+
setGroupState: async (id, patch, signal) => write(`/groups/${this.#resourceId(id)}/action`, deconzGroupActionPatch(patch), signal),
|
|
78
|
+
setSensorConfig: async (id, patch, signal) => write(`/sensors/${this.#resourceId(id)}/config`, deconzSensorConfigPatch(patch), signal),
|
|
79
|
+
setSensorState: async (id, patch, signal) => write(`/sensors/${this.#resourceId(id)}/state`, this.#sensorPatch(patch), signal),
|
|
80
|
+
});
|
|
81
|
+
try {
|
|
82
|
+
const result = await this.#foreign(operation, () => workArg(session));
|
|
83
|
+
return { result, observation };
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
open = false;
|
|
87
|
+
}
|
|
88
|
+
}, signalArg);
|
|
93
89
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
90
|
+
acquireApiKey(deviceTypeArg = 'smarthome.exchange', signalArg) {
|
|
91
|
+
deconzText(deviceTypeArg, 'client name', 40);
|
|
92
|
+
return this.#run(async (operation) => {
|
|
93
|
+
this.#permission('config', this.#config.bridgeId, ['pair', 'credentials:create']);
|
|
94
|
+
if (!this.canCreateCredential)
|
|
95
|
+
throw new Error('deCONZ pairing requires credential creation by the selected provider or encrypted store.');
|
|
96
|
+
await this.#basic(operation);
|
|
97
|
+
let dispatched = false;
|
|
98
|
+
try {
|
|
99
|
+
const result = await this.#request(operation, 'POST', '/api', { devicetype: deviceTypeArg }, () => { dispatched = true; });
|
|
100
|
+
if (!Array.isArray(result) || result.length !== 1 || !isDeconzRecord(result[0]) || !isDeconzRecord(result[0].success))
|
|
101
|
+
throw new Error('Invalid deCONZ pairing acknowledgement.');
|
|
102
|
+
return this.#key(result[0].success.username);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (error instanceof DeconzRequestError && error.apiErrorType === 101)
|
|
106
|
+
throw error;
|
|
107
|
+
if (dispatched)
|
|
108
|
+
throw new DeconzWriteError();
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}, signalArg);
|
|
100
112
|
}
|
|
101
|
-
|
|
102
|
-
|
|
113
|
+
createCredential(apiKeyArg, signalArg) {
|
|
114
|
+
const apiKey = this.#key(apiKeyArg);
|
|
115
|
+
return this.#run(async (operation) => {
|
|
116
|
+
this.#permission('config', this.#config.bridgeId, ['credentials:create']);
|
|
117
|
+
if (!this.canCreateCredential)
|
|
118
|
+
throw new Error('deCONZ credential creation is unavailable.');
|
|
119
|
+
await this.#snapshot(operation, apiKey);
|
|
120
|
+
const request = this.#credentialRequest(operation);
|
|
121
|
+
let dispatched = false;
|
|
122
|
+
try {
|
|
123
|
+
if (this.#options.credentialProvider?.create)
|
|
124
|
+
await this.#foreign(operation, () => { dispatched = true; return this.#options.credentialProvider.create(request, apiKey); });
|
|
125
|
+
else {
|
|
126
|
+
await this.#foreign(operation, () => this.#store.initialize({ signal: operation.signal }));
|
|
127
|
+
await this.#foreign(operation, () => { dispatched = true; return this.#store.create(this.#storeKey(), { version: 1, homeId: request.homeId, origin: request.origin, bridgeId: request.bridgeId, credentialReference: request.credentialReference, apiKey }); });
|
|
128
|
+
}
|
|
129
|
+
this.#active(operation);
|
|
130
|
+
}
|
|
131
|
+
catch (error) {
|
|
132
|
+
if (dispatched)
|
|
133
|
+
throw new DeconzWriteError();
|
|
134
|
+
throw error;
|
|
135
|
+
}
|
|
136
|
+
}, signalArg);
|
|
103
137
|
}
|
|
138
|
+
async setLightState(idArg, patchArg, signalArg) { return this.put(`/lights/${this.#resourceId(idArg)}/state`, deconzLightStatePatch(patchArg), signalArg); }
|
|
139
|
+
async setGroupState(idArg, patchArg, signalArg) { return this.put(`/groups/${this.#resourceId(idArg)}/action`, deconzGroupActionPatch(patchArg), signalArg); }
|
|
140
|
+
async setSensorConfig(idArg, patchArg, signalArg) { return this.put(`/sensors/${this.#resourceId(idArg)}/config`, deconzSensorConfigPatch(patchArg), signalArg); }
|
|
141
|
+
async setSensorState(idArg, patchArg, signalArg) { return this.put(`/sensors/${this.#resourceId(idArg)}/state`, this.#sensorPatch(patchArg), signalArg); }
|
|
142
|
+
async recallScene(groupIdArg, sceneIdArg, signalArg) { return this.put(`/groups/${this.#resourceId(groupIdArg)}/scenes/${this.#resourceId(sceneIdArg)}/recall`, {}, signalArg); }
|
|
104
143
|
async put(pathArg, dataArg, signalArg) {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
144
|
+
const match = /^\/(lights|groups|sensors)\/([a-z0-9_-]+)\/(state|action|config)$/i.exec(pathArg);
|
|
145
|
+
const scene = /^\/groups\/([a-z0-9_-]+)\/scenes\/([a-z0-9_-]+)\/recall$/i.exec(pathArg);
|
|
146
|
+
if (!match && !scene)
|
|
147
|
+
throw new Error('Unsupported deCONZ command path.');
|
|
148
|
+
const patch = scene ? deconzData(dataArg, []) : match[1] === 'lights' && match[3] === 'state' ? deconzLightStatePatch(dataArg) : match[1] === 'groups' && match[3] === 'action' ? deconzGroupActionPatch(dataArg) : match[1] === 'sensors' && match[3] === 'config' ? deconzSensorConfigPatch(dataArg) : match[1] === 'sensors' && match[3] === 'state' ? this.#sensorPatch(dataArg) : undefined;
|
|
149
|
+
if (!patch)
|
|
150
|
+
throw new Error('Unsupported deCONZ command endpoint.');
|
|
151
|
+
return this.#run((operation) => this.#write(operation, pathArg, patch), signalArg);
|
|
108
152
|
}
|
|
109
153
|
async post(pathArg, dataArg, signalArg) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
154
|
+
void pathArg;
|
|
155
|
+
void dataArg;
|
|
156
|
+
void signalArg;
|
|
157
|
+
throw new Error('deCONZ arbitrary creation requires a supported current control contract.');
|
|
113
158
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const port = this.config.websocketPort ?? (await this.getGatewayConfig(abortSignalArg)).websocketport;
|
|
123
|
-
this.assertActive(abortSignalArg);
|
|
124
|
-
if (port === undefined)
|
|
125
|
-
throw new Error('deCONZ gateway did not advertise a WebSocket port.');
|
|
126
|
-
const websocketUrl = new URL(this.endpoint);
|
|
127
|
-
websocketUrl.protocol = 'ws:';
|
|
128
|
-
websocketUrl.port = String(deconzPort(port));
|
|
129
|
-
const socket = new WebSocket(websocketUrl);
|
|
130
|
-
const signal = AbortSignal.any([this.lifetime.signal, ...(this.abortSignal ? [this.abortSignal] : []), ...(abortSignalArg ? [abortSignalArg] : [])]);
|
|
131
|
-
let closing = false;
|
|
132
|
-
let closePromise;
|
|
133
|
-
let opened = false;
|
|
134
|
-
let resolveOpen = () => { };
|
|
135
|
-
let rejectOpen = () => { };
|
|
136
|
-
const ready = new Promise((resolveArg, rejectArg) => { resolveOpen = resolveArg; rejectOpen = rejectArg; });
|
|
137
|
-
const report = (messageArg) => {
|
|
138
|
-
this.streamHealthy = false;
|
|
139
|
-
const error = new Error(messageArg);
|
|
140
|
-
if (!opened)
|
|
141
|
-
rejectOpen(error);
|
|
142
|
-
else if (!closing)
|
|
143
|
-
errorHandlerArg?.(error);
|
|
144
|
-
};
|
|
145
|
-
const message = (eventArg) => {
|
|
146
|
-
if (closing || signal.aborted)
|
|
147
|
-
return;
|
|
148
|
-
let event;
|
|
149
|
-
try {
|
|
150
|
-
if (typeof eventArg.data !== 'string' || eventArg.data.length > 1048576)
|
|
151
|
-
throw new Error('Invalid message.');
|
|
152
|
-
event = deconzWebsocketEvent(JSON.parse(eventArg.data));
|
|
153
|
-
}
|
|
154
|
-
catch {
|
|
155
|
-
report('deCONZ WebSocket received an invalid event.');
|
|
156
|
-
return;
|
|
157
|
-
}
|
|
158
|
-
handlerArg(event);
|
|
159
|
-
};
|
|
160
|
-
const onOpen = () => { opened = true; this.streamHealthy = true; resolveOpen(); };
|
|
161
|
-
const onError = () => report('deCONZ WebSocket connection failed.');
|
|
162
|
-
const onClose = () => {
|
|
163
|
-
if (!closing)
|
|
164
|
-
report('deCONZ WebSocket connection closed.');
|
|
165
|
-
cleanup();
|
|
166
|
-
};
|
|
167
|
-
const onAbort = () => {
|
|
168
|
-
rejectOpen(new Error('deCONZ subscription cancelled.'));
|
|
169
|
-
void close().catch(() => {
|
|
170
|
-
this.streamHealthy = false;
|
|
171
|
-
errorHandlerArg?.(new Error('deCONZ WebSocket cleanup failed.'));
|
|
172
|
-
});
|
|
173
|
-
};
|
|
174
|
-
const cleanup = () => {
|
|
175
|
-
socket.removeEventListener('open', onOpen);
|
|
176
|
-
socket.removeEventListener('message', message);
|
|
177
|
-
socket.removeEventListener('error', onError);
|
|
178
|
-
socket.removeEventListener('close', onClose);
|
|
179
|
-
signal.removeEventListener('abort', onAbort);
|
|
180
|
-
this.subscriptions.delete(close);
|
|
181
|
-
};
|
|
182
|
-
const close = () => {
|
|
183
|
-
if (closePromise)
|
|
184
|
-
return closePromise;
|
|
185
|
-
closing = true;
|
|
186
|
-
socket.removeEventListener('message', message);
|
|
187
|
-
if (socket.readyState === WebSocket.CLOSED) {
|
|
188
|
-
cleanup();
|
|
189
|
-
return Promise.resolve();
|
|
190
|
-
}
|
|
191
|
-
closePromise = new Promise((resolveArg, rejectArg) => {
|
|
192
|
-
const closed = () => { clearTimeout(timer); socket.removeEventListener('close', closed); cleanup(); resolveArg(); };
|
|
193
|
-
const timer = setTimeout(() => {
|
|
194
|
-
socket.removeEventListener('close', closed);
|
|
195
|
-
closePromise = undefined;
|
|
196
|
-
rejectArg(new Error('deCONZ WebSocket close timed out.'));
|
|
197
|
-
}, this.timeoutMs);
|
|
198
|
-
socket.addEventListener('close', closed, { once: true });
|
|
199
|
-
socket.close();
|
|
200
|
-
});
|
|
201
|
-
return closePromise;
|
|
202
|
-
};
|
|
203
|
-
this.subscriptions.add(close);
|
|
204
|
-
socket.addEventListener('open', onOpen, { once: true });
|
|
205
|
-
socket.addEventListener('message', message);
|
|
206
|
-
socket.addEventListener('error', onError);
|
|
207
|
-
socket.addEventListener('close', onClose, { once: true });
|
|
208
|
-
signal.addEventListener('abort', onAbort, { once: true });
|
|
209
|
-
const timer = setTimeout(() => rejectOpen(new Error('deCONZ WebSocket open timed out.')), this.timeoutMs);
|
|
159
|
+
subscribeToEvents(handlerArg, signalArg, errorHandlerArg) {
|
|
160
|
+
if (typeof handlerArg !== 'function' || errorHandlerArg !== undefined && typeof errorHandlerArg !== 'function')
|
|
161
|
+
throw new TypeError('deCONZ subscriber requires data functions.');
|
|
162
|
+
let resolveSubscription = () => { };
|
|
163
|
+
let rejectSubscription = () => { };
|
|
164
|
+
let issued = false;
|
|
165
|
+
const subscribed = new Promise((resolve, reject) => { resolveSubscription = resolve; rejectSubscription = reject; });
|
|
166
|
+
let admitted;
|
|
210
167
|
try {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
168
|
+
admitted = this.#run(async (operation) => {
|
|
169
|
+
if (this.#config.enableWebSocket === false) {
|
|
170
|
+
issued = true;
|
|
171
|
+
resolveSubscription(async () => { });
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const config = (await this.#snapshot(operation)).config;
|
|
175
|
+
const port = config.websocketport;
|
|
176
|
+
if (port === undefined)
|
|
177
|
+
throw new Error('deCONZ gateway did not advertise a WebSocket port.');
|
|
178
|
+
this.#active(operation);
|
|
179
|
+
if (typeof globalThis.WebSocket !== 'function')
|
|
180
|
+
throw new Error('deCONZ requires native WebSocket support.');
|
|
181
|
+
const url = new URL(this.#endpoint);
|
|
182
|
+
url.protocol = 'ws:';
|
|
183
|
+
url.port = String(deconzPort(port));
|
|
184
|
+
const signal = AbortSignal.any([this.#lifetime.signal, this.#owner.signal, ...(this.#context.abortSignal ? [this.#context.abortSignal] : []), ...(signalArg ? [signalArg] : [])]);
|
|
185
|
+
const callbacks = new Set();
|
|
186
|
+
let closing = false;
|
|
187
|
+
let opened = false;
|
|
188
|
+
let closePromise;
|
|
189
|
+
let closeFailed = false;
|
|
190
|
+
let resolveOpen = () => { };
|
|
191
|
+
let rejectOpen = () => { };
|
|
192
|
+
const ready = new Promise((resolve, reject) => { resolveOpen = resolve; rejectOpen = reject; });
|
|
193
|
+
// Keep the subscription's actual lifetime on the shared lease after the caller receives its close handle.
|
|
194
|
+
let releaseLifetime = () => { };
|
|
195
|
+
const lifetime = new Promise((resolve) => { releaseLifetime = resolve; });
|
|
196
|
+
operation.actual.add(lifetime);
|
|
197
|
+
void lifetime.then(() => operation.actual.delete(lifetime));
|
|
198
|
+
let socket;
|
|
199
|
+
try {
|
|
200
|
+
socket = new WebSocket(url);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
releaseLifetime();
|
|
204
|
+
throw new Error('deCONZ WebSocket allocation failed.');
|
|
205
|
+
}
|
|
206
|
+
const cleanup = () => {
|
|
207
|
+
socket.removeEventListener('open', onOpen);
|
|
208
|
+
socket.removeEventListener('message', message);
|
|
209
|
+
socket.removeEventListener('error', onError);
|
|
210
|
+
socket.removeEventListener('close', onClose);
|
|
211
|
+
signal.removeEventListener('abort', onAbort);
|
|
212
|
+
};
|
|
213
|
+
const subscription = { close: (retryArg = false) => {
|
|
214
|
+
if (retryArg && closeFailed) {
|
|
215
|
+
closePromise = undefined;
|
|
216
|
+
closeFailed = false;
|
|
217
|
+
}
|
|
218
|
+
if (!closePromise) {
|
|
219
|
+
closing = true;
|
|
220
|
+
closePromise = Promise.resolve().then(async () => {
|
|
221
|
+
const closed = socket.readyState === WebSocket.CLOSED ? Promise.resolve() : new Promise((resolve, reject) => {
|
|
222
|
+
const done = () => { clearTimeout(timer); socket.removeEventListener('close', done); resolve(); };
|
|
223
|
+
const timer = setTimeout(() => { socket.removeEventListener('close', done); reject(new Error('deCONZ WebSocket close timed out.')); }, this.#config.requestTimeoutMs);
|
|
224
|
+
socket.addEventListener('close', done, { once: true });
|
|
225
|
+
try {
|
|
226
|
+
socket.close();
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
clearTimeout(timer);
|
|
230
|
+
socket.removeEventListener('close', done);
|
|
231
|
+
reject(new Error('deCONZ WebSocket close failed.'));
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
const [closedResult] = await Promise.allSettled([closed, ...callbacks]);
|
|
235
|
+
const errors = closedResult.status === 'rejected' ? [closedResult] : [];
|
|
236
|
+
if (errors.length)
|
|
237
|
+
throw new AggregateError(errors.map(() => new Error('deCONZ subscription cleanup failed.')), 'deCONZ subscription cleanup failed.');
|
|
238
|
+
cleanup();
|
|
239
|
+
this.#subscriptions.delete(subscription);
|
|
240
|
+
});
|
|
241
|
+
void closePromise.then(releaseLifetime, () => { closeFailed = true; releaseLifetime(); });
|
|
242
|
+
}
|
|
243
|
+
return closePromise;
|
|
244
|
+
} };
|
|
245
|
+
this.#subscriptions.add(subscription);
|
|
246
|
+
const invoke = (work) => {
|
|
247
|
+
if (closing || signal.aborted)
|
|
248
|
+
return;
|
|
249
|
+
let callback;
|
|
250
|
+
try {
|
|
251
|
+
callback = this.#run((leaseOperation) => this.#foreign(leaseOperation, async () => {
|
|
252
|
+
try {
|
|
253
|
+
await work();
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
this.#callbackFailures.add(new Error('deCONZ subscriber failed.'));
|
|
257
|
+
this.#streamHealthy = false;
|
|
258
|
+
throw new Error('deCONZ subscriber failed.');
|
|
259
|
+
}
|
|
260
|
+
}));
|
|
261
|
+
}
|
|
262
|
+
catch {
|
|
263
|
+
this.#callbackFailures.add(new Error('deCONZ subscriber admission failed.'));
|
|
264
|
+
this.#streamHealthy = false;
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
callbacks.add(callback);
|
|
268
|
+
void callback.then(() => callbacks.delete(callback), () => { callbacks.delete(callback); if (!closing && !signal.aborted) {
|
|
269
|
+
this.#callbackFailures.add(new Error('deCONZ subscriber failed.'));
|
|
270
|
+
this.#streamHealthy = false;
|
|
271
|
+
} });
|
|
272
|
+
};
|
|
273
|
+
const report = (messageArg) => { this.#streamHealthy = false; const error = new Error(messageArg); if (!opened)
|
|
274
|
+
rejectOpen(error);
|
|
275
|
+
else if (errorHandlerArg)
|
|
276
|
+
invoke(() => errorHandlerArg(error)); };
|
|
277
|
+
const message = (eventArg) => {
|
|
278
|
+
if (closing || signal.aborted)
|
|
279
|
+
return;
|
|
280
|
+
try {
|
|
281
|
+
if (typeof eventArg.data !== 'string' || eventArg.data.length > 1048576)
|
|
282
|
+
throw new Error('Invalid deCONZ event.');
|
|
283
|
+
const event = deconzWebsocketEvent(JSON.parse(eventArg.data));
|
|
284
|
+
invoke(() => handlerArg(event));
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
report('deCONZ WebSocket received an invalid event.');
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
const onOpen = () => { opened = true; this.#streamHealthy = true; resolveOpen(); };
|
|
291
|
+
const onError = () => report('deCONZ WebSocket connection failed.');
|
|
292
|
+
const onClose = () => { if (!closing) {
|
|
293
|
+
report('deCONZ WebSocket connection closed.');
|
|
294
|
+
void subscription.close().catch(() => { this.#streamHealthy = false; });
|
|
295
|
+
} };
|
|
296
|
+
const onAbort = () => { rejectOpen(new Error('deCONZ subscription cancelled.')); void subscription.close().catch(() => { this.#streamHealthy = false; }); };
|
|
297
|
+
const onDeadline = () => rejectOpen(this.#cancelled(operation));
|
|
298
|
+
socket.addEventListener('open', onOpen, { once: true });
|
|
299
|
+
socket.addEventListener('message', message);
|
|
300
|
+
socket.addEventListener('error', onError);
|
|
301
|
+
socket.addEventListener('close', onClose);
|
|
302
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
303
|
+
operation.signal.addEventListener('abort', onDeadline, { once: true });
|
|
304
|
+
try {
|
|
305
|
+
await this.#foreign(operation, () => ready);
|
|
306
|
+
this.#active(operation);
|
|
307
|
+
if (signal.aborted)
|
|
308
|
+
throw new Error('deCONZ subscription cancelled.');
|
|
309
|
+
issued = true;
|
|
310
|
+
resolveSubscription(async () => { await subscription.close(); await admitted; });
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
await subscription.close();
|
|
314
|
+
throw error;
|
|
315
|
+
}
|
|
316
|
+
finally {
|
|
317
|
+
operation.signal.removeEventListener('abort', onDeadline);
|
|
318
|
+
}
|
|
319
|
+
}, signalArg);
|
|
216
320
|
}
|
|
217
321
|
catch (error) {
|
|
218
|
-
|
|
219
|
-
|
|
322
|
+
rejectSubscription(error);
|
|
323
|
+
return subscribed;
|
|
220
324
|
}
|
|
221
|
-
|
|
222
|
-
|
|
325
|
+
void admitted.then(() => { if (!issued)
|
|
326
|
+
rejectSubscription(new Error('deCONZ subscription failed.')); }, (error) => { if (!issued)
|
|
327
|
+
rejectSubscription(error);
|
|
328
|
+
else {
|
|
329
|
+
this.#callbackFailures.add(new Error('deCONZ subscription lifecycle failed.'));
|
|
330
|
+
this.#streamHealthy = false;
|
|
331
|
+
} });
|
|
332
|
+
return subscribed;
|
|
333
|
+
}
|
|
334
|
+
destroy() {
|
|
335
|
+
if (!this.#closePromise) {
|
|
336
|
+
this.#closePromise = Promise.resolve().then(() => this.#drain(false));
|
|
337
|
+
this.#lifetime.abort();
|
|
338
|
+
if (this.#onAbort)
|
|
339
|
+
this.#context.abortSignal.removeEventListener('abort', this.#onAbort);
|
|
223
340
|
}
|
|
341
|
+
return this.#closePromise;
|
|
224
342
|
}
|
|
225
|
-
|
|
226
|
-
this
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
343
|
+
retryCleanup() {
|
|
344
|
+
if (!this.#closePromise)
|
|
345
|
+
throw new Error('deCONZ cleanup retry requires a terminal client.');
|
|
346
|
+
if (!this.#retryPromise) {
|
|
347
|
+
this.#retryPromise = Promise.resolve().then(async () => { await this.#closePromise.catch(() => undefined); await this.#drain(true); });
|
|
348
|
+
const settled = () => { this.#retryPromise = undefined; };
|
|
349
|
+
void this.#retryPromise.then(settled, settled);
|
|
350
|
+
}
|
|
351
|
+
return this.#retryPromise;
|
|
232
352
|
}
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
void operation.then(() => this.operations.delete(operation), () => this.operations.delete(operation));
|
|
244
|
-
return operation;
|
|
353
|
+
async #drain(retryArg) {
|
|
354
|
+
if (retryArg)
|
|
355
|
+
this.#callbackFailures.clear();
|
|
356
|
+
const results = await Promise.allSettled([...this.#subscriptions].map((subscription) => subscription.close(retryArg)));
|
|
357
|
+
await Promise.allSettled([...this.#operations]);
|
|
358
|
+
const other = await Promise.allSettled([...(this.#ownsStore && this.#store ? [retryArg ? this.#store.retryCleanup() : this.#store.close()] : []), ...(this.#ownsOwner ? [retryArg ? this.#owner.retryCleanup() : this.#owner.close()] : [])]);
|
|
359
|
+
const errors = [...results, ...other].filter((result) => result.status === 'rejected').map(() => new Error('deCONZ cleanup failed.'));
|
|
360
|
+
errors.push(...this.#callbackFailures);
|
|
361
|
+
if (errors.length)
|
|
362
|
+
throw new AggregateError(errors, 'deCONZ cleanup failed; handles remain retained for explicit retry.');
|
|
245
363
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
const
|
|
250
|
-
|
|
251
|
-
const
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
const
|
|
257
|
-
if (!reader)
|
|
258
|
-
throw new DeconzRequestError('Empty deCONZ response.');
|
|
259
|
-
const chunks = [];
|
|
260
|
-
let length = 0;
|
|
364
|
+
#run(workArg, signalArg) {
|
|
365
|
+
if (this.#closePromise || this.#lifetime.signal.aborted)
|
|
366
|
+
throw new DeconzRequestError('deCONZ request cancelled.');
|
|
367
|
+
const operation = this.#owner.runOperation(this.#context, this.#config.homeId, async (lease) => {
|
|
368
|
+
const deadlineAbort = new AbortController();
|
|
369
|
+
const deadline = performance.now() + this.#config.requestTimeoutMs;
|
|
370
|
+
const signal = AbortSignal.any([lease.signal, this.#lifetime.signal, deadlineAbort.signal, ...(signalArg ? [signalArg] : [])]);
|
|
371
|
+
const actual = new Set();
|
|
372
|
+
lease.own(async () => { while (actual.size)
|
|
373
|
+
await Promise.allSettled([...actual]); });
|
|
374
|
+
const timer = setTimeout(() => deadlineAbort.abort(new DeconzRequestError('deCONZ request timed out.')), this.#config.requestTimeoutMs);
|
|
261
375
|
try {
|
|
262
|
-
|
|
263
|
-
const chunk = await reader.read();
|
|
264
|
-
if (chunk.done)
|
|
265
|
-
break;
|
|
266
|
-
length += chunk.value.length;
|
|
267
|
-
if (length > 8388608) {
|
|
268
|
-
await reader.cancel();
|
|
269
|
-
throw new DeconzRequestError('deCONZ response exceeds the size limit.');
|
|
270
|
-
}
|
|
271
|
-
chunks.push(chunk.value);
|
|
272
|
-
}
|
|
376
|
+
return await workArg({ lease, signal, deadline, actual });
|
|
273
377
|
}
|
|
274
378
|
finally {
|
|
275
|
-
|
|
276
|
-
}
|
|
277
|
-
const bytes = new Uint8Array(length);
|
|
278
|
-
let offset = 0;
|
|
279
|
-
for (const chunk of chunks) {
|
|
280
|
-
bytes.set(chunk, offset);
|
|
281
|
-
offset += chunk.length;
|
|
282
|
-
}
|
|
283
|
-
let result;
|
|
284
|
-
try {
|
|
285
|
-
result = JSON.parse(new TextDecoder().decode(bytes));
|
|
286
|
-
}
|
|
287
|
-
catch {
|
|
288
|
-
throw new DeconzRequestError('Invalid deCONZ JSON response.');
|
|
289
|
-
}
|
|
290
|
-
if (Array.isArray(result)) {
|
|
291
|
-
for (const item of result) {
|
|
292
|
-
if (isDeconzRecord(item) && isDeconzRecord(item.error)) {
|
|
293
|
-
const type = typeof item.error.type === 'number' && Number.isInteger(item.error.type) ? item.error.type : undefined;
|
|
294
|
-
throw new DeconzRequestError('deCONZ rejected the request.', type);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
379
|
+
clearTimeout(timer);
|
|
297
380
|
}
|
|
381
|
+
});
|
|
382
|
+
this.#operations.add(operation);
|
|
383
|
+
void operation.then(() => this.#operations.delete(operation), () => this.#operations.delete(operation));
|
|
384
|
+
return operation;
|
|
385
|
+
}
|
|
386
|
+
async #foreign(operationArg, workArg, transportArg = false) {
|
|
387
|
+
this.#active(operationArg);
|
|
388
|
+
if (operationArg.actual.size >= 16)
|
|
389
|
+
throw new Error('deCONZ actual callback capacity reached.');
|
|
390
|
+
const actual = Promise.resolve().then(() => { this.#active(operationArg); return workArg(); });
|
|
391
|
+
operationArg.actual.add(actual);
|
|
392
|
+
void actual.then(() => operationArg.actual.delete(actual), () => operationArg.actual.delete(actual));
|
|
393
|
+
let abort = () => { };
|
|
394
|
+
const cancelled = new Promise((resolve, reject) => { void resolve; abort = () => reject(this.#cancelled(operationArg)); operationArg.signal.addEventListener('abort', abort, { once: true }); if (operationArg.signal.aborted)
|
|
395
|
+
abort(); });
|
|
396
|
+
try {
|
|
397
|
+
const result = await Promise.race([actual, cancelled]);
|
|
398
|
+
this.#active(operationArg);
|
|
298
399
|
return result;
|
|
299
400
|
}
|
|
300
401
|
catch (error) {
|
|
301
|
-
if (signal.aborted)
|
|
302
|
-
throw
|
|
303
|
-
if (error instanceof
|
|
402
|
+
if (operationArg.signal.aborted)
|
|
403
|
+
throw this.#cancelled(operationArg);
|
|
404
|
+
if (error instanceof DeconzWriteError)
|
|
405
|
+
throw new DeconzWriteError();
|
|
406
|
+
if (transportArg && error instanceof DeconzRequestError)
|
|
304
407
|
throw error;
|
|
305
|
-
throw new
|
|
408
|
+
throw new Error('deCONZ operation failed.');
|
|
306
409
|
}
|
|
307
410
|
finally {
|
|
308
|
-
|
|
411
|
+
operationArg.signal.removeEventListener('abort', abort);
|
|
309
412
|
}
|
|
310
413
|
}
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
414
|
+
#active(operationArg) { if (operationArg.signal.aborted || performance.now() >= operationArg.deadline || this.#closePromise)
|
|
415
|
+
throw this.#cancelled(operationArg); operationArg.lease.assertOpen(); }
|
|
416
|
+
#cancelled(operationArg) { return new DeconzRequestError(performance.now() >= operationArg.deadline || operationArg.signal.reason instanceof DeconzRequestError && operationArg.signal.reason.message === 'deCONZ request timed out.' ? 'deCONZ request timed out.' : 'deCONZ request cancelled.'); }
|
|
417
|
+
#credentialRequest(operationArg) { return Object.freeze({ homeId: this.#context.homeId, origin: this.#endpoint.origin, bridgeId: this.#config.bridgeId, credentialReference: this.#config.credentialReference, signal: operationArg.signal, deadline: operationArg.deadline }); }
|
|
418
|
+
#storeKey() { return `deconz.credential.${encodeURIComponent(this.#config.credentialReference)}`; }
|
|
419
|
+
async #credential(operationArg) {
|
|
420
|
+
const request = this.#credentialRequest(operationArg);
|
|
421
|
+
if (this.#options.credentialProvider)
|
|
422
|
+
return this.#key(await this.#foreign(operationArg, () => this.#options.credentialProvider.resolve(request)));
|
|
423
|
+
await this.#foreign(operationArg, () => this.#store.initialize({ signal: operationArg.signal }));
|
|
424
|
+
const envelope = deconzData(await this.#foreign(operationArg, () => this.#store.get(this.#storeKey())), ['version', 'homeId', 'origin', 'bridgeId', 'credentialReference', 'apiKey']);
|
|
425
|
+
if (envelope.version !== 1 || envelope.homeId !== request.homeId || envelope.origin !== request.origin || envelope.bridgeId !== request.bridgeId || envelope.credentialReference !== request.credentialReference)
|
|
426
|
+
throw new Error('deCONZ credential reference does not match the selected home and bridge.');
|
|
427
|
+
return this.#key(envelope.apiKey);
|
|
428
|
+
}
|
|
429
|
+
#key(valueArg) { return deconzText(valueArg, 'resolved credential', 256); }
|
|
430
|
+
async #basic(operationArg) { const config = deconzGatewayConfig(await this.#request(operationArg, 'GET', '/api/config')); this.#identity(config); return config; }
|
|
431
|
+
async #snapshot(operationArg, keyArg) {
|
|
432
|
+
try {
|
|
433
|
+
await this.#basic(operationArg);
|
|
434
|
+
const key = keyArg ?? await this.#credential(operationArg);
|
|
435
|
+
const snapshot = deconzSnapshot(await this.#request(operationArg, 'GET', `/api/${encodeURIComponent(key)}`));
|
|
436
|
+
this.#identity(snapshot.config);
|
|
437
|
+
this.#active(operationArg);
|
|
438
|
+
this.#gatewayHealthy = true;
|
|
439
|
+
return { ...snapshot, homeId: this.#context.homeId };
|
|
315
440
|
}
|
|
316
|
-
|
|
317
|
-
|
|
441
|
+
catch (error) {
|
|
442
|
+
this.#gatewayHealthy = false;
|
|
443
|
+
throw error;
|
|
318
444
|
}
|
|
319
445
|
}
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
446
|
+
#identity(configArg) { if (configArg.bridgeid?.toLowerCase() !== this.#config.bridgeId && configArg.uuid?.toLowerCase() !== this.#config.bridgeId) {
|
|
447
|
+
this.#streamHealthy = false;
|
|
448
|
+
throw new Error('deCONZ gateway identity does not match configuration.');
|
|
449
|
+
} }
|
|
450
|
+
#permission(resourceArg, idArg, fieldsArg) {
|
|
451
|
+
if (!this.#options.controlPermissions?.some((permission) => permission.resource === resourceArg && permission.resourceId === idArg && fieldsArg.every((field) => permission.fields.includes(field))))
|
|
452
|
+
throw new Error('deCONZ control requires exact owner authorization.');
|
|
453
|
+
}
|
|
454
|
+
#sensorPatch(valueArg) {
|
|
455
|
+
return deconzData(valueArg, ['alarm', 'battery', 'carbonmonoxide', 'consumption', 'current', 'dark', 'daylight', 'fire', 'flag', 'humidity', 'lightlevel', 'lux', 'open', 'power', 'presence', 'duration', 'pressure', 'status', 'temperature', 'vibration', 'voltage', 'water', 'buttonevent']);
|
|
323
456
|
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
const
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
457
|
+
async #write(operationArg, pathArg, patchArg, selectedArg) {
|
|
458
|
+
await this.#basic(operationArg);
|
|
459
|
+
const key = await this.#credential(operationArg);
|
|
460
|
+
const snapshot = await this.#snapshot(operationArg, key);
|
|
461
|
+
const parts = pathArg.split('/');
|
|
462
|
+
const resource = parts[1];
|
|
463
|
+
const id = parts[2];
|
|
464
|
+
const section = parts[3];
|
|
465
|
+
if (selectedArg && (resource === 'lights' || resource === 'sensors')) {
|
|
466
|
+
const current = snapshot[resource][id];
|
|
467
|
+
const selected = selectedArg[resource][id];
|
|
468
|
+
if (!selected || !current || selected.uniqueid !== current.uniqueid || selected.type !== current.type)
|
|
469
|
+
throw new Error('deCONZ selected resource changed before dispatch.');
|
|
470
|
+
}
|
|
471
|
+
if (selectedArg && resource === 'groups' && JSON.stringify(selectedArg.groups[id]?.lights) !== JSON.stringify(snapshot.groups[id]?.lights))
|
|
472
|
+
throw new Error('deCONZ selected group membership changed before dispatch.');
|
|
473
|
+
if (section === 'scenes') {
|
|
474
|
+
this.#permission('scenes', `${id}/${parts[4]}`, ['recall']);
|
|
475
|
+
if (snapshot.config?.rfconnected === false || !snapshot.groups[id]?.lights?.length || !Object.values(snapshot.groups[id].scenes ?? {}).some((scene) => scene.id === parts[4]))
|
|
476
|
+
throw new Error('deCONZ scene is not currently available.');
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
this.#permission(resource, id, Object.keys(patchArg));
|
|
480
|
+
if (resource === 'sensors' && section === 'state')
|
|
481
|
+
deconzSensorStatePatch(snapshot.sensors[id]?.type, patchArg);
|
|
482
|
+
deconzCurrentPatch(snapshot, resource, id, section, patchArg);
|
|
483
|
+
}
|
|
484
|
+
let dispatched = false;
|
|
485
|
+
try {
|
|
486
|
+
const result = await this.#request(operationArg, 'PUT', `/api/${encodeURIComponent(key)}${pathArg}`, patchArg, () => { dispatched = true; });
|
|
487
|
+
this.#acknowledgement(result, pathArg);
|
|
488
|
+
const observedState = await this.#snapshot(operationArg);
|
|
489
|
+
return { effectOutcome: 'accepted', observedState, causalityConfirmed: false, physicalCompletion: 'unconfirmed' };
|
|
490
|
+
}
|
|
491
|
+
catch (error) {
|
|
492
|
+
this.#gatewayHealthy = false;
|
|
493
|
+
if (dispatched)
|
|
494
|
+
throw new DeconzWriteError();
|
|
495
|
+
throw error;
|
|
330
496
|
}
|
|
331
|
-
this.gatewayId = identity;
|
|
332
497
|
}
|
|
333
|
-
resourceId(valueArg) {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
498
|
+
#resourceId(valueArg) { if (typeof valueArg !== 'string' || !/^[a-z0-9_-]+$/i.test(valueArg))
|
|
499
|
+
throw new Error('Invalid deCONZ resource identity.'); return valueArg; }
|
|
500
|
+
#acknowledgement(valueArg, pathArg) {
|
|
501
|
+
const entries = Array.isArray(valueArg) ? valueArg : [valueArg];
|
|
502
|
+
if (!entries.length || entries.some((entry) => !isDeconzRecord(entry) || !isDeconzRecord(entry.success) || !Object.keys(entry.success).length || Object.keys(entry.success).some((address) => address !== pathArg && !address.startsWith(`${pathArg}/`))))
|
|
503
|
+
throw new Error('Invalid deCONZ write acknowledgement.');
|
|
504
|
+
}
|
|
505
|
+
async #request(operationArg, methodArg, pathArg, dataArg, dispatchArg) {
|
|
506
|
+
const url = new URL(this.#endpoint);
|
|
507
|
+
url.pathname = pathArg;
|
|
508
|
+
return this.#foreign(operationArg, async () => {
|
|
509
|
+
try {
|
|
510
|
+
dispatchArg?.();
|
|
511
|
+
const response = await fetch(url, { method: methodArg, redirect: 'error', signal: operationArg.signal, headers: dataArg ? { 'content-type': 'application/json' } : undefined, body: dataArg ? JSON.stringify(dataArg) : undefined });
|
|
512
|
+
if (!response.ok) {
|
|
513
|
+
await response.body?.cancel();
|
|
514
|
+
throw new DeconzRequestError(`deCONZ request failed with HTTP ${response.status}.`);
|
|
515
|
+
}
|
|
516
|
+
const reader = response.body?.getReader();
|
|
517
|
+
if (!reader)
|
|
518
|
+
throw new DeconzRequestError('Empty deCONZ response.');
|
|
519
|
+
const chunks = [];
|
|
520
|
+
let length = 0;
|
|
521
|
+
try {
|
|
522
|
+
while (true) {
|
|
523
|
+
const chunk = await reader.read();
|
|
524
|
+
if (chunk.done)
|
|
525
|
+
break;
|
|
526
|
+
length += chunk.value.length;
|
|
527
|
+
if (length > 8388608) {
|
|
528
|
+
await reader.cancel();
|
|
529
|
+
throw new DeconzRequestError('deCONZ response exceeds the size limit.');
|
|
530
|
+
}
|
|
531
|
+
chunks.push(chunk.value);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
finally {
|
|
535
|
+
reader.releaseLock();
|
|
536
|
+
}
|
|
537
|
+
const bytes = new Uint8Array(length);
|
|
538
|
+
let offset = 0;
|
|
539
|
+
for (const chunk of chunks) {
|
|
540
|
+
bytes.set(chunk, offset);
|
|
541
|
+
offset += chunk.length;
|
|
542
|
+
}
|
|
543
|
+
let result;
|
|
544
|
+
try {
|
|
545
|
+
result = JSON.parse(new TextDecoder().decode(bytes));
|
|
546
|
+
}
|
|
547
|
+
catch {
|
|
548
|
+
throw new DeconzRequestError('Invalid deCONZ JSON response.');
|
|
549
|
+
}
|
|
550
|
+
if (Array.isArray(result))
|
|
551
|
+
for (const item of result)
|
|
552
|
+
if (isDeconzRecord(item) && isDeconzRecord(item.error))
|
|
553
|
+
throw new DeconzRequestError('deCONZ rejected the request.', typeof item.error.type === 'number' && Number.isInteger(item.error.type) ? item.error.type : undefined);
|
|
554
|
+
return result;
|
|
555
|
+
}
|
|
556
|
+
catch (error) {
|
|
557
|
+
if (operationArg.signal.aborted)
|
|
558
|
+
throw this.#cancelled(operationArg);
|
|
559
|
+
if (error instanceof DeconzRequestError)
|
|
560
|
+
throw error;
|
|
561
|
+
throw new DeconzRequestError('deCONZ network request failed.');
|
|
562
|
+
}
|
|
563
|
+
}, true);
|
|
337
564
|
}
|
|
338
565
|
}
|
|
339
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb256LmNsYXNzZXMuY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvaW50ZWdyYXRpb25zL2RlY29uei9kZWNvbnouY2xhc3Nlcy5jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsdUJBQXVCLEVBQUUsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9PLE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxLQUFLO0lBQ0ssWUFBWTtJQUE1RCxZQUFZLFVBQWtCLEVBQWtCLFlBQXFCO1FBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzRCQUEzQyxZQUFZO0lBQWdDLENBQUM7Q0FDOUY7QUFFRCxNQUFNLE9BQU8sWUFBWTtJQVdnQyxXQUFXO0lBVmpELE1BQU0sQ0FBZ0I7SUFDdEIsUUFBUSxDQUFPO0lBQ2YsU0FBUyxDQUFTO0lBQ2xCLFFBQVEsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ2pDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUN6QyxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7SUFDeEQsYUFBYSxHQUFHLElBQUksQ0FBQztJQUNyQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLFNBQVMsQ0FBVTtJQUUzQixZQUFZLFNBQXdCLEVBQW1CLFdBQXlCOzJCQUF6QixXQUFXO1FBQ2hFLElBQUksQ0FBQyxNQUFNLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENB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
|
|
566
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb256LmNsYXNzZXMuY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvaW50ZWdyYXRpb25zL2RlY29uei9kZWNvbnouY2xhc3Nlcy5jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQThCLE1BQU0sOENBQThDLENBQUM7QUFJbEgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsc0JBQXNCLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFeFUsTUFBTSxPQUFPLGtCQUFtQixTQUFRLEtBQUs7SUFDSyxZQUFZO0lBQTVELFlBQVksVUFBa0IsRUFBa0IsWUFBcUI7UUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQTNDLFlBQVk7SUFBZ0MsQ0FBQztDQUM5RjtBQUVELE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxLQUFLO0lBQ3pCLGFBQWEsR0FBRyxlQUF3QixDQUFDO0lBQ3pELGdCQUFnQixLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDekY7QUFzQkQsNkZBQTZGO0FBQzdGLE1BQU0sT0FBTyxZQUFZO0lBQ2QsT0FBTyxDQUEwQjtJQUNqQyxRQUFRLENBQXNDO0lBQzlDLFFBQVEsQ0FBMEI7SUFDbEMsTUFBTSxDQUF5QjtJQUMvQixVQUFVLENBQVU7SUFDcEIsU0FBUyxDQUFNO0lBQ2YsU0FBUyxDQUFrQjtJQUMzQixXQUFXLEdBQUcsSUFB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
|