@digital-alchemy/hass 24.9.3 → 24.9.5

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 (276) hide show
  1. package/README.md +3 -0
  2. package/dist/dynamic.d.ts +1 -1
  3. package/dist/dynamic.js +7 -2
  4. package/dist/dynamic.js.map +1 -1
  5. package/dist/extensions/area.extension.d.ts +2 -12
  6. package/dist/extensions/area.extension.js +20 -26
  7. package/dist/extensions/area.extension.js.map +1 -1
  8. package/dist/extensions/backup.extension.d.ts +2 -7
  9. package/dist/extensions/backup.extension.js +5 -8
  10. package/dist/extensions/backup.extension.js.map +1 -1
  11. package/dist/extensions/call-proxy.extension.d.ts +1 -1
  12. package/dist/extensions/call-proxy.extension.js +3 -22
  13. package/dist/extensions/call-proxy.extension.js.map +1 -1
  14. package/dist/extensions/config.extension.d.ts +2 -6
  15. package/dist/extensions/config.extension.js +21 -25
  16. package/dist/extensions/config.extension.js.map +1 -1
  17. package/dist/extensions/conversation.extension.d.ts +2 -6
  18. package/dist/extensions/conversation.extension.js +5 -8
  19. package/dist/extensions/conversation.extension.js.map +1 -1
  20. package/dist/extensions/device.extension.d.ts +2 -5
  21. package/dist/extensions/device.extension.js +16 -22
  22. package/dist/extensions/device.extension.js.map +1 -1
  23. package/dist/extensions/entity.extension.d.ts +2 -61
  24. package/dist/extensions/entity.extension.js +42 -83
  25. package/dist/extensions/entity.extension.js.map +1 -1
  26. package/dist/extensions/events.extension.d.ts +3 -11
  27. package/dist/extensions/events.extension.js +8 -11
  28. package/dist/extensions/events.extension.js.map +1 -1
  29. package/dist/extensions/fetch-api.extension.d.ts +12 -4
  30. package/dist/extensions/fetch-api.extension.js +23 -35
  31. package/dist/extensions/fetch-api.extension.js.map +1 -1
  32. package/dist/extensions/floor.extension.d.ts +2 -9
  33. package/dist/extensions/floor.extension.js +17 -23
  34. package/dist/extensions/floor.extension.js.map +1 -1
  35. package/dist/extensions/id-by.extension.js +15 -20
  36. package/dist/extensions/id-by.extension.js.map +1 -1
  37. package/dist/extensions/index.d.ts +1 -0
  38. package/dist/extensions/index.js +16 -18
  39. package/dist/extensions/index.js.map +1 -1
  40. package/dist/extensions/internal.extension.d.ts +18 -0
  41. package/dist/extensions/internal.extension.js +102 -0
  42. package/dist/extensions/internal.extension.js.map +1 -0
  43. package/dist/extensions/label.extension.d.ts +2 -9
  44. package/dist/extensions/label.extension.js +17 -23
  45. package/dist/extensions/label.extension.js.map +1 -1
  46. package/dist/extensions/reference.extension.d.ts +2 -12
  47. package/dist/extensions/reference.extension.js +19 -25
  48. package/dist/extensions/reference.extension.js.map +1 -1
  49. package/dist/extensions/registry.extension.d.ts +2 -7
  50. package/dist/extensions/registry.extension.js +1 -4
  51. package/dist/extensions/registry.extension.js.map +1 -1
  52. package/dist/extensions/websocket-api.extension.d.ts +3 -78
  53. package/dist/extensions/websocket-api.extension.js +82 -165
  54. package/dist/extensions/websocket-api.extension.js.map +1 -1
  55. package/dist/extensions/zone.extension.d.ts +2 -7
  56. package/dist/extensions/zone.extension.js +15 -21
  57. package/dist/extensions/zone.extension.js.map +1 -1
  58. package/dist/hass.module.d.ts +47 -36
  59. package/dist/hass.module.js +70 -70
  60. package/dist/hass.module.js.map +1 -1
  61. package/dist/helpers/backup.helper.js +1 -2
  62. package/dist/helpers/constants.helper.js +15 -18
  63. package/dist/helpers/constants.helper.js.map +1 -1
  64. package/dist/helpers/device.helper.js +2 -5
  65. package/dist/helpers/device.helper.js.map +1 -1
  66. package/dist/helpers/entity-state.helper.d.ts +3 -8
  67. package/dist/helpers/entity-state.helper.js +1 -8
  68. package/dist/helpers/entity-state.helper.js.map +1 -1
  69. package/dist/helpers/features.helper.js +79 -85
  70. package/dist/helpers/features.helper.js.map +1 -1
  71. package/dist/helpers/fetch/calendar.js +1 -2
  72. package/dist/helpers/fetch/configuration.js +2 -5
  73. package/dist/helpers/fetch/configuration.js.map +1 -1
  74. package/dist/helpers/fetch/index.js +5 -8
  75. package/dist/helpers/fetch/index.js.map +1 -1
  76. package/dist/helpers/fetch/server-log.js +1 -2
  77. package/dist/helpers/fetch/server-log.js.map +1 -1
  78. package/dist/helpers/fetch/service-list.js +1 -2
  79. package/dist/helpers/fetch/weather-forecasts.js +1 -2
  80. package/dist/helpers/fetch/weather-forecasts.js.map +1 -1
  81. package/dist/helpers/fetch.helper.d.ts +162 -0
  82. package/dist/helpers/fetch.helper.js +161 -0
  83. package/dist/helpers/fetch.helper.js.map +1 -0
  84. package/dist/helpers/id-by.helper.js +1 -2
  85. package/dist/helpers/index.d.ts +2 -1
  86. package/dist/helpers/index.js +13 -15
  87. package/dist/helpers/index.js.map +1 -1
  88. package/dist/helpers/interfaces.helper.d.ts +228 -0
  89. package/dist/helpers/interfaces.helper.js +10 -0
  90. package/dist/helpers/interfaces.helper.js.map +1 -0
  91. package/dist/helpers/manifest.helper.d.ts +0 -1
  92. package/dist/helpers/manifest.helper.js +0 -1
  93. package/dist/helpers/notify.helper.d.ts +13 -5
  94. package/dist/helpers/notify.helper.js +1 -2
  95. package/dist/helpers/registry.js +7 -10
  96. package/dist/helpers/registry.js.map +1 -1
  97. package/dist/helpers/utility.helper.d.ts +6 -1
  98. package/dist/helpers/utility.helper.js +9 -13
  99. package/dist/helpers/utility.helper.js.map +1 -1
  100. package/dist/helpers/websocket.helper.d.ts +1 -2
  101. package/dist/helpers/websocket.helper.js +1 -2
  102. package/dist/index.js +5 -8
  103. package/dist/index.js.map +1 -1
  104. package/dist/mock_assistant/extensions/area.extension.d.ts +8 -0
  105. package/dist/mock_assistant/extensions/area.extension.js +51 -0
  106. package/dist/mock_assistant/extensions/area.extension.js.map +1 -0
  107. package/dist/mock_assistant/extensions/config.extension.d.ts +14 -0
  108. package/dist/mock_assistant/extensions/config.extension.js +29 -0
  109. package/dist/mock_assistant/extensions/config.extension.js.map +1 -0
  110. package/dist/mock_assistant/extensions/device.extension.d.ts +8 -0
  111. package/dist/mock_assistant/extensions/device.extension.js +33 -0
  112. package/dist/mock_assistant/extensions/device.extension.js.map +1 -0
  113. package/dist/mock_assistant/extensions/entity-registry.extension.d.ts +13 -0
  114. package/dist/mock_assistant/extensions/entity-registry.extension.js +28 -0
  115. package/dist/mock_assistant/extensions/entity-registry.extension.js.map +1 -0
  116. package/dist/mock_assistant/extensions/entity.extension.d.ts +30 -0
  117. package/dist/mock_assistant/extensions/entity.extension.js +77 -0
  118. package/dist/mock_assistant/extensions/entity.extension.js.map +1 -0
  119. package/dist/mock_assistant/extensions/events.extension.d.ts +1 -1
  120. package/dist/mock_assistant/extensions/events.extension.js +3 -6
  121. package/dist/mock_assistant/extensions/events.extension.js.map +1 -1
  122. package/dist/mock_assistant/extensions/fetch.extension.d.ts +1 -0
  123. package/dist/mock_assistant/extensions/fetch.extension.js +4 -0
  124. package/dist/mock_assistant/extensions/fetch.extension.js.map +1 -0
  125. package/dist/mock_assistant/extensions/fixtures.extension.d.ts +1 -1
  126. package/dist/mock_assistant/extensions/fixtures.extension.js +29 -33
  127. package/dist/mock_assistant/extensions/fixtures.extension.js.map +1 -1
  128. package/dist/mock_assistant/extensions/floor.extension.d.ts +8 -0
  129. package/dist/mock_assistant/extensions/floor.extension.js +51 -0
  130. package/dist/mock_assistant/extensions/floor.extension.js.map +1 -0
  131. package/dist/mock_assistant/extensions/index.d.ts +10 -0
  132. package/dist/mock_assistant/extensions/index.js +12 -5
  133. package/dist/mock_assistant/extensions/index.js.map +1 -1
  134. package/dist/mock_assistant/extensions/label.extension.d.ts +8 -0
  135. package/dist/mock_assistant/extensions/label.extension.js +51 -0
  136. package/dist/mock_assistant/extensions/label.extension.js.map +1 -0
  137. package/dist/mock_assistant/extensions/services.extension.d.ts +12 -0
  138. package/dist/mock_assistant/extensions/services.extension.js +20 -0
  139. package/dist/mock_assistant/extensions/services.extension.js.map +1 -0
  140. package/dist/mock_assistant/extensions/websocket-api.extension.d.ts +15 -0
  141. package/dist/mock_assistant/extensions/websocket-api.extension.js +68 -0
  142. package/dist/mock_assistant/extensions/websocket-api.extension.js.map +1 -0
  143. package/dist/mock_assistant/extensions/zone.extension.d.ts +8 -0
  144. package/dist/mock_assistant/extensions/zone.extension.js +51 -0
  145. package/dist/mock_assistant/extensions/zone.extension.js.map +1 -0
  146. package/dist/mock_assistant/helpers/fixtures.js +1 -2
  147. package/dist/mock_assistant/helpers/index.d.ts +0 -1
  148. package/dist/mock_assistant/helpers/index.js +1 -5
  149. package/dist/mock_assistant/helpers/index.js.map +1 -1
  150. package/dist/mock_assistant/index.js +3 -6
  151. package/dist/mock_assistant/index.js.map +1 -1
  152. package/dist/mock_assistant/main.js +11 -15
  153. package/dist/mock_assistant/main.js.map +1 -1
  154. package/dist/mock_assistant/mock-assistant.module.d.ts +156 -3
  155. package/dist/mock_assistant/mock-assistant.module.js +56 -11
  156. package/dist/mock_assistant/mock-assistant.module.js.map +1 -1
  157. package/dist/quickboot.module.js +5 -8
  158. package/dist/quickboot.module.js.map +1 -1
  159. package/dist/testing/area.spec.js +106 -194
  160. package/dist/testing/area.spec.js.map +1 -1
  161. package/dist/testing/backup.spec.js +97 -139
  162. package/dist/testing/backup.spec.js.map +1 -1
  163. package/dist/testing/config.spec.js +79 -153
  164. package/dist/testing/config.spec.js.map +1 -1
  165. package/dist/testing/device.spec.js +35 -69
  166. package/dist/testing/device.spec.js.map +1 -1
  167. package/dist/testing/entity.spec.js +94 -149
  168. package/dist/testing/entity.spec.js.map +1 -1
  169. package/dist/testing/events.spec.js +33 -57
  170. package/dist/testing/events.spec.js.map +1 -1
  171. package/dist/testing/fetch-api.spec.js +242 -427
  172. package/dist/testing/fetch-api.spec.js.map +1 -1
  173. package/dist/testing/fixtures.spec.d.ts +1 -0
  174. package/dist/testing/fixtures.spec.js +150 -0
  175. package/dist/testing/fixtures.spec.js.map +1 -0
  176. package/dist/testing/floor.spec.js +106 -194
  177. package/dist/testing/floor.spec.js.map +1 -1
  178. package/dist/testing/id-by.spec.js +68 -107
  179. package/dist/testing/id-by.spec.js.map +1 -1
  180. package/dist/testing/label.spec.js +106 -194
  181. package/dist/testing/label.spec.js.map +1 -1
  182. package/dist/testing/ref-by.spec.js +155 -219
  183. package/dist/testing/ref-by.spec.js.map +1 -1
  184. package/dist/testing/websocket.spec.d.ts +1 -8
  185. package/dist/testing/websocket.spec.js +35 -50
  186. package/dist/testing/websocket.spec.js.map +1 -1
  187. package/dist/testing/workflow.spec.js +82 -81
  188. package/dist/testing/workflow.spec.js.map +1 -1
  189. package/dist/testing/zone.spec.js +61 -113
  190. package/dist/testing/zone.spec.js.map +1 -1
  191. package/package.json +62 -44
  192. package/scripts/mock-assistant.sh +5 -0
  193. package/scripts/run-e2e.sh +7 -0
  194. package/scripts/test.sh +2 -0
  195. package/src/dynamic.ts +4254 -0
  196. package/src/extensions/area.extension.ts +118 -0
  197. package/src/extensions/backup.extension.ts +63 -0
  198. package/src/extensions/call-proxy.extension.ts +113 -0
  199. package/src/extensions/config.extension.ts +119 -0
  200. package/src/extensions/conversation.extension.ts +46 -0
  201. package/src/extensions/device.extension.ts +56 -0
  202. package/src/extensions/entity.extension.ts +344 -0
  203. package/src/extensions/events.extension.ts +25 -0
  204. package/src/extensions/fetch-api.extension.ts +269 -0
  205. package/src/extensions/floor.extension.ts +76 -0
  206. package/src/extensions/id-by.extension.ts +157 -0
  207. package/src/extensions/index.ts +16 -0
  208. package/src/extensions/internal.extension.ts +145 -0
  209. package/src/extensions/label.extension.ts +83 -0
  210. package/src/extensions/reference.extension.ts +330 -0
  211. package/src/extensions/registry.extension.ts +44 -0
  212. package/src/extensions/websocket-api.extension.ts +554 -0
  213. package/src/extensions/zone.extension.ts +69 -0
  214. package/src/hass.module.ts +217 -0
  215. package/src/helpers/backup.helper.ts +11 -0
  216. package/src/helpers/constants.helper.ts +30 -0
  217. package/src/helpers/device.helper.ts +25 -0
  218. package/src/helpers/entity-state.helper.ts +171 -0
  219. package/src/helpers/features.helper.ts +580 -0
  220. package/src/helpers/fetch/calendar.ts +54 -0
  221. package/src/helpers/fetch/configuration.ts +75 -0
  222. package/src/helpers/fetch/index.ts +5 -0
  223. package/src/helpers/fetch/server-log.ts +28 -0
  224. package/src/helpers/fetch/service-list.ts +64 -0
  225. package/src/helpers/fetch/weather-forecasts.ts +86 -0
  226. package/src/helpers/fetch.helper.ts +328 -0
  227. package/src/helpers/id-by.helper.ts +53 -0
  228. package/src/helpers/index.ts +13 -0
  229. package/src/helpers/interfaces.helper.ts +340 -0
  230. package/src/helpers/manifest.helper.ts +0 -0
  231. package/src/helpers/notify.helper.ts +302 -0
  232. package/src/helpers/registry.ts +281 -0
  233. package/src/helpers/utility.helper.ts +147 -0
  234. package/src/helpers/websocket.helper.ts +117 -0
  235. package/src/index.ts +5 -0
  236. package/src/mock_assistant/extensions/area.extension.ts +62 -0
  237. package/src/mock_assistant/extensions/config.extension.ts +33 -0
  238. package/src/mock_assistant/extensions/device.extension.ts +44 -0
  239. package/src/mock_assistant/extensions/entity-registry.extension.ts +41 -0
  240. package/src/mock_assistant/extensions/entity.extension.ts +114 -0
  241. package/src/mock_assistant/extensions/events.extension.ts +37 -0
  242. package/src/mock_assistant/extensions/fetch.extension.ts +3 -0
  243. package/src/mock_assistant/extensions/fixtures.extension.ts +79 -0
  244. package/src/mock_assistant/extensions/floor.extension.ts +64 -0
  245. package/src/mock_assistant/extensions/index.ts +12 -0
  246. package/src/mock_assistant/extensions/label.extension.ts +64 -0
  247. package/src/mock_assistant/extensions/services.extension.ts +25 -0
  248. package/src/mock_assistant/extensions/websocket-api.extension.ts +84 -0
  249. package/src/mock_assistant/extensions/zone.extension.ts +65 -0
  250. package/src/mock_assistant/helpers/fixtures.ts +22 -0
  251. package/src/mock_assistant/helpers/index.ts +1 -0
  252. package/src/mock_assistant/index.ts +3 -0
  253. package/src/mock_assistant/main.ts +46 -0
  254. package/src/mock_assistant/mock-assistant.module.ts +90 -0
  255. package/src/quickboot.module.ts +23 -0
  256. package/src/testing/area.spec.ts +189 -0
  257. package/src/testing/backup.spec.ts +157 -0
  258. package/src/testing/config.spec.ts +188 -0
  259. package/src/testing/device.spec.ts +89 -0
  260. package/src/testing/entity.spec.ts +171 -0
  261. package/src/testing/events.spec.ts +78 -0
  262. package/src/testing/fetch-api.spec.ts +410 -0
  263. package/src/testing/fixtures.spec.ts +158 -0
  264. package/src/testing/floor.spec.ts +186 -0
  265. package/src/testing/id-by.spec.ts +140 -0
  266. package/src/testing/label.spec.ts +186 -0
  267. package/src/testing/ref-by.spec.ts +300 -0
  268. package/src/testing/websocket.spec.ts +63 -0
  269. package/src/testing/workflow.spec.ts +195 -0
  270. package/src/testing/zone.spec.ts +109 -0
  271. package/dist/helpers/metrics.helper.d.ts +0 -29
  272. package/dist/helpers/metrics.helper.js +0 -62
  273. package/dist/helpers/metrics.helper.js.map +0 -1
  274. package/dist/mock_assistant/helpers/utils.d.ts +0 -4
  275. package/dist/mock_assistant/helpers/utils.js +0 -57
  276. package/dist/mock_assistant/helpers/utils.js.map +0 -1
