@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,9 +1,9 @@
|
|
|
1
1
|
import { BaseIntegration } from '../../core/classes.baseintegration.js';
|
|
2
2
|
import { DiscoveryDescriptor } from '../../core/classes.discoverydescriptor.js';
|
|
3
|
-
import type {
|
|
4
|
-
import
|
|
3
|
+
import type { IIntegrationSetupContext } from '../../core/types.js';
|
|
4
|
+
import { HomeAssistantRuntime } from './homeassistant.classes.runtime.js';
|
|
5
|
+
import type { IHomeAssistantHomeassistantConfig, IHomeAssistantIntegrationOptions, THomeAssistantWebSocketFactory } from './homeassistant.types.js';
|
|
5
6
|
export declare class HomeAssistantHomeassistantIntegration extends BaseIntegration<IHomeAssistantHomeassistantConfig> {
|
|
6
|
-
private readonly webSocketFactory;
|
|
7
7
|
readonly domain = "homeassistant";
|
|
8
8
|
readonly displayName = "Home Assistant";
|
|
9
9
|
readonly status: 'control-runtime';
|
|
@@ -16,7 +16,10 @@ export declare class HomeAssistantHomeassistantIntegration extends BaseIntegrati
|
|
|
16
16
|
qualityScale: string;
|
|
17
17
|
transport: string;
|
|
18
18
|
};
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
private readonly owner;
|
|
20
|
+
private readonly webSocketFactory;
|
|
21
|
+
constructor(optionsOrFactoryArg?: IHomeAssistantIntegrationOptions | THomeAssistantWebSocketFactory);
|
|
22
|
+
setup(configArg: IHomeAssistantHomeassistantConfig, contextArg: IIntegrationSetupContext): Promise<HomeAssistantRuntime>;
|
|
21
23
|
destroy(): Promise<void>;
|
|
24
|
+
retryCleanup(): Promise<void>;
|
|
22
25
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
|
|
3
|
+
import { normalizeHomeAssistantConfig } from './homeassistant.classes.client.js';
|
|
4
|
+
import { homeAssistantRecord } from './homeassistant.validation.js';
|
|
2
5
|
import { BaseIntegration } from '../../core/classes.baseintegration.js';
|
|
3
6
|
import { DiscoveryDescriptor } from '../../core/classes.discoverydescriptor.js';
|
|
4
7
|
import { HomeAssistantClient } from './homeassistant.classes.client.js';
|
|
5
8
|
import { HomeAssistantRuntime } from './homeassistant.classes.runtime.js';
|
|
6
9
|
export class HomeAssistantHomeassistantIntegration extends BaseIntegration {
|
|
7
|
-
webSocketFactory;
|
|
8
10
|
domain = 'homeassistant';
|
|
9
11
|
displayName = 'Home Assistant';
|
|
10
12
|
status = 'control-runtime';
|
|
@@ -20,15 +22,39 @@ export class HomeAssistantHomeassistantIntegration extends BaseIntegration {
|
|
|
20
22
|
qualityScale: 'internal',
|
|
21
23
|
transport: 'websocket',
|
|
22
24
|
};
|
|
23
|
-
|
|
25
|
+
owner;
|
|
26
|
+
webSocketFactory;
|
|
27
|
+
constructor(optionsOrFactoryArg = {}) {
|
|
24
28
|
super();
|
|
25
|
-
|
|
29
|
+
const options = homeAssistantRecord(typeof optionsOrFactoryArg === 'function'
|
|
30
|
+
? { webSocketFactory: optionsOrFactoryArg } : optionsOrFactoryArg);
|
|
31
|
+
if (Object.keys(options).some((key) => !['homeId', 'capacity', 'webSocketFactory'].includes(key)))
|
|
32
|
+
throw new TypeError('Home Assistant integration options contain unsupported fields.');
|
|
33
|
+
if (options.webSocketFactory !== undefined && typeof options.webSocketFactory !== 'function')
|
|
34
|
+
throw new TypeError('Home Assistant webSocketFactory must be a function.');
|
|
35
|
+
this.webSocketFactory = options.webSocketFactory ?? ((urlArg) => new globalThis.WebSocket(urlArg));
|
|
36
|
+
this.owner = new NativeIntegrationOwner(this.domain, { homeId: options.homeId, capacity: options.capacity });
|
|
26
37
|
}
|
|
27
38
|
async setup(configArg, contextArg) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
39
|
+
// Validate/capture before deferred setup so later caller mutation cannot change scope.
|
|
40
|
+
normalizeHomeAssistantConfig(configArg);
|
|
41
|
+
const config = structuredClone(configArg);
|
|
42
|
+
return this.owner.runSetup(contextArg, config.homeId, async (leaseArg) => {
|
|
43
|
+
const client = new HomeAssistantClient(config, leaseArg.context, plugins.homeAssistantWebsocket, this.webSocketFactory, { owner: this.owner, lease: leaseArg });
|
|
44
|
+
let cleanupStarted = false;
|
|
45
|
+
leaseArg.own(() => {
|
|
46
|
+
const retry = cleanupStarted;
|
|
47
|
+
cleanupStarted = true;
|
|
48
|
+
return retry ? client.retryCleanup() : client.destroy();
|
|
49
|
+
});
|
|
50
|
+
await client.init(leaseArg.signal);
|
|
51
|
+
leaseArg.assertOpen();
|
|
52
|
+
const runtime = new HomeAssistantRuntime(client, leaseArg, this.owner);
|
|
53
|
+
leaseArg.promoteToRuntime();
|
|
54
|
+
return runtime;
|
|
55
|
+
});
|
|
31
56
|
}
|
|
32
|
-
|
|
57
|
+
destroy() { return this.owner.close(); }
|
|
58
|
+
retryCleanup() { return this.owner.retryCleanup(); }
|
|
33
59
|
}
|
|
34
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZWFzc2lzdGFudC5jbGFzc2VzLmludGVncmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvaW50ZWdyYXRpb25zL2hvbWVhc3Npc3RhbnQvaG9tZWFzc2lzdGFudC5jbGFzc2VzLmludGVncmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDdEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBSWhGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBTzFFLE1BQU0sT0FBTyxxQ0FBc0MsU0FBUSxlQUFrRDtJQUMzRixNQUFNLEdBQUcsZUFBZSxDQUFDO0lBQ3pCLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQztJQUMvQixNQUFNLEdBQUcsaUJBQTBCLENBQUM7SUFDcEMsbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQztRQUM1RCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsTUFBTTtRQUM5QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7S0FDOUIsQ0FBQyxDQUFDO0lBQ2EsUUFBUSxHQUFHO1FBQ3pCLE1BQU0sRUFBRSxxQkFBcUI7UUFDN0IsWUFBWSxFQUFFLHdDQUF3QztRQUN0RCxjQUFjLEVBQUUsZUFBZTtRQUMvQixlQUFlLEVBQUUsUUFBUTtRQUN6QixZQUFZLEVBQUUsVUFBVTtRQUN4QixT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
|
|
@@ -1,21 +1,24 @@
|
|
|
1
|
+
import type { INativeSetupLease, NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
|
|
1
2
|
import type * as shxInterfaces from '@smarthome.exchange/interfaces';
|
|
2
3
|
import type { IDeviceFeatureWriteRequest, IIntegrationEntity, IIntegrationEvent, IIntegrationRuntime, IServiceCallResult } from '../../core/types.js';
|
|
3
4
|
import type { IHomeAssistantClient } from './homeassistant.types.js';
|
|
4
5
|
export declare class HomeAssistantRuntime implements IIntegrationRuntime {
|
|
5
6
|
private readonly client;
|
|
7
|
+
private readonly lease?;
|
|
8
|
+
private readonly owner?;
|
|
6
9
|
readonly domain = "homeassistant";
|
|
7
|
-
private readonly subscriptions;
|
|
8
10
|
private destroyed;
|
|
9
|
-
private cleanupComplete;
|
|
10
11
|
private destroyPromise?;
|
|
11
12
|
private readonly targetScope;
|
|
12
|
-
constructor(client: IHomeAssistantClient);
|
|
13
|
+
constructor(client: IHomeAssistantClient, lease?: INativeSetupLease | undefined, owner?: NativeIntegrationOwner | undefined);
|
|
13
14
|
isHealthy(): boolean;
|
|
14
15
|
devices(abortSignalArg?: AbortSignal): Promise<shxInterfaces.data.IDeviceDefinition[]>;
|
|
15
16
|
entities(): Promise<IIntegrationEntity[]>;
|
|
16
|
-
subscribe(handlerArg: (eventArg: IIntegrationEvent) => void
|
|
17
|
+
subscribe(handlerArg: (eventArg: IIntegrationEvent) => void | Promise<void>, abortSignalArg?: AbortSignal): Promise<() => Promise<void>>;
|
|
17
18
|
writeFeature(requestArg: IDeviceFeatureWriteRequest, abortSignalArg?: AbortSignal): Promise<IServiceCallResult>;
|
|
19
|
+
private writeAdmitted;
|
|
18
20
|
private assertActive;
|
|
19
21
|
destroy(): Promise<void>;
|
|
22
|
+
retryCleanup(): Promise<void>;
|
|
20
23
|
private performDestroy;
|
|
21
24
|
}
|
|
@@ -7,66 +7,65 @@ const abortError = (abortSignalArg) => {
|
|
|
7
7
|
};
|
|
8
8
|
export class HomeAssistantRuntime {
|
|
9
9
|
client;
|
|
10
|
+
lease;
|
|
11
|
+
owner;
|
|
10
12
|
domain = 'homeassistant';
|
|
11
|
-
subscriptions = new Set();
|
|
12
13
|
destroyed = false;
|
|
13
|
-
cleanupComplete = false;
|
|
14
14
|
destroyPromise;
|
|
15
15
|
targetScope;
|
|
16
|
-
constructor(client) {
|
|
16
|
+
constructor(client, lease, owner) {
|
|
17
17
|
this.client = client;
|
|
18
|
+
this.lease = lease;
|
|
19
|
+
this.owner = owner;
|
|
18
20
|
this.targetScope = Object.freeze({ ...client.getTargetScope() });
|
|
19
21
|
}
|
|
20
22
|
isHealthy() {
|
|
21
|
-
return !this.destroyed && this.client.connected;
|
|
23
|
+
return !this.destroyed && !this.lease?.signal.aborted && this.client.connected;
|
|
22
24
|
}
|
|
23
25
|
async devices(abortSignalArg) {
|
|
24
26
|
this.assertActive();
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
return this.client.withOperation(async () => {
|
|
28
|
+
this.assertActive();
|
|
29
|
+
return HomeAssistantMapper.toDevices(this.client.getSnapshot(), this.client.connected, this.client.getEntityPlatforms(), this.client.getServices(), this.targetScope);
|
|
30
|
+
}, abortSignalArg);
|
|
29
31
|
}
|
|
30
32
|
async entities() {
|
|
31
33
|
this.assertActive();
|
|
32
|
-
return
|
|
34
|
+
return this.client.withOperation(async () => {
|
|
35
|
+
this.assertActive();
|
|
36
|
+
return HomeAssistantMapper.toEntities(this.client.getSnapshot(), this.client.connected, this.targetScope);
|
|
37
|
+
});
|
|
33
38
|
}
|
|
34
39
|
async subscribe(handlerArg, abortSignalArg) {
|
|
35
40
|
this.assertActive();
|
|
36
41
|
if (abortSignalArg?.aborted) {
|
|
37
42
|
throw abortError(abortSignalArg);
|
|
38
43
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
if (typeof handlerArg !== 'function')
|
|
45
|
+
throw new TypeError('Home Assistant subscriber must be a function.');
|
|
46
|
+
return this.client.subscribe(() => {
|
|
47
|
+
return handlerArg({
|
|
42
48
|
type: 'state_changed',
|
|
43
49
|
integrationDomain: this.domain,
|
|
44
50
|
timestamp: Date.now(),
|
|
45
51
|
});
|
|
46
|
-
});
|
|
47
|
-
const unsubscribe = () => {
|
|
48
|
-
if (!subscribed) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
subscribed = false;
|
|
52
|
-
this.subscriptions.delete(unsubscribe);
|
|
53
|
-
abortSignalArg?.removeEventListener('abort', unsubscribe);
|
|
54
|
-
unsubscribeClient();
|
|
55
|
-
};
|
|
56
|
-
this.subscriptions.add(unsubscribe);
|
|
57
|
-
abortSignalArg?.addEventListener('abort', unsubscribe, { once: true });
|
|
58
|
-
if (abortSignalArg?.aborted) {
|
|
59
|
-
unsubscribe();
|
|
60
|
-
}
|
|
61
|
-
return async () => {
|
|
62
|
-
unsubscribe();
|
|
63
|
-
};
|
|
52
|
+
}, abortSignalArg);
|
|
64
53
|
}
|
|
65
54
|
async writeFeature(requestArg, abortSignalArg) {
|
|
66
55
|
this.assertActive();
|
|
67
56
|
if (abortSignalArg?.aborted) {
|
|
68
57
|
throw abortError(abortSignalArg);
|
|
69
58
|
}
|
|
59
|
+
homeAssistantRecord(requestArg);
|
|
60
|
+
homeAssistantRecord(requestArg.device);
|
|
61
|
+
homeAssistantRecord(requestArg.feature);
|
|
62
|
+
if (requestArg.device.metadata !== undefined)
|
|
63
|
+
homeAssistantRecord(requestArg.device.metadata);
|
|
64
|
+
const request = structuredClone(requestArg);
|
|
65
|
+
return this.client.withOperation((sessionArg) => this.writeAdmitted(request, sessionArg), abortSignalArg);
|
|
66
|
+
}
|
|
67
|
+
async writeAdmitted(requestArg, sessionArg) {
|
|
68
|
+
this.assertActive();
|
|
70
69
|
if (Object.keys(homeAssistantRecord(requestArg)).some((key) => !['device', 'feature', 'value'].includes(key))) {
|
|
71
70
|
return { success: false, error: 'Home Assistant feature requests contain unsupported fields.' };
|
|
72
71
|
}
|
|
@@ -106,10 +105,8 @@ export class HomeAssistantRuntime {
|
|
|
106
105
|
if (!mappedCall.request) {
|
|
107
106
|
return { success: false, error: mappedCall.error || 'Unsupported Home Assistant write.' };
|
|
108
107
|
}
|
|
109
|
-
const data = await
|
|
110
|
-
|
|
111
|
-
throw abortError(abortSignalArg);
|
|
112
|
-
}
|
|
108
|
+
const data = await sessionArg.callService(mappedCall.request);
|
|
109
|
+
sessionArg.signal.throwIfAborted();
|
|
113
110
|
return {
|
|
114
111
|
success: true,
|
|
115
112
|
data: {
|
|
@@ -119,34 +116,25 @@ export class HomeAssistantRuntime {
|
|
|
119
116
|
};
|
|
120
117
|
}
|
|
121
118
|
assertActive() {
|
|
119
|
+
this.lease?.assertOpen();
|
|
122
120
|
if (this.destroyed)
|
|
123
121
|
throw new Error('Home Assistant runtime is destroyed.');
|
|
124
122
|
}
|
|
125
123
|
destroy() {
|
|
126
|
-
if (this.destroyPromise) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
if (this.cleanupComplete) {
|
|
130
|
-
return Promise.resolve();
|
|
124
|
+
if (!this.destroyPromise) {
|
|
125
|
+
this.destroyed = true;
|
|
126
|
+
this.destroyPromise = Promise.resolve().then(() => this.performDestroy());
|
|
131
127
|
}
|
|
132
|
-
this.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
if (this.destroyPromise === destroyPromise) {
|
|
139
|
-
this.destroyPromise = undefined;
|
|
140
|
-
}
|
|
141
|
-
}).catch(() => undefined);
|
|
142
|
-
return destroyPromise;
|
|
128
|
+
return this.destroyPromise;
|
|
129
|
+
}
|
|
130
|
+
retryCleanup() {
|
|
131
|
+
if (!this.destroyPromise)
|
|
132
|
+
return Promise.reject(new Error('Home Assistant cleanup retry requires destruction.'));
|
|
133
|
+
return this.owner ? this.owner.retryCleanup() : this.client.retryCleanup();
|
|
143
134
|
}
|
|
144
135
|
async performDestroy() {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
this.subscriptions.clear();
|
|
149
|
-
await this.client.destroy();
|
|
136
|
+
// The client closes transport before joining its owned subscriber continuations.
|
|
137
|
+
await (this.lease ? this.lease.close() : this.client.destroy());
|
|
150
138
|
}
|
|
151
139
|
}
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZWFzc2lzdGFudC5jbGFzc2VzLnJ1bnRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9pbnRlZ3JhdGlvbnMvaG9tZWFzc2lzdGFudC9ob21lYXNzaXN0YW50LmNsYXNzZXMucnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFTQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU9wRSxNQUFNLFVBQVUsR0FBRyxDQUFDLGNBQTJCLEVBQVMsRUFBRTtJQUN4RCxPQUFPLGNBQWMsQ0FBQyxNQUFNLFlBQVksS0FBSztRQUMzQyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU07UUFDdkIsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7QUFDekQsQ0FBQyxDQUFDO0FBRUYsTUFBTSxPQUFPLG9CQUFvQjtJQU1GLE1BQU07SUFBeUMsS0FBSztJQUF1QyxLQUFLO0lBTDdHLE1BQU0sR0FBRyxlQUFlLENBQUM7SUFDakMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixjQUFjLENBQWlCO0lBQ3RCLFdBQVcsQ0FBNEI7SUFFeEQsWUFBNkIsTUFBNEIsRUFBbUIsS0FBeUIsRUFBbUIsS0FBOEI7c0JBQXpILE1BQU07cUJBQXlDLEtBQUs7cUJBQXVDLEtBQUs7UUFDM0gsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDakYsQ0FBQztJQUVNLEtB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
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
+
import type { INativeIntegrationOwnerOptions } from '../../core/classes.nativeintegrationowner.js';
|
|
1
2
|
import type * as homeAssistantWebsocket from 'home-assistant-js-websocket';
|
|
2
3
|
export type THomeAssistantVacuumCommand = 'start' | 'pause' | 'stop' | 'return_to_base' | 'locate' | 'clean_spot';
|
|
4
|
+
export interface IHomeAssistantIntegrationOptions extends INativeIntegrationOwnerOptions {
|
|
5
|
+
readonly webSocketFactory?: THomeAssistantWebSocketFactory;
|
|
6
|
+
}
|
|
3
7
|
export interface IHomeAssistantHomeassistantConfig {
|
|
4
8
|
homeId: string;
|
|
5
9
|
baseUrl: string;
|
|
@@ -57,9 +61,16 @@ export interface IHomeAssistantClient {
|
|
|
57
61
|
getEntityPlatforms(): Record<string, string>;
|
|
58
62
|
getServices(): ReadonlySet<string>;
|
|
59
63
|
getTargetScope(): IHomeAssistantTargetScope;
|
|
60
|
-
subscribe(handlerArg: () => void): () => void
|
|
64
|
+
subscribe(handlerArg: () => void | Promise<void>, abortSignalArg?: AbortSignal): () => Promise<void>;
|
|
65
|
+
withOperation<TResult>(workArg: (sessionArg: IHomeAssistantOperationSession) => Promise<TResult>, abortSignalArg?: AbortSignal): Promise<TResult>;
|
|
61
66
|
callService(requestArg: IHomeAssistantServiceCall, abortSignalArg?: AbortSignal): Promise<unknown>;
|
|
62
67
|
destroy(): Promise<void>;
|
|
68
|
+
retryCleanup(): Promise<void>;
|
|
69
|
+
}
|
|
70
|
+
/** A service session remains usable only inside its admitted continuation. */
|
|
71
|
+
export interface IHomeAssistantOperationSession {
|
|
72
|
+
readonly signal: AbortSignal;
|
|
73
|
+
callService(requestArg: IHomeAssistantServiceCall): Promise<unknown>;
|
|
63
74
|
}
|
|
64
75
|
export interface IHomeAssistantTargetScope {
|
|
65
76
|
readonly homeId: string;
|
|
@@ -1,15 +1,43 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { NativeIntegrationOwner } from '../../core/classes.nativeintegrationowner.js';
|
|
2
|
+
import type { IIntegrationSetupContext } from '../../core/types.js';
|
|
3
|
+
import type { IHueConfig, IHueEvent, IHueLightStatePatch, IHueResourceResponse, IHueIntegrationOptions } from './hue.types.js';
|
|
4
|
+
export declare class HuePairingError extends Error {
|
|
5
|
+
readonly linkButtonRequired: boolean;
|
|
6
|
+
constructor(linkButtonRequired?: boolean);
|
|
7
|
+
}
|
|
8
|
+
export interface IHueClientOperation {
|
|
9
|
+
getResources(signalArg?: AbortSignal): Promise<IHueResourceResponse>;
|
|
10
|
+
setLightState(idArg: string, stateArg: IHueLightStatePatch, signalArg?: AbortSignal): Promise<void>;
|
|
11
|
+
}
|
|
2
12
|
export declare class HueClient {
|
|
3
13
|
#private;
|
|
4
|
-
|
|
5
|
-
|
|
14
|
+
constructor(configArg: IHueConfig, contextArg: IIntegrationSetupContext, optionsArg?: IHueIntegrationOptions, ownerArg?: NativeIntegrationOwner);
|
|
15
|
+
get canCreateCredential(): boolean;
|
|
6
16
|
isHealthy(): boolean;
|
|
7
17
|
getResources(abortSignalArg?: AbortSignal): Promise<IHueResourceResponse>;
|
|
18
|
+
private readResources;
|
|
8
19
|
setLightState(lightIdArg: string, stateArg: IHueLightStatePatch, abortSignalArg?: AbortSignal): Promise<void>;
|
|
9
|
-
|
|
20
|
+
/** A captured runtime command shares one operation lease, provider deadline and one write attempt. */
|
|
21
|
+
execute<TResult>(workArg: (clientArg: IHueClientOperation) => Promise<TResult>, signalArg?: AbortSignal): Promise<TResult>;
|
|
22
|
+
private captureWrite;
|
|
23
|
+
private write;
|
|
24
|
+
acquireAppKey(deviceTypeArg?: string, signalArg?: AbortSignal): Promise<string>;
|
|
25
|
+
createCredential(appKeyArg: string, signalArg?: AbortSignal): Promise<void>;
|
|
26
|
+
subscribeToEvents(handlerArg: (eventArg: IHueEvent) => unknown, onErrorArg: (errorArg: Error) => unknown, abortSignalArg?: AbortSignal): Promise<() => Promise<void>>;
|
|
27
|
+
private subscribe;
|
|
10
28
|
destroy(): Promise<void>;
|
|
29
|
+
/** Retries only failed cleanup and acknowledges settled callback failures; never replays callbacks or HTTPS work. */
|
|
30
|
+
retryCleanup(): Promise<void>;
|
|
11
31
|
private readonly abortSetup;
|
|
12
32
|
private drain;
|
|
33
|
+
private run;
|
|
34
|
+
private foreign;
|
|
35
|
+
private active;
|
|
36
|
+
private cancelled;
|
|
37
|
+
private credentialRequest;
|
|
38
|
+
private storeKey;
|
|
39
|
+
private credential;
|
|
40
|
+
private permission;
|
|
13
41
|
private assertOpen;
|
|
14
42
|
private requestOptions;
|
|
15
43
|
private request;
|