@digital-alchemy/hass 24.9.2 → 24.9.4
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/README.md +4 -1
- package/dist/dynamic.d.ts +1 -1
- package/dist/dynamic.js +7 -2
- package/dist/dynamic.js.map +1 -1
- package/dist/extensions/area.extension.d.ts +2 -12
- package/dist/extensions/area.extension.js +20 -26
- package/dist/extensions/area.extension.js.map +1 -1
- package/dist/extensions/backup.extension.d.ts +2 -7
- package/dist/extensions/backup.extension.js +5 -8
- package/dist/extensions/backup.extension.js.map +1 -1
- package/dist/extensions/call-proxy.extension.d.ts +1 -1
- package/dist/extensions/call-proxy.extension.js +11 -29
- package/dist/extensions/call-proxy.extension.js.map +1 -1
- package/dist/extensions/config.extension.d.ts +2 -6
- package/dist/extensions/config.extension.js +21 -25
- package/dist/extensions/config.extension.js.map +1 -1
- package/dist/extensions/conversation.extension.d.ts +2 -6
- package/dist/extensions/conversation.extension.js +5 -8
- package/dist/extensions/conversation.extension.js.map +1 -1
- package/dist/extensions/device.extension.d.ts +2 -5
- package/dist/extensions/device.extension.js +16 -22
- package/dist/extensions/device.extension.js.map +1 -1
- package/dist/extensions/entity.extension.d.ts +2 -61
- package/dist/extensions/entity.extension.js +42 -83
- package/dist/extensions/entity.extension.js.map +1 -1
- package/dist/extensions/events.extension.d.ts +3 -11
- package/dist/extensions/events.extension.js +8 -11
- package/dist/extensions/events.extension.js.map +1 -1
- package/dist/extensions/fetch-api.extension.d.ts +12 -4
- package/dist/extensions/fetch-api.extension.js +23 -35
- package/dist/extensions/fetch-api.extension.js.map +1 -1
- package/dist/extensions/floor.extension.d.ts +2 -9
- package/dist/extensions/floor.extension.js +17 -23
- package/dist/extensions/floor.extension.js.map +1 -1
- package/dist/extensions/id-by.extension.js +15 -20
- package/dist/extensions/id-by.extension.js.map +1 -1
- package/dist/extensions/index.d.ts +1 -0
- package/dist/extensions/index.js +16 -18
- package/dist/extensions/index.js.map +1 -1
- package/dist/extensions/internal.extension.d.ts +18 -0
- package/dist/extensions/internal.extension.js +102 -0
- package/dist/extensions/internal.extension.js.map +1 -0
- package/dist/extensions/label.extension.d.ts +2 -9
- package/dist/extensions/label.extension.js +17 -23
- package/dist/extensions/label.extension.js.map +1 -1
- package/dist/extensions/reference.extension.d.ts +2 -12
- package/dist/extensions/reference.extension.js +19 -25
- package/dist/extensions/reference.extension.js.map +1 -1
- package/dist/extensions/registry.extension.d.ts +2 -7
- package/dist/extensions/registry.extension.js +1 -4
- package/dist/extensions/registry.extension.js.map +1 -1
- package/dist/extensions/websocket-api.extension.d.ts +3 -78
- package/dist/extensions/websocket-api.extension.js +82 -165
- package/dist/extensions/websocket-api.extension.js.map +1 -1
- package/dist/extensions/zone.extension.d.ts +2 -7
- package/dist/extensions/zone.extension.js +15 -21
- package/dist/extensions/zone.extension.js.map +1 -1
- package/dist/hass.module.d.ts +47 -36
- package/dist/hass.module.js +70 -70
- package/dist/hass.module.js.map +1 -1
- package/dist/helpers/backup.helper.js +1 -2
- package/dist/helpers/constants.helper.js +15 -18
- package/dist/helpers/constants.helper.js.map +1 -1
- package/dist/helpers/device.helper.js +2 -5
- package/dist/helpers/device.helper.js.map +1 -1
- package/dist/helpers/entity-state.helper.d.ts +3 -8
- package/dist/helpers/entity-state.helper.js +1 -8
- package/dist/helpers/entity-state.helper.js.map +1 -1
- package/dist/helpers/features.helper.js +79 -85
- package/dist/helpers/features.helper.js.map +1 -1
- package/dist/helpers/fetch/calendar.js +1 -2
- package/dist/helpers/fetch/configuration.js +2 -5
- package/dist/helpers/fetch/configuration.js.map +1 -1
- package/dist/helpers/fetch/index.js +5 -8
- package/dist/helpers/fetch/index.js.map +1 -1
- package/dist/helpers/fetch/server-log.js +1 -2
- package/dist/helpers/fetch/server-log.js.map +1 -1
- package/dist/helpers/fetch/service-list.js +1 -2
- package/dist/helpers/fetch/weather-forecasts.js +1 -2
- package/dist/helpers/fetch/weather-forecasts.js.map +1 -1
- package/dist/helpers/fetch.helper.d.ts +162 -0
- package/dist/helpers/fetch.helper.js +161 -0
- package/dist/helpers/fetch.helper.js.map +1 -0
- package/dist/helpers/id-by.helper.js +1 -2
- package/dist/helpers/index.d.ts +2 -1
- package/dist/helpers/index.js +13 -15
- package/dist/helpers/index.js.map +1 -1
- package/dist/helpers/interfaces.helper.d.ts +228 -0
- package/dist/helpers/interfaces.helper.js +10 -0
- package/dist/helpers/interfaces.helper.js.map +1 -0
- package/dist/helpers/manifest.helper.d.ts +0 -1
- package/dist/helpers/manifest.helper.js +0 -1
- package/dist/helpers/notify.helper.d.ts +11 -3
- package/dist/helpers/notify.helper.js +1 -2
- package/dist/helpers/registry.js +7 -10
- package/dist/helpers/registry.js.map +1 -1
- package/dist/helpers/utility.helper.d.ts +6 -1
- package/dist/helpers/utility.helper.js +9 -13
- package/dist/helpers/utility.helper.js.map +1 -1
- package/dist/helpers/websocket.helper.d.ts +1 -2
- package/dist/helpers/websocket.helper.js +1 -2
- package/dist/index.js +5 -8
- package/dist/index.js.map +1 -1
- package/dist/mock_assistant/extensions/area.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/area.extension.js +51 -0
- package/dist/mock_assistant/extensions/area.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/config.extension.d.ts +14 -0
- package/dist/mock_assistant/extensions/config.extension.js +29 -0
- package/dist/mock_assistant/extensions/config.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/device.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/device.extension.js +33 -0
- package/dist/mock_assistant/extensions/device.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/entity-registry.extension.d.ts +13 -0
- package/dist/mock_assistant/extensions/entity-registry.extension.js +28 -0
- package/dist/mock_assistant/extensions/entity-registry.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/entity.extension.d.ts +30 -0
- package/dist/mock_assistant/extensions/entity.extension.js +77 -0
- package/dist/mock_assistant/extensions/entity.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/events.extension.d.ts +1 -1
- package/dist/mock_assistant/extensions/events.extension.js +3 -6
- package/dist/mock_assistant/extensions/events.extension.js.map +1 -1
- package/dist/mock_assistant/extensions/fetch.extension.d.ts +1 -0
- package/dist/mock_assistant/extensions/fetch.extension.js +4 -0
- package/dist/mock_assistant/extensions/fetch.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/fixtures.extension.d.ts +1 -1
- package/dist/mock_assistant/extensions/fixtures.extension.js +29 -33
- package/dist/mock_assistant/extensions/fixtures.extension.js.map +1 -1
- package/dist/mock_assistant/extensions/floor.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/floor.extension.js +51 -0
- package/dist/mock_assistant/extensions/floor.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/index.d.ts +10 -0
- package/dist/mock_assistant/extensions/index.js +12 -5
- package/dist/mock_assistant/extensions/index.js.map +1 -1
- package/dist/mock_assistant/extensions/label.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/label.extension.js +51 -0
- package/dist/mock_assistant/extensions/label.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/services.extension.d.ts +12 -0
- package/dist/mock_assistant/extensions/services.extension.js +20 -0
- package/dist/mock_assistant/extensions/services.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/websocket-api.extension.d.ts +15 -0
- package/dist/mock_assistant/extensions/websocket-api.extension.js +68 -0
- package/dist/mock_assistant/extensions/websocket-api.extension.js.map +1 -0
- package/dist/mock_assistant/extensions/zone.extension.d.ts +8 -0
- package/dist/mock_assistant/extensions/zone.extension.js +51 -0
- package/dist/mock_assistant/extensions/zone.extension.js.map +1 -0
- package/dist/mock_assistant/helpers/fixtures.js +1 -2
- package/dist/mock_assistant/helpers/index.d.ts +0 -1
- package/dist/mock_assistant/helpers/index.js +1 -5
- package/dist/mock_assistant/helpers/index.js.map +1 -1
- package/dist/mock_assistant/index.js +3 -6
- package/dist/mock_assistant/index.js.map +1 -1
- package/dist/mock_assistant/main.js +11 -15
- package/dist/mock_assistant/main.js.map +1 -1
- package/dist/mock_assistant/mock-assistant.module.d.ts +156 -3
- package/dist/mock_assistant/mock-assistant.module.js +56 -11
- package/dist/mock_assistant/mock-assistant.module.js.map +1 -1
- package/dist/quickboot.module.js +5 -8
- package/dist/quickboot.module.js.map +1 -1
- package/dist/testing/area.spec.js +106 -194
- package/dist/testing/area.spec.js.map +1 -1
- package/dist/testing/backup.spec.js +97 -139
- package/dist/testing/backup.spec.js.map +1 -1
- package/dist/testing/config.spec.js +79 -153
- package/dist/testing/config.spec.js.map +1 -1
- package/dist/testing/device.spec.js +35 -69
- package/dist/testing/device.spec.js.map +1 -1
- package/dist/testing/entity.spec.js +94 -149
- package/dist/testing/entity.spec.js.map +1 -1
- package/dist/testing/events.spec.js +33 -57
- package/dist/testing/events.spec.js.map +1 -1
- package/dist/testing/fetch-api.spec.js +242 -427
- package/dist/testing/fetch-api.spec.js.map +1 -1
- package/dist/testing/fixtures.spec.d.ts +1 -0
- package/dist/testing/fixtures.spec.js +150 -0
- package/dist/testing/fixtures.spec.js.map +1 -0
- package/dist/testing/floor.spec.js +106 -194
- package/dist/testing/floor.spec.js.map +1 -1
- package/dist/testing/id-by.spec.js +68 -107
- package/dist/testing/id-by.spec.js.map +1 -1
- package/dist/testing/label.spec.js +106 -194
- package/dist/testing/label.spec.js.map +1 -1
- package/dist/testing/ref-by.spec.js +155 -219
- package/dist/testing/ref-by.spec.js.map +1 -1
- package/dist/testing/websocket.spec.d.ts +1 -8
- package/dist/testing/websocket.spec.js +35 -50
- package/dist/testing/websocket.spec.js.map +1 -1
- package/dist/testing/workflow.spec.js +82 -81
- package/dist/testing/workflow.spec.js.map +1 -1
- package/dist/testing/zone.spec.js +61 -113
- package/dist/testing/zone.spec.js.map +1 -1
- package/package.json +57 -41
- package/dist/helpers/metrics.helper.d.ts +0 -29
- package/dist/helpers/metrics.helper.js +0 -62
- package/dist/helpers/metrics.helper.js.map +0 -1
- package/dist/mock_assistant/helpers/utils.d.ts +0 -4
- package/dist/mock_assistant/helpers/utils.js +0 -57
- package/dist/mock_assistant/helpers/utils.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
[](https://github.com/Digital-Alchemy-TS/hass)
|
|
2
|
+

|
|
2
3
|
|
|
4
|
+
[](https://codecov.io/gh/Digital-Alchemy-TS/hass)
|
|
5
|
+
[](https://www.npmjs.com/package/@digital-alchemy/hass)
|
|
3
6
|
---
|
|
4
7
|
|
|
5
8
|
# 🏠 Welcome to `@digital-alchemy/hass`!
|
package/dist/dynamic.d.ts
CHANGED
package/dist/dynamic.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-magic-numbers */
|
|
2
|
+
/* eslint-disable sonarjs/redundant-type-aliases */
|
|
3
|
+
/* eslint-disable @cspell/spellchecker */
|
|
4
|
+
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
5
|
+
/* eslint-disable sonarjs/no-redundant-type-constituents */
|
|
6
|
+
/* eslint-disable @typescript-eslint/no-empty-object-type */
|
|
7
|
+
export {};
|
|
3
8
|
//# sourceMappingURL=dynamic.js.map
|
package/dist/dynamic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../src/dynamic.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,mDAAmD;AACnD,yCAAyC;AACzC,sDAAsD;AACtD,2DAA2D;AAC3D,4DAA4D"}
|
|
@@ -1,13 +1,3 @@
|
|
|
1
1
|
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export declare function Area({ hass, context, config, logger, event, lifecycle, }: TServiceParams): {
|
|
5
|
-
apply: (area: TAreaId, entities: ANY_ENTITY[]) => Promise<{
|
|
6
|
-
updated: ANY_ENTITY[];
|
|
7
|
-
}>;
|
|
8
|
-
create: (details: AreaCreate) => Promise<void>;
|
|
9
|
-
current: AreaDetails[];
|
|
10
|
-
delete: (area_id: TAreaId) => Promise<void>;
|
|
11
|
-
list: () => Promise<AreaDetails[]>;
|
|
12
|
-
update: (details: AreaDetails) => Promise<void>;
|
|
13
|
-
};
|
|
2
|
+
import { HassAreaService } from "../helpers";
|
|
3
|
+
export declare function Area({ hass, context, config, logger, event, lifecycle, }: TServiceParams): HassAreaService;
|
|
@@ -1,29 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const core_1 = require("@digital-alchemy/core");
|
|
5
|
-
const helpers_1 = require("../helpers");
|
|
6
|
-
function Area({ hass, context, config, logger, event, lifecycle, }) {
|
|
1
|
+
import { debounce, eachSeries, InternalError } from "@digital-alchemy/core";
|
|
2
|
+
import { AREA_REGISTRY_UPDATED, EARLY_ON_READY, ENTITY_REGISTRY_UPDATED, } from "../helpers";
|
|
3
|
+
export function Area({ hass, context, config, logger, event, lifecycle, }) {
|
|
7
4
|
hass.socket.onConnect(async () => {
|
|
8
|
-
if (!config.hass.AUTO_CONNECT_SOCKET || !config.hass.MANAGE_REGISTRY) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
5
|
let loading = new Promise(async (done) => {
|
|
12
6
|
hass.area.current = await hass.area.list();
|
|
13
7
|
loading = undefined;
|
|
14
8
|
done();
|
|
15
9
|
});
|
|
16
|
-
lifecycle.onReady(async () => loading && (await loading),
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
10
|
+
lifecycle.onReady(async () => loading && (await loading), EARLY_ON_READY);
|
|
11
|
+
hass.socket.subscribe({
|
|
12
|
+
context,
|
|
13
|
+
event_type: "area_registry_updated",
|
|
14
|
+
async exec() {
|
|
15
|
+
await debounce(AREA_REGISTRY_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
|
|
16
|
+
hass.area.current = await hass.area.list();
|
|
17
|
+
logger.debug(`area registry updated`);
|
|
18
|
+
event.emit(AREA_REGISTRY_UPDATED);
|
|
19
|
+
},
|
|
20
|
+
});
|
|
27
21
|
});
|
|
28
22
|
async function list() {
|
|
29
23
|
return await hass.socket.sendMessage({
|
|
@@ -32,7 +26,7 @@ function Area({ hass, context, config, logger, event, lifecycle, }) {
|
|
|
32
26
|
}
|
|
33
27
|
async function deleteArea(area_id) {
|
|
34
28
|
return await new Promise(async (done) => {
|
|
35
|
-
event.once(
|
|
29
|
+
event.once(AREA_REGISTRY_UPDATED, done);
|
|
36
30
|
await hass.socket.sendMessage({
|
|
37
31
|
area_id,
|
|
38
32
|
type: "config/area_registry/delete",
|
|
@@ -41,7 +35,7 @@ function Area({ hass, context, config, logger, event, lifecycle, }) {
|
|
|
41
35
|
}
|
|
42
36
|
async function create(details) {
|
|
43
37
|
return await new Promise(async (done) => {
|
|
44
|
-
event.once(
|
|
38
|
+
event.once(AREA_REGISTRY_UPDATED, done);
|
|
45
39
|
await hass.socket.sendMessage({
|
|
46
40
|
floor_id: "",
|
|
47
41
|
icon: "",
|
|
@@ -54,16 +48,16 @@ function Area({ hass, context, config, logger, event, lifecycle, }) {
|
|
|
54
48
|
}
|
|
55
49
|
async function apply(area, entities) {
|
|
56
50
|
const out = { updated: [] };
|
|
57
|
-
await
|
|
51
|
+
await eachSeries(entities, async (entity) => {
|
|
58
52
|
const details = hass.entity.registry.current.find(item => item.entity_id === entity);
|
|
59
53
|
if (!details) {
|
|
60
|
-
throw new
|
|
54
|
+
throw new InternalError(context, "UNKNOWN_ENTITY", `Cannot find ${entity} in entity registry`);
|
|
61
55
|
}
|
|
62
56
|
if (details.area_id === area) {
|
|
63
57
|
return;
|
|
64
58
|
}
|
|
65
59
|
await new Promise(async (done) => {
|
|
66
|
-
event.once(
|
|
60
|
+
event.once(ENTITY_REGISTRY_UPDATED, done);
|
|
67
61
|
logger.trace({ area, entity }, `setting area`);
|
|
68
62
|
out.updated.push(entity);
|
|
69
63
|
await hass.socket.sendMessage({
|
|
@@ -77,7 +71,7 @@ function Area({ hass, context, config, logger, event, lifecycle, }) {
|
|
|
77
71
|
}
|
|
78
72
|
async function update(details) {
|
|
79
73
|
return await new Promise(async (done) => {
|
|
80
|
-
event.once(
|
|
74
|
+
event.once(AREA_REGISTRY_UPDATED, done);
|
|
81
75
|
await hass.socket.sendMessage({
|
|
82
76
|
type: "config/area_registry/update",
|
|
83
77
|
...details,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area.extension.js","sourceRoot":"","sources":["../../src/extensions/area.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"area.extension.js","sourceRoot":"","sources":["../../src/extensions/area.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAkB,MAAM,uBAAuB,CAAC;AAG5F,OAAO,EAEL,qBAAqB,EAGrB,cAAc,EACd,uBAAuB,GAExB,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,IAAI,CAAC,EACnB,IAAI,EACJ,OAAO,EACP,MAAM,EACN,MAAM,EACN,KAAK,EACL,SAAS,GACM;IACf,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QAC/B,IAAI,OAAO,GAAG,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;YAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3C,OAAO,GAAG,SAAS,CAAC;YACpB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;QAE1E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACpB,OAAO;YACP,UAAU,EAAE,uBAAuB;YACnC,KAAK,CAAC,IAAI;gBACR,MAAM,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACrE,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC3C,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACpC,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,IAAI;QACjB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAgB;YAClD,IAAI,EAAE,2BAA2B;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,UAAU,CAAC,OAAgB;QACxC,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;YAC1C,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5B,OAAO;gBACP,IAAI,EAAE,6BAA6B;aACpC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,OAAmB;QACvC,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;YAC1C,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5B,QAAQ,EAAE,EAAE;gBACZ,IAAI,EAAE,EAAE;gBACR,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,6BAA6B;gBACnC,GAAG,OAAO;aACX,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,KAAK,CAAC,IAAa,EAAE,QAAsB;QACxD,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,EAAkB,EAAE,CAAC;QAC5C,MAAM,UAAU,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAkB,EAAE,EAAE;YACtD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC;YACrF,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,aAAa,CACrB,OAAO,EACP,gBAAgB,EAChB,eAAe,MAAM,qBAAqB,CAC3C,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC7B,OAAO;YACT,CAAC;YACD,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;gBACnC,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC;gBAC1C,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC;gBAC/C,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzB,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC5B,OAAO,EAAE,IAAI;oBACb,SAAS,EAAE,MAAM;oBACjB,IAAI,EAAE,+BAA+B;iBACtC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,OAAoB;QACxC,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;YAC1C,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC,CAAC;YACxC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5B,IAAI,EAAE,6BAA6B;gBACnC,GAAG,OAAO;aACX,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK;QACL,MAAM;QACN,OAAO,EAAE,EAAmB;QAC5B,MAAM,EAAE,UAAU;QAClB,IAAI;QACJ,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
1
|
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
|
-
import {
|
|
3
|
-
export declare function Backup({ logger, hass, config }: TServiceParams):
|
|
4
|
-
download: (slug: string, destination: string) => Promise<void>;
|
|
5
|
-
generate: () => Promise<HomeAssistantBackup>;
|
|
6
|
-
list: () => Promise<BackupResponse>;
|
|
7
|
-
remove: (slug: string) => Promise<void>;
|
|
8
|
-
};
|
|
2
|
+
import { HassBackupService } from "../helpers";
|
|
3
|
+
export declare function Backup({ logger, hass, config }: TServiceParams): HassBackupService;
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.Backup = Backup;
|
|
4
|
-
const core_1 = require("@digital-alchemy/core");
|
|
5
|
-
function Backup({ logger, hass, config }) {
|
|
1
|
+
import { is, SECOND, sleep } from "@digital-alchemy/core";
|
|
2
|
+
export function Backup({ logger, hass, config }) {
|
|
6
3
|
async function download(slug, destination) {
|
|
7
4
|
const result = await hass.socket.sendMessage({
|
|
8
5
|
path: `/api/backup/download/${slug}`,
|
|
9
6
|
type: "auth/sign_path",
|
|
10
7
|
});
|
|
11
|
-
if (!
|
|
8
|
+
if (!is.object(result) || !("path" in result)) {
|
|
12
9
|
return;
|
|
13
10
|
}
|
|
14
11
|
await hass.fetch.download(destination, {
|
|
@@ -26,13 +23,13 @@ function Backup({ logger, hass, config }) {
|
|
|
26
23
|
hass.socket.sendMessage({ type: "backup/generate" });
|
|
27
24
|
while (current.backing_up === false) {
|
|
28
25
|
logger.debug({ name: generate }, "... waiting");
|
|
29
|
-
await
|
|
26
|
+
await sleep(config.hass.RETRY_INTERVAL * SECOND);
|
|
30
27
|
current = await hass.backup.list();
|
|
31
28
|
}
|
|
32
29
|
}
|
|
33
30
|
while (current.backing_up === true) {
|
|
34
31
|
logger.debug({ name: generate }, "... waiting");
|
|
35
|
-
await
|
|
32
|
+
await sleep(config.hass.RETRY_INTERVAL * SECOND);
|
|
36
33
|
current = await hass.backup.list();
|
|
37
34
|
}
|
|
38
35
|
logger.info({ name: generate }, `backup complete`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backup.extension.js","sourceRoot":"","sources":["../../src/extensions/backup.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backup.extension.js","sourceRoot":"","sources":["../../src/extensions/backup.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAkB,MAAM,uBAAuB,CAAC;AAS1E,MAAM,UAAU,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAkB;IAC7D,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,WAAmB;QACvD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAsB;YAChE,IAAI,EAAE,wBAAwB,IAAI,EAAE;YACpC,IAAI,EAAE,gBAAgB;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE;YACrC,GAAG,EAAE,MAAM,CAAC,IAAI;SACjB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,QAAQ;QACrB,IAAI,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,iDAAiD;QACjD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,QAAQ,EAAE,EAClB,yEAAyE,CAC1E,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,uBAAuB,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;YACrD,OAAO,OAAO,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;gBAChD,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC;gBACjD,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACrC,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,aAAa,CAAC,CAAC;YAChD,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,CAAC;YACjD,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACrC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,iBAAiB,CAAC,CAAC;QACnD,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,UAAU,IAAI;QACjB,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAiB;YACnD,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,IAAY;QAChC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9C,CAAC"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
2
|
import { iCallService } from "..";
|
|
3
|
-
export declare function CallProxy({ logger, lifecycle, internal, hass
|
|
3
|
+
export declare function CallProxy({ logger, lifecycle, internal, hass }: TServiceParams): iCallService;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.CallProxy = CallProxy;
|
|
4
|
-
const core_1 = require("@digital-alchemy/core");
|
|
5
|
-
const __1 = require("..");
|
|
6
|
-
function CallProxy({ logger, lifecycle, internal, hass, config, }) {
|
|
1
|
+
import { is } from "@digital-alchemy/core";
|
|
2
|
+
export function CallProxy({ logger, lifecycle, internal, hass }) {
|
|
7
3
|
let loaded = false;
|
|
8
4
|
const rawProxy = {};
|
|
9
5
|
/**
|
|
@@ -12,10 +8,6 @@ function CallProxy({ logger, lifecycle, internal, hass, config, }) {
|
|
|
12
8
|
* This API matches the api at the time the this function is run, which may be different from any generated typescript definitions from the past.
|
|
13
9
|
*/
|
|
14
10
|
lifecycle.onBootstrap(async () => {
|
|
15
|
-
if (!config.hass.AUTO_SCAN_CALL_PROXY) {
|
|
16
|
-
logger.debug({ name: "onBootstrap" }, `skip service populate`);
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
11
|
logger.debug({ name: "onBootstrap" }, `runtime populate service interfaces`);
|
|
20
12
|
await loadServiceList();
|
|
21
13
|
loaded = true;
|
|
@@ -32,7 +24,7 @@ function CallProxy({ logger, lifecycle, internal, hass, config, }) {
|
|
|
32
24
|
const service = `${value.domain}.${key}`;
|
|
33
25
|
return await sendMessage(service, {
|
|
34
26
|
...parameters,
|
|
35
|
-
},
|
|
27
|
+
}, is.boolean(data?.response?.optional));
|
|
36
28
|
},
|
|
37
29
|
]));
|
|
38
30
|
logger.trace({ name: loadServiceList, services }, `loaded domain [%s]`, value.domain);
|
|
@@ -46,26 +38,16 @@ function CallProxy({ logger, lifecycle, internal, hass, config, }) {
|
|
|
46
38
|
if (hass.socket.pauseMessages) {
|
|
47
39
|
return undefined;
|
|
48
40
|
}
|
|
49
|
-
const sendViaRest = (config.hass.CALL_PROXY_ALLOW_REST === "allow" &&
|
|
50
|
-
hass.socket.connectionState !== "connected") ||
|
|
51
|
-
config.hass.CALL_PROXY_ALLOW_REST === "prefer";
|
|
52
|
-
if (sendViaRest && return_response) {
|
|
53
|
-
// See https://github.com/home-assistant/core/issues/106379#issuecomment-1878548124 for the reason for this warning
|
|
54
|
-
logger.warn({ name: sendMessage }, "Services that require a return_response are not allowed to be sent via REST, they must use WebSockets");
|
|
55
|
-
}
|
|
56
|
-
if (sendViaRest) {
|
|
57
|
-
return await hass.fetch.callService(serviceName, service_data);
|
|
58
|
-
}
|
|
59
41
|
const [domain, service] = serviceName.split(".");
|
|
60
|
-
__1.CALL_PROXY_SERVICE_CALL.labels({ domain, service }).inc();
|
|
61
42
|
// User can just not await this call if they don't care about the "waitForChange"
|
|
62
|
-
|
|
63
|
-
domain,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
43
|
+
if (!return_response) {
|
|
44
|
+
return await hass.socket.sendMessage({ domain, service, service_data, type: "call_service" }, true);
|
|
45
|
+
}
|
|
46
|
+
const result = (await hass.socket.sendMessage({ domain, return_response, service, service_data, type: "call_service" }, true));
|
|
47
|
+
if (!result?.response) {
|
|
48
|
+
logger.warn({ result }, `{%s}.{%s} did not return a response`, domain, service);
|
|
49
|
+
}
|
|
50
|
+
return result?.response;
|
|
69
51
|
}
|
|
70
52
|
function buildCallProxy() {
|
|
71
53
|
return new Proxy(rawProxy, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-proxy.extension.js","sourceRoot":"","sources":["../../src/extensions/call-proxy.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"call-proxy.extension.js","sourceRoot":"","sources":["../../src/extensions/call-proxy.extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
|
-
import {
|
|
2
|
+
import { HassConfigService } from "..";
|
|
3
3
|
export declare const SERVICE_LIST_UPDATED = "SERVICE_LIST_UPDATED";
|
|
4
|
-
export declare function Configure({ logger, lifecycle, event, hass, config, internal, }: TServiceParams):
|
|
5
|
-
getServices: () => HassServiceDTO[];
|
|
6
|
-
isService: <DOMAIN extends ALL_SERVICE_DOMAINS>(domain: DOMAIN, service: string) => service is Extract<keyof iCallService[DOMAIN], string>;
|
|
7
|
-
loadServiceList: (recursion?: number) => Promise<void>;
|
|
8
|
-
};
|
|
4
|
+
export declare function Configure({ logger, lifecycle, event, hass, config, internal, }: TServiceParams): HassConfigService;
|
|
@@ -1,26 +1,22 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SERVICE_LIST_UPDATED = void 0;
|
|
4
|
-
exports.Configure = Configure;
|
|
5
1
|
/* eslint-disable @typescript-eslint/no-magic-numbers */
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
import { asyncNoop, INCREMENT, is, SECOND, sleep, START, } from "@digital-alchemy/core";
|
|
3
|
+
import { env } from "process";
|
|
4
|
+
import { PostConfigPriorities, } from "..";
|
|
9
5
|
const MAX_ATTEMPTS = 50;
|
|
10
6
|
const FAILED = 1;
|
|
11
|
-
|
|
12
|
-
function Configure({ logger, lifecycle, event, hass, config, internal, }) {
|
|
7
|
+
export const SERVICE_LIST_UPDATED = "SERVICE_LIST_UPDATED";
|
|
8
|
+
export function Configure({ logger, lifecycle, event, hass, config, internal, }) {
|
|
13
9
|
lifecycle.onPreInit(() => {
|
|
14
10
|
// HASSIO_TOKEN provided by home assistant to addons
|
|
15
11
|
// SUPERVISOR_TOKEN used as alias elsewhere
|
|
16
|
-
const token =
|
|
17
|
-
if (
|
|
12
|
+
const token = env.HASSIO_TOKEN || env.SUPERVISOR_TOKEN;
|
|
13
|
+
if (is.empty(token)) {
|
|
18
14
|
return;
|
|
19
15
|
}
|
|
20
16
|
logger.debug({ name: "onPreInit" }, `auto configuring from addon environment`);
|
|
21
17
|
internal.boilerplate.configuration.set("hass", "BASE_URL",
|
|
22
18
|
// don't go over the network
|
|
23
|
-
|
|
19
|
+
env.HASS_SERVER || "http://supervisor/core");
|
|
24
20
|
internal.boilerplate.configuration.set("hass", "TOKEN", token);
|
|
25
21
|
});
|
|
26
22
|
/**
|
|
@@ -33,40 +29,40 @@ function Configure({ logger, lifecycle, event, hass, config, internal, }) {
|
|
|
33
29
|
return;
|
|
34
30
|
}
|
|
35
31
|
internal.boilerplate.configuration.set("boilerplate", "LOG_LEVEL", "trace");
|
|
36
|
-
await
|
|
32
|
+
await asyncNoop();
|
|
37
33
|
logger.info({ name: "onPostConfig" }, `validating credentials`);
|
|
38
34
|
try {
|
|
39
35
|
const result = await hass.fetch.checkCredentials();
|
|
40
|
-
if (
|
|
36
|
+
if (is.object(result)) {
|
|
41
37
|
// * all good
|
|
42
38
|
logger.info({ name: "onPostConfig" }, result.message);
|
|
43
|
-
|
|
39
|
+
process.exit(1);
|
|
44
40
|
}
|
|
45
41
|
// * bad token
|
|
46
42
|
logger.error({ name: "onPostConfig" }, String(result));
|
|
47
|
-
|
|
43
|
+
process.exit(0);
|
|
48
44
|
}
|
|
49
45
|
catch (error) {
|
|
50
46
|
// * bad BASE_URL
|
|
51
47
|
logger.error({ error, name: "onPostConfig" }, "failed to send request");
|
|
52
|
-
|
|
48
|
+
process.exit(0);
|
|
53
49
|
}
|
|
54
|
-
},
|
|
50
|
+
}, PostConfigPriorities.VALIDATE);
|
|
55
51
|
let services;
|
|
56
|
-
async function loadServiceList(recursion =
|
|
52
|
+
async function loadServiceList(recursion = START) {
|
|
57
53
|
logger.debug({ name: loadServiceList }, `fetching service list`);
|
|
58
54
|
services = await hass.fetch.listServices();
|
|
59
|
-
if (
|
|
55
|
+
if (is.empty(services)) {
|
|
60
56
|
if (recursion > MAX_ATTEMPTS) {
|
|
61
57
|
logger.fatal({ name: loadServiceList }, `failed to load service list from Home Assistant`);
|
|
62
|
-
|
|
58
|
+
process.exit(FAILED);
|
|
63
59
|
}
|
|
64
60
|
logger.warn({ name: loadServiceList }, "failed to retrieve {service} list. Retrying {%s}/[%s]", recursion, MAX_ATTEMPTS);
|
|
65
|
-
await
|
|
66
|
-
await loadServiceList(recursion +
|
|
61
|
+
await sleep(config.hass.RETRY_INTERVAL * SECOND);
|
|
62
|
+
await loadServiceList(recursion + INCREMENT);
|
|
67
63
|
}
|
|
68
64
|
else {
|
|
69
|
-
event.emit(
|
|
65
|
+
event.emit(SERVICE_LIST_UPDATED, services);
|
|
70
66
|
checkedServices = new Map();
|
|
71
67
|
}
|
|
72
68
|
}
|
|
@@ -77,7 +73,7 @@ function Configure({ logger, lifecycle, event, hass, config, internal, }) {
|
|
|
77
73
|
if (checkedServices.has(service)) {
|
|
78
74
|
return checkedServices.get(service);
|
|
79
75
|
}
|
|
80
|
-
const exists = services.some(i => i.domain === domain && !
|
|
76
|
+
const exists = services.some(i => i.domain === domain && !is.undefined(i.services[service]));
|
|
81
77
|
checkedServices.set(service, exists);
|
|
82
78
|
return exists;
|
|
83
79
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.extension.js","sourceRoot":"","sources":["../../src/extensions/config.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.extension.js","sourceRoot":"","sources":["../../src/extensions/config.extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
1
|
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
|
-
import {
|
|
3
|
-
export declare function Conversation({ hass, logger }: TServiceParams):
|
|
4
|
-
addAlias: ({ entity, alias }: EditAliasOptions) => Promise<void>;
|
|
5
|
-
removeAlias: ({ entity, alias }: EditAliasOptions) => Promise<void>;
|
|
6
|
-
setConversational: ({ entity_ids, assistants, should_expose, }: ToggleExpose) => Promise<void>;
|
|
7
|
-
};
|
|
2
|
+
import { HassConversationService } from "../helpers";
|
|
3
|
+
export declare function Conversation({ hass, logger }: TServiceParams): HassConversationService;
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.Conversation = Conversation;
|
|
4
|
-
const helpers_1 = require("../helpers");
|
|
5
|
-
function Conversation({ hass, logger }) {
|
|
1
|
+
import { UPDATE_REGISTRY, } from "../helpers";
|
|
2
|
+
export function Conversation({ hass, logger }) {
|
|
6
3
|
async function addAlias({ entity, alias }) {
|
|
7
4
|
const current = await hass.entity.registry.get(entity);
|
|
8
5
|
if (current?.aliases?.includes(alias)) {
|
|
@@ -20,14 +17,14 @@ function Conversation({ hass, logger }) {
|
|
|
20
17
|
logger.debug({ name: entity }, `does not have alias {%s}`, alias);
|
|
21
18
|
return;
|
|
22
19
|
}
|
|
23
|
-
await hass.socket.sendMessage({ entity_id: entity, type:
|
|
20
|
+
await hass.socket.sendMessage({ entity_id: entity, type: UPDATE_REGISTRY });
|
|
24
21
|
}
|
|
25
|
-
async function setConversational({ entity_ids, assistants, should_expose
|
|
22
|
+
async function setConversational({ entity_ids, assistants, should_expose }) {
|
|
26
23
|
await hass.socket.sendMessage({
|
|
27
24
|
assistants: [assistants].flat(),
|
|
28
25
|
entity_ids: [entity_ids].flat(),
|
|
29
26
|
should_expose,
|
|
30
|
-
type:
|
|
27
|
+
type: UPDATE_REGISTRY,
|
|
31
28
|
});
|
|
32
29
|
}
|
|
33
30
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.extension.js","sourceRoot":"","sources":["../../src/extensions/conversation.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"conversation.extension.js","sourceRoot":"","sources":["../../src/extensions/conversation.extension.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAkB;IAC3D,KAAK,UAAU,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,EAAoB;QACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAC5B,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,+BAA+B;SACtC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAoB;QAC5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,0BAA0B,EAAE,KAAK,CAAC,CAAC;YAClE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,KAAK,UAAU,iBAAiB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAgB;QACtF,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAC5B,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;YAC/B,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;YAC/B,aAAa;YACb,IAAI,EAAE,eAAe;SACtB,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,QAAQ;QACR,WAAW;QACX,iBAAiB;KAClB,CAAC;AACJ,CAAC"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
1
|
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
|
-
import {
|
|
3
|
-
export declare function Device({ hass, config, context, logger, lifecycle, event, }: TServiceParams):
|
|
4
|
-
current: DeviceDetails[];
|
|
5
|
-
list: () => Promise<DeviceDetails[]>;
|
|
6
|
-
};
|
|
2
|
+
import { HassDeviceService } from "../helpers";
|
|
3
|
+
export declare function Device({ hass, config, context, logger, lifecycle, event, }: TServiceParams): HassDeviceService;
|
|
@@ -1,32 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const core_1 = require("@digital-alchemy/core");
|
|
5
|
-
const helpers_1 = require("../helpers");
|
|
6
|
-
function Device({ hass, config, context, logger, lifecycle, event, }) {
|
|
1
|
+
import { debounce } from "@digital-alchemy/core";
|
|
2
|
+
import { DEVICE_REGISTRY_UPDATED, EARLY_ON_READY, } from "../helpers";
|
|
3
|
+
export function Device({ hass, config, context, logger, lifecycle, event, }) {
|
|
7
4
|
hass.socket.onConnect(async () => {
|
|
8
|
-
if (!config.hass.AUTO_CONNECT_SOCKET || !config.hass.MANAGE_REGISTRY) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
5
|
let loading = new Promise(async (done) => {
|
|
12
6
|
hass.device.current = await hass.device.list();
|
|
13
7
|
loading = undefined;
|
|
14
8
|
done();
|
|
15
9
|
});
|
|
16
|
-
lifecycle.onReady(async () => loading && (await loading),
|
|
17
|
-
await
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
10
|
+
lifecycle.onReady(async () => loading && (await loading), EARLY_ON_READY);
|
|
11
|
+
await subscribeUpdates();
|
|
12
|
+
hass.socket.subscribe({
|
|
13
|
+
context,
|
|
14
|
+
event_type: "device_registry_updated",
|
|
15
|
+
async exec() {
|
|
16
|
+
await debounce(DEVICE_REGISTRY_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
|
|
17
|
+
hass.device.current = await hass.device.list();
|
|
18
|
+
logger.debug(`device registry updated`);
|
|
19
|
+
event.emit(DEVICE_REGISTRY_UPDATED);
|
|
20
|
+
},
|
|
21
|
+
});
|
|
28
22
|
});
|
|
29
|
-
async function
|
|
23
|
+
async function subscribeUpdates() {
|
|
30
24
|
await hass.socket.sendMessage({
|
|
31
25
|
event_type: "device_registry_updated",
|
|
32
26
|
type: "subscribe_events",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.extension.js","sourceRoot":"","sources":["../../src/extensions/device.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"device.extension.js","sourceRoot":"","sources":["../../src/extensions/device.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EACL,uBAAuB,EAEvB,cAAc,GAEf,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,MAAM,CAAC,EACrB,IAAI,EACJ,MAAM,EACN,OAAO,EACP,MAAM,EACN,SAAS,EACT,KAAK,GACU;IACf,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QAC/B,IAAI,OAAO,GAAG,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC/C,OAAO,GAAG,SAAS,CAAC;YACpB,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC;QAC1E,MAAM,gBAAgB,EAAE,CAAC;QAEzB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YACpB,OAAO;YACP,UAAU,EAAE,yBAAyB;YACrC,KAAK,CAAC,IAAI;gBACR,MAAM,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACvE,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC/C,MAAM,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtC,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,gBAAgB;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAC5B,UAAU,EAAE,yBAAyB;YACrC,IAAI,EAAE,kBAAkB;SACzB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,IAAI;QACjB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAkB;YACpD,IAAI,EAAE,6BAA6B;SACpC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO,EAAE,EAAqB;QAC9B,IAAI;KACL,CAAC;AACJ,CAAC"}
|