@digital-alchemy/hass 25.10.27-beta.1 → 25.11.16

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 (70) hide show
  1. package/dist/dev/mappings.d.mts +26 -0
  2. package/dist/dev/services.mjs +0 -1
  3. package/dist/dev/services.mjs.map +1 -1
  4. package/dist/hass.module.d.mts +8 -1
  5. package/dist/hass.module.mjs +5 -1
  6. package/dist/hass.module.mjs.map +1 -1
  7. package/dist/helpers/fetch/configuration.d.mts +5 -5
  8. package/dist/helpers/fetch/configuration.mjs.map +1 -1
  9. package/dist/helpers/interfaces.d.mts +11 -0
  10. package/dist/helpers/interfaces.mjs.map +1 -1
  11. package/dist/mock_assistant/mock-assistant.module.d.mts +2 -0
  12. package/dist/services/area.service.mjs +12 -12
  13. package/dist/services/area.service.mjs.map +1 -1
  14. package/dist/services/config.service.d.mts +2 -1
  15. package/dist/services/config.service.mjs +35 -5
  16. package/dist/services/config.service.mjs.map +1 -1
  17. package/dist/services/conversation.service.d.mts +1 -1
  18. package/dist/services/conversation.service.mjs +9 -1
  19. package/dist/services/conversation.service.mjs.map +1 -1
  20. package/dist/services/device.service.mjs +12 -19
  21. package/dist/services/device.service.mjs.map +1 -1
  22. package/dist/services/entity.service.mjs +12 -12
  23. package/dist/services/entity.service.mjs.map +1 -1
  24. package/dist/services/floor.service.mjs +12 -12
  25. package/dist/services/floor.service.mjs.map +1 -1
  26. package/dist/services/index.d.mts +1 -0
  27. package/dist/services/index.mjs +1 -0
  28. package/dist/services/index.mjs.map +1 -1
  29. package/dist/services/label.service.mjs +12 -12
  30. package/dist/services/label.service.mjs.map +1 -1
  31. package/dist/services/registry.service.mjs +4 -3
  32. package/dist/services/registry.service.mjs.map +1 -1
  33. package/dist/services/websocket-api.service.d.mts +1 -1
  34. package/dist/services/websocket-api.service.mjs +70 -6
  35. package/dist/services/websocket-api.service.mjs.map +1 -1
  36. package/dist/services/zone.service.mjs +12 -12
  37. package/dist/services/zone.service.mjs.map +1 -1
  38. package/dist/testing/config.spec.mjs +367 -0
  39. package/dist/testing/config.spec.mjs.map +1 -1
  40. package/dist/testing/conversation.spec.d.mts +1 -0
  41. package/dist/testing/conversation.spec.mjs +42 -0
  42. package/dist/testing/conversation.spec.mjs.map +1 -0
  43. package/dist/testing/fetch-api.spec.mjs +2 -5
  44. package/dist/testing/fetch-api.spec.mjs.map +1 -1
  45. package/dist/testing/websocket.spec.mjs +177 -0
  46. package/dist/testing/websocket.spec.mjs.map +1 -1
  47. package/dist/user.d.mts +7 -0
  48. package/package.json +1 -1
  49. package/src/dev/mappings.mts +15 -0
  50. package/src/dev/registry.mts +0 -1
  51. package/src/dev/services.mts +0 -1
  52. package/src/hass.module.mts +10 -0
  53. package/src/helpers/fetch/configuration.mts +11 -5
  54. package/src/helpers/interfaces.mts +14 -0
  55. package/src/services/area.service.mts +13 -13
  56. package/src/services/config.service.mts +53 -6
  57. package/src/services/conversation.service.mts +16 -2
  58. package/src/services/device.service.mts +13 -21
  59. package/src/services/entity.service.mts +13 -12
  60. package/src/services/floor.service.mts +13 -13
  61. package/src/services/index.mts +1 -0
  62. package/src/services/label.service.mts +13 -13
  63. package/src/services/registry.service.mts +5 -4
  64. package/src/services/websocket-api.service.mts +86 -5
  65. package/src/services/zone.service.mts +13 -13
  66. package/src/testing/config.spec.mts +410 -0
  67. package/src/testing/conversation.spec.mts +48 -0
  68. package/src/testing/fetch-api.spec.mts +2 -5
  69. package/src/testing/websocket.spec.mts +225 -0
  70. package/src/user.mts +14 -0
