From ba70439a8cdeb45d1bf877c4ff1a889b884abace Mon Sep 17 00:00:00 2001 From: Zoe Date: Fri, 7 Jun 2024 16:30:41 -0500 Subject: [PATCH] improved compat with synapse switches (#11) --- package-lock.json | 32 ++++----- package.json | 8 +-- src/extensions/managed-switch.extension.ts | 79 ++++++++++++---------- src/helpers/managed-switch.helper.ts | 10 ++- 4 files changed, 71 insertions(+), 58 deletions(-) diff --git a/package-lock.json b/package-lock.json index 71f2600..c9ac872 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,17 +1,17 @@ { "name": "@digital-alchemy/automation", - "version": "0.3.7", + "version": "0.3.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@digital-alchemy/automation", - "version": "0.3.7", + "version": "0.3.9", "license": "MIT", "dependencies": { - "@digital-alchemy/core": "^0.3.16", - "@digital-alchemy/hass": "^0.3.30", - "@digital-alchemy/synapse": "^0.3.6", + "@digital-alchemy/core": "^0.3.17", + "@digital-alchemy/hass": "^0.3.31", + "@digital-alchemy/synapse": "^0.3.8", "dayjs": "^1.11.10", "prom-client": "^15.1.1" }, @@ -1170,9 +1170,9 @@ } }, "node_modules/@digital-alchemy/core": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/@digital-alchemy/core/-/core-0.3.16.tgz", - "integrity": "sha512-O8OwY23US1eCKRut2cs1KD6C3bAQ9m7/G16mqWp6E8EDMB7Hoj5kMxSjJdsKj7PNHtXEnxIUCknZWmvZtzpv3w==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@digital-alchemy/core/-/core-0.3.17.tgz", + "integrity": "sha512-GjWigpJ5v8I78jn+w6GFGeH4KrBblBW1PZ2FBj96KKCPTc+ipPFWLkTeyHXD/61xesgGfVNfD8xHnU4WqQfHJg==", "dependencies": { "chalk": "^5.3.0", "dayjs": "^1.11.10", @@ -1208,9 +1208,9 @@ } }, "node_modules/@digital-alchemy/hass": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@digital-alchemy/hass/-/hass-0.3.30.tgz", - "integrity": "sha512-13MnEoSWSx51b56XrkJ2rMi+WQZa9tOEr0VvP1bag/8cypqUy1saq3Xn7pG4s+J60y5tDFc3amikOq17mcH/vw==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@digital-alchemy/hass/-/hass-0.3.31.tgz", + "integrity": "sha512-vRTiFTAUeuHrYucK0OIu4onYGuYLoMj70kZPFDjRbWxsXhZA2jf++8X99ULnkd8e+JEj12kyRg3f4dTVDBF6Jw==", "dependencies": { "@digital-alchemy/core": "^0.3.15", "dayjs": "^1.11.11", @@ -1225,13 +1225,13 @@ } }, "node_modules/@digital-alchemy/synapse": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@digital-alchemy/synapse/-/synapse-0.3.6.tgz", - "integrity": "sha512-tS92KR7P08XjXKj0atsnMz4vVaaTe6s5plCMBRcvsMJGdQHwTJ0MLs7Wa0n5tZo8xCJVIM8kXE3EkZSEH8zn4A==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@digital-alchemy/synapse/-/synapse-0.3.8.tgz", + "integrity": "sha512-J6W6AE/Nyxlk5lzEtx2DXg5WEkN0qjaUf6bJcVhb956cx2O8KADBjhJ4ZkBKUWk1WUdlql1Klb4iam1qbEDEHg==", "dependencies": { - "@digital-alchemy/core": "^0.3.16", + "@digital-alchemy/core": "^0.3.17", "@digital-alchemy/fastify-extension": "^0.3.3", - "@digital-alchemy/hass": "^0.3.30", + "@digital-alchemy/hass": "^0.3.31", "bonjour": "^3.5.0", "dayjs": "^1.11.11" }, diff --git a/package.json b/package.json index 4d007b4..3ca60be 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@digital-alchemy/automation", "repository": "https://github.com/Digital-Alchemy-TS/automation", "homepage": "https://docs.digital-alchemy.app/Automation", - "version": "0.3.9", + "version": "0.3.10", "scripts": { "build": "rm -rf dist/; tsc", "lint": "eslint src", @@ -25,9 +25,9 @@ }, "license": "MIT", "dependencies": { - "@digital-alchemy/core": "^0.3.16", - "@digital-alchemy/hass": "^0.3.30", - "@digital-alchemy/synapse": "^0.3.6", + "@digital-alchemy/core": "^0.3.17", + "@digital-alchemy/hass": "^0.3.31", + "@digital-alchemy/synapse": "^0.3.8", "dayjs": "^1.11.10", "prom-client": "^15.1.1" }, diff --git a/src/extensions/managed-switch.extension.ts b/src/extensions/managed-switch.extension.ts index 0773fa2..57b357f 100644 --- a/src/extensions/managed-switch.extension.ts +++ b/src/extensions/managed-switch.extension.ts @@ -8,7 +8,12 @@ import { import { ManagedSwitchOptions, PickASwitch } from "../helpers"; -export function ManagedSwitch({ logger, hass, scheduler }: TServiceParams) { +export function ManagedSwitch({ + logger, + hass, + scheduler, + lifecycle, +}: TServiceParams) { /** * Logic runner for the state enforcer */ @@ -54,49 +59,49 @@ export function ManagedSwitch({ logger, hass, scheduler }: TServiceParams) { shouldBeOn, onUpdate = [], }: ManagedSwitchOptions) { - logger.trace( - { context, entity_id, name: ManageSwitch }, - `setting up managed switch`, - ); - const entityList = is.array(entity_id) ? entity_id : [entity_id]; + lifecycle.onReady(() => { + logger.trace( + { context, entity_id, name: ManageSwitch }, + `setting up managed switch`, + ); + const entityList = is.array(entity_id) ? entity_id : [entity_id]; - // * Check if there should be a change - const update = async () => { - const expected = shouldBeOn(); - if (!is.boolean(expected)) { - if (!is.undefined(expected)) { - logger.error( - { context, entity_id, expected, name: ManageSwitch }, - `Invalid value from switch manage function`, - ); + // * Check if there should be a change + const update = async () => { + const expected = shouldBeOn(); + if (!is.boolean(expected)) { + if (!is.undefined(expected)) { + logger.error( + { context, entity_id, expected, name: ManageSwitch }, + `Invalid value from switch manage function`, + ); + return; + } return; } - return; - } - await updateEntities(expected, entityList, context); - }; + await updateEntities(expected, entityList, context); + }; - // * Always run on a schedule - scheduler.cron({ exec: async () => await update(), schedule }); + // * Always run on a schedule + scheduler.cron({ exec: async () => await update(), schedule }); - // * Update when relevant things update - if (!is.empty(onUpdate)) { - [onUpdate].flat().forEach(i => { - if (is.object(i) && !("entity_id" in i)) { - const onUpdate = i.onUpdate; - if (!is.function(onUpdate)) { + // * Update when relevant things update + if (!is.empty(onUpdate)) { + [onUpdate].flat().forEach(i => { + if (is.object(i) && !("entity_id" in i)) { + const onUpdate = i.onUpdate; + if (!is.function(onUpdate)) { + return; + } + i.onUpdate(async () => await update()); return; } - i.onUpdate(async () => { - await update(); - }); - return; - } - hass.entity - .byId(is.object(i) ? i.entity_id : i) - .onUpdate(async () => await update()); - }); - } + hass.entity + .byId(is.object(i) ? i.entity_id : i) + .onUpdate(async () => await update()); + }); + } + }); } return ManageSwitch; } diff --git a/src/helpers/managed-switch.helper.ts b/src/helpers/managed-switch.helper.ts index 029b8be..78fbd9a 100644 --- a/src/helpers/managed-switch.helper.ts +++ b/src/helpers/managed-switch.helper.ts @@ -4,12 +4,20 @@ import { PICK_ENTITY } from "@digital-alchemy/hass"; export type PickASwitch = | PICK_ENTITY<"switch"> | { entity_id: PICK_ENTITY<"switch"> }; + type EntityUpdate = | PICK_ENTITY | { entity_id: PICK_ENTITY } | { onUpdate: (callback: () => TBlackHole) => void; - state: unknown; + /** + * Hass entity compat + */ + state?: unknown; + /** + * Synapse entity compat + */ + is_on?: boolean; name: string; };