@digital-alchemy/core 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/LICENSE +21 -0
- package/README.md +47 -0
- package/dist/automation/automation.module.d.ts +61 -0
- package/dist/automation/automation.module.js +70 -0
- package/dist/automation/automation.module.js.map +1 -0
- package/dist/automation/extensions/aggressive-scenes.extension.d.ts +22 -0
- package/dist/automation/extensions/aggressive-scenes.extension.js +125 -0
- package/dist/automation/extensions/aggressive-scenes.extension.js.map +1 -0
- package/dist/automation/extensions/circadian.extension.d.ts +11 -0
- package/dist/automation/extensions/circadian.extension.js +87 -0
- package/dist/automation/extensions/circadian.extension.js.map +1 -0
- package/dist/automation/extensions/index.d.ts +7 -0
- package/dist/automation/extensions/index.js +11 -0
- package/dist/automation/extensions/index.js.map +1 -0
- package/dist/automation/extensions/light-manager.extension.d.ts +26 -0
- package/dist/automation/extensions/light-manager.extension.js +260 -0
- package/dist/automation/extensions/light-manager.extension.js.map +1 -0
- package/dist/automation/extensions/managed-switch.extension.d.ts +3 -0
- package/dist/automation/extensions/managed-switch.extension.js +73 -0
- package/dist/automation/extensions/managed-switch.extension.js.map +1 -0
- package/dist/automation/extensions/room.extension.d.ts +11 -0
- package/dist/automation/extensions/room.extension.js +179 -0
- package/dist/automation/extensions/room.extension.js.map +1 -0
- package/dist/automation/extensions/sequence-matcher.extension.d.ts +3 -0
- package/dist/automation/extensions/sequence-matcher.extension.js +126 -0
- package/dist/automation/extensions/sequence-matcher.extension.js.map +1 -0
- package/dist/automation/extensions/solar-calc.extension.d.ts +20 -0
- package/dist/automation/extensions/solar-calc.extension.js +105 -0
- package/dist/automation/extensions/solar-calc.extension.js.map +1 -0
- package/dist/automation/helpers/events.helper.d.ts +33 -0
- package/dist/automation/helpers/events.helper.js +14 -0
- package/dist/automation/helpers/events.helper.js.map +1 -0
- package/dist/automation/helpers/index.d.ts +7 -0
- package/dist/automation/helpers/index.js +11 -0
- package/dist/automation/helpers/index.js.map +1 -0
- package/dist/automation/helpers/managed-switch.helper.d.ts +41 -0
- package/dist/automation/helpers/managed-switch.helper.js +3 -0
- package/dist/automation/helpers/managed-switch.helper.js.map +1 -0
- package/dist/automation/helpers/metrics.helper.d.ts +13 -0
- package/dist/automation/helpers/metrics.helper.js +30 -0
- package/dist/automation/helpers/metrics.helper.js.map +1 -0
- package/dist/automation/helpers/reftimes.helper.d.ts +54 -0
- package/dist/automation/helpers/reftimes.helper.js +33 -0
- package/dist/automation/helpers/reftimes.helper.js.map +1 -0
- package/dist/automation/helpers/scene.helper.d.ts +97 -0
- package/dist/automation/helpers/scene.helper.js +5 -0
- package/dist/automation/helpers/scene.helper.js.map +1 -0
- package/dist/automation/helpers/sequence.helper.d.ts +55 -0
- package/dist/automation/helpers/sequence.helper.js +3 -0
- package/dist/automation/helpers/sequence.helper.js.map +1 -0
- package/dist/automation/helpers/solar.helper.d.ts +3 -0
- package/dist/automation/helpers/solar.helper.js +262 -0
- package/dist/automation/helpers/solar.helper.js.map +1 -0
- package/dist/automation/index.d.ts +3 -0
- package/dist/automation/index.js +10 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/boilerplate/extensions/cache.extension.d.ts +24 -0
- package/dist/boilerplate/extensions/cache.extension.js +96 -0
- package/dist/boilerplate/extensions/cache.extension.js.map +1 -0
- package/dist/boilerplate/extensions/configuration.extension.d.ts +23 -0
- package/dist/boilerplate/extensions/configuration.extension.js +98 -0
- package/dist/boilerplate/extensions/configuration.extension.js.map +1 -0
- package/dist/boilerplate/extensions/fetch.extension.d.ts +20 -0
- package/dist/boilerplate/extensions/fetch.extension.js +154 -0
- package/dist/boilerplate/extensions/fetch.extension.js.map +1 -0
- package/dist/boilerplate/extensions/index.d.ts +6 -0
- package/dist/boilerplate/extensions/index.js +10 -0
- package/dist/boilerplate/extensions/index.js.map +1 -0
- package/dist/boilerplate/extensions/logger.extension.d.ts +39 -0
- package/dist/boilerplate/extensions/logger.extension.js +159 -0
- package/dist/boilerplate/extensions/logger.extension.js.map +1 -0
- package/dist/boilerplate/extensions/scheduler.extension.d.ts +21 -0
- package/dist/boilerplate/extensions/scheduler.extension.js +117 -0
- package/dist/boilerplate/extensions/scheduler.extension.js.map +1 -0
- package/dist/boilerplate/extensions/wiring.extension.d.ts +101 -0
- package/dist/boilerplate/extensions/wiring.extension.js +452 -0
- package/dist/boilerplate/extensions/wiring.extension.js.map +1 -0
- package/dist/boilerplate/helpers/cache-memory.helper.d.ts +7 -0
- package/dist/boilerplate/helpers/cache-memory.helper.js +65 -0
- package/dist/boilerplate/helpers/cache-memory.helper.js.map +1 -0
- package/dist/boilerplate/helpers/cache-redis.helper.d.ts +7 -0
- package/dist/boilerplate/helpers/cache-redis.helper.js +69 -0
- package/dist/boilerplate/helpers/cache-redis.helper.js.map +1 -0
- package/dist/boilerplate/helpers/config-environment-loader.helper.d.ts +2 -0
- package/dist/boilerplate/helpers/config-environment-loader.helper.js +56 -0
- package/dist/boilerplate/helpers/config-environment-loader.helper.js.map +1 -0
- package/dist/boilerplate/helpers/config-file-loader.helper.d.ts +4 -0
- package/dist/boilerplate/helpers/config-file-loader.helper.js +87 -0
- package/dist/boilerplate/helpers/config-file-loader.helper.js.map +1 -0
- package/dist/boilerplate/helpers/config.helper.d.ts +102 -0
- package/dist/boilerplate/helpers/config.helper.js +32 -0
- package/dist/boilerplate/helpers/config.helper.js.map +1 -0
- package/dist/boilerplate/helpers/errors.helper.d.ts +39 -0
- package/dist/boilerplate/helpers/errors.helper.js +76 -0
- package/dist/boilerplate/helpers/errors.helper.js.map +1 -0
- package/dist/boilerplate/helpers/events.helper.d.ts +3 -0
- package/dist/boilerplate/helpers/events.helper.js +11 -0
- package/dist/boilerplate/helpers/events.helper.js.map +1 -0
- package/dist/boilerplate/helpers/fetch.helper.d.ts +170 -0
- package/dist/boilerplate/helpers/fetch.helper.js +173 -0
- package/dist/boilerplate/helpers/fetch.helper.js.map +1 -0
- package/dist/boilerplate/helpers/index.d.ts +12 -0
- package/dist/boilerplate/helpers/index.js +16 -0
- package/dist/boilerplate/helpers/index.js.map +1 -0
- package/dist/boilerplate/helpers/lifecycle.helper.d.ts +43 -0
- package/dist/boilerplate/helpers/lifecycle.helper.js +13 -0
- package/dist/boilerplate/helpers/lifecycle.helper.js.map +1 -0
- package/dist/boilerplate/helpers/metrics.helper.d.ts +73 -0
- package/dist/boilerplate/helpers/metrics.helper.js +141 -0
- package/dist/boilerplate/helpers/metrics.helper.js.map +1 -0
- package/dist/boilerplate/helpers/testing.helper.d.ts +13 -0
- package/dist/boilerplate/helpers/testing.helper.js +91 -0
- package/dist/boilerplate/helpers/testing.helper.js.map +1 -0
- package/dist/boilerplate/helpers/wiring.helper.d.ts +155 -0
- package/dist/boilerplate/helpers/wiring.helper.js +5 -0
- package/dist/boilerplate/helpers/wiring.helper.js.map +1 -0
- package/dist/boilerplate/index.d.ts +2 -0
- package/dist/boilerplate/index.js +6 -0
- package/dist/boilerplate/index.js.map +1 -0
- package/dist/gotify/extensions/application.extension.d.ts +13 -0
- package/dist/gotify/extensions/application.extension.js +52 -0
- package/dist/gotify/extensions/application.extension.js.map +1 -0
- package/dist/gotify/extensions/client.extension.d.ts +8 -0
- package/dist/gotify/extensions/client.extension.js +38 -0
- package/dist/gotify/extensions/client.extension.js.map +1 -0
- package/dist/gotify/extensions/fetch.extension.d.ts +2 -0
- package/dist/gotify/extensions/fetch.extension.js +14 -0
- package/dist/gotify/extensions/fetch.extension.js.map +1 -0
- package/dist/gotify/extensions/index.d.ts +4 -0
- package/dist/gotify/extensions/index.js +8 -0
- package/dist/gotify/extensions/index.js.map +1 -0
- package/dist/gotify/extensions/message.extension.d.ts +8 -0
- package/dist/gotify/extensions/message.extension.js +37 -0
- package/dist/gotify/extensions/message.extension.js.map +1 -0
- package/dist/gotify/gotify.module.d.ts +29 -0
- package/dist/gotify/gotify.module.js +33 -0
- package/dist/gotify/gotify.module.js.map +1 -0
- package/dist/gotify/helpers/api.d.ts +346 -0
- package/dist/gotify/helpers/api.js +14 -0
- package/dist/gotify/helpers/api.js.map +1 -0
- package/dist/gotify/helpers/events.helper.d.ts +6 -0
- package/dist/gotify/helpers/events.helper.js +5 -0
- package/dist/gotify/helpers/events.helper.js.map +1 -0
- package/dist/gotify/helpers/index.d.ts +2 -0
- package/dist/gotify/helpers/index.js +6 -0
- package/dist/gotify/helpers/index.js.map +1 -0
- package/dist/gotify/index.d.ts +3 -0
- package/dist/gotify/index.js +7 -0
- package/dist/gotify/index.js.map +1 -0
- package/dist/hass/dynamic.d.ts +1126 -0
- package/dist/hass/dynamic.js +153 -0
- package/dist/hass/dynamic.js.map +1 -0
- package/dist/hass/extensions/call-proxy.extension.d.ts +4 -0
- package/dist/hass/extensions/call-proxy.extension.js +88 -0
- package/dist/hass/extensions/call-proxy.extension.js.map +1 -0
- package/dist/hass/extensions/entity-manager.extension.d.ts +61 -0
- package/dist/hass/extensions/entity-manager.extension.js +214 -0
- package/dist/hass/extensions/entity-manager.extension.js.map +1 -0
- package/dist/hass/extensions/fetch-api.extension.d.ts +26 -0
- package/dist/hass/extensions/fetch-api.extension.js +166 -0
- package/dist/hass/extensions/fetch-api.extension.js.map +1 -0
- package/dist/hass/extensions/index.d.ts +5 -0
- package/dist/hass/extensions/index.js +9 -0
- package/dist/hass/extensions/index.js.map +1 -0
- package/dist/hass/extensions/utilities.extension.d.ts +9 -0
- package/dist/hass/extensions/utilities.extension.js +43 -0
- package/dist/hass/extensions/utilities.extension.js.map +1 -0
- package/dist/hass/extensions/websocket-api.extension.d.ts +39 -0
- package/dist/hass/extensions/websocket-api.extension.js +363 -0
- package/dist/hass/extensions/websocket-api.extension.js.map +1 -0
- package/dist/hass/hass.module.d.ts +53 -0
- package/dist/hass/hass.module.js +59 -0
- package/dist/hass/hass.module.js.map +1 -0
- package/dist/hass/helpers/backup.helper.d.ts +11 -0
- package/dist/hass/helpers/backup.helper.js +3 -0
- package/dist/hass/helpers/backup.helper.js.map +1 -0
- package/dist/hass/helpers/constants.helper.d.ts +54 -0
- package/dist/hass/helpers/constants.helper.js +63 -0
- package/dist/hass/helpers/constants.helper.js.map +1 -0
- package/dist/hass/helpers/entity-state.helper.d.ts +45 -0
- package/dist/hass/helpers/entity-state.helper.js +9 -0
- package/dist/hass/helpers/entity-state.helper.js.map +1 -0
- package/dist/hass/helpers/fetch/calendar.d.ts +54 -0
- package/dist/hass/helpers/fetch/calendar.js +3 -0
- package/dist/hass/helpers/fetch/calendar.js.map +1 -0
- package/dist/hass/helpers/fetch/configuration.d.ts +34 -0
- package/dist/hass/helpers/fetch/configuration.js +3 -0
- package/dist/hass/helpers/fetch/configuration.js.map +1 -0
- package/dist/hass/helpers/fetch/index.d.ts +4 -0
- package/dist/hass/helpers/fetch/index.js +8 -0
- package/dist/hass/helpers/fetch/index.js.map +1 -0
- package/dist/hass/helpers/fetch/server-log.d.ts +10 -0
- package/dist/hass/helpers/fetch/server-log.js +20 -0
- package/dist/hass/helpers/fetch/server-log.js.map +1 -0
- package/dist/hass/helpers/fetch/service-list.d.ts +51 -0
- package/dist/hass/helpers/fetch/service-list.js +3 -0
- package/dist/hass/helpers/fetch/service-list.js.map +1 -0
- package/dist/hass/helpers/index.d.ts +7 -0
- package/dist/hass/helpers/index.js +11 -0
- package/dist/hass/helpers/index.js.map +1 -0
- package/dist/hass/helpers/metrics.helper.d.ts +13 -0
- package/dist/hass/helpers/metrics.helper.js +30 -0
- package/dist/hass/helpers/metrics.helper.js.map +1 -0
- package/dist/hass/helpers/utility.helper.d.ts +57 -0
- package/dist/hass/helpers/utility.helper.js +34 -0
- package/dist/hass/helpers/utility.helper.js.map +1 -0
- package/dist/hass/helpers/websocket.helper.d.ts +129 -0
- package/dist/hass/helpers/websocket.helper.js +3 -0
- package/dist/hass/helpers/websocket.helper.js.map +1 -0
- package/dist/hass/index.d.ts +4 -0
- package/dist/hass/index.js +8 -0
- package/dist/hass/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/nexus/entities.extension.d.ts +2 -0
- package/dist/nexus/entities.extension.js +51 -0
- package/dist/nexus/entities.extension.js.map +1 -0
- package/dist/nexus/main.d.ts +9 -0
- package/dist/nexus/main.js +28 -0
- package/dist/nexus/main.js.map +1 -0
- package/dist/synapse/extensions/binary-sensor.extension.d.ts +19 -0
- package/dist/synapse/extensions/binary-sensor.extension.js +84 -0
- package/dist/synapse/extensions/binary-sensor.extension.js.map +1 -0
- package/dist/synapse/extensions/button.extension.d.ts +10 -0
- package/dist/synapse/extensions/button.extension.js +46 -0
- package/dist/synapse/extensions/button.extension.js.map +1 -0
- package/dist/synapse/extensions/index.d.ts +6 -0
- package/dist/synapse/extensions/index.js +10 -0
- package/dist/synapse/extensions/index.js.map +1 -0
- package/dist/synapse/extensions/registry.extension.d.ts +21 -0
- package/dist/synapse/extensions/registry.extension.js +207 -0
- package/dist/synapse/extensions/registry.extension.js.map +1 -0
- package/dist/synapse/extensions/scene.extension.d.ts +9 -0
- package/dist/synapse/extensions/scene.extension.js +37 -0
- package/dist/synapse/extensions/scene.extension.js.map +1 -0
- package/dist/synapse/extensions/sensor.extension.d.ts +25 -0
- package/dist/synapse/extensions/sensor.extension.js +154 -0
- package/dist/synapse/extensions/sensor.extension.js.map +1 -0
- package/dist/synapse/extensions/switch.extension.d.ts +19 -0
- package/dist/synapse/extensions/switch.extension.js +95 -0
- package/dist/synapse/extensions/switch.extension.js.map +1 -0
- package/dist/synapse/helpers/device-class.helper.d.ts +323 -0
- package/dist/synapse/helpers/device-class.helper.js +241 -0
- package/dist/synapse/helpers/device-class.helper.js.map +1 -0
- package/dist/synapse/helpers/index.d.ts +3 -0
- package/dist/synapse/helpers/index.js +7 -0
- package/dist/synapse/helpers/index.js.map +1 -0
- package/dist/synapse/helpers/metrics.helper.d.ts +13 -0
- package/dist/synapse/helpers/metrics.helper.js +30 -0
- package/dist/synapse/helpers/metrics.helper.js.map +1 -0
- package/dist/synapse/helpers/utility.helper.d.ts +1 -0
- package/dist/synapse/helpers/utility.helper.js +3 -0
- package/dist/synapse/helpers/utility.helper.js.map +1 -0
- package/dist/synapse/index.d.ts +3 -0
- package/dist/synapse/index.js +7 -0
- package/dist/synapse/index.js.map +1 -0
- package/dist/synapse/synapse.module.d.ts +29 -0
- package/dist/synapse/synapse.module.js +41 -0
- package/dist/synapse/synapse.module.js.map +1 -0
- package/dist/type-writer/build.extension.d.ts +2 -0
- package/dist/type-writer/build.extension.js +53 -0
- package/dist/type-writer/build.extension.js.map +1 -0
- package/dist/type-writer/main.d.ts +17 -0
- package/dist/type-writer/main.js +36 -0
- package/dist/type-writer/main.js.map +1 -0
- package/dist/type-writer/type-writer.extension.d.ts +2 -0
- package/dist/type-writer/type-writer.extension.js +212 -0
- package/dist/type-writer/type-writer.extension.js.map +1 -0
- package/dist/utilities/extensions/index.d.ts +3 -0
- package/dist/utilities/extensions/index.js +7 -0
- package/dist/utilities/extensions/index.js.map +1 -0
- package/dist/utilities/extensions/is.extension.d.ts +38 -0
- package/dist/utilities/extensions/is.extension.js +104 -0
- package/dist/utilities/extensions/is.extension.js.map +1 -0
- package/dist/utilities/extensions/zcc-testing.extension.d.ts +4 -0
- package/dist/utilities/extensions/zcc-testing.extension.js +9 -0
- package/dist/utilities/extensions/zcc-testing.extension.js.map +1 -0
- package/dist/utilities/extensions/zcc.extension.d.ts +20 -0
- package/dist/utilities/extensions/zcc.extension.js +66 -0
- package/dist/utilities/extensions/zcc.extension.js.map +1 -0
- package/dist/utilities/helpers/async.helper.d.ts +2 -0
- package/dist/utilities/helpers/async.helper.js +26 -0
- package/dist/utilities/helpers/async.helper.js.map +1 -0
- package/dist/utilities/helpers/context.helper.d.ts +7 -0
- package/dist/utilities/helpers/context.helper.js +3 -0
- package/dist/utilities/helpers/context.helper.js.map +1 -0
- package/dist/utilities/helpers/cron.helper.d.ts +87 -0
- package/dist/utilities/helpers/cron.helper.js +92 -0
- package/dist/utilities/helpers/cron.helper.js.map +1 -0
- package/dist/utilities/helpers/extend.helper.d.ts +2 -0
- package/dist/utilities/helpers/extend.helper.js +68 -0
- package/dist/utilities/helpers/extend.helper.js.map +1 -0
- package/dist/utilities/helpers/index.d.ts +5 -0
- package/dist/utilities/helpers/index.js +9 -0
- package/dist/utilities/helpers/index.js.map +1 -0
- package/dist/utilities/helpers/utilities.helper.d.ts +63 -0
- package/dist/utilities/helpers/utilities.helper.js +93 -0
- package/dist/utilities/helpers/utilities.helper.js.map +1 -0
- package/dist/utilities/index.d.ts +2 -0
- package/dist/utilities/index.js +6 -0
- package/dist/utilities/index.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LightManager = void 0;
|
|
4
|
+
const async_1 = require("async");
|
|
5
|
+
const utilities_1 = require("../../utilities");
|
|
6
|
+
function LightManager({ logger, hass, scheduler, lifecycle, automation, config, context, }) {
|
|
7
|
+
/**
|
|
8
|
+
* Lights fall into one of the following:
|
|
9
|
+
*
|
|
10
|
+
* ### Unable to change color, only brightness
|
|
11
|
+
*
|
|
12
|
+
* Lights will be maintained at the correct brightness / state
|
|
13
|
+
*
|
|
14
|
+
* ### Able to change color temp (only)
|
|
15
|
+
*
|
|
16
|
+
* Lights will be maintained at the correct brightness & circadian color temp
|
|
17
|
+
*
|
|
18
|
+
* ### RGB (only)
|
|
19
|
+
*
|
|
20
|
+
* Will always manage brightness & state.
|
|
21
|
+
* If rgb color is passed, that will be used.
|
|
22
|
+
* Otherwise, a conversion between color temp and rgb color is done within Home Assistant to attempt to track circadian color temp
|
|
23
|
+
*
|
|
24
|
+
* ### Anything goes
|
|
25
|
+
*
|
|
26
|
+
* Same as RGB only, but will preferentially use color temp mode
|
|
27
|
+
*/
|
|
28
|
+
async function manageLight(entity, scene) {
|
|
29
|
+
const entity_id = entity.entity_id;
|
|
30
|
+
const expected = scene[entity_id];
|
|
31
|
+
if (utilities_1.is.empty(expected)) {
|
|
32
|
+
// ??
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (entity.state === "unavailable") {
|
|
36
|
+
logger.warn({ entity_id }, `entity is unavailable, cannot manage state`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const performedUpdate = await matchToScene(entity, expected);
|
|
40
|
+
if (performedUpdate) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if ("entity_id" in entity.attributes) {
|
|
44
|
+
const list = entity.attributes.entity_id;
|
|
45
|
+
if (utilities_1.is.array(list) && !utilities_1.is.empty(list)) {
|
|
46
|
+
await (0, async_1.each)(list, async (child_id) => {
|
|
47
|
+
const child = hass.entity.byId(child_id);
|
|
48
|
+
if (!child) {
|
|
49
|
+
logger.warn(`%s => %s child entity of group cannot be found`, entity_id, child_id);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await matchToScene(child, expected);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function getCurrentDiff({ attributes, }) {
|
|
58
|
+
if (!attributes.supported_color_modes.includes("color_temp")) {
|
|
59
|
+
return utilities_1.NONE;
|
|
60
|
+
}
|
|
61
|
+
const min = Math.max(config.automation.CIRCADIAN_MIN_TEMP, attributes.min_color_temp_kelvin ?? utilities_1.NONE);
|
|
62
|
+
const max = Math.min(config.automation.CIRCADIAN_MAX_TEMP, attributes.max_color_temp_kelvin ?? utilities_1.NONE);
|
|
63
|
+
const kelvin = attributes.color_temp_kelvin;
|
|
64
|
+
const target = Math.min(max, Math.max(automation.circadian.getKelvin(), min));
|
|
65
|
+
return Math.abs(kelvin - target);
|
|
66
|
+
}
|
|
67
|
+
// async function manageLightCircadian(
|
|
68
|
+
// entity: ColorLight,
|
|
69
|
+
// state: SceneLightStateOn,
|
|
70
|
+
// ): Promise<boolean> {
|
|
71
|
+
// const stateTests = {
|
|
72
|
+
// brightness: entity.attributes.brightness === state.brightness,
|
|
73
|
+
// state: entity.state === state.state,
|
|
74
|
+
// temperature: getCurrentDiff(entity) <= MAX_DIFFERENCE,
|
|
75
|
+
// };
|
|
76
|
+
// // ? Find things that don't currently match expectations
|
|
77
|
+
// const reasons = Object.keys(stateTests).filter(
|
|
78
|
+
// key => !stateTests[key as keyof typeof stateTests],
|
|
79
|
+
// );
|
|
80
|
+
// let type: AggressiveScenesAdjustmentTypes;
|
|
81
|
+
// if (!stateTests.state) {
|
|
82
|
+
// type = "light_on_off";
|
|
83
|
+
// } else if (!stateTests.brightness) {
|
|
84
|
+
// type = "light_brightness";
|
|
85
|
+
// // eslint-disable-next-line unicorn/no-negated-condition
|
|
86
|
+
// } else if (!stateTests.temperature) {
|
|
87
|
+
// type = "light_temperature";
|
|
88
|
+
// } else {
|
|
89
|
+
// return false;
|
|
90
|
+
// }
|
|
91
|
+
// logger.debug(
|
|
92
|
+
// {
|
|
93
|
+
// from: entity.attributes.color_temp_kelvin,
|
|
94
|
+
// name: entity.entity_id,
|
|
95
|
+
// reasons,
|
|
96
|
+
// state,
|
|
97
|
+
// to: automation.circadian.getKelvin(),
|
|
98
|
+
// type,
|
|
99
|
+
// },
|
|
100
|
+
// `setting light {temperature}`,
|
|
101
|
+
// );
|
|
102
|
+
// await hass.call.light.turn_on({
|
|
103
|
+
// brightness: state.brightness,
|
|
104
|
+
// entity_id: entity.entity_id,
|
|
105
|
+
// kelvin: automation.circadian.getKelvin(),
|
|
106
|
+
// });
|
|
107
|
+
// return true;
|
|
108
|
+
// }
|
|
109
|
+
/**
|
|
110
|
+
* Take in the expected color state of a light, and compare against actual
|
|
111
|
+
*
|
|
112
|
+
* If they don't match, then issue a `turn_on` call, and log a message
|
|
113
|
+
*/
|
|
114
|
+
async function manageLightColor(entity, state) {
|
|
115
|
+
const stateTests = {
|
|
116
|
+
brightness: entity.attributes.brightness == state.brightness,
|
|
117
|
+
color: entity.attributes.rgb_color.every((color, index) => state.rgb_color[[..."rgb"][index]] ===
|
|
118
|
+
color),
|
|
119
|
+
state: entity.state === "off",
|
|
120
|
+
};
|
|
121
|
+
// ? Find things that don't currently match expectations
|
|
122
|
+
const reasons = Object.keys(stateTests).filter(key => !stateTests[key]);
|
|
123
|
+
let type;
|
|
124
|
+
if (stateTests.state) {
|
|
125
|
+
type = "light_on_off";
|
|
126
|
+
}
|
|
127
|
+
else if (stateTests.brightness) {
|
|
128
|
+
type = "light_brightness";
|
|
129
|
+
// eslint-disable-next-line unicorn/no-negated-condition
|
|
130
|
+
}
|
|
131
|
+
else if (!stateTests.color) {
|
|
132
|
+
type = "light_color";
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
logger.debug({
|
|
138
|
+
entity_id: entity.entity_id,
|
|
139
|
+
reasons,
|
|
140
|
+
rgb_color: state.rgb_color,
|
|
141
|
+
type,
|
|
142
|
+
}, `setting light color`);
|
|
143
|
+
await hass.call.light.turn_on({
|
|
144
|
+
brightness: state.brightness,
|
|
145
|
+
entity_id: entity.entity_id,
|
|
146
|
+
rgb_color: state.rgb_color,
|
|
147
|
+
});
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* ? return true if a change was made
|
|
152
|
+
*
|
|
153
|
+
* ? return false if everything is as expected
|
|
154
|
+
*/
|
|
155
|
+
async function matchToScene(entity, expected) {
|
|
156
|
+
const entity_id = entity.entity_id;
|
|
157
|
+
if (expected.state === "off") {
|
|
158
|
+
if (entity.state === "on") {
|
|
159
|
+
logger.debug({ entity_id }, `on => off`);
|
|
160
|
+
await hass.call.light.turn_off({ entity_id });
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
if ("rgb_color" in expected) {
|
|
166
|
+
return await manageLightColor(entity, expected);
|
|
167
|
+
}
|
|
168
|
+
return true;
|
|
169
|
+
// // TODO this technically overlaps with the big cron below, needs attention
|
|
170
|
+
// // Something should be done about the inefficiency of 2 overlapping processes like this
|
|
171
|
+
// // It could end up with multiple service calls in flight unnecessarily
|
|
172
|
+
// // Each of these processes individually throttles itself fine, but when a change of scene happens
|
|
173
|
+
// // it can end up with the light rapidly changing and sticking in the wrong spot until one of these
|
|
174
|
+
// // schedules runs again.
|
|
175
|
+
// return await manageLightCircadian(
|
|
176
|
+
// entity as unknown as ColorLight,
|
|
177
|
+
// expected,
|
|
178
|
+
// );
|
|
179
|
+
}
|
|
180
|
+
const rooms = new Set();
|
|
181
|
+
function buildLightList() {
|
|
182
|
+
// * Produce a list of lights that are supposed to be turned on
|
|
183
|
+
// > Source from the active scene in each loaded room
|
|
184
|
+
const lightsToCheck = utilities_1.is.unique([...rooms.values()].flatMap(room => {
|
|
185
|
+
const current = room.currentSceneDefinition?.definition;
|
|
186
|
+
if (!current) {
|
|
187
|
+
// ? Room set to invalid scene
|
|
188
|
+
// Notice already being emitted from room extension
|
|
189
|
+
return [];
|
|
190
|
+
}
|
|
191
|
+
return Object.keys(room.currentSceneDefinition.definition).filter(key => {
|
|
192
|
+
if (!utilities_1.is.domain(key, "light")) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
// TODO: Introduce additional checks for items like rgb color
|
|
196
|
+
return room.currentSceneDefinition.definition[key].state !== "off";
|
|
197
|
+
});
|
|
198
|
+
}));
|
|
199
|
+
// * Calculate how off the light is, omit ones that within tolerance, sort list by difference
|
|
200
|
+
return lightsToCheck
|
|
201
|
+
.map(light => ({
|
|
202
|
+
diff: getCurrentDiff(hass.entity.byId(light)),
|
|
203
|
+
light,
|
|
204
|
+
}))
|
|
205
|
+
.filter(({ diff }) => diff >= config.automation.CIRCADIAN_DIFF_THRESHOLD)
|
|
206
|
+
.sort((a, b) => (a.diff > b.diff ? utilities_1.UP : utilities_1.DOWN));
|
|
207
|
+
}
|
|
208
|
+
// # Light temperature adjustments
|
|
209
|
+
// - seek out all lights that are turned on / tracking light temp
|
|
210
|
+
// - sort by how off target they are
|
|
211
|
+
// - adjust them at a relatively constant rate until all have been called
|
|
212
|
+
// - start over every 30 s
|
|
213
|
+
// ~ if a new iteration starts before the previous one finishes:
|
|
214
|
+
// ~ the previous is halted and a warning is emitted
|
|
215
|
+
//
|
|
216
|
+
// Could be too many lights, or long response times. Depends on individual setup
|
|
217
|
+
lifecycle.onPostConfig(() => {
|
|
218
|
+
if (!config.automation.CIRCADIAN_ENABLED) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
logger.debug(`setting up light adjustment cron`);
|
|
222
|
+
let earlyStop;
|
|
223
|
+
scheduler.cron({
|
|
224
|
+
context,
|
|
225
|
+
exec: async () => {
|
|
226
|
+
let stopped = false;
|
|
227
|
+
if (earlyStop) {
|
|
228
|
+
earlyStop();
|
|
229
|
+
}
|
|
230
|
+
const list = buildLightList();
|
|
231
|
+
let complete = utilities_1.NONE;
|
|
232
|
+
earlyStop = () => {
|
|
233
|
+
logger.warn({ complete, total: list.length }, `light temperature adjustment not complete yet`);
|
|
234
|
+
stopped = true;
|
|
235
|
+
earlyStop = undefined;
|
|
236
|
+
};
|
|
237
|
+
await (0, async_1.eachLimit)(list, config.automation.CIRCADIAN_RATE, async ({ light, diff }) => {
|
|
238
|
+
if (stopped) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
logger.trace({ diff, name: light }, `adjusting light temperature`);
|
|
242
|
+
await hass.call.light.turn_on({
|
|
243
|
+
entity_id: light,
|
|
244
|
+
kelvin: automation.circadian.getKelvin(),
|
|
245
|
+
});
|
|
246
|
+
complete++;
|
|
247
|
+
await (0, utilities_1.sleep)(config.automation.CIRCADIAN_THROTTLE);
|
|
248
|
+
});
|
|
249
|
+
earlyStop = undefined;
|
|
250
|
+
},
|
|
251
|
+
schedule: utilities_1.CronExpression.EVERY_30_SECONDS,
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
return {
|
|
255
|
+
manageLight,
|
|
256
|
+
registerRoom: (room) => rooms.add(room),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
exports.LightManager = LightManager;
|
|
260
|
+
//# sourceMappingURL=light-manager.extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"light-manager.extension.js","sourceRoot":"","sources":["../../../src/automation/extensions/light-manager.extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { TServiceParams } from "../../boilerplate";
|
|
2
|
+
import { ManagedSwitchOptions } from "../helpers";
|
|
3
|
+
export declare function ManagedSwitch({ logger, hass, scheduler }: TServiceParams): ({ context, entity_id, schedule, shouldBeOn, onUpdate, }: ManagedSwitchOptions) => void;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ManagedSwitch = void 0;
|
|
4
|
+
const utilities_1 = require("../../utilities");
|
|
5
|
+
function ManagedSwitch({ logger, hass, scheduler }) {
|
|
6
|
+
/**
|
|
7
|
+
* Logic runner for the state enforcer
|
|
8
|
+
*/
|
|
9
|
+
async function updateEntities(current, switches, context) {
|
|
10
|
+
// ? Bail out if no action can be taken
|
|
11
|
+
if (!hass.socket.getConnectionActive()) {
|
|
12
|
+
logger.warn({ context }, `Skipping state enforce attempt, socket not available`);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
// Annotation can be used on property getter, or directly on a plain property (that some other logic updates)
|
|
16
|
+
const action = current ? "turn_on" : "turn_off";
|
|
17
|
+
const entity_id = [switches]
|
|
18
|
+
.flat()
|
|
19
|
+
.map(i => (utilities_1.is.string(i) ? i : i.entity_id));
|
|
20
|
+
const shouldExecute = entity_id.some(id => !action.includes(hass.entity.byId(id)?.state?.toLocaleLowerCase()));
|
|
21
|
+
if (!shouldExecute) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// * Notify and execute!
|
|
25
|
+
if (entity_id.length === utilities_1.SINGLE) {
|
|
26
|
+
logger.debug({ name: entity_id }, action);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
logger.debug({ action, entity_id });
|
|
30
|
+
}
|
|
31
|
+
await hass.call.switch[action]({ entity_id });
|
|
32
|
+
}
|
|
33
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
34
|
+
function ManageSwitch({ context, entity_id, schedule = utilities_1.CronExpression.EVERY_MINUTE, shouldBeOn, onUpdate = [], }) {
|
|
35
|
+
logger.trace({ context, entity_id }, `setting up managed switch`);
|
|
36
|
+
const entityList = utilities_1.is.array(entity_id) ? entity_id : [entity_id];
|
|
37
|
+
// * Check if there should be a change
|
|
38
|
+
const update = async () => {
|
|
39
|
+
const expected = shouldBeOn();
|
|
40
|
+
if (!utilities_1.is.boolean(expected)) {
|
|
41
|
+
if (!utilities_1.is.undefined(expected)) {
|
|
42
|
+
logger.error({ context, entity_id, expected }, `Invalid value from switch manage function`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
await updateEntities(expected, entityList, context);
|
|
48
|
+
};
|
|
49
|
+
// * Always run on a schedule
|
|
50
|
+
scheduler.cron({ context, exec: async () => await update(), schedule });
|
|
51
|
+
// * Update when relevant things update
|
|
52
|
+
if (!utilities_1.is.empty(onUpdate)) {
|
|
53
|
+
[onUpdate].flat().forEach(i => {
|
|
54
|
+
if (utilities_1.is.object(i) && !("entity_id" in i)) {
|
|
55
|
+
const onUpdate = i.onUpdate;
|
|
56
|
+
if (!utilities_1.is.function(onUpdate)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
i.onUpdate(async () => {
|
|
60
|
+
await update();
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
hass.entity
|
|
65
|
+
.byId(utilities_1.is.object(i) ? i.entity_id : i)
|
|
66
|
+
.onUpdate(async () => await update());
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return ManageSwitch;
|
|
71
|
+
}
|
|
72
|
+
exports.ManagedSwitch = ManagedSwitch;
|
|
73
|
+
//# sourceMappingURL=managed-switch.extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"managed-switch.extension.js","sourceRoot":"","sources":["../../../src/automation/extensions/managed-switch.extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TServiceParams } from "../..";
|
|
2
|
+
import { PICK_ENTITY } from "../../hass";
|
|
3
|
+
import { VirtualSensor } from "../../synapse";
|
|
4
|
+
import { RoomConfiguration, RoomScene } from "..";
|
|
5
|
+
export type RoomDefinition<SCENES extends string = string> = {
|
|
6
|
+
scene: SCENES;
|
|
7
|
+
currentSceneDefinition: RoomScene;
|
|
8
|
+
currentSceneEntity: VirtualSensor<SCENES>;
|
|
9
|
+
sceneId: (scene: SCENES) => PICK_ENTITY<"scene">;
|
|
10
|
+
};
|
|
11
|
+
export declare function Room({ logger, hass, synapse, scheduler, automation, context: parentContext, }: TServiceParams): <SCENES extends string>({ name, context, scenes, }: RoomConfiguration<SCENES>) => RoomDefinition<SCENES>;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Room = void 0;
|
|
4
|
+
const async_1 = require("async");
|
|
5
|
+
const __1 = require("../..");
|
|
6
|
+
function Room({ logger, hass, synapse, scheduler, automation, context: parentContext, }) {
|
|
7
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
8
|
+
return function ({ name, context, scenes, }) {
|
|
9
|
+
logger.info({ name }, `create room`);
|
|
10
|
+
const SCENE_LIST = Object.keys(scenes);
|
|
11
|
+
const sensorName = `${name} current scene`;
|
|
12
|
+
const currentScene = synapse.sensor({
|
|
13
|
+
context,
|
|
14
|
+
name: sensorName,
|
|
15
|
+
});
|
|
16
|
+
function restoreFromEntity() {
|
|
17
|
+
const importedValue = hass.entity.byId(__1.ZCC.toHassId("sensor", sensorName))
|
|
18
|
+
.state;
|
|
19
|
+
const current = currentScene.state;
|
|
20
|
+
if (__1.is.empty(current) && !SCENE_LIST.includes(importedValue)) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
currentScene.state = importedValue;
|
|
24
|
+
return importedValue;
|
|
25
|
+
}
|
|
26
|
+
scheduler.cron({
|
|
27
|
+
context,
|
|
28
|
+
exec: async () => {
|
|
29
|
+
let current = currentScene.state;
|
|
30
|
+
if (!SCENE_LIST.includes(current)) {
|
|
31
|
+
current = restoreFromEntity();
|
|
32
|
+
if (!SCENE_LIST.includes(current)) {
|
|
33
|
+
logger.warn({ name, scene: current || "(empty string)" }, `room is set to an invalid scene`);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
logger.debug({ current, name: sensorName }, `imported value restore`);
|
|
37
|
+
}
|
|
38
|
+
await automation.aggressive.validateRoomScene({
|
|
39
|
+
context,
|
|
40
|
+
name: current,
|
|
41
|
+
room: name,
|
|
42
|
+
scene: scenes[current],
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
schedule: __1.CronExpression.EVERY_30_SECONDS,
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Should circadian if:
|
|
49
|
+
* - auto circadian is not disabled
|
|
50
|
+
* - is a light, that is currently on
|
|
51
|
+
* - the light was recently turned off (<5s)
|
|
52
|
+
*/
|
|
53
|
+
function shouldCircadian(entity_id, target) {
|
|
54
|
+
if (!__1.is.domain(entity_id, "light")) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (!__1.is.empty(target) && target !== "on") {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
const current = (scenes[currentScene.state] ?? {});
|
|
61
|
+
const definition = current.definition;
|
|
62
|
+
if (entity_id in definition) {
|
|
63
|
+
const state = definition[entity_id];
|
|
64
|
+
return Object.keys(state).every(i => ["state", "brightness"].includes(i));
|
|
65
|
+
}
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
function dynamicProperties(sceneName) {
|
|
69
|
+
const item = scenes[sceneName];
|
|
70
|
+
const definition = item.definition;
|
|
71
|
+
const entities = Object.keys(item.definition);
|
|
72
|
+
const kelvin = automation.circadian.getKelvin();
|
|
73
|
+
const list = entities
|
|
74
|
+
.map(name => {
|
|
75
|
+
const value = definition[name];
|
|
76
|
+
if (__1.is.domain(name, "switch")) {
|
|
77
|
+
return [name, value];
|
|
78
|
+
}
|
|
79
|
+
if (!__1.is.domain(name, "light")) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
if (!shouldCircadian(name, value?.state)) {
|
|
83
|
+
return [name, value];
|
|
84
|
+
}
|
|
85
|
+
return [name, { kelvin, ...value }];
|
|
86
|
+
})
|
|
87
|
+
.filter(i => !__1.is.undefined(i));
|
|
88
|
+
return {
|
|
89
|
+
lights: Object.fromEntries(list.filter(i => !__1.is.undefined(i[__1.VALUE].kelvin))),
|
|
90
|
+
scene: Object.fromEntries(list.filter(i => __1.is.undefined(i[__1.VALUE].kelvin))),
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
async function sceneApply(sceneName) {
|
|
94
|
+
const { scene, lights } = dynamicProperties(sceneName);
|
|
95
|
+
// Send most things through the expected scene apply
|
|
96
|
+
// Send requests to set lights to a specific temperature through the `light.turn_on` call
|
|
97
|
+
await Promise.all([
|
|
98
|
+
// Normal scene set
|
|
99
|
+
new Promise(async (done) => {
|
|
100
|
+
if (!__1.is.empty(scene)) {
|
|
101
|
+
await hass.call.scene.apply({
|
|
102
|
+
entities: scene,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
done();
|
|
106
|
+
}),
|
|
107
|
+
// Set lights to current color temp
|
|
108
|
+
new Promise(async (done) => {
|
|
109
|
+
await (0, async_1.eachSeries)(Object.keys(lights), async (entity_id) => {
|
|
110
|
+
const change = lights[entity_id];
|
|
111
|
+
await hass.call.light.turn_on({
|
|
112
|
+
brightness: change.brightness,
|
|
113
|
+
entity_id,
|
|
114
|
+
kelvin: change.kelvin,
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
done();
|
|
118
|
+
}),
|
|
119
|
+
]);
|
|
120
|
+
}
|
|
121
|
+
async function setScene(sceneName) {
|
|
122
|
+
// ensure not garbage inputs
|
|
123
|
+
if (!__1.is.string(sceneName) || !__1.is.object(scenes[sceneName])) {
|
|
124
|
+
throw new __1.InternalError(parentContext, "INVALID_SCENE", `scene does not exist on room ${name}`);
|
|
125
|
+
}
|
|
126
|
+
logger.info({ name }, `set scene {%s}`, sceneName);
|
|
127
|
+
currentScene.state = sceneName;
|
|
128
|
+
await sceneApply(sceneName);
|
|
129
|
+
}
|
|
130
|
+
SCENE_LIST.forEach(scene => {
|
|
131
|
+
const sceneName = `${name} ${scene}`;
|
|
132
|
+
synapse.scene({
|
|
133
|
+
context,
|
|
134
|
+
exec: async () => {
|
|
135
|
+
logger.trace({ name: sceneName }, `scene activate`);
|
|
136
|
+
await setScene(scene);
|
|
137
|
+
},
|
|
138
|
+
name: sceneName,
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
const out = new Proxy({}, {
|
|
142
|
+
get: (_, property) => {
|
|
143
|
+
if (property === "scene") {
|
|
144
|
+
return currentScene.state;
|
|
145
|
+
}
|
|
146
|
+
if (property === "sceneId") {
|
|
147
|
+
return (scene) => {
|
|
148
|
+
return __1.ZCC.toHassId("scene", name, scene);
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (property === "currentSceneEntity") {
|
|
152
|
+
return currentScene;
|
|
153
|
+
}
|
|
154
|
+
if (property === "currentSceneDefinition") {
|
|
155
|
+
return scenes[currentScene.state];
|
|
156
|
+
}
|
|
157
|
+
return undefined;
|
|
158
|
+
},
|
|
159
|
+
set: (_, property, value) => {
|
|
160
|
+
if (property === "scene") {
|
|
161
|
+
setImmediate(async () =>
|
|
162
|
+
// ? This way adds a network hop, allows hass to create a logbook entry for the call
|
|
163
|
+
await hass.call.scene.turn_on({
|
|
164
|
+
entity_id: __1.ZCC.toHassId("scene", name, value),
|
|
165
|
+
}));
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
logger.error({ property }, `cannot set property on room`);
|
|
169
|
+
return false;
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
// FIXME: This casting shouldn't be needed, why is string not assignable to string?
|
|
173
|
+
// No idea, but I spent 30 minutes trying to figure it out, and I'm really mad at it
|
|
174
|
+
automation.light.registerRoom(out);
|
|
175
|
+
return out;
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
exports.Room = Room;
|
|
179
|
+
//# sourceMappingURL=room.extension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room.extension.js","sourceRoot":"","sources":["../../../src/automation/extensions/room.extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { TServiceParams } from "../../boilerplate";
|
|
2
|
+
import { SequenceWatchOptions } from "..";
|
|
3
|
+
export declare function SequenceWatcher({ logger, hass, config }: TServiceParams): <DATA extends object = object, MATCH extends string = string>(data: SequenceWatchOptions<DATA, MATCH>) => () => void;
|