@@ -1,9 +1,13 @@
1
+ import { sleep } from "@digital-alchemy/core";
1
2
  import { hassTestRunner } from "../mock_assistant/index.mjs";
2
3
  describe("Websocket", () => {
3
4
  afterEach(async () => {
4
5
  await hassTestRunner.teardown();
5
6
  vi.restoreAllMocks();
6
7
  });
8
+ beforeEach(() => {
9
+ hassTestRunner.emitLogs("silent");
10
+ });
7
11
  describe("API Interactions", () => {
8
12
  it("should emit events onConnect", async () => {
9
13
  expect.assertions(1);
@@ -173,5 +177,178 @@ describe("Websocket", () => {
173
177
  });
174
178
  });
175
179
  });
180
+ describe("Memory Leak Detection", () => {
181
+ it("should NOT warn when subscribe is called outside onConnect", async () => {
182
+ expect.assertions(1);
183
+ await hassTestRunner.run(({ lifecycle, hass, logger, context }) => {
184
+ const warnSpy = vi.spyOn(logger, "warn").mockImplementation(() => { });
185
+ lifecycle.onReady(async () => {
186
+ await hass.socket.subscribe({
187
+ context,
188
+ event_type: "test_event",
189
+ exec: () => { },
190
+ });
191
+ // Should not have been called with memory leak warning
192
+ const memoryLeakWarnings = warnSpy.mock.calls.filter(call => call[1]?.toString().includes("MEMORY LEAK DETECTED"));
193
+ expect(memoryLeakWarnings.length).toBe(0);
194
+ });
195
+ });
196
+ });
197
+ it("should warn when subscribe is called inside onConnect callback", async () => {
198
+ expect.assertions(2);
199
+ const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => { });
200
+ await hassTestRunner.emitLogs("warn").run(({ lifecycle, hass, internal, context, event }) => {
201
+ internal.boilerplate.configuration.set("boilerplate", "LOG_LEVEL", "warn");
202
+ lifecycle.onReady(async () => {
203
+ // Wait for initial connection to complete
204
+ await new Promise(resolve => setTimeout(resolve, 100));
205
+ // Ensure socket is connected
206
+ expect(hass.socket.connectionState).toBe("connected");
207
+ // Register onConnect callback that subscribes (this should trigger warning)
208
+ hass.socket.onConnect(async () => {
209
+ await hass.socket.subscribe({
210
+ context,
211
+ event_type: "test_event_warn",
212
+ exec: () => { },
213
+ });
214
+ });
215
+ // Trigger onConnect by emitting SOCKET_CONNECTED event again
216
+ event.emit("SOCKET_CONNECTED");
217
+ await sleep(0);
218
+ expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining("MEMORY LEAK DETECTED"));
219
+ });
220
+ });
221
+ });
222
+ });
223
+ describe("Subscription Registry", () => {
224
+ it("should prevent duplicate subscriptions", async () => {
225
+ expect.assertions(1);
226
+ await hassTestRunner.run(({ lifecycle, hass, context }) => {
227
+ const sendMessageSpy = vi
228
+ .spyOn(hass.socket, "sendMessage")
229
+ .mockImplementation(async () => undefined);
230
+ lifecycle.onReady(async () => {
231
+ // Clear spy after initial bootstrap subscriptions
232
+ sendMessageSpy.mockClear();
233
+ // Subscribe to the same event twice (even with same context)
234
+ // Since registry tracks by event_type only, second subscription won't send message
235
+ await hass.socket.subscribe({
236
+ context,
237
+ event_type: "duplicate_test",
238
+ exec: () => { },
239
+ });
240
+ await hass.socket.subscribe({
241
+ context,
242
+ event_type: "duplicate_test",
243
+ exec: () => { },
244
+ });
245
+ // Should only send subscribe message once (duplicate event_type is prevented)
246
+ const subscribeCalls = sendMessageSpy.mock.calls.filter(call => call[0]?.type === "subscribe_events" && call[0]?.event_type === "duplicate_test");
247
+ expect(subscribeCalls.length).toBe(1);
248
+ });
249
+ });
250
+ });
251
+ it("should allow different event types with same context", async () => {
252
+ expect.assertions(1);
253
+ await hassTestRunner.run(({ lifecycle, hass, context }) => {
254
+ const sendMessageSpy = vi
255
+ .spyOn(hass.socket, "sendMessage")
256
+ .mockImplementation(async () => undefined);
257
+ lifecycle.onReady(async () => {
258
+ await hass.socket.subscribe({
259
+ context,
260
+ event_type: "event_type_1",
261
+ exec: () => { },
262
+ });
263
+ await hass.socket.subscribe({
264
+ context,
265
+ event_type: "event_type_2",
266
+ exec: () => { },
267
+ });
268
+ // Should send subscribe message for both
269
+ const subscribeCalls = sendMessageSpy.mock.calls.filter(call => call[0]?.type === "subscribe_events");
270
+ expect(subscribeCalls.length).toBeGreaterThanOrEqual(2);
271
+ });
272
+ });
273
+ });
274
+ it("should re-establish subscriptions on reconnect", async () => {
275
+ expect.assertions(2);
276
+ await hassTestRunner.run(({ lifecycle, hass, context, event }) => {
277
+ const sendMessageSpy = vi
278
+ .spyOn(hass.socket, "sendMessage")
279
+ .mockImplementation(async () => undefined);
280
+ lifecycle.onReady(async () => {
281
+ // Register a subscription
282
+ await hass.socket.subscribe({
283
+ context,
284
+ event_type: "reconnect_test",
285
+ exec: () => { },
286
+ });
287
+ // Clear the spy to only track re-establishment calls
288
+ sendMessageSpy.mockClear();
289
+ // Register an onConnect callback that will trigger re-establishment
290
+ hass.socket.onConnect(async () => {
291
+ // This callback will trigger re-establishment
292
+ });
293
+ // Trigger reconnect by emitting SOCKET_CONNECTED event
294
+ event.emit("SOCKET_CONNECTED");
295
+ // Wait for async operations
296
+ await new Promise(resolve => setTimeout(resolve, 50));
297
+ // Should have re-established the subscription
298
+ const reestablishCalls = sendMessageSpy.mock.calls.filter(call => call[0]?.type === "subscribe_events" && call[0]?.event_type === "reconnect_test");
299
+ expect(reestablishCalls.length).toBeGreaterThan(0);
300
+ expect(sendMessageSpy).toHaveBeenCalled();
301
+ });
302
+ });
303
+ });
304
+ it("should re-establish multiple subscriptions on reconnect", async () => {
305
+ expect.assertions(4);
306
+ await hassTestRunner.run(({ lifecycle, hass, context, event }) => {
307
+ const sendMessageSpy = vi
308
+ .spyOn(hass.socket, "sendMessage")
309
+ .mockImplementation(async () => undefined);
310
+ lifecycle.onReady(async () => {
311
+ // Wait for initial connection to complete
312
+ await new Promise(resolve => setTimeout(resolve, 50));
313
+ // Register multiple subscriptions
314
+ await hass.socket.subscribe({
315
+ context,
316
+ event_type: "multi_test_1",
317
+ exec: () => { },
318
+ });
319
+ await hass.socket.subscribe({
320
+ context,
321
+ event_type: "multi_test_2",
322
+ exec: () => { },
323
+ });
324
+ await hass.socket.subscribe({
325
+ context,
326
+ event_type: "multi_test_3",
327
+ exec: () => { },
328
+ });
329
+ // Clear the spy to only track re-establishment calls
330
+ sendMessageSpy.mockClear();
331
+ // Register an onConnect callback that will trigger re-establishment
332
+ hass.socket.onConnect(async () => {
333
+ // This callback will trigger re-establishment
334
+ });
335
+ // Trigger reconnect by emitting SOCKET_CONNECTED event
336
+ event.emit("SOCKET_CONNECTED");
337
+ // Wait for async operations
338
+ await new Promise(resolve => setTimeout(resolve, 150));
339
+ // Should have re-established our specific subscriptions (along with others)
340
+ const reestablishCalls = sendMessageSpy.mock.calls.filter(call => call[0]?.type === "subscribe_events" &&
341
+ (call[0]?.event_type === "multi_test_1" ||
342
+ call[0]?.event_type === "multi_test_2" ||
343
+ call[0]?.event_type === "multi_test_3"));
344
+ // Verify each specific subscription was re-established
345
+ expect(reestablishCalls.length).toBe(3);
346
+ expect(reestablishCalls.some(call => call[0]?.event_type === "multi_test_1")).toBe(true);
347
+ expect(reestablishCalls.some(call => call[0]?.event_type === "multi_test_2")).toBe(true);
348
+ expect(reestablishCalls.some(call => call[0]?.event_type === "multi_test_3")).toBe(true);
349
+ });
350
+ });
351
+ });
352
+ });
176
353
  });