@@ -0,0 +1,281 @@
1
+ import { TAreaId, TDeviceId, TFloorId, TLabelId, TPlatformId, TZoneId } from "../dynamic";
2
+ import { ANY_ENTITY } from "./utility.helper";
3
+
4
+ export type LabelOptions = {
5
+ name: string;
6
+ icon: string;
7
+ color: string;
8
+ };
9
+
10
+ export type EditLabelOptions = {
11
+ entity: ANY_ENTITY;
12
+ label: TLabelId;
13
+ };
14
+
15
+ export type EditAliasOptions = {
16
+ entity: ANY_ENTITY;
17
+ alias: string;
18
+ };
19
+
20
+ export type LabelDefinition = {
21
+ color: string;
22
+ description?: string;
23
+ icon: string;
24
+ label_id: TLabelId;
25
+ name: string;
26
+ };
27
+
28
+ export type ToggleExpose = {
29
+ assistants: string | string[];
30
+ entity_ids: ANY_ENTITY | ANY_ENTITY[];
31
+ should_expose: boolean;
32
+ };
33
+
34
+ export type SensorUnitOfMeasurement =
35
+ | "h"
36
+ | "min"
37
+ | "s"
38
+ | "d"
39
+ | "K"
40
+ | "°C"
41
+ | "°F"
42
+ | "cm"
43
+ | "in"
44
+ | "mm"
45
+ | "VA"
46
+ | "L"
47
+ | "gal"
48
+ | "m³"
49
+ | "ft³"
50
+ | "CCF"
51
+ | "kg"
52
+ | "g"
53
+ | "mg"
54
+ | "µg"
55
+ | "oz"
56
+ | "lb"
57
+ | "st"
58
+ | "ft/s"
59
+ | "km/h"
60
+ | "kn"
61
+ | "m/s"
62
+ | "mph"
63
+ | "in/d"
64
+ | "in/h"
65
+ | "mm/d"
66
+ | "V"
67
+ | "mV"
68
+ | "dB"
69
+ | "dBm"
70
+ | "mL"
71
+ | "fl. oz."
72
+ | "dBA"
73
+ | "cbar"
74
+ | "bar"
75
+ | "hPa"
76
+ | "inHg"
77
+ | "kPa"
78
+ | "mbar"
79
+ | "Pa"
80
+ | "psi"
81
+ | "var"
82
+ | "%"
83
+ | "None"
84
+ | "W"
85
+ | "kW"
86
+ | "µg/m³"
87
+ | "lx"
88
+ | "W/m²"
89
+ | "BTU/(h⋅ft²)"
90
+ | "Hz"
91
+ | "kHz"
92
+ | "MHz"
93
+ | "GHz"
94
+ | "Wh"
95
+ | "kWh"
96
+ | "MWh"
97
+ | "MJ"
98
+ | "GJ"
99
+ | "km"
100
+ | "m"
101
+ | "mi"
102
+ | "yd"
103
+ | "bit/s"
104
+ | "kbit/s"
105
+ | "Mbit/s"
106
+ | "Gbit/s"
107
+ | "B/s"
108
+ | "kB/s"
109
+ | "MB/s"
110
+ | "GB/s"
111
+ | "KiB/s"
112
+ | "MiB/s"
113
+ | "GiB/s"
114
+ | "bit"
115
+ | "kbit"
116
+ | "Mbit"
117
+ | "Gbit"
118
+ | "B"
119
+ | "kB"
120
+ | "MB"
121
+ | "GB"
122
+ | "TB"
123
+ | "PB"
124
+ | "EB"
125
+ | "ZB"
126
+ | "YB"
127
+ | "KiB"
128
+ | "MiB"
129
+ | "GiB"
130
+ | "TiB"
131
+ | "PiB"
132
+ | "EiB"
133
+ | "ZiB"
134
+ | "YiB"
135
+ | "A"
136
+ | "mA"
137
+ | "ppm";
138
+
139
+ export type EntityRegistryItem<ENTITY extends ANY_ENTITY> = {
140
+ area_id?: TAreaId;
141
+ categories: object;
142
+ config_entry_id?: string;
143
+ device_id?: TDeviceId;
144
+ disabled_by?: string;
145
+ entity_category?: string;
146
+ entity_id: ENTITY;
147
+ has_entity_name: boolean;
148
+ hidden_by?: string;
149
+ icon?: string;
150
+ id: string;
151
+ labels: TLabelId[];
152
+ name?: string;
153
+ options: {
154
+ conversation: {
155
+ should_expose?: boolean;
156
+ };
157
+ sensor?: {
158
+ display_precision?: number;
159
+ unit_of_measurement?: SensorUnitOfMeasurement;
160
+ };
161
+ };
162
+ original_name: string;
163
+ platform: TPlatformId;
164
+ translation_key?: string;
165
+ unique_id: string;
166
+ aliases: string[];
167
+ capabilities?: string;
168
+ device_class?: string;
169
+ original_device_class?: string;
170
+ original_icon?: string;
171
+ };
172
+
173
+ export const UPDATE_REGISTRY = "config/entity_registry/update";
174
+
175
+ export type UpdateCoreOptions = {
176
+ currency: string;
177
+ elevation: number;
178
+ unit_system: string;
179
+ update_units: boolean;
180
+ time_zone: string;
181
+ location_name: string;
182
+ language: string;
183
+ country: string;
184
+ };
185
+
186
+ export type ZoneOptions = {
187
+ latitude: number;
188
+ longitude: number;
189
+ name: string;
190
+ icon: string;
191
+ passive: boolean;
192
+ };
193
+
194
+ export type ZoneDetails = ZoneOptions & { id: TZoneId };
195
+
196
+ export interface ManifestItem {
197
+ domain: string;
198
+ name: string;
199
+ codeowners: string[];
200
+ config_flow?: boolean;
201
+ documentation?: string;
202
+ iot_class?: IotClass;
203
+ loggers?: string[];
204
+ requirements?: string[];
205
+ is_built_in: boolean;
206
+ integration_type?: IntegrationType;
207
+ quality_scale?: QualityScale;
208
+ dependencies?: string[];
209
+ dhcp?: DHCP[];
210
+ after_dependencies?: string[];
211
+ single_config_entry?: boolean;
212
+ bluetooth?: Bluetooth[];
213
+ version?: string;
214
+ homekit?: Homekit;
215
+ zeroconf?: Array<ZeroconfClass | string>;
216
+ ssdp?: SSDP[];
217
+ issue_tracker?: string;
218
+ }
219
+
220
+ export interface Bluetooth {
221
+ manufacturer_id: number;
222
+ service_uuid?: string;
223
+ manufacturer_data_start?: number[];
224
+ }
225
+
226
+ export interface DHCP {
227
+ registered_devices?: boolean;
228
+ hostname?: string;
229
+ macaddress?: string;
230
+ }
231
+
232
+ export interface Homekit {
233
+ models: string[];
234
+ }
235
+
236
+ export enum IntegrationType {
237
+ Device = "device",
238
+ Entity = "entity",
239
+ Helper = "helper",
240
+ Hub = "hub",
241
+ Service = "service",
242
+ System = "system",
243
+ }
244
+
245
+ export enum IotClass {
246
+ Calculated = "calculated",
247
+ CloudPolling = "cloud_polling",
248
+ CloudPush = "cloud_push",
249
+ LocalPolling = "local_polling",
250
+ LocalPush = "local_push",
251
+ }
252
+
253
+ export enum QualityScale {
254
+ Internal = "internal",
255
+ Platinum = "platinum",
256
+ }
257
+
258
+ export interface SSDP {
259
+ manufacturer: string;
260
+ modelDescription: string;
261
+ }
262
+
263
+ export interface ZeroconfClass {
264
+ type: string;
265
+ properties?: Properties;
266
+ }
267
+
268
+ export interface Properties {
269
+ mdl?: string;
270
+ SYSTYPE?: string;
271
+ }
272
+
273
+ export type FloorCreate = {
274
+ name: string;
275
+ level: number;
276
+ aliases?: string[];
277
+ };
278
+
279
+ export type FloorDetails = FloorCreate & {
280
+ floor_id: TFloorId;
281
+ };
@@ -0,0 +1,147 @@
1
+ import { is, TBlackHole } from "@digital-alchemy/core";
2
+ import { Dayjs } from "dayjs";
3
+ import { Get } from "type-fest";
4
+
5
+ import {
6
+ ENTITY_SETUP,
7
+ iCallService,
8
+ REGISTRY_SETUP,
9
+ TAreaId,
10
+ TDeviceId,
11
+ TFloorId,
12
+ TLabelId,
13
+ TPlatformId,
14
+ TRawDomains,
15
+ TRawEntityIds,
16
+ } from "../dynamic";
17
+ import { HassEntityContext } from ".";
18
+
19
+ export type ANY_ENTITY = TRawEntityIds;
20
+
21
+ // ? Casting by domain turns things from "equiv to ANY_ENTITY" to "scene.*" type generics
22
+ // These are no longer valid comparisons against ANY_ENTITY though
23
+ // ? The extract converts those generic types back into real entity ids to make types valid again
24
+ /**
25
+ * Pick any valid entity, optionally limiting by domain
26
+ */
27
+ export type PICK_ENTITY<DOMAIN extends ALL_DOMAINS = ALL_DOMAINS> = Extract<
28
+ ANY_ENTITY,
29
+ `${DOMAIN}.${string}`
30
+ >;
31
+
32
+ /**
33
+ * Pick any valid service call, optionally limiting by domain
34
+ */
35
+ export type PICK_SERVICE<DOMAIN extends ALL_SERVICE_DOMAINS = ALL_SERVICE_DOMAINS> = {
36
+ [key in DOMAIN]: `${key}.${keyof iCallService[key] & string}`;
37
+ }[DOMAIN];
38
+
39
+ export type PICK_SERVICE_PARAMETERS<
40
+ DOMAINS extends ALL_SERVICE_DOMAINS,
41
+ SERVICE extends PICK_SERVICE<DOMAINS>,
42
+ > =
43
+ Get<iCallService, SERVICE> extends (serviceParams: infer ServiceParams) => TBlackHole
44
+ ? ServiceParams
45
+ : never;
46
+
47
+ export function entity_split(
48
+ entity: { entity_id: ANY_ENTITY } | ANY_ENTITY,
49
+ ): [ALL_DOMAINS, string] {
50
+ if (is.object(entity)) {
51
+ entity = entity.entity_id;
52
+ }
53
+ return entity.split(".") as [ALL_DOMAINS, string];
54
+ }
55
+ /**
56
+ * Extract the domain from an entity with type safety
57
+ */
58
+ export function domain(entity: { entity_id: ANY_ENTITY } | ANY_ENTITY): ALL_DOMAINS {
59
+ if (is.object(entity)) {
60
+ entity = entity.entity_id;
61
+ }
62
+ return entity_split(entity).shift() as ALL_DOMAINS;
63
+ }
64
+
65
+ export type ENTITY_PROP<ENTITY_ID extends PICK_ENTITY, PROP extends "state" | "attributes"> = Get<
66
+ ENTITY_SETUP,
67
+ `${ENTITY_ID}.${PROP}`
68
+ >;
69
+
70
+ /**
71
+ * Type definitions to match a specific entity.
72
+ */
73
+ export type ENTITY_STATE<ENTITY_ID extends ANY_ENTITY> = Omit<
74
+ ENTITY_SETUP[ENTITY_ID],
75
+ "state" | "context" | "last_changed" | "last_updated" | "entity_id" | "attributes"
76
+ > & {
77
+ last_reported: Dayjs;
78
+ last_changed: Dayjs;
79
+ last_updated: Dayjs;
80
+ attributes: ENTITY_SETUP[ENTITY_ID]["attributes"];
81
+ entity_id: ENTITY_ID;
82
+ state: ENTITY_SETUP[ENTITY_ID]["state"];
83
+ context: HassEntityContext;
84
+ };
85
+
86
+ /**
87
+ * Union of all domains that contain entities
88
+ */
89
+ export type ALL_DOMAINS = TRawDomains;
90
+
91
+ /**
92
+ * Union of all services with callable methods
93
+ */
94
+ export type ALL_SERVICE_DOMAINS = keyof iCallService;
95
+
96
+ export type GetDomain<ENTITY extends ANY_ENTITY> = ENTITY extends `${infer domain}.${string}`
97
+ ? domain
98
+ : never;
99
+
100
+ function isDomain<DOMAIN extends ALL_DOMAINS>(
101
+ entity: string,
102
+ domain: DOMAIN | DOMAIN[],
103
+ ): entity is PICK_ENTITY<DOMAIN> {
104
+ const [test] = entity.split(".") as [DOMAIN, string];
105
+ return [domain].flat().includes(test);
106
+ }
107
+
108
+ is.domain = isDomain;
109
+
110
+ declare module "@digital-alchemy/core" {
111
+ export interface IsIt {
112
+ /**
113
+ * Check to see if an entity matches
114
+ */
115
+ domain: typeof isDomain;
116
+ }
117
+ }
118
+
119
+ export const PostConfigPriorities = {
120
+ FETCH: 1,
121
+ VALIDATE: -1,
122
+ } as const;
123
+
124
+ export type PICK_FROM_AREA<ID extends TAreaId, DOMAIN extends ALL_DOMAINS = ALL_DOMAINS> = Extract<
125
+ REGISTRY_SETUP["area"][`_${ID}`],
126
+ PICK_ENTITY<DOMAIN>
127
+ >;
128
+
129
+ export type PICK_FROM_LABEL<
130
+ ID extends TLabelId,
131
+ DOMAIN extends ALL_DOMAINS = ALL_DOMAINS,
132
+ > = Extract<REGISTRY_SETUP["label"][`_${ID}`], PICK_ENTITY<DOMAIN>>;
133
+
134
+ export type PICK_FROM_FLOOR<
135
+ ID extends TFloorId,
136
+ DOMAIN extends ALL_DOMAINS = ALL_DOMAINS,
137
+ > = Extract<REGISTRY_SETUP["floor"][`_${ID}`], PICK_ENTITY<DOMAIN>>;
138
+
139
+ export type PICK_FROM_DEVICE<
140
+ ID extends TDeviceId,
141
+ DOMAIN extends ALL_DOMAINS = ALL_DOMAINS,
142
+ > = Extract<REGISTRY_SETUP["device"][`_${ID}`], PICK_ENTITY<DOMAIN>>;
143
+
144
+ export type PICK_FROM_PLATFORM<
145
+ ID extends TPlatformId,
146
+ DOMAIN extends ALL_DOMAINS = ALL_DOMAINS,
147
+ > = Extract<REGISTRY_SETUP["platform"][`_${ID}`], PICK_ENTITY<DOMAIN>>;
@@ -0,0 +1,117 @@
1
+ import { TBlackHole, TContext } from "@digital-alchemy/core";
2
+ import { Dayjs } from "dayjs";
3
+
4
+ import { HassSocketMessageTypes } from "./constants.helper";
5
+ import { EntityUpdateEvent } from "./entity-state.helper";
6
+ import { ALL_DOMAINS, ANY_ENTITY, ENTITY_STATE, PICK_ENTITY } from "./utility.helper";
7
+
8
+ export interface SignRequestResponse {
9
+ path: string;
10
+ }
11
+
12
+ export interface SocketMessageDTO {
13
+ error?: Record<string, unknown>;
14
+ event?: EntityUpdateEvent;
15
+ id: string | number;
16
+ message?: string;
17
+ result?: Record<string, unknown> | Array<unknown>;
18
+ type: `${HassSocketMessageTypes}`;
19
+ }
20
+
21
+ export type SocketSubscribeOptions<EVENT extends string> = {
22
+ event_type: EVENT;
23
+ context: TContext;
24
+ exec: (data: SocketSubscribeData<EVENT>) => TBlackHole;
25
+ };
26
+
27
+ export type SocketSubscribeData<EVENT extends string> = {
28
+ event_type: EVENT;
29
+ };
30
+
31
+ export interface SendSocketMessageDTO {
32
+ access_token?: string;
33
+ disabled_by?: "user";
34
+ domain?: string;
35
+ hidden_by?: "user";
36
+ service?: string;
37
+ service_data?: unknown;
38
+ type: string;
39
+ }
40
+
41
+ export interface UpdateEntityMessageDTO<DOMAIN extends ALL_DOMAINS = ALL_DOMAINS> {
42
+ area_id?: string;
43
+ disabled_by?: "user";
44
+ entity_id: PICK_ENTITY<DOMAIN>;
45
+ hidden_by?: "user";
46
+ icon?: string;
47
+ name: string;
48
+ new_entity_id: PICK_ENTITY<DOMAIN>;
49
+ type: "config/entity_registry/update";
50
+ }
51
+
52
+ export interface RemoveEntityMessageDTO {
53
+ entity_id: ANY_ENTITY;
54
+ type: "config/entity_registry/remove";
55
+ }
56
+
57
+ export interface FindRelatedDTO {
58
+ item_id: string;
59
+ item_type: string;
60
+ type: "search/related";
61
+ }
62
+
63
+ export interface RegistryGetDTO {
64
+ entity_id: string;
65
+ type: "config/entity_registry/get";
66
+ }
67
+
68
+ export interface RenderTemplateDTO {
69
+ template: string;
70
+ timeout: number;
71
+ type: "render_template";
72
+ }
73
+
74
+ export interface SubscribeTriggerDTO {
75
+ trigger: Record<string, unknown>;
76
+ type: "subscribe_trigger";
77
+ }
78
+
79
+ export interface UnsubscribeEventsDTO {
80
+ subscription: number;
81
+ type: "unsubscribe_events";
82
+ }
83
+
84
+ export interface SignPathDTO {
85
+ path: string;
86
+ type: "auth/sign_path";
87
+ }
88
+
89
+ export interface RemoveBackupDTO {
90
+ slug: string;
91
+ type: "backup/remove";
92
+ }
93
+
94
+ export interface EntityHistoryDTO<ENTITIES extends ANY_ENTITY[] = ANY_ENTITY[]> {
95
+ end_time: Date | string | Dayjs;
96
+ entity_ids: ENTITIES;
97
+ minimal_response?: boolean;
98
+ no_attributes?: boolean;
99
+ start_time: Date | string | Dayjs;
100
+ type: "history/history_during_period";
101
+ }
102
+
103
+ export type EntityHistoryResult<
104
+ ENTITY extends ANY_ENTITY = ANY_ENTITY,
105
+ ATTRIBUTES extends object = object,
106
+ > = Pick<ENTITY_STATE<ENTITY> & { attributes: ATTRIBUTES }, "attributes" | "state"> & {
107
+ date: Date;
108
+ };
109
+
110
+ export type OnHassEventCallback<T = object> = (event: T) => TBlackHole;
111
+
112
+ export type OnHassEventOptions<T = object> = {
113
+ context: TContext;
114
+ exec: OnHassEventCallback<T>;
115
+ event: string;
116
+ once?: boolean;
117
+ };
package/src/index.ts ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./dynamic";
2
+ export * from "./extensions";
3
+ export * from "./hass.module";
4
+ export * from "./helpers";
5
+ export * from "./quickboot.module";
@@ -0,0 +1,62 @@
1
+ import { TServiceParams } from "@digital-alchemy/core";
2
+
3
+ import { TAreaId } from "../../dynamic";
4
+ import { AreaDetails } from "../../helpers";
5
+
6
+ export function MockAreaExtension({ mock_assistant }: TServiceParams) {
7
+ let areas = new Map<TAreaId, AreaDetails>();
8
+
9
+ mock_assistant.socket.onMessage("config/area_registry/list", message => {
10
+ mock_assistant.socket.sendMessage({
11
+ id: message.id,
12
+ result: [...areas.values()],
13
+ type: "result",
14
+ });
15
+ });
16
+
17
+ mock_assistant.socket.onMessage<{ area_id: TAreaId }>("config/area_registry/delete", message => {
18
+ areas.delete(message.area_id);
19
+ sendUpdate();
20
+ mock_assistant.socket.sendMessage({
21
+ id: message.id,
22
+ result: null,
23
+ type: "result",
24
+ });
25
+ });
26
+
27
+ mock_assistant.socket.onMessage<AreaDetails>("config/area_registry/create", message => {
28
+ message.area_id = message.name as TAreaId;
29
+ areas.set(message.area_id as TAreaId, message);
30
+ sendUpdate();
31
+ mock_assistant.socket.sendMessage({
32
+ id: message.id,
33
+ result: null,
34
+ type: "result",
35
+ });
36
+ });
37
+
38
+ mock_assistant.socket.onMessage<AreaDetails>("config/area_registry/update", message => {
39
+ areas.set(message.area_id as TAreaId, message);
40
+ sendUpdate();
41
+ mock_assistant.socket.sendMessage({
42
+ id: message.id,
43
+ result: null,
44
+ type: "result",
45
+ });
46
+ });
47
+
48
+ const sendUpdate = () =>
49
+ mock_assistant.socket.sendMessage({
50
+ event: { event_type: "area_registry_updated" },
51
+ type: "event",
52
+ });
53
+
54
+ return {
55
+ /**
56
+ * @internal
57
+ */
58
+ loadFixtures(incoming: AreaDetails[]) {
59
+ areas = new Map(incoming.map(i => [i.area_id, i]));
60
+ },
61
+ };
62
+ }
@@ -0,0 +1,33 @@
1
+ import { deepExtend, TServiceParams } from "@digital-alchemy/core";
2
+
3
+ import { HassConfig } from "../../helpers";
4
+
5
+ export function MockConfig({ hass }: TServiceParams) {
6
+ let config = { components: ["synapse"], version: "2024.4.1" } as HassConfig;
7
+
8
+ const origConfig = hass.fetch.getConfig;
9
+ hass.fetch.getConfig = async () => config;
10
+
11
+ return {
12
+ current() {
13
+ return config;
14
+ },
15
+ /**
16
+ * @internal
17
+ */
18
+ loadFixtures(incoming: HassConfig) {
19
+ if (incoming) {
20
+ config = incoming;
21
+ }
22
+ },
23
+ merge(incoming: Partial<HassConfig>) {
24
+ config = deepExtend(config, incoming);
25
+ },
26
+ /**
27
+ * @internal
28
+ */
29
+ monkeyReset() {
30
+ hass.fetch.getConfig = origConfig;
31
+ },
32
+ };
33
+ }
@@ -0,0 +1,44 @@
1
+ import { TServiceParams } from "@digital-alchemy/core";
2
+
3
+ import { TDeviceId } from "../../dynamic";
4
+ import { DEVICE_REGISTRY_UPDATED, DeviceDetails } from "../../helpers";
5
+
6
+ export function MockDeviceExtension({ mock_assistant }: TServiceParams) {
7
+ let devices = new Map<TDeviceId, DeviceDetails>();
8
+
9
+ mock_assistant.socket.onMessage("config/device_registry/list", message => {
10
+ mock_assistant.socket.sendMessage({
11
+ id: message.id,
12
+ result: [...devices.values()],
13
+ type: "result",
14
+ });
15
+ });
16
+
17
+ mock_assistant.socket.onMessage<{ device_id: TDeviceId }>(
18
+ "config/device_registry/delete",
19
+ message => {
20
+ devices.delete(message.device_id);
21
+ sendUpdate();
22
+ mock_assistant.socket.sendMessage({
23
+ id: message.id,
24
+ result: null,
25
+ type: "result",
26
+ });
27
+ },
28
+ );
29
+
30
+ const sendUpdate = () =>
31
+ mock_assistant.socket.sendMessage({
32
+ event: { event_type: DEVICE_REGISTRY_UPDATED },
33
+ type: "event",
34
+ });
35
+
36
+ return {
37
+ /**
38
+ * @internal
39
+ */
40
+ loadFixtures(incoming: DeviceDetails[]) {
41
+ devices = new Map(incoming.map(i => [i.id, i]));
42
+ },
43
+ };
44
+ }