@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
|
@@ -1,34 +1,28 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const core_1 = require("@digital-alchemy/core");
|
|
5
|
-
const helpers_1 = require("../helpers");
|
|
6
|
-
function Floor({ hass, config, context, event, logger, lifecycle, }) {
|
|
1
|
+
import { debounce } from "@digital-alchemy/core";
|
|
2
|
+
import { EARLY_ON_READY, FLOOR_REGISTRY_UPDATED, } from "../helpers";
|
|
3
|
+
export function Floor({ hass, config, context, event, logger, 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.floor.current = await hass.floor.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: "floor_registry_updated",
|
|
14
|
+
async exec() {
|
|
15
|
+
await debounce(FLOOR_REGISTRY_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
|
|
16
|
+
hass.floor.current = await hass.floor.list();
|
|
17
|
+
logger.debug(`floor registry updated`);
|
|
18
|
+
event.emit(FLOOR_REGISTRY_UPDATED);
|
|
19
|
+
},
|
|
20
|
+
});
|
|
27
21
|
});
|
|
28
22
|
return {
|
|
29
23
|
async create(details) {
|
|
30
24
|
return await new Promise(async (done) => {
|
|
31
|
-
event.once(
|
|
25
|
+
event.once(FLOOR_REGISTRY_UPDATED, done);
|
|
32
26
|
await hass.socket.sendMessage({
|
|
33
27
|
aliases: [],
|
|
34
28
|
type: "config/floor_registry/create",
|
|
@@ -39,7 +33,7 @@ function Floor({ hass, config, context, event, logger, lifecycle, }) {
|
|
|
39
33
|
current: [],
|
|
40
34
|
async delete(floor_id) {
|
|
41
35
|
return await new Promise(async (done) => {
|
|
42
|
-
event.once(
|
|
36
|
+
event.once(FLOOR_REGISTRY_UPDATED, done);
|
|
43
37
|
await hass.socket.sendMessage({
|
|
44
38
|
floor_id,
|
|
45
39
|
type: "config/floor_registry/delete",
|
|
@@ -53,7 +47,7 @@ function Floor({ hass, config, context, event, logger, lifecycle, }) {
|
|
|
53
47
|
},
|
|
54
48
|
async update(details) {
|
|
55
49
|
return await new Promise(async (done) => {
|
|
56
|
-
event.once(
|
|
50
|
+
event.once(FLOOR_REGISTRY_UPDATED, done);
|
|
57
51
|
await hass.socket.sendMessage({
|
|
58
52
|
type: "config/floor_registry/update",
|
|
59
53
|
...details,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"floor.extension.js","sourceRoot":"","sources":["../../src/extensions/floor.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"floor.extension.js","sourceRoot":"","sources":["../../src/extensions/floor.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,uBAAuB,CAAC;AAGjE,OAAO,EACL,cAAc,EACd,sBAAsB,GAIvB,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,KAAK,CAAC,EACpB,IAAI,EACJ,MAAM,EACN,OAAO,EACP,KAAK,EACL,MAAM,EACN,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,KAAK,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7C,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,wBAAwB;YACpC,KAAK,CAAC,IAAI;gBACR,MAAM,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACtE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7C,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACrC,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,OAAoB;YAC/B,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;gBAC1C,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;gBACzC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC5B,OAAO,EAAE,EAAE;oBACX,IAAI,EAAE,8BAA8B;oBACpC,GAAG,OAAO;iBACX,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,EAAoB;QAC7B,KAAK,CAAC,MAAM,CAAC,QAAkB;YAC7B,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;gBAC1C,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;gBACzC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC5B,QAAQ;oBACR,IAAI,EAAE,8BAA8B;iBACrC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,IAAI;YACR,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAiB;gBACnD,IAAI,EAAE,4BAA4B;aACnC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,OAAqB;YAChC,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;gBAC1C,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;gBACzC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;oBAC5B,IAAI,EAAE,8BAA8B;oBACpC,GAAG,OAAO;iBACX,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const process = (raw, domains) => {
|
|
6
|
-
if (!core_1.is.empty(domains)) {
|
|
7
|
-
raw = raw.filter(entity => core_1.is.domain(entity, domains));
|
|
1
|
+
import { is } from "@digital-alchemy/core";
|
|
2
|
+
const check = (raw, domains) => {
|
|
3
|
+
if (!is.empty(domains)) {
|
|
4
|
+
raw = raw.filter(entity => is.domain(entity, domains));
|
|
8
5
|
}
|
|
9
6
|
return raw;
|
|
10
7
|
};
|
|
11
|
-
function IDByExtension({ hass, logger }) {
|
|
12
|
-
// *
|
|
8
|
+
export function IDByExtension({ hass, logger }) {
|
|
9
|
+
// * byDomain
|
|
13
10
|
function byDomain(domain) {
|
|
14
11
|
const MASTER_STATE = hass.entity._masterState();
|
|
15
12
|
return Object.keys(MASTER_STATE[domain] ?? {}).map(id => `${domain}.${id}`);
|
|
16
13
|
}
|
|
17
|
-
//
|
|
14
|
+
// * unique_id
|
|
18
15
|
function unique_id(unique_id) {
|
|
19
16
|
hass.entity.warnEarly("byUniqueId");
|
|
20
17
|
const entity = hass.entity.registry.current.find(i => i.unique_id === unique_id);
|
|
@@ -27,7 +24,7 @@ function IDByExtension({ hass, logger }) {
|
|
|
27
24
|
// * label
|
|
28
25
|
function label(label, ...domains) {
|
|
29
26
|
hass.entity.warnEarly("label");
|
|
30
|
-
return
|
|
27
|
+
return check(hass.entity.registry.current
|
|
31
28
|
.filter(i => i.labels.includes(label))
|
|
32
29
|
.map(i => i.entity_id), domains);
|
|
33
30
|
}
|
|
@@ -39,21 +36,19 @@ function IDByExtension({ hass, logger }) {
|
|
|
39
36
|
.filter(i => i.area_id === area)
|
|
40
37
|
.map(i => i.entity_id);
|
|
41
38
|
// identify devices
|
|
42
|
-
const devices = new Set(hass.device.current
|
|
43
|
-
.filter(device => device.area_id === area)
|
|
44
|
-
.map(i => i.id));
|
|
39
|
+
const devices = new Set(hass.device.current.filter(device => device.area_id === area).map(i => i.id));
|
|
45
40
|
// extract entities associated with device, that have not been assigned to a room
|
|
46
41
|
const fromDevice = hass.entity.registry.current
|
|
47
|
-
.filter(entity => devices.has(entity.device_id) &&
|
|
42
|
+
.filter(entity => devices.has(entity.device_id) && is.empty(entity.area_id))
|
|
48
43
|
.map(i => i.entity_id);
|
|
49
|
-
return
|
|
44
|
+
return check(
|
|
50
45
|
// merge lists
|
|
51
|
-
|
|
46
|
+
is.unique([...fromEntity, ...fromDevice]), domains);
|
|
52
47
|
}
|
|
53
48
|
// * device
|
|
54
49
|
function device(device, ...domains) {
|
|
55
50
|
hass.entity.warnEarly("device");
|
|
56
|
-
return
|
|
51
|
+
return check(hass.entity.registry.current
|
|
57
52
|
.filter(i => i.device_id === device)
|
|
58
53
|
.map(i => i.entity_id), domains);
|
|
59
54
|
}
|
|
@@ -61,14 +56,14 @@ function IDByExtension({ hass, logger }) {
|
|
|
61
56
|
function floor(floor, ...domains) {
|
|
62
57
|
hass.entity.warnEarly("floor");
|
|
63
58
|
const areas = new Set(hass.area.current.filter(i => i.floor_id === floor).map(i => i.area_id));
|
|
64
|
-
return
|
|
59
|
+
return check(hass.entity.registry.current
|
|
65
60
|
.filter(i => areas.has(i.area_id))
|
|
66
61
|
.map(i => i.entity_id), domains);
|
|
67
62
|
}
|
|
68
63
|
// * platform
|
|
69
64
|
function platform(platform, ...domains) {
|
|
70
65
|
hass.entity.warnEarly("platform");
|
|
71
|
-
return
|
|
66
|
+
return check(hass.entity.registry.current
|
|
72
67
|
.filter(i => i.platform === platform)
|
|
73
68
|
.map(i => i.entity_id), domains);
|
|
74
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id-by.extension.js","sourceRoot":"","sources":["../../src/extensions/id-by.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"id-by.extension.js","sourceRoot":"","sources":["../../src/extensions/id-by.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAkB,MAAM,uBAAuB,CAAC;AAwB3D,MAAM,KAAK,GAAG,CAAyB,GAAU,EAAE,OAAsB,EAAE,EAAE;IAC3E,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAkB;IAC5D,aAAa;IACb,SAAS,QAAQ,CAA6B,MAAc;QAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAChD,EAAE,CAAC,EAAE,CAAC,GAAG,MAAM,IAAI,EAAE,EAAyB,CAC/C,CAAC;IACJ,CAAC;IAED,cAAc;IACd,SAAS,SAAS,CAMhB,SAAoB;QACpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CACE,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACzE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,EAAE,SAAS,CAAC;IAC3B,CAAC;IAED,UAAU;IACV,SAAS,KAAK,CACZ,KAAY,EACZ,GAAG,OAAiB;QAEpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,OAAO,KAAK,CACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;aACrC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAA2C,CAAC,EAC1D,OAAO,CACR,CAAC;IACJ,CAAC;IAED,SAAS;IACT,SAAS,IAAI,CACX,IAAU,EACV,GAAG,OAAiB;QAEpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAE9B,sDAAsD;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;aAC5C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEzB,mBAAmB;QACnB,MAAM,OAAO,GAAG,IAAI,GAAG,CACrB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7E,CAAC;QAEF,iFAAiF;QACjF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;aAC5C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;aAC3E,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEzB,OAAO,KAAK;QACV,cAAc;QACd,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC,CAAC,EACzC,OAAO,CAC0B,CAAC;IACtC,CAAC;IAED,WAAW;IACX,SAAS,MAAM,CACb,MAAc,EACd,GAAG,OAAiB;QAEpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,KAAK,CACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,MAAM,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAA6C,CAAC,EAC5D,OAAO,CACR,CAAC;IACJ,CAAC;IAED,UAAU;IACV,SAAS,KAAK,CACZ,KAAY,EACZ,GAAG,OAAiB;QAEpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CACxE,CAAC;QACF,OAAO,KAAK,CACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAA2C,CAAC,EAC1D,OAAO,CACR,CAAC;IACJ,CAAC;IAED,aAAa;IACb,SAAS,QAAQ,CACf,QAAkB,EAClB,GAAG,OAAiB;QAEpB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAClC,OAAO,KAAK,CACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO;aACzB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;aACpC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAiD,CAAC,EAChE,OAAO,CACR,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI;QACJ,MAAM;QACN,MAAM,EAAE,QAAQ;QAChB,KAAK;QACL,KAAK;QACL,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC"}
|
|
@@ -8,6 +8,7 @@ export * from "./events.extension";
|
|
|
8
8
|
export * from "./fetch-api.extension";
|
|
9
9
|
export * from "./floor.extension";
|
|
10
10
|
export * from "./id-by.extension";
|
|
11
|
+
export * from "./internal.extension";
|
|
11
12
|
export * from "./label.extension";
|
|
12
13
|
export * from "./reference.extension";
|
|
13
14
|
export * from "./registry.extension";
|
package/dist/extensions/index.js
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
tslib_1.__exportStar(require("./websocket-api.extension"), exports);
|
|
18
|
-
tslib_1.__exportStar(require("./zone.extension"), exports);
|
|
1
|
+
export * from "./area.extension";
|
|
2
|
+
export * from "./backup.extension";
|
|
3
|
+
export * from "./call-proxy.extension";
|
|
4
|
+
export * from "./config.extension";
|
|
5
|
+
export * from "./device.extension";
|
|
6
|
+
export * from "./entity.extension";
|
|
7
|
+
export * from "./events.extension";
|
|
8
|
+
export * from "./fetch-api.extension";
|
|
9
|
+
export * from "./floor.extension";
|
|
10
|
+
export * from "./id-by.extension";
|
|
11
|
+
export * from "./internal.extension";
|
|
12
|
+
export * from "./label.extension";
|
|
13
|
+
export * from "./reference.extension";
|
|
14
|
+
export * from "./registry.extension";
|
|
15
|
+
export * from "./websocket-api.extension";
|
|
16
|
+
export * from "./zone.extension";
|
|
19
17
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
|
+
import { DownloadOptions, FetchArguments, FetcherOptions, TFetchBody } from "../helpers";
|
|
3
|
+
export declare function FetchInternals({ logger, context: parentContext }: TServiceParams): ({ headers: base_headers, baseUrl: base_url, context: logContext }: FetcherOptions) => {
|
|
4
|
+
base_headers: Record<string, string>;
|
|
5
|
+
base_url: string;
|
|
6
|
+
download: ({ destination, body, headers, method, ...fetchWith }: DownloadOptions) => Promise<void>;
|
|
7
|
+
exec: <T, BODY extends TFetchBody = undefined>({ body, headers, method, process, ...fetchWith }: Partial<FetchArguments<BODY>>) => Promise<T>;
|
|
8
|
+
/**
|
|
9
|
+
* @deprecated set base_url directly
|
|
10
|
+
*/
|
|
11
|
+
setBaseUrl: (url: string) => string;
|
|
12
|
+
/**
|
|
13
|
+
* @deprecated set base_headers directly
|
|
14
|
+
*/
|
|
15
|
+
setHeaders: (headers: Record<string, string>) => Record<string, string>;
|
|
16
|
+
};
|
|
17
|
+
export type TFetch = <T, BODY extends object = object>(fetchWith: Partial<FetchArguments<BODY>>) => Promise<T>;
|
|
18
|
+
export type TDownload = (fetchWith: DownloadOptions) => Promise<void>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { FIRST, InternalError, is } from "@digital-alchemy/core";
|
|
2
|
+
import { createWriteStream } from "fs";
|
|
3
|
+
import { pipeline } from "stream";
|
|
4
|
+
import { promisify } from "util";
|
|
5
|
+
import { buildFilterString, } from "../helpers";
|
|
6
|
+
const streamPipeline = promisify(pipeline);
|
|
7
|
+
export function FetchInternals({ logger, context: parentContext }) {
|
|
8
|
+
return ({ headers: base_headers, baseUrl: base_url, context: logContext }) => {
|
|
9
|
+
const capabilities = [];
|
|
10
|
+
if (!is.empty(capabilities)) {
|
|
11
|
+
logger.trace({ capabilities, name: logContext }, `initialized fetcher`);
|
|
12
|
+
}
|
|
13
|
+
function checkForHttpErrors(maybeError) {
|
|
14
|
+
if (is.object(maybeError) &&
|
|
15
|
+
maybeError !== null &&
|
|
16
|
+
is.number(maybeError.statusCode) &&
|
|
17
|
+
is.string(maybeError.error)) {
|
|
18
|
+
// Log the error if needed
|
|
19
|
+
logger.error({ error: maybeError, name: logContext }, maybeError.message);
|
|
20
|
+
// Throw a FetchRequestError
|
|
21
|
+
// throw new FetchRequestError(maybeError);
|
|
22
|
+
throw new InternalError(logContext || parentContext, maybeError.error, maybeError.message);
|
|
23
|
+
}
|
|
24
|
+
return maybeError;
|
|
25
|
+
}
|
|
26
|
+
// #MARK: fetchHandleResponse
|
|
27
|
+
async function fetchHandleResponse(process, response) {
|
|
28
|
+
if (process === false || process === "raw") {
|
|
29
|
+
return response;
|
|
30
|
+
}
|
|
31
|
+
const text = await response.text();
|
|
32
|
+
if (process === "text") {
|
|
33
|
+
return text;
|
|
34
|
+
}
|
|
35
|
+
if (!["{", "["].includes(text.charAt(FIRST))) {
|
|
36
|
+
if (["OK"].includes(text)) {
|
|
37
|
+
logger.debug({ name: logContext, text }, "full response text");
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
// It's probably a coding error error, and not something a user did.
|
|
41
|
+
// Will try to keep the array up to date if any other edge cases pop up
|
|
42
|
+
logger.warn({ name: logContext, text }, `unexpected api Response`);
|
|
43
|
+
}
|
|
44
|
+
return text;
|
|
45
|
+
}
|
|
46
|
+
const parsed = JSON.parse(text);
|
|
47
|
+
return checkForHttpErrors(parsed);
|
|
48
|
+
}
|
|
49
|
+
function fetchCreateUrl({ rawUrl, url, ...fetchWith }) {
|
|
50
|
+
let out = url || "";
|
|
51
|
+
if (!rawUrl) {
|
|
52
|
+
const base = fetchWith.baseUrl || fetchWrapper.base_url;
|
|
53
|
+
out = base + url;
|
|
54
|
+
}
|
|
55
|
+
if (!is.empty(fetchWith.params)) {
|
|
56
|
+
out = `${out}?${buildFilterString(fetchWith)}`;
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
// #MARK: execFetch
|
|
61
|
+
async function exec({ body, headers = {}, method = "get", process, ...fetchWith }) {
|
|
62
|
+
const contentType = is.object(body) ? { "Content-Type": "application/json" } : {};
|
|
63
|
+
const result = await global.fetch(fetchCreateUrl(fetchWith), {
|
|
64
|
+
body: is.object(body) ? JSON.stringify(body) : body,
|
|
65
|
+
headers: {
|
|
66
|
+
...contentType,
|
|
67
|
+
...fetchWrapper.base_headers,
|
|
68
|
+
...headers,
|
|
69
|
+
},
|
|
70
|
+
method,
|
|
71
|
+
});
|
|
72
|
+
return await fetchHandleResponse(process, result);
|
|
73
|
+
}
|
|
74
|
+
async function download({ destination, body, headers = {}, method = "get", ...fetchWith }) {
|
|
75
|
+
const url = await fetchCreateUrl(fetchWith);
|
|
76
|
+
const response = await fetch(url, {
|
|
77
|
+
body: is.object(body) ? JSON.stringify(body) : body,
|
|
78
|
+
headers: { ...fetchWrapper.base_headers, ...headers },
|
|
79
|
+
method,
|
|
80
|
+
});
|
|
81
|
+
const stream = createWriteStream(destination);
|
|
82
|
+
await streamPipeline(response.body, stream);
|
|
83
|
+
}
|
|
84
|
+
// #MARK: return object
|
|
85
|
+
const fetchWrapper = {
|
|
86
|
+
base_headers,
|
|
87
|
+
base_url,
|
|
88
|
+
download,
|
|
89
|
+
exec,
|
|
90
|
+
/**
|
|
91
|
+
* @deprecated set base_url directly
|
|
92
|
+
*/
|
|
93
|
+
setBaseUrl: (url) => (fetchWrapper.base_url = url),
|
|
94
|
+
/**
|
|
95
|
+
* @deprecated set base_headers directly
|
|
96
|
+
*/
|
|
97
|
+
setHeaders: (headers) => (fetchWrapper.base_headers = headers),
|
|
98
|
+
};
|
|
99
|
+
return fetchWrapper;
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=internal.extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.extension.js","sourceRoot":"","sources":["../../src/extensions/internal.extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
1
|
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export declare function Label({ hass, config, logger, lifecycle, event, context, }: TServiceParams): {
|
|
5
|
-
create: (details: LabelOptions) => Promise<void>;
|
|
6
|
-
current: LabelDefinition[];
|
|
7
|
-
delete: (label_id: TLabelId) => Promise<void>;
|
|
8
|
-
list: () => Promise<LabelDefinition[]>;
|
|
9
|
-
update: (details: LabelDefinition) => Promise<void>;
|
|
10
|
-
};
|
|
2
|
+
import { HassLabelService } from "../helpers";
|
|
3
|
+
export declare function Label({ hass, config, logger, lifecycle, event, context, }: TServiceParams): HassLabelService;
|
|
@@ -1,33 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const core_1 = require("@digital-alchemy/core");
|
|
5
|
-
const helpers_1 = require("../helpers");
|
|
6
|
-
function Label({ hass, config, logger, lifecycle, event, context, }) {
|
|
1
|
+
import { debounce } from "@digital-alchemy/core";
|
|
2
|
+
import { EARLY_ON_READY, LABEL_REGISTRY_UPDATED, } from "../helpers";
|
|
3
|
+
export function Label({ hass, config, logger, lifecycle, event, context, }) {
|
|
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.label.current = await hass.label.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: "label_registry_updated",
|
|
14
|
+
async exec() {
|
|
15
|
+
await debounce(LABEL_REGISTRY_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
|
|
16
|
+
hass.label.current = await hass.label.list();
|
|
17
|
+
logger.debug(`label registry updated`);
|
|
18
|
+
event.emit(LABEL_REGISTRY_UPDATED);
|
|
19
|
+
},
|
|
20
|
+
});
|
|
27
21
|
});
|
|
28
22
|
async function create(details) {
|
|
29
23
|
return await new Promise(async (done) => {
|
|
30
|
-
event.once(
|
|
24
|
+
event.once(LABEL_REGISTRY_UPDATED, done);
|
|
31
25
|
await hass.socket.sendMessage({
|
|
32
26
|
type: "config/label_registry/create",
|
|
33
27
|
...details,
|
|
@@ -36,7 +30,7 @@ function Label({ hass, config, logger, lifecycle, event, context, }) {
|
|
|
36
30
|
}
|
|
37
31
|
async function deleteLabel(label_id) {
|
|
38
32
|
return await new Promise(async (done) => {
|
|
39
|
-
event.once(
|
|
33
|
+
event.once(LABEL_REGISTRY_UPDATED, done);
|
|
40
34
|
await hass.socket.sendMessage({
|
|
41
35
|
label_id,
|
|
42
36
|
type: "config/label_registry/delete",
|
|
@@ -50,7 +44,7 @@ function Label({ hass, config, logger, lifecycle, event, context, }) {
|
|
|
50
44
|
}
|
|
51
45
|
async function update(details) {
|
|
52
46
|
return await new Promise(async (done) => {
|
|
53
|
-
event.once(
|
|
47
|
+
event.once(LABEL_REGISTRY_UPDATED, done);
|
|
54
48
|
await hass.socket.sendMessage({
|
|
55
49
|
type: "config/label_registry/update",
|
|
56
50
|
...details,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.extension.js","sourceRoot":"","sources":["../../src/extensions/label.extension.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"label.extension.js","sourceRoot":"","sources":["../../src/extensions/label.extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,uBAAuB,CAAC;AAGjE,OAAO,EACL,cAAc,EAEd,sBAAsB,GAGvB,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,KAAK,CAAC,EACpB,IAAI,EACJ,MAAM,EACN,MAAM,EACN,SAAS,EACT,KAAK,EACL,OAAO,GACQ;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,KAAK,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7C,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,wBAAwB;YACpC,KAAK,CAAC,IAAI;gBACR,MAAM,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBACtE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7C,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;gBACvC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACrC,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,MAAM,CAAC,OAAqB;QACzC,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;YAC1C,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5B,IAAI,EAAE,8BAA8B;gBACpC,GAAG,OAAO;aACX,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,WAAW,CAAC,QAAkB;QAC3C,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;YAC1C,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5B,QAAQ;gBACR,IAAI,EAAE,8BAA8B;aACrC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,IAAI;QACjB,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAoB;YACtD,IAAI,EAAE,4BAA4B;SACnC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,MAAM,CAAC,OAAwB;QAC5C,OAAO,MAAM,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;YAC1C,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5B,IAAI,EAAE,8BAA8B;gBACpC,GAAG,OAAO;aACX,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO,EAAE,EAAuB;QAChC,MAAM,EAAE,WAAW;QACnB,IAAI;QACJ,MAAM;KACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,13 +1,3 @@
|
|
|
1
1
|
import { TServiceParams } from "@digital-alchemy/core";
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
export declare function ReferenceExtension({ hass, logger, internal, event, }: TServiceParams): {
|
|
5
|
-
area: <AREA extends TAreaId, DOMAINS extends TRawDomains = TRawDomains>(area: AREA, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_AREA<AREA, DOMAINS>>[];
|
|
6
|
-
device: <DEVICE extends TDeviceId, DOMAINS extends TRawDomains = TRawDomains>(device: DEVICE, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_DEVICE<DEVICE, DOMAINS>>[];
|
|
7
|
-
domain: <DOMAIN extends TRawDomains = TRawDomains>(domain: DOMAIN) => ByIdProxy<PICK_ENTITY<DOMAIN>>[];
|
|
8
|
-
floor: <FLOOR extends TFloorId, DOMAINS extends TRawDomains = TRawDomains>(floor: FLOOR, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_FLOOR<FLOOR, DOMAINS>>[];
|
|
9
|
-
id: <ENTITY_ID extends ANY_ENTITY>(entity_id: ENTITY_ID) => ByIdProxy<ENTITY_ID>;
|
|
10
|
-
label: <LABEL extends TLabelId, DOMAINS extends TRawDomains = TRawDomains>(label: LABEL, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_LABEL<LABEL, DOMAINS>>[];
|
|
11
|
-
platform: <PLATFORM extends TPlatformId, DOMAINS extends TRawDomains = TRawDomains>(platform: PLATFORM, ...domains: DOMAINS[]) => ByIdProxy<PICK_FROM_PLATFORM<PLATFORM, DOMAINS>>[];
|
|
12
|
-
unique_id: <UNIQUE_ID extends TUniqueId, ENTITY_ID extends Extract<TUniqueIDMapping[UNIQUE_ID], ANY_ENTITY> = Extract<TUniqueIDMapping[UNIQUE_ID], import("..").TRawEntityIds>>(unique_id: UNIQUE_ID) => ByIdProxy<ENTITY_ID>;
|
|
13
|
-
};
|
|
2
|
+
import { HassReferenceService } from "../helpers";
|
|
3
|
+
export declare function ReferenceExtension({ hass, logger, internal, event, }: TServiceParams): HassReferenceService;
|
|
@@ -1,13 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const dayjs_1 = tslib_1.__importDefault(require("dayjs"));
|
|
7
|
-
const validator_1 = require("validator");
|
|
8
|
-
const __1 = require("..");
|
|
9
|
-
const helpers_1 = require("../helpers");
|
|
10
|
-
function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
1
|
+
import { DOWN, is, NONE, sleep, UP } from "@digital-alchemy/core";
|
|
2
|
+
import dayjs from "dayjs";
|
|
3
|
+
import { SERVICE_LIST_UPDATED } from "..";
|
|
4
|
+
import { domain, } from "../helpers";
|
|
5
|
+
export function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
11
6
|
const ENTITY_PROXIES = new Map();
|
|
12
7
|
// #MARK:proxyGetLogic
|
|
13
8
|
function proxyGetLogic(entity, property) {
|
|
@@ -22,10 +17,10 @@ function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
|
22
17
|
}
|
|
23
18
|
if (property.startsWith("last")) {
|
|
24
19
|
const value = internal.utils.object.get(current, property);
|
|
25
|
-
return (
|
|
20
|
+
return dayjs(value);
|
|
26
21
|
}
|
|
27
22
|
if (property === "state") {
|
|
28
|
-
if (
|
|
23
|
+
if (domain(entity) === "sensor" && is.number(Number(current.state))) {
|
|
29
24
|
return Number(current.state);
|
|
30
25
|
}
|
|
31
26
|
return current.state;
|
|
@@ -34,12 +29,12 @@ function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
|
34
29
|
}
|
|
35
30
|
// #MARK: byId
|
|
36
31
|
function byId(entity_id) {
|
|
37
|
-
const entity_domain =
|
|
32
|
+
const entity_domain = domain(entity_id);
|
|
38
33
|
if (!ENTITY_PROXIES.has(entity_id)) {
|
|
39
34
|
const { ...thing } = hass.entity.getCurrentState(entity_id);
|
|
40
35
|
let loaded = false;
|
|
41
36
|
function keys() {
|
|
42
|
-
const entityDomain =
|
|
37
|
+
const entityDomain = domain(entity_id);
|
|
43
38
|
return [
|
|
44
39
|
"attributes",
|
|
45
40
|
"entity_id",
|
|
@@ -56,7 +51,7 @@ function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
|
56
51
|
.getServices()
|
|
57
52
|
.filter(({ domain }) => domain === entityDomain)
|
|
58
53
|
.flatMap(i => Object.keys(i.services))
|
|
59
|
-
.sort((a, b) => (a > b ?
|
|
54
|
+
.sort((a, b) => (a > b ? UP : DOWN)),
|
|
60
55
|
];
|
|
61
56
|
}
|
|
62
57
|
function appendKeys(force = false) {
|
|
@@ -69,15 +64,16 @@ function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
|
69
64
|
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
70
65
|
// @ts-ignore
|
|
71
66
|
keys().forEach(i => (thing[i] ??= () => { }));
|
|
72
|
-
if (!
|
|
67
|
+
if (!is.empty(hass.configure.getServices())) {
|
|
73
68
|
loaded = true;
|
|
74
69
|
}
|
|
75
70
|
}
|
|
76
|
-
event.on(
|
|
71
|
+
event.on(SERVICE_LIST_UPDATED, () => appendKeys(true));
|
|
77
72
|
ENTITY_PROXIES.set(entity_id,
|
|
78
73
|
// just because you can't do generics properly....
|
|
79
74
|
new Proxy(thing, {
|
|
80
75
|
// things that shouldn't be needed: this extract
|
|
76
|
+
// eslint-disable-next-line sonarjs/function-return-type
|
|
81
77
|
get: (_, property) => {
|
|
82
78
|
switch (property) {
|
|
83
79
|
// * onUpdate
|
|
@@ -125,8 +121,8 @@ function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
|
125
121
|
}
|
|
126
122
|
};
|
|
127
123
|
event.once(entity_id, complete);
|
|
128
|
-
if (
|
|
129
|
-
await
|
|
124
|
+
if (is.number(timeout) && timeout > NONE) {
|
|
125
|
+
await sleep(timeout);
|
|
130
126
|
if (done) {
|
|
131
127
|
logger.debug({ entity_id, name: "nextState", timeout }, "timed out");
|
|
132
128
|
done(undefined);
|
|
@@ -155,8 +151,8 @@ function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
|
155
151
|
}
|
|
156
152
|
};
|
|
157
153
|
event.on(entity_id, complete);
|
|
158
|
-
if (
|
|
159
|
-
await
|
|
154
|
+
if (is.number(timeout) && timeout > NONE) {
|
|
155
|
+
await sleep(timeout);
|
|
160
156
|
if (done) {
|
|
161
157
|
logger.debug({ entity_id, name: "waitForState", timeout }, "timed out");
|
|
162
158
|
done(undefined);
|
|
@@ -199,7 +195,7 @@ function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
|
199
195
|
}
|
|
200
196
|
// * attributes
|
|
201
197
|
if (property === "attributes") {
|
|
202
|
-
if (!
|
|
198
|
+
if (!is.object(value)) {
|
|
203
199
|
logger.error(`can only provide objects as attributes`);
|
|
204
200
|
return false;
|
|
205
201
|
}
|
|
@@ -225,9 +221,7 @@ function ReferenceExtension({ hass, logger, internal, event, }) {
|
|
|
225
221
|
floor: (floor, ...domains) => hass.idBy.floor(floor, ...domains).map(id => byId(id)),
|
|
226
222
|
id: byId,
|
|
227
223
|
label: (label, ...domains) => hass.idBy.label(label, ...domains).map(id => byId(id)),
|
|
228
|
-
platform: (platform, ...domains) => hass.idBy
|
|
229
|
-
.platform(platform, ...domains)
|
|
230
|
-
.map(id => byId(id)),
|
|
224
|
+
platform: (platform, ...domains) => hass.idBy.platform(platform, ...domains).map(id => byId(id)),
|
|
231
225
|
unique_id: (unique_id) => {
|
|
232
226
|
const id = hass.idBy.unique_id(unique_id);
|
|
233
227
|
if (!id) {
|