177
354
  //# sourceMappingURL=websocket.spec.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"websocket.spec.mjs","sourceRoot":"","sources":["../../src/testing/websocket.spec.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"websocket.spec.mjs","sourceRoot":"","sources":["../../src/testing/websocket.spec.mts"],"names":[],"mappings":"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"}
package/dist/user.d.mts CHANGED
@@ -21,11 +21,18 @@ export interface HassZoneMapping {
21
21
  }
22
22
  export interface HassThemeMapping {
23
23
  }
24
+ export interface HassConfigEntryMapping {
25
+ }
26
+ export type FindEntryIdByTitle<TITLE extends HassConfigEntryMapping[keyof HassConfigEntryMapping]["title"]> = {
27
+ [K in keyof HassConfigEntryMapping]: HassConfigEntryMapping[K]["title"] extends TITLE ? K : never;
28
+ }[keyof HassConfigEntryMapping];
29
+ export type TConfigEntryTitle = HassConfigEntryMapping[keyof HassConfigEntryMapping]["title"];
24
30
  export type TAreaId = UnPrefix<keyof HassAreaMapping>;
25
31
  export type TDeviceId = UnPrefix<keyof HassDeviceMapping>;
26
32
  export type TFloorId = UnPrefix<keyof HassFloorMapping>;
