@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.
Files changed (303) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/automation/automation.module.d.ts +61 -0
  4. package/dist/automation/automation.module.js +70 -0
  5. package/dist/automation/automation.module.js.map +1 -0
  6. package/dist/automation/extensions/aggressive-scenes.extension.d.ts +22 -0
  7. package/dist/automation/extensions/aggressive-scenes.extension.js +125 -0
  8. package/dist/automation/extensions/aggressive-scenes.extension.js.map +1 -0
  9. package/dist/automation/extensions/circadian.extension.d.ts +11 -0
  10. package/dist/automation/extensions/circadian.extension.js +87 -0
  11. package/dist/automation/extensions/circadian.extension.js.map +1 -0
  12. package/dist/automation/extensions/index.d.ts +7 -0
  13. package/dist/automation/extensions/index.js +11 -0
  14. package/dist/automation/extensions/index.js.map +1 -0
  15. package/dist/automation/extensions/light-manager.extension.d.ts +26 -0
  16. package/dist/automation/extensions/light-manager.extension.js +260 -0
  17. package/dist/automation/extensions/light-manager.extension.js.map +1 -0
  18. package/dist/automation/extensions/managed-switch.extension.d.ts +3 -0
  19. package/dist/automation/extensions/managed-switch.extension.js +73 -0
  20. package/dist/automation/extensions/managed-switch.extension.js.map +1 -0
  21. package/dist/automation/extensions/room.extension.d.ts +11 -0
  22. package/dist/automation/extensions/room.extension.js +179 -0
  23. package/dist/automation/extensions/room.extension.js.map +1 -0
  24. package/dist/automation/extensions/sequence-matcher.extension.d.ts +3 -0
  25. package/dist/automation/extensions/sequence-matcher.extension.js +126 -0
  26. package/dist/automation/extensions/sequence-matcher.extension.js.map +1 -0
  27. package/dist/automation/extensions/solar-calc.extension.d.ts +20 -0
  28. package/dist/automation/extensions/solar-calc.extension.js +105 -0
  29. package/dist/automation/extensions/solar-calc.extension.js.map +1 -0
  30. package/dist/automation/helpers/events.helper.d.ts +33 -0
  31. package/dist/automation/helpers/events.helper.js +14 -0
  32. package/dist/automation/helpers/events.helper.js.map +1 -0
  33. package/dist/automation/helpers/index.d.ts +7 -0
  34. package/dist/automation/helpers/index.js +11 -0
  35. package/dist/automation/helpers/index.js.map +1 -0
  36. package/dist/automation/helpers/managed-switch.helper.d.ts +41 -0
  37. package/dist/automation/helpers/managed-switch.helper.js +3 -0
  38. package/dist/automation/helpers/managed-switch.helper.js.map +1 -0
  39. package/dist/automation/helpers/metrics.helper.d.ts +13 -0
  40. package/dist/automation/helpers/metrics.helper.js +30 -0
  41. package/dist/automation/helpers/metrics.helper.js.map +1 -0
  42. package/dist/automation/helpers/reftimes.helper.d.ts +54 -0
  43. package/dist/automation/helpers/reftimes.helper.js +33 -0
  44. package/dist/automation/helpers/reftimes.helper.js.map +1 -0
  45. package/dist/automation/helpers/scene.helper.d.ts +97 -0
  46. package/dist/automation/helpers/scene.helper.js +5 -0
  47. package/dist/automation/helpers/scene.helper.js.map +1 -0
  48. package/dist/automation/helpers/sequence.helper.d.ts +55 -0
  49. package/dist/automation/helpers/sequence.helper.js +3 -0
  50. package/dist/automation/helpers/sequence.helper.js.map +1 -0
  51. package/dist/automation/helpers/solar.helper.d.ts +3 -0
  52. package/dist/automation/helpers/solar.helper.js +262 -0
  53. package/dist/automation/helpers/solar.helper.js.map +1 -0
  54. package/dist/automation/index.d.ts +3 -0
  55. package/dist/automation/index.js +10 -0
  56. package/dist/automation/index.js.map +1 -0
  57. package/dist/boilerplate/extensions/cache.extension.d.ts +24 -0
  58. package/dist/boilerplate/extensions/cache.extension.js +96 -0
  59. package/dist/boilerplate/extensions/cache.extension.js.map +1 -0
  60. package/dist/boilerplate/extensions/configuration.extension.d.ts +23 -0
  61. package/dist/boilerplate/extensions/configuration.extension.js +98 -0
  62. package/dist/boilerplate/extensions/configuration.extension.js.map +1 -0
  63. package/dist/boilerplate/extensions/fetch.extension.d.ts +20 -0
  64. package/dist/boilerplate/extensions/fetch.extension.js +154 -0
  65. package/dist/boilerplate/extensions/fetch.extension.js.map +1 -0
  66. package/dist/boilerplate/extensions/index.d.ts +6 -0
  67. package/dist/boilerplate/extensions/index.js +10 -0
  68. package/dist/boilerplate/extensions/index.js.map +1 -0
  69. package/dist/boilerplate/extensions/logger.extension.d.ts +39 -0
  70. package/dist/boilerplate/extensions/logger.extension.js +159 -0
  71. package/dist/boilerplate/extensions/logger.extension.js.map +1 -0
  72. package/dist/boilerplate/extensions/scheduler.extension.d.ts +21 -0
  73. package/dist/boilerplate/extensions/scheduler.extension.js +117 -0
  74. package/dist/boilerplate/extensions/scheduler.extension.js.map +1 -0
  75. package/dist/boilerplate/extensions/wiring.extension.d.ts +101 -0
  76. package/dist/boilerplate/extensions/wiring.extension.js +452 -0
  77. package/dist/boilerplate/extensions/wiring.extension.js.map +1 -0
  78. package/dist/boilerplate/helpers/cache-memory.helper.d.ts +7 -0
  79. package/dist/boilerplate/helpers/cache-memory.helper.js +65 -0
  80. package/dist/boilerplate/helpers/cache-memory.helper.js.map +1 -0
  81. package/dist/boilerplate/helpers/cache-redis.helper.d.ts +7 -0
  82. package/dist/boilerplate/helpers/cache-redis.helper.js +69 -0
  83. package/dist/boilerplate/helpers/cache-redis.helper.js.map +1 -0
  84. package/dist/boilerplate/helpers/config-environment-loader.helper.d.ts +2 -0
  85. package/dist/boilerplate/helpers/config-environment-loader.helper.js +56 -0
  86. package/dist/boilerplate/helpers/config-environment-loader.helper.js.map +1 -0
  87. package/dist/boilerplate/helpers/config-file-loader.helper.d.ts +4 -0
  88. package/dist/boilerplate/helpers/config-file-loader.helper.js +87 -0
  89. package/dist/boilerplate/helpers/config-file-loader.helper.js.map +1 -0
  90. package/dist/boilerplate/helpers/config.helper.d.ts +102 -0
  91. package/dist/boilerplate/helpers/config.helper.js +32 -0
  92. package/dist/boilerplate/helpers/config.helper.js.map +1 -0
  93. package/dist/boilerplate/helpers/errors.helper.d.ts +39 -0
  94. package/dist/boilerplate/helpers/errors.helper.js +76 -0
  95. package/dist/boilerplate/helpers/errors.helper.js.map +1 -0
  96. package/dist/boilerplate/helpers/events.helper.d.ts +3 -0
  97. package/dist/boilerplate/helpers/events.helper.js +11 -0
  98. package/dist/boilerplate/helpers/events.helper.js.map +1 -0
  99. package/dist/boilerplate/helpers/fetch.helper.d.ts +170 -0
  100. package/dist/boilerplate/helpers/fetch.helper.js +173 -0
  101. package/dist/boilerplate/helpers/fetch.helper.js.map +1 -0
  102. package/dist/boilerplate/helpers/index.d.ts +12 -0
  103. package/dist/boilerplate/helpers/index.js +16 -0
  104. package/dist/boilerplate/helpers/index.js.map +1 -0
  105. package/dist/boilerplate/helpers/lifecycle.helper.d.ts +43 -0
  106. package/dist/boilerplate/helpers/lifecycle.helper.js +13 -0
  107. package/dist/boilerplate/helpers/lifecycle.helper.js.map +1 -0
  108. package/dist/boilerplate/helpers/metrics.helper.d.ts +73 -0
  109. package/dist/boilerplate/helpers/metrics.helper.js +141 -0
  110. package/dist/boilerplate/helpers/metrics.helper.js.map +1 -0
  111. package/dist/boilerplate/helpers/testing.helper.d.ts +13 -0
  112. package/dist/boilerplate/helpers/testing.helper.js +91 -0
  113. package/dist/boilerplate/helpers/testing.helper.js.map +1 -0
  114. package/dist/boilerplate/helpers/wiring.helper.d.ts +155 -0
  115. package/dist/boilerplate/helpers/wiring.helper.js +5 -0
  116. package/dist/boilerplate/helpers/wiring.helper.js.map +1 -0
  117. package/dist/boilerplate/index.d.ts +2 -0
  118. package/dist/boilerplate/index.js +6 -0
  119. package/dist/boilerplate/index.js.map +1 -0
  120. package/dist/gotify/extensions/application.extension.d.ts +13 -0
  121. package/dist/gotify/extensions/application.extension.js +52 -0
  122. package/dist/gotify/extensions/application.extension.js.map +1 -0
  123. package/dist/gotify/extensions/client.extension.d.ts +8 -0
  124. package/dist/gotify/extensions/client.extension.js +38 -0
  125. package/dist/gotify/extensions/client.extension.js.map +1 -0
  126. package/dist/gotify/extensions/fetch.extension.d.ts +2 -0
  127. package/dist/gotify/extensions/fetch.extension.js +14 -0
  128. package/dist/gotify/extensions/fetch.extension.js.map +1 -0
  129. package/dist/gotify/extensions/index.d.ts +4 -0
  130. package/dist/gotify/extensions/index.js +8 -0
  131. package/dist/gotify/extensions/index.js.map +1 -0
  132. package/dist/gotify/extensions/message.extension.d.ts +8 -0
  133. package/dist/gotify/extensions/message.extension.js +37 -0
  134. package/dist/gotify/extensions/message.extension.js.map +1 -0
  135. package/dist/gotify/gotify.module.d.ts +29 -0
  136. package/dist/gotify/gotify.module.js +33 -0
  137. package/dist/gotify/gotify.module.js.map +1 -0
  138. package/dist/gotify/helpers/api.d.ts +346 -0
  139. package/dist/gotify/helpers/api.js +14 -0
  140. package/dist/gotify/helpers/api.js.map +1 -0
  141. package/dist/gotify/helpers/events.helper.d.ts +6 -0
  142. package/dist/gotify/helpers/events.helper.js +5 -0
  143. package/dist/gotify/helpers/events.helper.js.map +1 -0
  144. package/dist/gotify/helpers/index.d.ts +2 -0
  145. package/dist/gotify/helpers/index.js +6 -0
  146. package/dist/gotify/helpers/index.js.map +1 -0
  147. package/dist/gotify/index.d.ts +3 -0
  148. package/dist/gotify/index.js +7 -0
  149. package/dist/gotify/index.js.map +1 -0
  150. package/dist/hass/dynamic.d.ts +1126 -0
  151. package/dist/hass/dynamic.js +153 -0
  152. package/dist/hass/dynamic.js.map +1 -0
  153. package/dist/hass/extensions/call-proxy.extension.d.ts +4 -0
  154. package/dist/hass/extensions/call-proxy.extension.js +88 -0
  155. package/dist/hass/extensions/call-proxy.extension.js.map +1 -0
  156. package/dist/hass/extensions/entity-manager.extension.d.ts +61 -0
  157. package/dist/hass/extensions/entity-manager.extension.js +214 -0
  158. package/dist/hass/extensions/entity-manager.extension.js.map +1 -0
  159. package/dist/hass/extensions/fetch-api.extension.d.ts +26 -0
  160. package/dist/hass/extensions/fetch-api.extension.js +166 -0
  161. package/dist/hass/extensions/fetch-api.extension.js.map +1 -0
  162. package/dist/hass/extensions/index.d.ts +5 -0
  163. package/dist/hass/extensions/index.js +9 -0
  164. package/dist/hass/extensions/index.js.map +1 -0
  165. package/dist/hass/extensions/utilities.extension.d.ts +9 -0
  166. package/dist/hass/extensions/utilities.extension.js +43 -0
  167. package/dist/hass/extensions/utilities.extension.js.map +1 -0
  168. package/dist/hass/extensions/websocket-api.extension.d.ts +39 -0
  169. package/dist/hass/extensions/websocket-api.extension.js +363 -0
  170. package/dist/hass/extensions/websocket-api.extension.js.map +1 -0
  171. package/dist/hass/hass.module.d.ts +53 -0
  172. package/dist/hass/hass.module.js +59 -0
  173. package/dist/hass/hass.module.js.map +1 -0
  174. package/dist/hass/helpers/backup.helper.d.ts +11 -0
  175. package/dist/hass/helpers/backup.helper.js +3 -0
  176. package/dist/hass/helpers/backup.helper.js.map +1 -0
  177. package/dist/hass/helpers/constants.helper.d.ts +54 -0
  178. package/dist/hass/helpers/constants.helper.js +63 -0
  179. package/dist/hass/helpers/constants.helper.js.map +1 -0
  180. package/dist/hass/helpers/entity-state.helper.d.ts +45 -0
  181. package/dist/hass/helpers/entity-state.helper.js +9 -0
  182. package/dist/hass/helpers/entity-state.helper.js.map +1 -0
  183. package/dist/hass/helpers/fetch/calendar.d.ts +54 -0
  184. package/dist/hass/helpers/fetch/calendar.js +3 -0
  185. package/dist/hass/helpers/fetch/calendar.js.map +1 -0
  186. package/dist/hass/helpers/fetch/configuration.d.ts +34 -0
  187. package/dist/hass/helpers/fetch/configuration.js +3 -0
  188. package/dist/hass/helpers/fetch/configuration.js.map +1 -0
  189. package/dist/hass/helpers/fetch/index.d.ts +4 -0
  190. package/dist/hass/helpers/fetch/index.js +8 -0
  191. package/dist/hass/helpers/fetch/index.js.map +1 -0
  192. package/dist/hass/helpers/fetch/server-log.d.ts +10 -0
  193. package/dist/hass/helpers/fetch/server-log.js +20 -0
  194. package/dist/hass/helpers/fetch/server-log.js.map +1 -0
  195. package/dist/hass/helpers/fetch/service-list.d.ts +51 -0
  196. package/dist/hass/helpers/fetch/service-list.js +3 -0
  197. package/dist/hass/helpers/fetch/service-list.js.map +1 -0
  198. package/dist/hass/helpers/index.d.ts +7 -0
  199. package/dist/hass/helpers/index.js +11 -0
  200. package/dist/hass/helpers/index.js.map +1 -0
  201. package/dist/hass/helpers/metrics.helper.d.ts +13 -0
  202. package/dist/hass/helpers/metrics.helper.js +30 -0
  203. package/dist/hass/helpers/metrics.helper.js.map +1 -0
  204. package/dist/hass/helpers/utility.helper.d.ts +57 -0
  205. package/dist/hass/helpers/utility.helper.js +34 -0
  206. package/dist/hass/helpers/utility.helper.js.map +1 -0
  207. package/dist/hass/helpers/websocket.helper.d.ts +129 -0
  208. package/dist/hass/helpers/websocket.helper.js +3 -0
  209. package/dist/hass/helpers/websocket.helper.js.map +1 -0
  210. package/dist/hass/index.d.ts +4 -0
  211. package/dist/hass/index.js +8 -0
  212. package/dist/hass/index.js.map +1 -0
  213. package/dist/index.d.ts +2 -0
  214. package/dist/index.js +8 -0
  215. package/dist/index.js.map +1 -0
  216. package/dist/nexus/entities.extension.d.ts +2 -0
  217. package/dist/nexus/entities.extension.js +51 -0
  218. package/dist/nexus/entities.extension.js.map +1 -0
  219. package/dist/nexus/main.d.ts +9 -0
  220. package/dist/nexus/main.js +28 -0
  221. package/dist/nexus/main.js.map +1 -0
  222. package/dist/synapse/extensions/binary-sensor.extension.d.ts +19 -0
  223. package/dist/synapse/extensions/binary-sensor.extension.js +84 -0
  224. package/dist/synapse/extensions/binary-sensor.extension.js.map +1 -0
  225. package/dist/synapse/extensions/button.extension.d.ts +10 -0
  226. package/dist/synapse/extensions/button.extension.js +46 -0
  227. package/dist/synapse/extensions/button.extension.js.map +1 -0
  228. package/dist/synapse/extensions/index.d.ts +6 -0
  229. package/dist/synapse/extensions/index.js +10 -0
  230. package/dist/synapse/extensions/index.js.map +1 -0
  231. package/dist/synapse/extensions/registry.extension.d.ts +21 -0
  232. package/dist/synapse/extensions/registry.extension.js +207 -0
  233. package/dist/synapse/extensions/registry.extension.js.map +1 -0
  234. package/dist/synapse/extensions/scene.extension.d.ts +9 -0
  235. package/dist/synapse/extensions/scene.extension.js +37 -0
  236. package/dist/synapse/extensions/scene.extension.js.map +1 -0
  237. package/dist/synapse/extensions/sensor.extension.d.ts +25 -0
  238. package/dist/synapse/extensions/sensor.extension.js +154 -0
  239. package/dist/synapse/extensions/sensor.extension.js.map +1 -0
  240. package/dist/synapse/extensions/switch.extension.d.ts +19 -0
  241. package/dist/synapse/extensions/switch.extension.js +95 -0
  242. package/dist/synapse/extensions/switch.extension.js.map +1 -0
  243. package/dist/synapse/helpers/device-class.helper.d.ts +323 -0
  244. package/dist/synapse/helpers/device-class.helper.js +241 -0
  245. package/dist/synapse/helpers/device-class.helper.js.map +1 -0
  246. package/dist/synapse/helpers/index.d.ts +3 -0
  247. package/dist/synapse/helpers/index.js +7 -0
  248. package/dist/synapse/helpers/index.js.map +1 -0
  249. package/dist/synapse/helpers/metrics.helper.d.ts +13 -0
  250. package/dist/synapse/helpers/metrics.helper.js +30 -0
  251. package/dist/synapse/helpers/metrics.helper.js.map +1 -0
  252. package/dist/synapse/helpers/utility.helper.d.ts +1 -0
  253. package/dist/synapse/helpers/utility.helper.js +3 -0
  254. package/dist/synapse/helpers/utility.helper.js.map +1 -0
  255. package/dist/synapse/index.d.ts +3 -0
  256. package/dist/synapse/index.js +7 -0
  257. package/dist/synapse/index.js.map +1 -0
  258. package/dist/synapse/synapse.module.d.ts +29 -0
  259. package/dist/synapse/synapse.module.js +41 -0
  260. package/dist/synapse/synapse.module.js.map +1 -0
  261. package/dist/type-writer/build.extension.d.ts +2 -0
  262. package/dist/type-writer/build.extension.js +53 -0
  263. package/dist/type-writer/build.extension.js.map +1 -0
  264. package/dist/type-writer/main.d.ts +17 -0
  265. package/dist/type-writer/main.js +36 -0
  266. package/dist/type-writer/main.js.map +1 -0
  267. package/dist/type-writer/type-writer.extension.d.ts +2 -0
  268. package/dist/type-writer/type-writer.extension.js +212 -0
  269. package/dist/type-writer/type-writer.extension.js.map +1 -0
  270. package/dist/utilities/extensions/index.d.ts +3 -0
  271. package/dist/utilities/extensions/index.js +7 -0
  272. package/dist/utilities/extensions/index.js.map +1 -0
  273. package/dist/utilities/extensions/is.extension.d.ts +38 -0
  274. package/dist/utilities/extensions/is.extension.js +104 -0
  275. package/dist/utilities/extensions/is.extension.js.map +1 -0
  276. package/dist/utilities/extensions/zcc-testing.extension.d.ts +4 -0
  277. package/dist/utilities/extensions/zcc-testing.extension.js +9 -0
  278. package/dist/utilities/extensions/zcc-testing.extension.js.map +1 -0
  279. package/dist/utilities/extensions/zcc.extension.d.ts +20 -0
  280. package/dist/utilities/extensions/zcc.extension.js +66 -0
  281. package/dist/utilities/extensions/zcc.extension.js.map +1 -0
  282. package/dist/utilities/helpers/async.helper.d.ts +2 -0
  283. package/dist/utilities/helpers/async.helper.js +26 -0
  284. package/dist/utilities/helpers/async.helper.js.map +1 -0
  285. package/dist/utilities/helpers/context.helper.d.ts +7 -0
  286. package/dist/utilities/helpers/context.helper.js +3 -0
  287. package/dist/utilities/helpers/context.helper.js.map +1 -0
  288. package/dist/utilities/helpers/cron.helper.d.ts +87 -0
  289. package/dist/utilities/helpers/cron.helper.js +92 -0
  290. package/dist/utilities/helpers/cron.helper.js.map +1 -0
  291. package/dist/utilities/helpers/extend.helper.d.ts +2 -0
  292. package/dist/utilities/helpers/extend.helper.js +68 -0
  293. package/dist/utilities/helpers/extend.helper.js.map +1 -0
  294. package/dist/utilities/helpers/index.d.ts +5 -0
  295. package/dist/utilities/helpers/index.js +9 -0
  296. package/dist/utilities/helpers/index.js.map +1 -0
  297. package/dist/utilities/helpers/utilities.helper.d.ts +63 -0
  298. package/dist/utilities/helpers/utilities.helper.js +93 -0
  299. package/dist/utilities/helpers/utilities.helper.js.map +1 -0
  300. package/dist/utilities/index.d.ts +2 -0
  301. package/dist/utilities/index.js +6 -0
  302. package/dist/utilities/index.js.map +1 -0
  303. 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":";;;AAAA,iCAAmC;AAEnC,6BAOe;AAef,SAAgB,IAAI,CAAC,EACnB,MAAM,EACN,IAAI,EACJ,OAAO,EACP,SAAS,EACT,UAAU,EACV,OAAO,EAAE,aAAa,GACP;IACf,wDAAwD;IACxD,OAAO,UAAiC,EACtC,IAAI,EACJ,OAAO,EACP,MAAM,GACoB;QAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAa,CAAC;QAEnD,MAAM,UAAU,GAAG,GAAG,IAAI,gBAAgB,CAAC;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAS;YAC1C,OAAO;YACP,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QAEH,SAAS,iBAAiB;YACxB,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;iBACvE,KAAe,CAAC;YACnB,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC;YACnC,IAAI,MAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC7D,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,YAAY,CAAC,KAAK,GAAG,aAAa,CAAC;YACnC,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,SAAS,CAAC,IAAI,CAAC;YACb,OAAO;YACP,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,IAAI,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC;gBACjC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBAClC,OAAO,GAAG,iBAAiB,EAAE,CAAC;oBAC9B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBAClC,MAAM,CAAC,IAAI,CACT,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAE,EAC5C,iCAAiC,CAClC,CAAC;wBACF,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,wBAAwB,CAAC,CAAC;gBACxE,CAAC;gBACD,MAAM,UAAU,CAAC,UAAU,CAAC,iBAAiB,CAAC;oBAC5C,OAAO;oBACP,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC;iBACvB,CAAC,CAAC;YACL,CAAC;YACD,QAAQ,EAAE,kBAAc,CAAC,gBAAgB;SAC1C,CAAC,CAAC;QAEH;;;;;WAKG;QACH,SAAS,eAAe,CACtB,SAA+B,EAC/B,MAAe;YAEf,IAAI,CAAC,MAAE,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,MAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,KAAe,CAAC,IAAI,EAAE,CAAc,CAAC;YAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;YACtC,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;gBAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAoB,CAAC;gBACvD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAClC,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACpC,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,SAAS,iBAAiB,CAAC,SAAiB;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAc,CAAC;YAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,UAGvB,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAA2B,CAAC;YACxE,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,QAAQ;iBAClB,GAAG,CAAC,IAAI,CAAC,EAAE;gBACV,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAoB,CAAC;gBAElD,IAAI,MAAE,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;oBAC9B,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACvB,CAAC;gBACD,IAAI,CAAC,MAAE,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC9B,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;oBACzC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACvB,CAAC;gBACD,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YACtC,CAAC,CAAC;iBACD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAE,CAAC,SAAS,CAAE,CAAC,CAAC,SAAK,CAAe,CAAC,MAAM,CAAC,CAAC,CAChE;gBACD,KAAK,EAAE,MAAM,CAAC,WAAW,CACvB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,MAAE,CAAC,SAAS,CAAE,CAAC,CAAC,SAAK,CAAe,CAAC,MAAM,CAAC,CAAC,CAC/D;aACF,CAAC;QACJ,CAAC;QAED,KAAK,UAAU,UAAU,CAAC,SAAiB;YACzC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACvD,oDAAoD;YACpD,yFAAyF;YACzF,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChB,mBAAmB;gBACnB,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;oBAC7B,IAAI,CAAC,MAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBACrB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;4BAC1B,QAAQ,EAAE,KAAK;yBAChB,CAAC,CAAC;oBACL,CAAC;oBACD,IAAI,EAAE,CAAC;gBACT,CAAC,CAAC;gBACF,mCAAmC;gBACnC,IAAI,OAAO,CAAO,KAAK,EAAC,IAAI,EAAC,EAAE;oBAC7B,MAAM,IAAA,kBAAU,EACd,MAAM,CAAC,IAAI,CAAC,MAAM,CAA2B,EAC7C,KAAK,EAAE,SAA+B,EAAE,EAAE;wBACxC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;wBACjC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;4BAC5B,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,SAAS;4BACT,MAAM,EAAE,MAAM,CAAC,MAAM;yBACtB,CAAC,CAAC;oBACL,CAAC,CACF,CAAC;oBACF,IAAI,EAAE,CAAC;gBACT,CAAC,CAAC;aACH,CAAC,CAAC;QACL,CAAC;QAED,KAAK,UAAU,QAAQ,CAAC,SAAiB;YACvC,4BAA4B;YAC5B,IAAI,CAAC,MAAE,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,iBAAa,CACrB,aAAa,EACb,eAAe,EACf,gCAAgC,IAAI,EAAE,CACvC,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;YACnD,YAAY,CAAC,KAAK,GAAG,SAAS,CAAC;YAC/B,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC9B,CAAC;QAED,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACzB,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC;gBACZ,OAAO;gBACP,IAAI,EAAE,KAAK,IAAI,EAAE;oBACf,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,gBAAgB,CAAC,CAAC;oBACpD,MAAM,QAAQ,CAAC,KAAe,CAAC,CAAC;gBAClC,CAAC;gBACD,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAA4B,EAAE;YAClD,GAAG,EAAE,CAAC,CAAC,EAAE,QAAsC,EAAE,EAAE;gBACjD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,OAAO,YAAY,CAAC,KAAK,CAAC;gBAC5B,CAAC;gBACD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,OAAO,CAAC,KAAa,EAAE,EAAE;wBACvB,OAAO,OAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;oBAC5C,CAAC,CAAC;gBACJ,CAAC;gBACD,IAAI,QAAQ,KAAK,oBAAoB,EAAE,CAAC;oBACtC,OAAO,YAAY,CAAC;gBACtB,CAAC;gBACD,IAAI,QAAQ,KAAK,wBAAwB,EAAE,CAAC;oBAC1C,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpC,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,GAAG,EAAE,CAAC,CAAC,EAAE,QAAsC,EAAE,KAAK,EAAE,EAAE;gBACxD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,YAAY,CACV,KAAK,IAAI,EAAE;oBACT,oFAAoF;oBACpF,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;wBAC5B,SAAS,EAAE,OAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC;qBAC9C,CAAC,CACL,CAAC;oBACF,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,6BAA6B,CAAC,CAAC;gBAC1D,OAAO,KAAK,CAAC;YACf,CAAC;SACF,CAAC,CAAC;QAEH,mFAAmF;QACnF,oFAAoF;QACpF,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,GAAgC,CAAC,CAAC;QAEhE,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;AACJ,CAAC;AA1ND,oBA0NC"}
@@ -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;