@mehrwiedu/dreo-api 0.1.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/dist/CapabilityMerger.d.ts +4 -0
- package/dist/CapabilityMerger.js +31 -0
- package/dist/CapabilityMerger.js.map +1 -0
- package/dist/DeviceCapabilityResolver.d.ts +9 -0
- package/dist/DeviceCapabilityResolver.js +73 -0
- package/dist/DeviceCapabilityResolver.js.map +1 -0
- package/dist/DeviceResolver.d.ts +13 -0
- package/dist/DeviceResolver.js +64 -0
- package/dist/DeviceResolver.js.map +1 -0
- package/dist/DreoCapabilityRegistry.d.ts +13 -0
- package/dist/DreoCapabilityRegistry.js +57 -0
- package/dist/DreoCapabilityRegistry.js.map +1 -0
- package/dist/DreoClient.d.ts +63 -0
- package/dist/DreoClient.js +210 -0
- package/dist/DreoClient.js.map +1 -0
- package/dist/DreoDevice.d.ts +41 -0
- package/dist/DreoDevice.js +147 -0
- package/dist/DreoDevice.js.map +1 -0
- package/dist/DreoLogger.d.ts +7 -0
- package/dist/DreoLogger.js +15 -0
- package/dist/DreoLogger.js.map +1 -0
- package/dist/DreoSession.d.ts +31 -0
- package/dist/DreoSession.js +81 -0
- package/dist/DreoSession.js.map +1 -0
- package/dist/DreoSessionObserver.d.ts +12 -0
- package/dist/DreoSessionObserver.js +2 -0
- package/dist/DreoSessionObserver.js.map +1 -0
- package/dist/DreoStateRegistry.d.ts +3 -0
- package/dist/DreoStateRegistry.js +302 -0
- package/dist/DreoStateRegistry.js.map +1 -0
- package/dist/InputValidator.d.ts +15 -0
- package/dist/InputValidator.js +30 -0
- package/dist/InputValidator.js.map +1 -0
- package/dist/ResolvedDeviceResolver.d.ts +12 -0
- package/dist/ResolvedDeviceResolver.js +54 -0
- package/dist/ResolvedDeviceResolver.js.map +1 -0
- package/dist/StateConstraintResolver.d.ts +15 -0
- package/dist/StateConstraintResolver.js +169 -0
- package/dist/StateConstraintResolver.js.map +1 -0
- package/dist/StateConstraintValidator.d.ts +9 -0
- package/dist/StateConstraintValidator.js +79 -0
- package/dist/StateConstraintValidator.js.map +1 -0
- package/dist/StateMapper.d.ts +17 -0
- package/dist/StateMapper.js +84 -0
- package/dist/StateMapper.js.map +1 -0
- package/dist/api/AppApi.d.ts +7 -0
- package/dist/api/AppApi.js +10 -0
- package/dist/api/AppApi.js.map +1 -0
- package/dist/api/AuthenticatedHttpClient.d.ts +14 -0
- package/dist/api/AuthenticatedHttpClient.js +54 -0
- package/dist/api/AuthenticatedHttpClient.js.map +1 -0
- package/dist/api/DeviceApi.d.ts +9 -0
- package/dist/api/DeviceApi.js +24 -0
- package/dist/api/DeviceApi.js.map +1 -0
- package/dist/api/HttpClient.d.ts +15 -0
- package/dist/api/HttpClient.js +41 -0
- package/dist/api/HttpClient.js.map +1 -0
- package/dist/api/UserApi.d.ts +1 -0
- package/dist/api/UserApi.js +2 -0
- package/dist/api/UserApi.js.map +1 -0
- package/dist/auth/AuthManager.d.ts +16 -0
- package/dist/auth/AuthManager.js +27 -0
- package/dist/auth/AuthManager.js.map +1 -0
- package/dist/auth/LoginRequestBuilder.d.ts +5 -0
- package/dist/auth/LoginRequestBuilder.js +18 -0
- package/dist/auth/LoginRequestBuilder.js.map +1 -0
- package/dist/auth/TokenStore.d.ts +1 -0
- package/dist/auth/TokenStore.js +2 -0
- package/dist/auth/TokenStore.js.map +1 -0
- package/dist/crypto/PasswordHasher.d.ts +3 -0
- package/dist/crypto/PasswordHasher.js +7 -0
- package/dist/crypto/PasswordHasher.js.map +1 -0
- package/dist/crypto/Signer.d.ts +1 -0
- package/dist/crypto/Signer.js +2 -0
- package/dist/crypto/Signer.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/mappers/DeviceStateMapper.d.ts +8 -0
- package/dist/mappers/DeviceStateMapper.js +27 -0
- package/dist/mappers/DeviceStateMapper.js.map +1 -0
- package/dist/mappers/FamilyTreeMapper.d.ts +8 -0
- package/dist/mappers/FamilyTreeMapper.js +50 -0
- package/dist/mappers/FamilyTreeMapper.js.map +1 -0
- package/dist/models/AuthTokens.d.ts +4 -0
- package/dist/models/AuthTokens.js +2 -0
- package/dist/models/AuthTokens.js.map +1 -0
- package/dist/models/Commands.d.ts +1 -0
- package/dist/models/Commands.js +2 -0
- package/dist/models/Commands.js.map +1 -0
- package/dist/models/Device.d.ts +19 -0
- package/dist/models/Device.js +2 -0
- package/dist/models/Device.js.map +1 -0
- package/dist/models/DeviceCapabilities.d.ts +7 -0
- package/dist/models/DeviceCapabilities.js +2 -0
- package/dist/models/DeviceCapabilities.js.map +1 -0
- package/dist/models/DeviceListResponse.d.ts +8 -0
- package/dist/models/DeviceListResponse.js +2 -0
- package/dist/models/DeviceListResponse.js.map +1 -0
- package/dist/models/DeviceState.d.ts +12 -0
- package/dist/models/DeviceState.js +2 -0
- package/dist/models/DeviceState.js.map +1 -0
- package/dist/models/DeviceStateResponse.d.ts +20 -0
- package/dist/models/DeviceStateResponse.js +2 -0
- package/dist/models/DeviceStateResponse.js.map +1 -0
- package/dist/models/DeviceSummary.d.ts +11 -0
- package/dist/models/DeviceSummary.js +2 -0
- package/dist/models/DeviceSummary.js.map +1 -0
- package/dist/models/DiscoveredState.d.ts +18 -0
- package/dist/models/DiscoveredState.js +2 -0
- package/dist/models/DiscoveredState.js.map +1 -0
- package/dist/models/DreoDeviceState.d.ts +15 -0
- package/dist/models/DreoDeviceState.js +2 -0
- package/dist/models/DreoDeviceState.js.map +1 -0
- package/dist/models/Family.d.ts +14 -0
- package/dist/models/Family.js +2 -0
- package/dist/models/Family.js.map +1 -0
- package/dist/models/FamilyRoomDevicesResponse.d.ts +10 -0
- package/dist/models/FamilyRoomDevicesResponse.js +2 -0
- package/dist/models/FamilyRoomDevicesResponse.js.map +1 -0
- package/dist/models/FamilyTree.d.ts +19 -0
- package/dist/models/FamilyTree.js +2 -0
- package/dist/models/FamilyTree.js.map +1 -0
- package/dist/models/LoginResponse.d.ts +9 -0
- package/dist/models/LoginResponse.js +2 -0
- package/dist/models/LoginResponse.js.map +1 -0
- package/dist/models/ResolvedCapability.d.ts +13 -0
- package/dist/models/ResolvedCapability.js +2 -0
- package/dist/models/ResolvedCapability.js.map +1 -0
- package/dist/models/ResolvedDevice.d.ts +42 -0
- package/dist/models/ResolvedDevice.js +2 -0
- package/dist/models/ResolvedDevice.js.map +1 -0
- package/dist/models/Room.d.ts +12 -0
- package/dist/models/Room.js +2 -0
- package/dist/models/Room.js.map +1 -0
- package/dist/models/StateConstraint.d.ts +42 -0
- package/dist/models/StateConstraint.js +2 -0
- package/dist/models/StateConstraint.js.map +1 -0
- package/dist/models/User.d.ts +1 -0
- package/dist/models/User.js +2 -0
- package/dist/models/User.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/Helpers.d.ts +1 -0
- package/dist/utils/Helpers.js +2 -0
- package/dist/utils/Helpers.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/dist/websocket/DreoCommand.d.ts +13 -0
- package/dist/websocket/DreoCommand.js +2 -0
- package/dist/websocket/DreoCommand.js.map +1 -0
- package/dist/websocket/DreoWebSocketClient.d.ts +39 -0
- package/dist/websocket/DreoWebSocketClient.js +271 -0
- package/dist/websocket/DreoWebSocketClient.js.map +1 -0
- package/dist/websocket/DreoWebSocketMessage.d.ts +9 -0
- package/dist/websocket/DreoWebSocketMessage.js +2 -0
- package/dist/websocket/DreoWebSocketMessage.js.map +1 -0
- package/dist/websocket/DreoWebSocketReply.d.ts +7 -0
- package/dist/websocket/DreoWebSocketReply.js +2 -0
- package/dist/websocket/DreoWebSocketReply.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class CapabilityMerger {
|
|
2
|
+
merge(primary, secondary) {
|
|
3
|
+
const merged = new Map();
|
|
4
|
+
//
|
|
5
|
+
// Primary source wins.
|
|
6
|
+
//
|
|
7
|
+
for (const capability of primary) {
|
|
8
|
+
merged.set(capability.id, new Set(capability.states));
|
|
9
|
+
}
|
|
10
|
+
//
|
|
11
|
+
// Merge secondary source.
|
|
12
|
+
//
|
|
13
|
+
for (const capability of secondary) {
|
|
14
|
+
const states = merged.get(capability.id);
|
|
15
|
+
if (!states) {
|
|
16
|
+
merged.set(capability.id, new Set(capability.states));
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
for (const state of capability.states) {
|
|
20
|
+
states.add(state);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return [...merged.entries()]
|
|
24
|
+
.map(([id, states]) => ({
|
|
25
|
+
id,
|
|
26
|
+
states: [...states].sort(),
|
|
27
|
+
}))
|
|
28
|
+
.sort((a, b) => a.id.localeCompare(b.id));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=CapabilityMerger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CapabilityMerger.js","sourceRoot":"","sources":["../src/CapabilityMerger.ts"],"names":[],"mappings":"AAKA,MAAM,OAAO,gBAAgB;IAClB,KAAK,CACR,OAA6B,EAC7B,SAA+B;QAE/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqC,CAAC;QAE5D,EAAE;QACF,uBAAuB;QACvB,EAAE;QACF,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,CAAC;QAED,EAAE;QACF,0BAA0B;QAC1B,EAAE;QACF,KAAK,MAAM,UAAU,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAEzC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtD,SAAS;YACb,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACL,CAAC;QAED,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;aACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACpB,EAAE;YACF,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE;SAC7B,CAAC,CAAC;aACF,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;CACJ"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DeviceCapabilities } from "./models/DeviceCapabilities.js";
|
|
2
|
+
import type { ResolvedCapability } from "./models/ResolvedCapability.js";
|
|
3
|
+
export declare class DeviceCapabilityResolver {
|
|
4
|
+
resolve(capabilities?: DeviceCapabilities): ResolvedCapability[];
|
|
5
|
+
private collectStateKeys;
|
|
6
|
+
private collectPreferenceCommands;
|
|
7
|
+
private collectControlCommands;
|
|
8
|
+
private collectScheduleCommands;
|
|
9
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { DREO_CAPABILITY_REGISTRY } from "./DreoCapabilityRegistry.js";
|
|
2
|
+
export class DeviceCapabilityResolver {
|
|
3
|
+
resolve(capabilities) {
|
|
4
|
+
if (!capabilities) {
|
|
5
|
+
return [];
|
|
6
|
+
}
|
|
7
|
+
const availableStates = this.collectStateKeys(capabilities);
|
|
8
|
+
return DREO_CAPABILITY_REGISTRY.filter((capability) => capability.required.every((state) => availableStates.has(state))).map((capability) => ({
|
|
9
|
+
id: capability.id,
|
|
10
|
+
states: capability.states.filter((state) => availableStates.has(state)),
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
13
|
+
collectStateKeys(capabilities) {
|
|
14
|
+
const keys = new Set();
|
|
15
|
+
const controlsConf = capabilities.controlsConf;
|
|
16
|
+
this.collectPreferenceCommands(controlsConf, keys);
|
|
17
|
+
this.collectControlCommands(controlsConf, keys);
|
|
18
|
+
this.collectScheduleCommands(controlsConf, keys);
|
|
19
|
+
return keys;
|
|
20
|
+
}
|
|
21
|
+
collectPreferenceCommands(controlsConf, keys) {
|
|
22
|
+
if (!Array.isArray(controlsConf?.preference)) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
for (const preference of controlsConf.preference) {
|
|
26
|
+
if (typeof preference.cmd === "string") {
|
|
27
|
+
keys.add(preference.cmd);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
collectControlCommands(controlsConf, keys) {
|
|
32
|
+
if (!Array.isArray(controlsConf?.control)) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
for (const control of controlsConf.control) {
|
|
36
|
+
if (!Array.isArray(control.items)) {
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
for (const item of control.items) {
|
|
40
|
+
if (typeof item.cmd === "string") {
|
|
41
|
+
keys.add(item.cmd);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
collectScheduleCommands(controlsConf, keys) {
|
|
47
|
+
if (!Array.isArray(controlsConf?.schedule?.modes)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
for (const mode of controlsConf.schedule.modes) {
|
|
51
|
+
if (typeof mode.cmd === "string") {
|
|
52
|
+
keys.add(mode.cmd);
|
|
53
|
+
}
|
|
54
|
+
if (Array.isArray(mode.attention)) {
|
|
55
|
+
for (const command of mode.attention) {
|
|
56
|
+
keys.add(command);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if (!Array.isArray(mode.controls)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
for (const control of mode.controls) {
|
|
63
|
+
if (!Array.isArray(control.cmd)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
for (const command of control.cmd) {
|
|
67
|
+
keys.add(command);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=DeviceCapabilityResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceCapabilityResolver.js","sourceRoot":"","sources":["../src/DeviceCapabilityResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DiscoveredState } from "./models/DiscoveredState.js";
|
|
2
|
+
import type { DeviceMixedState, DeviceStateResponse } from "./models/DeviceStateResponse.js";
|
|
3
|
+
import type { ResolvedCapability } from "./models/ResolvedCapability.js";
|
|
4
|
+
export declare class DeviceResolver {
|
|
5
|
+
getRawStateKeys(response: DeviceStateResponse): string[];
|
|
6
|
+
getMixedStateKeys(mixed: DeviceMixedState): string[];
|
|
7
|
+
discoverStates(response: DeviceStateResponse): DiscoveredState[];
|
|
8
|
+
resolveCapabilities(response: DeviceStateResponse): ResolvedCapability[];
|
|
9
|
+
resolveMixedCapabilities(mixed: DeviceMixedState): ResolvedCapability[];
|
|
10
|
+
discoverMixedStates(mixed: DeviceMixedState): DiscoveredState[];
|
|
11
|
+
private getRegistryDefinition;
|
|
12
|
+
private detectValueType;
|
|
13
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { DREO_STATE_REGISTRY, } from "./DreoStateRegistry.js";
|
|
2
|
+
import { DREO_CAPABILITY_REGISTRY } from "./DreoCapabilityRegistry.js";
|
|
3
|
+
export class DeviceResolver {
|
|
4
|
+
getRawStateKeys(response) {
|
|
5
|
+
return this.getMixedStateKeys(response.data.mixed);
|
|
6
|
+
}
|
|
7
|
+
getMixedStateKeys(mixed) {
|
|
8
|
+
return Object.keys(mixed).sort();
|
|
9
|
+
}
|
|
10
|
+
discoverStates(response) {
|
|
11
|
+
return this.discoverMixedStates(response.data.mixed);
|
|
12
|
+
}
|
|
13
|
+
resolveCapabilities(response) {
|
|
14
|
+
return this.resolveMixedCapabilities(response.data.mixed);
|
|
15
|
+
}
|
|
16
|
+
resolveMixedCapabilities(mixed) {
|
|
17
|
+
const availableStates = new Set(Object.keys(mixed));
|
|
18
|
+
return DREO_CAPABILITY_REGISTRY.filter((capability) => capability.required.every((state) => availableStates.has(state))).map((capability) => ({
|
|
19
|
+
id: capability.id,
|
|
20
|
+
states: capability.states.filter((state) => availableStates.has(state)),
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
discoverMixedStates(mixed) {
|
|
24
|
+
return Object.entries(mixed)
|
|
25
|
+
.map(([key, value]) => {
|
|
26
|
+
const registryDefinition = this.getRegistryDefinition(key);
|
|
27
|
+
const detectedType = this.detectValueType(value);
|
|
28
|
+
return {
|
|
29
|
+
key,
|
|
30
|
+
valueType: detectedType,
|
|
31
|
+
writable: registryDefinition?.writable ?? false,
|
|
32
|
+
category: registryDefinition?.category ?? "unknown",
|
|
33
|
+
description: registryDefinition?.description ?? "Unknown Dreo state",
|
|
34
|
+
known: registryDefinition !== undefined,
|
|
35
|
+
constraint: registryDefinition?.constraint,
|
|
36
|
+
};
|
|
37
|
+
})
|
|
38
|
+
.sort((a, b) => a.key.localeCompare(b.key));
|
|
39
|
+
}
|
|
40
|
+
getRegistryDefinition(key) {
|
|
41
|
+
return DREO_STATE_REGISTRY[key];
|
|
42
|
+
}
|
|
43
|
+
detectValueType(value) {
|
|
44
|
+
if (typeof value !== "object" ||
|
|
45
|
+
value === null ||
|
|
46
|
+
!("state" in value)) {
|
|
47
|
+
return "unknown";
|
|
48
|
+
}
|
|
49
|
+
const state = value.state;
|
|
50
|
+
switch (typeof state) {
|
|
51
|
+
case "boolean":
|
|
52
|
+
return "boolean";
|
|
53
|
+
case "number":
|
|
54
|
+
return "number";
|
|
55
|
+
case "string":
|
|
56
|
+
return "string";
|
|
57
|
+
case "object":
|
|
58
|
+
return "object";
|
|
59
|
+
default:
|
|
60
|
+
return "unknown";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=DeviceResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceResolver.js","sourceRoot":"","sources":["../src/DeviceResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ResolvedCapabilityId } from "./models/ResolvedCapability.js";
|
|
2
|
+
export interface CapabilityDefinition {
|
|
3
|
+
id: ResolvedCapabilityId;
|
|
4
|
+
/**
|
|
5
|
+
* Alle diese States müssen vorhanden sein.
|
|
6
|
+
*/
|
|
7
|
+
required: string[];
|
|
8
|
+
/**
|
|
9
|
+
* Diese States gehören zu dieser Capability.
|
|
10
|
+
*/
|
|
11
|
+
states: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare const DREO_CAPABILITY_REGISTRY: CapabilityDefinition[];
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export const DREO_CAPABILITY_REGISTRY = [
|
|
2
|
+
{
|
|
3
|
+
id: "fan",
|
|
4
|
+
required: ["poweron", "mode", "windlevel"],
|
|
5
|
+
states: [
|
|
6
|
+
"poweron",
|
|
7
|
+
"mode",
|
|
8
|
+
"windlevel",
|
|
9
|
+
"fanon",
|
|
10
|
+
"oscmode",
|
|
11
|
+
"cruiseconf",
|
|
12
|
+
"fixedconf",
|
|
13
|
+
],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
id: "mainLight",
|
|
17
|
+
required: ["lighton", "brightness", "colortemp"],
|
|
18
|
+
states: ["lighton", "brightness", "colortemp"],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "ambientLight",
|
|
22
|
+
required: ["atmon"],
|
|
23
|
+
states: ["atmon", "atmbri", "rgbpresetsel", "rgbeffectid"],
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "configuration",
|
|
27
|
+
required: ["muteon"],
|
|
28
|
+
states: ["muteon", "childlockon"],
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "diagnostic",
|
|
32
|
+
required: ["connected"],
|
|
33
|
+
states: [
|
|
34
|
+
"connected",
|
|
35
|
+
"wifi_rssi",
|
|
36
|
+
"wifi_ssid",
|
|
37
|
+
"network_latency",
|
|
38
|
+
"module_firmware_version",
|
|
39
|
+
"mcu_firmware_version",
|
|
40
|
+
"module_hardware_model",
|
|
41
|
+
"mcu_hardware_model",
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
id: "information",
|
|
46
|
+
required: [],
|
|
47
|
+
states: [
|
|
48
|
+
"module_hardware_mac",
|
|
49
|
+
"temperature",
|
|
50
|
+
"timeron",
|
|
51
|
+
"timeroff",
|
|
52
|
+
"rgbpresetnum",
|
|
53
|
+
"scenes",
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
//# sourceMappingURL=DreoCapabilityRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DreoCapabilityRegistry.js","sourceRoot":"","sources":["../src/DreoCapabilityRegistry.ts"],"names":[],"mappings":"AAgBA,MAAM,CAAC,MAAM,wBAAwB,GAA2B;IAC5D;QACI,EAAE,EAAE,KAAK;QACT,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC;QAC1C,MAAM,EAAE;YACJ,SAAS;YACT,MAAM;YACN,WAAW;YACX,OAAO;YACP,SAAS;YACT,YAAY;YACZ,WAAW;SACd;KACJ;IAED;QACI,EAAE,EAAE,WAAW;QACf,QAAQ,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC;QAChD,MAAM,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC;KACjD;IAED;QACI,EAAE,EAAE,cAAc;QAClB,QAAQ,EAAE,CAAC,OAAO,CAAC;QACnB,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,CAAC;KAC7D;IAED;QACI,EAAE,EAAE,eAAe;QACnB,QAAQ,EAAE,CAAC,QAAQ,CAAC;QACpB,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;KACpC;IAED;QACI,EAAE,EAAE,YAAY;QAChB,QAAQ,EAAE,CAAC,WAAW,CAAC;QACvB,MAAM,EAAE;YACJ,WAAW;YACX,WAAW;YACX,WAAW;YACX,iBAAiB;YACjB,yBAAyB;YACzB,sBAAsB;YACtB,uBAAuB;YACvB,oBAAoB;SACvB;KACJ;IAED;QACI,EAAE,EAAE,aAAa;QACjB,QAAQ,EAAE,EAAE;QACZ,MAAM,EAAE;YACJ,qBAAqB;YACrB,aAAa;YACb,SAAS;YACT,UAAU;YACV,cAAc;YACd,QAAQ;SACX;KACJ;CACJ,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { AppApi } from "./api/AppApi.js";
|
|
2
|
+
import { DeviceApi } from "./api/DeviceApi.js";
|
|
3
|
+
import { DreoDevice } from "./DreoDevice.js";
|
|
4
|
+
import type { DreoLogger } from "./DreoLogger.js";
|
|
5
|
+
import type { FamilyTree } from "./models/FamilyTree.js";
|
|
6
|
+
import type { ResolvedDevice } from "./models/ResolvedDevice.js";
|
|
7
|
+
import { DreoWebSocketClient } from "./websocket/DreoWebSocketClient.js";
|
|
8
|
+
import type { DreoWebSocketReply } from "./websocket/DreoWebSocketReply.js";
|
|
9
|
+
export interface DreoClientLoginOptions {
|
|
10
|
+
email: string;
|
|
11
|
+
password: string;
|
|
12
|
+
region?: string;
|
|
13
|
+
logger?: DreoLogger;
|
|
14
|
+
}
|
|
15
|
+
export interface DreoDeviceStateChangeEvent {
|
|
16
|
+
device: DreoDevice;
|
|
17
|
+
report: DreoWebSocketReply;
|
|
18
|
+
reported: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export type DreoDeviceStateChangeHandler = (event: DreoDeviceStateChangeEvent) => void;
|
|
21
|
+
export type DreoDeviceStateChangeUnsubscribe = () => void;
|
|
22
|
+
export interface DreoDeviceDiscoveredEvent {
|
|
23
|
+
device: DreoDevice;
|
|
24
|
+
resolvedDevice: ResolvedDevice;
|
|
25
|
+
}
|
|
26
|
+
export type DreoDeviceDiscoveredHandler = (event: DreoDeviceDiscoveredEvent) => void;
|
|
27
|
+
export type DreoDeviceDiscoveredUnsubscribe = () => void;
|
|
28
|
+
export declare class DreoClient {
|
|
29
|
+
private readonly appApi;
|
|
30
|
+
private readonly deviceApi;
|
|
31
|
+
private readonly logger?;
|
|
32
|
+
private readonly devices;
|
|
33
|
+
private readonly resolvedDevices;
|
|
34
|
+
private readonly resolvedDeviceResolver;
|
|
35
|
+
private session?;
|
|
36
|
+
private websocket?;
|
|
37
|
+
private unsubscribeWebSocketReport?;
|
|
38
|
+
private readonly deviceStateChangeHandlers;
|
|
39
|
+
private readonly deviceDiscoveredHandlers;
|
|
40
|
+
private deviceSyncPromise?;
|
|
41
|
+
constructor(appApi: AppApi, deviceApi: DeviceApi, logger?: DreoLogger | undefined);
|
|
42
|
+
static login(options: DreoClientLoginOptions): Promise<DreoClient>;
|
|
43
|
+
getFamilyTree(): Promise<FamilyTree>;
|
|
44
|
+
sync(websocket: DreoWebSocketClient): Promise<void>;
|
|
45
|
+
getResolvedDevices(): Promise<readonly ResolvedDevice[]>;
|
|
46
|
+
getResolvedDevice(serialNumber: string): ResolvedDevice | undefined;
|
|
47
|
+
getResolvedDeviceByName(name: string): ResolvedDevice | undefined;
|
|
48
|
+
getDeviceState(serialNumber: string): Promise<import("./index.js").DeviceStateResponse>;
|
|
49
|
+
onDeviceStateChanged(handler: DreoDeviceStateChangeHandler): DreoDeviceStateChangeUnsubscribe;
|
|
50
|
+
onDeviceDiscovered(handler: DreoDeviceDiscoveredHandler): DreoDeviceDiscoveredUnsubscribe;
|
|
51
|
+
disconnect(): void;
|
|
52
|
+
registerDevice(device: DreoDevice): void;
|
|
53
|
+
getDevice(serialNumber: string): DreoDevice | undefined;
|
|
54
|
+
getDeviceByName(name: string): DreoDevice | undefined;
|
|
55
|
+
getDevices(): readonly DreoDevice[];
|
|
56
|
+
private createInitialRawState;
|
|
57
|
+
private createStateConstraintMap;
|
|
58
|
+
private applyWebSocketReport;
|
|
59
|
+
private ensureDeviceRegistered;
|
|
60
|
+
private syncNewDevices;
|
|
61
|
+
private emitDeviceStateChanged;
|
|
62
|
+
private emitDeviceDiscovered;
|
|
63
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { AppApi } from "./api/AppApi.js";
|
|
2
|
+
import { AuthenticatedHttpClient } from "./api/AuthenticatedHttpClient.js";
|
|
3
|
+
import { DeviceApi } from "./api/DeviceApi.js";
|
|
4
|
+
import { HttpClient } from "./api/HttpClient.js";
|
|
5
|
+
import { DreoSession } from "./DreoSession.js";
|
|
6
|
+
import { DreoDevice } from "./DreoDevice.js";
|
|
7
|
+
import { FamilyTreeMapper } from "./mappers/FamilyTreeMapper.js";
|
|
8
|
+
import { ResolvedDeviceResolver } from "./ResolvedDeviceResolver.js";
|
|
9
|
+
import { DreoWebSocketClient, } from "./websocket/DreoWebSocketClient.js";
|
|
10
|
+
export class DreoClient {
|
|
11
|
+
appApi;
|
|
12
|
+
deviceApi;
|
|
13
|
+
logger;
|
|
14
|
+
devices = new Map();
|
|
15
|
+
resolvedDevices = new Map();
|
|
16
|
+
resolvedDeviceResolver = new ResolvedDeviceResolver();
|
|
17
|
+
session;
|
|
18
|
+
websocket;
|
|
19
|
+
unsubscribeWebSocketReport;
|
|
20
|
+
deviceStateChangeHandlers = new Set();
|
|
21
|
+
deviceDiscoveredHandlers = new Set();
|
|
22
|
+
deviceSyncPromise;
|
|
23
|
+
constructor(appApi, deviceApi, logger) {
|
|
24
|
+
this.appApi = appApi;
|
|
25
|
+
this.deviceApi = deviceApi;
|
|
26
|
+
this.logger = logger;
|
|
27
|
+
}
|
|
28
|
+
static async login(options) {
|
|
29
|
+
const session = new DreoSession({
|
|
30
|
+
email: options.email,
|
|
31
|
+
password: options.password,
|
|
32
|
+
region: options.region ?? "EU",
|
|
33
|
+
logger: options.logger,
|
|
34
|
+
});
|
|
35
|
+
const tokens = await session.login();
|
|
36
|
+
const http = new HttpClient({
|
|
37
|
+
baseUrl: `https://app-api-${tokens.region}.dreo-tech.com`,
|
|
38
|
+
});
|
|
39
|
+
const authenticatedHttp = new AuthenticatedHttpClient(http, session, options.logger);
|
|
40
|
+
const appApi = new AppApi(authenticatedHttp);
|
|
41
|
+
const deviceApi = new DeviceApi(authenticatedHttp);
|
|
42
|
+
const websocket = new DreoWebSocketClient({
|
|
43
|
+
session,
|
|
44
|
+
logger: options.logger,
|
|
45
|
+
});
|
|
46
|
+
session.addObserver(websocket);
|
|
47
|
+
const client = new DreoClient(appApi, deviceApi, options.logger);
|
|
48
|
+
client.session = session;
|
|
49
|
+
client.websocket = websocket;
|
|
50
|
+
await client.sync(websocket);
|
|
51
|
+
await websocket.connect();
|
|
52
|
+
return client;
|
|
53
|
+
}
|
|
54
|
+
async getFamilyTree() {
|
|
55
|
+
const response = await this.appApi.getFamilyRoomDevices();
|
|
56
|
+
return new FamilyTreeMapper().map(response);
|
|
57
|
+
}
|
|
58
|
+
async sync(websocket) {
|
|
59
|
+
const tree = await this.getFamilyTree();
|
|
60
|
+
this.devices.clear();
|
|
61
|
+
this.resolvedDevices.clear();
|
|
62
|
+
for (const device of tree.devices) {
|
|
63
|
+
const state = await this.deviceApi.state(device.sn);
|
|
64
|
+
const resolvedDevice = this.resolvedDeviceResolver.resolve(device, state);
|
|
65
|
+
this.resolvedDevices.set(device.sn, resolvedDevice);
|
|
66
|
+
this.registerDevice(new DreoDevice(device, websocket, this.createStateConstraintMap(resolvedDevice), this.createInitialRawState(resolvedDevice)));
|
|
67
|
+
}
|
|
68
|
+
this.unsubscribeWebSocketReport?.();
|
|
69
|
+
this.unsubscribeWebSocketReport = websocket.onReport((report) => {
|
|
70
|
+
void this.applyWebSocketReport(report).catch((error) => {
|
|
71
|
+
this.logger?.warn?.(`Failed to process DREO WebSocket report: ${error instanceof Error
|
|
72
|
+
? error.message
|
|
73
|
+
: String(error)}`);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async getResolvedDevices() {
|
|
78
|
+
const tree = await this.getFamilyTree();
|
|
79
|
+
this.resolvedDevices.clear();
|
|
80
|
+
for (const device of tree.devices) {
|
|
81
|
+
const state = await this.deviceApi.state(device.sn);
|
|
82
|
+
const resolvedDevice = this.resolvedDeviceResolver.resolve(device, state);
|
|
83
|
+
this.resolvedDevices.set(device.sn, resolvedDevice);
|
|
84
|
+
}
|
|
85
|
+
return Array.from(this.resolvedDevices.values());
|
|
86
|
+
}
|
|
87
|
+
getResolvedDevice(serialNumber) {
|
|
88
|
+
return this.resolvedDevices.get(serialNumber);
|
|
89
|
+
}
|
|
90
|
+
getResolvedDeviceByName(name) {
|
|
91
|
+
return Array.from(this.resolvedDevices.values()).find((resolvedDevice) => resolvedDevice.device.deviceName === name);
|
|
92
|
+
}
|
|
93
|
+
async getDeviceState(serialNumber) {
|
|
94
|
+
return this.deviceApi.state(serialNumber);
|
|
95
|
+
}
|
|
96
|
+
onDeviceStateChanged(handler) {
|
|
97
|
+
this.deviceStateChangeHandlers.add(handler);
|
|
98
|
+
return () => {
|
|
99
|
+
this.deviceStateChangeHandlers.delete(handler);
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
onDeviceDiscovered(handler) {
|
|
103
|
+
this.deviceDiscoveredHandlers.add(handler);
|
|
104
|
+
return () => {
|
|
105
|
+
this.deviceDiscoveredHandlers.delete(handler);
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
disconnect() {
|
|
109
|
+
this.unsubscribeWebSocketReport?.();
|
|
110
|
+
this.unsubscribeWebSocketReport = undefined;
|
|
111
|
+
this.deviceStateChangeHandlers.clear();
|
|
112
|
+
this.deviceDiscoveredHandlers.clear();
|
|
113
|
+
this.deviceSyncPromise = undefined;
|
|
114
|
+
if (this.session && this.websocket) {
|
|
115
|
+
this.session.removeObserver(this.websocket);
|
|
116
|
+
}
|
|
117
|
+
this.websocket?.disconnect();
|
|
118
|
+
this.websocket = undefined;
|
|
119
|
+
this.session = undefined;
|
|
120
|
+
}
|
|
121
|
+
registerDevice(device) {
|
|
122
|
+
this.devices.set(device.sn, device);
|
|
123
|
+
}
|
|
124
|
+
getDevice(serialNumber) {
|
|
125
|
+
return this.devices.get(serialNumber);
|
|
126
|
+
}
|
|
127
|
+
getDeviceByName(name) {
|
|
128
|
+
return this.getDevices().find((device) => device.name === name);
|
|
129
|
+
}
|
|
130
|
+
getDevices() {
|
|
131
|
+
return Array.from(this.devices.values());
|
|
132
|
+
}
|
|
133
|
+
createInitialRawState(resolvedDevice) {
|
|
134
|
+
const initialRawState = {};
|
|
135
|
+
for (const [key, mixedState] of Object.entries(resolvedDevice.state.data.mixed)) {
|
|
136
|
+
initialRawState[key] = mixedState.state;
|
|
137
|
+
}
|
|
138
|
+
return initialRawState;
|
|
139
|
+
}
|
|
140
|
+
createStateConstraintMap(resolvedDevice) {
|
|
141
|
+
const constraints = new Map();
|
|
142
|
+
for (const state of resolvedDevice.states) {
|
|
143
|
+
if (state.constraint) {
|
|
144
|
+
constraints.set(state.key, state.constraint);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return constraints;
|
|
148
|
+
}
|
|
149
|
+
async applyWebSocketReport(report) {
|
|
150
|
+
if (!report.reported) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
await this.ensureDeviceRegistered(report.devicesn);
|
|
154
|
+
const device = this.getDevice(report.devicesn);
|
|
155
|
+
if (!device) {
|
|
156
|
+
this.logger?.warn?.(`Received DREO WebSocket report for unknown device ${report.devicesn}.`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
device.applyReport(report.reported);
|
|
160
|
+
this.emitDeviceStateChanged({
|
|
161
|
+
device,
|
|
162
|
+
report,
|
|
163
|
+
reported: report.reported,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async ensureDeviceRegistered(serialNumber) {
|
|
167
|
+
if (this.getDevice(serialNumber)) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (!this.deviceSyncPromise) {
|
|
171
|
+
this.deviceSyncPromise = this.syncNewDevices().finally(() => {
|
|
172
|
+
this.deviceSyncPromise = undefined;
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
await this.deviceSyncPromise;
|
|
176
|
+
}
|
|
177
|
+
async syncNewDevices() {
|
|
178
|
+
const websocket = this.websocket;
|
|
179
|
+
if (!websocket) {
|
|
180
|
+
throw new Error("Cannot synchronize DREO devices without a WebSocket client.");
|
|
181
|
+
}
|
|
182
|
+
const tree = await this.getFamilyTree();
|
|
183
|
+
for (const deviceInfo of tree.devices) {
|
|
184
|
+
if (this.getDevice(deviceInfo.sn)) {
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
const state = await this.deviceApi.state(deviceInfo.sn);
|
|
188
|
+
const resolvedDevice = this.resolvedDeviceResolver.resolve(deviceInfo, state);
|
|
189
|
+
const device = new DreoDevice(deviceInfo, websocket, this.createStateConstraintMap(resolvedDevice), this.createInitialRawState(resolvedDevice));
|
|
190
|
+
this.resolvedDevices.set(deviceInfo.sn, resolvedDevice);
|
|
191
|
+
this.registerDevice(device);
|
|
192
|
+
this.logger?.info?.(`Discovered new DREO device: ${deviceInfo.deviceName} (${deviceInfo.model}, ${deviceInfo.sn})`);
|
|
193
|
+
this.emitDeviceDiscovered({
|
|
194
|
+
device,
|
|
195
|
+
resolvedDevice,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
emitDeviceStateChanged(event) {
|
|
200
|
+
for (const handler of this.deviceStateChangeHandlers) {
|
|
201
|
+
handler(event);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
emitDeviceDiscovered(event) {
|
|
205
|
+
for (const handler of this.deviceDiscoveredHandlers) {
|
|
206
|
+
handler(event);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=DreoClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DreoClient.js","sourceRoot":"","sources":["../src/DreoClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { Device } from "./models/Device.js";
|
|
2
|
+
import type { DreoDeviceState } from "./models/DreoDeviceState.js";
|
|
3
|
+
import type { StateConstraint } from "./models/StateConstraint.js";
|
|
4
|
+
import type { DreoWebSocketClient } from "./websocket/DreoWebSocketClient.js";
|
|
5
|
+
export declare class DreoDevice {
|
|
6
|
+
private readonly device;
|
|
7
|
+
private readonly websocket;
|
|
8
|
+
private readonly stateConstraints;
|
|
9
|
+
private currentState;
|
|
10
|
+
private readonly stateMapper;
|
|
11
|
+
private readonly stateConstraintValidator;
|
|
12
|
+
constructor(device: Device, websocket: DreoWebSocketClient, stateConstraints?: ReadonlyMap<string, StateConstraint>, initialRawState?: Record<string, unknown>);
|
|
13
|
+
get sn(): string;
|
|
14
|
+
get name(): string;
|
|
15
|
+
get model(): string;
|
|
16
|
+
get state(): DreoDeviceState;
|
|
17
|
+
/**
|
|
18
|
+
* @internal
|
|
19
|
+
*
|
|
20
|
+
* Applies an incoming DREO WebSocket report to the local state cache.
|
|
21
|
+
* This method is used internally by DreoClient.
|
|
22
|
+
*/
|
|
23
|
+
applyReport(reported: Record<string, unknown>): void;
|
|
24
|
+
setPower(enabled: boolean): Promise<void>;
|
|
25
|
+
setFan(enabled: boolean): Promise<void>;
|
|
26
|
+
setMainLight(enabled: boolean): Promise<void>;
|
|
27
|
+
setAtmosphereLight(enabled: boolean): Promise<void>;
|
|
28
|
+
setWindLevel(level: number): Promise<void>;
|
|
29
|
+
setBrightness(value: number): Promise<void>;
|
|
30
|
+
setColorTemperature(value: number): Promise<void>;
|
|
31
|
+
setRgbPreset(value: number): Promise<void>;
|
|
32
|
+
setAtmosphereBrightness(value: number): Promise<void>;
|
|
33
|
+
setMute(value: boolean): Promise<void>;
|
|
34
|
+
private applyStateChange;
|
|
35
|
+
private setStates;
|
|
36
|
+
private validateStateParams;
|
|
37
|
+
private readBoolean;
|
|
38
|
+
private readNumber;
|
|
39
|
+
private readString;
|
|
40
|
+
private readUnknown;
|
|
41
|
+
}
|