27
33
  export type TLabelId = UnPrefix<keyof HassLabelMapping>;
28
34
  export type TPlatformId = UnPrefix<keyof HassPlatformMapping>;
35
+ export type TConfigEntryId = keyof HassConfigEntryMapping;
29
36
  export type TRawDomains = keyof HassDomainMapping;
30
37
  export type TZoneId = keyof HassZoneMapping;
31
38
  export type ALL_DOMAINS = keyof HassDomainMapping;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "@digital-alchemy/hass",
4
4
  "repository": "https://github.com/Digital-Alchemy-TS/hass",
5
5
  "homepage": "https://docs.digital-alchemy.app",
6
- "version": "25.10.27-beta.1",
6
+ "version": "25.11.16",
7
7
  "description": "Typescript APIs for Home Assistant. Includes rest & websocket bindings",
8
8
  "scripts": {
9
9
  "build": "rm -rf dist/; tsc",
@@ -192,4 +192,19 @@ declare module "../user.mts" {
192
192
  "LCARS Breen": true;
193
193
  "Minimal Ninja": "light" | "dark";
194
194
  }
195
+
196
+ export interface HassConfigEntryMapping {
197
+ "01JJJ3NAS9JAW1SESXZRHG7YH7": { title: "Sun"; domain: "sun" };
198
+ "01JJJ3NAVSK3WCDRZQADJVMDRH": { title: "Supervisor"; domain: "hassio" };
199
+ "01JJJ3NAVSPAHW2THWYBHM1X8F": {
200
+ title: "Intel Corporate 0a2b (7C:2A:31:0C:B1:9B)";
201
+ domain: "bluetooth";
202
+ };
203
+ "01JJJ4TT048V3TMDZHN29D3X5D": { title: "Shopping list"; domain: "shopping_list" };
204
+ "01JJJ4TT0BD1GFQQSGN295AH7G": {
205
+ title: "Google Translate text-to-speech";
206
+ domain: "google_translate";
207
+ };
208
+ "01JJJ4TT1VM15JJQ1YXC6MJKRF": { title: "Radio Browser"; domain: "radio_browser" };
209
+ }
195
210
  }
@@ -1,4 +1,3 @@
1
- /* eslint-disable @cspell/spellchecker */
2
1
  /* eslint-disable @typescript-eslint/no-magic-numbers */
3
2
  declare module "../user.mts" {
4
3
  export interface HassEntitySetupMapping {
@@ -1,6 +1,5 @@
1
1
  /* eslint-disable sonarjs/class-name */
2
2
  /* eslint-disable @typescript-eslint/no-empty-object-type */
3
- /* eslint-disable @cspell/spellchecker */
4
3
 
5
4
  import type {
6
5
  AndroidNotificationData,
@@ -6,6 +6,7 @@ import {
6
6
  Backup,
7
7
  CallProxy,
8
8
  Configure,
9
+ ConversationService,
9
10
  Device,
10
11
  EntityManager,
11
12
  EventsService,
@@ -174,6 +175,11 @@ export const LIB_HASS = CreateLibrary({
174
175
  */
175
176
  configure: Configure,
176
177
 
178
+ /**
179
+ * conversation agent interactions
180
+ */
181
+ conversation: ConversationService,
182
+
177
183
  /**
178
184
  * device interactions
179
185
  */
@@ -252,6 +258,10 @@ export const LIB_HASS = CreateLibrary({
252
258
  });
253
259
 
254
260
  declare module "@digital-alchemy/core" {
261
+ export interface AsyncLogData {
262
+ hassOnConnect?: boolean;
263
+ }
264
+
255
265
  export interface LoadedModules {
256
266
  /**
257
267
  * tools for interacting with home assistant
@@ -1,4 +1,10 @@
1
- import type { TAreaId, TFloorId, TLabelId } from "../../user.mts";
1
+ import type {
2
+ HassConfigEntryMapping,
3
+ TAreaId,
4
+ TConfigEntryId,
5
+ TFloorId,
6
+ TLabelId,
7
+ } from "../../user.mts";
2
8
 
3
9
  export interface HassUnitSystem {
4
10
  length: "mi";
@@ -52,10 +58,10 @@ export type AreaCreate = {
52
58
  picture?: string;
53
59
  };
54
60
 
55
- export interface ConfigEntry {
56
- entry_id: string;
57
- domain: string;
58
- title: string;
61
+ export interface ConfigEntry<ENTRY_ID extends TConfigEntryId = TConfigEntryId> {
62
+ entry_id: ENTRY_ID;
63
+ domain: HassConfigEntryMapping[ENTRY_ID]["domain"];
64
+ title: HassConfigEntryMapping[ENTRY_ID]["title"];
59
65
  source: string;
60
66
  state: State;
61
67
  supports_options: boolean;
@@ -25,10 +25,12 @@ import type {
25
25
  TRawEntityIds,
26
26
  TUniqueId,
27
27
  } from "../user.mts";
28
+ import type { FindEntryIdByTitle, TConfigEntryId, TConfigEntryTitle } from "../user.mts";
28
29
  import type { BackupResponse, HomeAssistantBackup } from "./backup.mts";
29
30
  import type { DeviceDetails } from "./device.mts";
30
31
  import type { ByIdProxy } from "./entity-state.mts";
31
32
  import type { AreaCreate, AreaDetails, ConfigEntry, HassConfig, HassServiceDTO } from "./index.mts";
33
+ import type { SupportedLanguages } from "./languages.mts";
32
34
  import type {
33
35
  EditAliasOptions,
34
36
  EditLabelOptions,
@@ -96,6 +98,11 @@ export type HassBackupService = {
96
98
  };
97
99
 
98
100
  export type HassConfigService = {
101
+ current: () => ConfigEntry<TConfigEntryId>[];
102
+ get: () => Promise<ConfigEntry<TConfigEntryId>[]>;
103
+ byTitle: <TITLE extends TConfigEntryTitle>(
104
+ title: TITLE,
105
+ ) => ConfigEntry<FindEntryIdByTitle<TITLE>> | undefined;
99
106
  getServices: () => HassServiceDTO[];
100
107
  isService: <DOMAIN extends ALL_SERVICE_DOMAINS>(
101
108
  domain: DOMAIN,
@@ -215,8 +222,15 @@ export enum WebsocketConnectionState {
215
222
 
216
223
  export type ConnectionState = `${keyof typeof WebsocketConnectionState}`;
217
224
 
225
+ export type ConversationAgent = {
226
+ id: string;
227
+ name: string;
228
+ supported_languages: SupportedLanguages[];
229
+ };
230
+
218
231
  export type HassConversationService = {
219
232
  addAlias: (options: EditAliasOptions) => Promise<void>;
233
+ listAgents: () => Promise<ConversationAgent[]>;
220
234
  removeAlias: (options: EditAliasOptions) => Promise<void>;
221
235
  setConversational: (options: ToggleExpose) => Promise<void>;
222
236
  };
@@ -13,6 +13,19 @@ export function Area({
13
13
  event,
14
14
  lifecycle,
15
15
  }: TServiceParams): HassAreaService {
16
+ void hass.socket.subscribe({
17
+ context,
18
+ event_type: "area_registry_updated",
19
+ async exec() {
20
+ const ms = perf();
21
+ await debounce(AREA_REGISTRY_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
22
+ hass.area.current = await hass.area.list();
23
+ logger.debug(`area registry updated`);
24
+ event.emit(AREA_REGISTRY_UPDATED);
25
+ hass.diagnostics.area?.registry_update.publish({ ms: ms() });
26
+ },
27
+ });
28
+
16
29
  hass.socket.onConnect(async () => {
17
30
  let loading = new Promise<void>(async done => {
18
31
  hass.area.current = await hass.area.list();
@@ -20,19 +33,6 @@ export function Area({
20
33
  done();
21
34
  });
22
35
  lifecycle.onReady(async () => loading && (await loading), EARLY_ON_READY);
23
-
24
- hass.socket.subscribe({
25
- context,
26
- event_type: "area_registry_updated",
27
- async exec() {
28
- const ms = perf();
29
- await debounce(AREA_REGISTRY_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
30
- hass.area.current = await hass.area.list();
31
- logger.debug(`area registry updated`);
32
- event.emit(AREA_REGISTRY_UPDATED);
33
- hass.diagnostics.area?.registry_update.publish({ ms: ms() });
34
- },
35
- });
36
36
  });
37
37
 
38
38
  async function list() {
@@ -1,16 +1,27 @@
1
1
  /* eslint-disable @typescript-eslint/no-magic-numbers */
2
2
  import type { TServiceParams } from "@digital-alchemy/core";
3
- import { asyncNoop, INCREMENT, SECOND, sleep, START } from "@digital-alchemy/core";
3
+ import { asyncNoop, debounce, INCREMENT, SECOND, sleep, START } from "@digital-alchemy/core";
4
4
  import { env } from "process";
5
5
 
6
- import type { ALL_SERVICE_DOMAINS, HassConfigService, HassServiceDTO } from "../helpers/index.mts";
6
+ import type {
7
+ ALL_SERVICE_DOMAINS,
8
+ ConfigEntry,
9
+ HassConfigService,
10
+ HassServiceDTO,
11
+ } from "../helpers/index.mts";
7
12
  import { PostConfigPriorities } from "../helpers/index.mts";
8
- import type { iCallService } from "../user.mts";
13
+ import type {
14
+ FindEntryIdByTitle,
15
+ iCallService,
16
+ TConfigEntryId,
17
+ TConfigEntryTitle,
18
+ } from "../user.mts";
9
19
 
10
20
  const MAX_ATTEMPTS = 50;
11
21
  const FAILED = 1;
12
22
 
13
23
  export const SERVICE_LIST_UPDATED = "SERVICE_LIST_UPDATED";
24
+ export const CONFIG_ENTRIES_UPDATED = "CONFIG_ENTRIES_UPDATED";
14
25
 
15
26
  export function Configure({
16
27
  logger,
@@ -19,10 +30,12 @@ export function Configure({
19
30
  hass,
20
31
  config,
21
32
  internal,
33
+ context,
22
34
  }: TServiceParams): HassConfigService {
23
35
  const { is } = internal.utils;
24
36
  let checkedServices = new Map<string, boolean>();
25
37
  let services: HassServiceDTO[];
38
+ let configEntries: ConfigEntry<TConfigEntryId>[] = [];
26
39
 
27
40
  lifecycle.onPreInit(() => {
28
41
  // HASSIO_TOKEN provided by home assistant to addons
@@ -77,6 +90,7 @@ export function Configure({
77
90
  if (recursion > MAX_ATTEMPTS) {
78
91
  logger.fatal({ name: loadServiceList }, `failed to load service list from Home Assistant`);
79
92
  process.exit(FAILED);
93
+ return;
80
94
  }
81
95
  logger.warn(
82
96
  { name: loadServiceList },
@@ -98,15 +112,48 @@ export function Configure({
98
112
  domain: DOMAIN,
99
113
  service: string,
100
114
  ): service is Extract<keyof iCallService[DOMAIN], string> {
101
- if (checkedServices.has(service)) {
102
- return checkedServices.get(service);
115
+ const key = [domain, service].join(".");
116
+ if (checkedServices.has(key)) {
117
+ return checkedServices.get(key);
103
118
  }
104
119
  const exists = services.some(i => i.domain === domain && !is.undefined(i.services[service]));
105
- checkedServices.set(service, exists);
120
+ checkedServices.set(key, exists);
106
121
  return exists;
107
122
  }
108
123
 
124
+ function byTitle<TITLE extends TConfigEntryTitle>(
125
+ title: TITLE,
126
+ ): ConfigEntry<FindEntryIdByTitle<TITLE>> {
127
+ logger.trace({ name: byTitle, title }, `looking up config entry by title`);
128
+ const entry = configEntries.find(e => e.title === title);
129
+ return entry as ConfigEntry<FindEntryIdByTitle<TITLE>>;
130
+ }
131
+
132
+ async function get(): Promise<ConfigEntry<TConfigEntryId>[]> {
133
+ logger.trace({ name: get }, `fetching config entries`);
134
+ const entries = await hass.socket.sendMessage<ConfigEntry<TConfigEntryId>[]>({
135
+ type: "config_entries/get",
136
+ });
137
+ configEntries = entries;
138
+ event.emit(CONFIG_ENTRIES_UPDATED, entries);
139
+ return entries;
140
+ }
141
+
142
+ void hass.socket.subscribe({
143
+ context,
144
+ event_type: "config_entry_updated",
145
+ async exec() {
146
+ await debounce(CONFIG_ENTRIES_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
147
+ await get();
148
+ },
149
+ });
150
+
151
+ hass.socket.onConnect(async () => await get());
152
+
109
153
  return {
154
+ byTitle,
155
+ current: () => configEntries,
156
+ get,
110
157
  getServices: () => services,
111
158
  isService,
112
159
  loadServiceList,
@@ -1,9 +1,14 @@
1
1
  import type { TServiceParams } from "@digital-alchemy/core";
2
2
 
3
- import type { EditAliasOptions, HassConversationService, ToggleExpose } from "../helpers/index.mts";
3
+ import type {
4
+ ConversationAgent,
5
+ EditAliasOptions,
6
+ HassConversationService,
7
+ ToggleExpose,
8
+ } from "../helpers/index.mts";
4
9
  import { UPDATE_REGISTRY } from "../helpers/index.mts";
5
10
 
6
- export function Conversation({ hass, logger }: TServiceParams): HassConversationService {
11
+ export function ConversationService({ hass, logger }: TServiceParams): HassConversationService {
7
12
  async function addAlias({ entity, alias }: EditAliasOptions) {
8
13
  const current = await hass.entity.registry.get(entity);
9
14
  if (current?.aliases?.includes(alias)) {
@@ -25,6 +30,14 @@ export function Conversation({ hass, logger }: TServiceParams): HassConversation
25
30
  await hass.socket.sendMessage({ entity_id: entity, type: UPDATE_REGISTRY });
26
31
  }
27
32
 
33
+ async function listAgents() {
34
+ logger.trace({ name: "listAgents" }, "fetching conversation agents");
35
+ const result = await hass.socket.sendMessage<{ agents: ConversationAgent[] }>({
36
+ type: "conversation/agent/list",
37
+ });
38
+ return result.agents;
39
+ }
40
+
28
41
  async function setConversational({ entity_ids, assistants, should_expose }: ToggleExpose) {
29
42
  await hass.socket.sendMessage({
30
43
  assistants: [assistants].flat(),
@@ -36,6 +49,7 @@ export function Conversation({ hass, logger }: TServiceParams): HassConversation
36
49
 
37
50
  return {
38
51
  addAlias,
52
+ listAgents,
39
53
  removeAlias,
40
54
  setConversational,
41
55
  };
@@ -12,6 +12,19 @@ export function Device({
12
12
  lifecycle,
13
13
  event,
14
14
  }: TServiceParams): HassDeviceService {
15
+ void hass.socket.subscribe({
16
+ context,
17
+ event_type: "device_registry_updated",
18
+ async exec() {
19
+ const ms = perf();
20
+ await debounce(DEVICE_REGISTRY_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
21
+ hass.device.current = await hass.device.list();
22
+ logger.debug(`device registry updated`);
23
+ event.emit(DEVICE_REGISTRY_UPDATED);
24
+ hass.diagnostics.device?.registry_update.publish({ ms: ms() });
25
+ },
26
+ });
27
+
15
28
  hass.socket.onConnect(async () => {
16
29
  let loading = new Promise<void>(async done => {
17
30
  hass.device.current = await hass.device.list();
@@ -19,29 +32,8 @@ export function Device({
19
32
  done();
20
33
  });
21
34
  lifecycle.onReady(async () => loading && (await loading), EARLY_ON_READY);
22
- await subscribeUpdates();
23
-
24
- hass.socket.subscribe({
25
- context,
26
- event_type: "device_registry_updated",
27
- async exec() {
28
- const ms = perf();
29
- await debounce(DEVICE_REGISTRY_UPDATED, config.hass.EVENT_DEBOUNCE_MS);
30
- hass.device.current = await hass.device.list();
31
- logger.debug(`device registry updated`);
32
- event.emit(DEVICE_REGISTRY_UPDATED);
33
- hass.diagnostics.device?.registry_update.publish({ ms: ms() });
34
- },
35
- });
36
35
  });
37
36
 
38
- async function subscribeUpdates() {
39
- await hass.socket.sendMessage({
40
- event_type: "device_registry_updated",
41
- type: "subscribe_events",
42
- });
43
- }
44
-
45
37
  async function list() {
46
38
  return await hass.socket.sendMessage<DeviceDetails[]>({
47
39
  type: "config/device_registry/list",