@coffeerunhobby/mcp-ha-connect 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +8 -0
- package/.env.example +149 -0
- package/.gitattributes +30 -0
- package/Dockerfile +33 -0
- package/LICENSE +21 -0
- package/README.md +394 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +183 -0
- package/dist/config.js.map +1 -0
- package/dist/haClient/automations.d.ts +67 -0
- package/dist/haClient/automations.d.ts.map +1 -0
- package/dist/haClient/automations.js +181 -0
- package/dist/haClient/automations.js.map +1 -0
- package/dist/haClient/config.d.ts +28 -0
- package/dist/haClient/config.d.ts.map +1 -0
- package/dist/haClient/config.js +38 -0
- package/dist/haClient/config.js.map +1 -0
- package/dist/haClient/devices.d.ts +219 -0
- package/dist/haClient/devices.d.ts.map +1 -0
- package/dist/haClient/devices.js +506 -0
- package/dist/haClient/devices.js.map +1 -0
- package/dist/haClient/entities.d.ts +35 -0
- package/dist/haClient/entities.d.ts.map +1 -0
- package/dist/haClient/entities.js +97 -0
- package/dist/haClient/entities.js.map +1 -0
- package/dist/haClient/events.d.ts +138 -0
- package/dist/haClient/events.d.ts.map +1 -0
- package/dist/haClient/events.js +344 -0
- package/dist/haClient/events.js.map +1 -0
- package/dist/haClient/history.d.ts +26 -0
- package/dist/haClient/history.d.ts.map +1 -0
- package/dist/haClient/history.js +54 -0
- package/dist/haClient/history.js.map +1 -0
- package/dist/haClient/index.d.ts +153 -0
- package/dist/haClient/index.d.ts.map +1 -0
- package/dist/haClient/index.js +223 -0
- package/dist/haClient/index.js.map +1 -0
- package/dist/haClient/request.d.ts +34 -0
- package/dist/haClient/request.d.ts.map +1 -0
- package/dist/haClient/request.js +93 -0
- package/dist/haClient/request.js.map +1 -0
- package/dist/haClient/services.d.ts +22 -0
- package/dist/haClient/services.d.ts.map +1 -0
- package/dist/haClient/services.js +39 -0
- package/dist/haClient/services.js.map +1 -0
- package/dist/haClient/states.d.ts +26 -0
- package/dist/haClient/states.d.ts.map +1 -0
- package/dist/haClient/states.js +53 -0
- package/dist/haClient/states.js.map +1 -0
- package/dist/haClient/updates.d.ts +22 -0
- package/dist/haClient/updates.d.ts.map +1 -0
- package/dist/haClient/updates.js +48 -0
- package/dist/haClient/updates.js.map +1 -0
- package/dist/haClient.d.ts +97 -0
- package/dist/haClient.d.ts.map +1 -0
- package/dist/haClient.js +344 -0
- package/dist/haClient.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/localAI/index.d.ts +37 -0
- package/dist/localAI/index.d.ts.map +1 -0
- package/dist/localAI/index.js +73 -0
- package/dist/localAI/index.js.map +1 -0
- package/dist/localAI/prompts.d.ts +20 -0
- package/dist/localAI/prompts.d.ts.map +1 -0
- package/dist/localAI/prompts.js +48 -0
- package/dist/localAI/prompts.js.map +1 -0
- package/dist/localAI/providers/base.d.ts +51 -0
- package/dist/localAI/providers/base.d.ts.map +1 -0
- package/dist/localAI/providers/base.js +80 -0
- package/dist/localAI/providers/base.js.map +1 -0
- package/dist/localAI/providers/ollama.d.ts +22 -0
- package/dist/localAI/providers/ollama.d.ts.map +1 -0
- package/dist/localAI/providers/ollama.js +63 -0
- package/dist/localAI/providers/ollama.js.map +1 -0
- package/dist/localAI/providers/openai.d.ts +23 -0
- package/dist/localAI/providers/openai.d.ts.map +1 -0
- package/dist/localAI/providers/openai.js +63 -0
- package/dist/localAI/providers/openai.js.map +1 -0
- package/dist/localAI/types.d.ts +61 -0
- package/dist/localAI/types.d.ts.map +1 -0
- package/dist/localAI/types.js +6 -0
- package/dist/localAI/types.js.map +1 -0
- package/dist/ollamaClient.d.ts +37 -0
- package/dist/ollamaClient.d.ts.map +1 -0
- package/dist/ollamaClient.js +110 -0
- package/dist/ollamaClient.js.map +1 -0
- package/dist/resources/index.d.ts +11 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +238 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/server/common.d.ts +9 -0
- package/dist/server/common.d.ts.map +1 -0
- package/dist/server/common.js +27 -0
- package/dist/server/common.js.map +1 -0
- package/dist/server/eventSubscription.d.ts +53 -0
- package/dist/server/eventSubscription.d.ts.map +1 -0
- package/dist/server/eventSubscription.js +257 -0
- package/dist/server/eventSubscription.js.map +1 -0
- package/dist/server/http.d.ts +12 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +491 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/rateLimiter.d.ts +70 -0
- package/dist/server/rateLimiter.d.ts.map +1 -0
- package/dist/server/rateLimiter.js +156 -0
- package/dist/server/rateLimiter.js.map +1 -0
- package/dist/server/sse.d.ts +32 -0
- package/dist/server/sse.d.ts.map +1 -0
- package/dist/server/sse.js +76 -0
- package/dist/server/sse.js.map +1 -0
- package/dist/server/stdio.d.ts +8 -0
- package/dist/server/stdio.d.ts.map +1 -0
- package/dist/server/stdio.js +16 -0
- package/dist/server/stdio.js.map +1 -0
- package/dist/server/stream.d.ts +26 -0
- package/dist/server/stream.d.ts.map +1 -0
- package/dist/server/stream.js +81 -0
- package/dist/server/stream.js.map +1 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +30 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/callService.d.ts +8 -0
- package/dist/tools/callService.d.ts.map +1 -0
- package/dist/tools/callService.js +100 -0
- package/dist/tools/callService.js.map +1 -0
- package/dist/tools/getClient.d.ts +8 -0
- package/dist/tools/getClient.d.ts.map +1 -0
- package/dist/tools/getClient.js +94 -0
- package/dist/tools/getClient.js.map +1 -0
- package/dist/tools/getDevice.d.ts +8 -0
- package/dist/tools/getDevice.d.ts.map +1 -0
- package/dist/tools/getDevice.js +94 -0
- package/dist/tools/getDevice.js.map +1 -0
- package/dist/tools/getEntitiesByDomain.d.ts +8 -0
- package/dist/tools/getEntitiesByDomain.d.ts.map +1 -0
- package/dist/tools/getEntitiesByDomain.js +80 -0
- package/dist/tools/getEntitiesByDomain.js.map +1 -0
- package/dist/tools/getState.d.ts +8 -0
- package/dist/tools/getState.d.ts.map +1 -0
- package/dist/tools/getState.js +90 -0
- package/dist/tools/getState.js.map +1 -0
- package/dist/tools/getStates.d.ts +8 -0
- package/dist/tools/getStates.d.ts.map +1 -0
- package/dist/tools/getStates.js +70 -0
- package/dist/tools/getStates.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/listClients.d.ts +8 -0
- package/dist/tools/listClients.d.ts.map +1 -0
- package/dist/tools/listClients.js +73 -0
- package/dist/tools/listClients.js.map +1 -0
- package/dist/tools/listDevices.d.ts +8 -0
- package/dist/tools/listDevices.d.ts.map +1 -0
- package/dist/tools/listDevices.js +73 -0
- package/dist/tools/listDevices.js.map +1 -0
- package/dist/tools/listSites.d.ts +8 -0
- package/dist/tools/listSites.d.ts.map +1 -0
- package/dist/tools/listSites.js +67 -0
- package/dist/tools/listSites.js.map +1 -0
- package/dist/tools/registry.d.ts +9 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +1382 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/searchDevices.d.ts +8 -0
- package/dist/tools/searchDevices.d.ts.map +1 -0
- package/dist/tools/searchDevices.js +84 -0
- package/dist/tools/searchDevices.js.map +1 -0
- package/dist/tools/searchEntities.d.ts +8 -0
- package/dist/tools/searchEntities.d.ts.map +1 -0
- package/dist/tools/searchEntities.js +80 -0
- package/dist/tools/searchEntities.js.map +1 -0
- package/dist/types/entity.d.ts +98 -0
- package/dist/types/entity.d.ts.map +1 -0
- package/dist/types/entity.js +2 -0
- package/dist/types/entity.js.map +1 -0
- package/dist/types/errors.d.ts +16 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +32 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/haConfig.d.ts +8 -0
- package/dist/types/haConfig.d.ts.map +1 -0
- package/dist/types/haConfig.js +2 -0
- package/dist/types/haConfig.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/request.d.ts +7 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +2 -0
- package/dist/types/request.js.map +1 -0
- package/dist/types/serviceCall.d.ts +18 -0
- package/dist/types/serviceCall.d.ts.map +1 -0
- package/dist/types/serviceCall.js +2 -0
- package/dist/types/serviceCall.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/config-validations.d.ts +12 -0
- package/dist/utils/config-validations.d.ts.map +1 -0
- package/dist/utils/config-validations.js +43 -0
- package/dist/utils/config-validations.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +94 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/wrapper.d.ts +8 -0
- package/dist/wrapper.d.ts.map +1 -0
- package/dist/wrapper.js +301 -0
- package/dist/wrapper.js.map +1 -0
- package/docker-compose.yml +17 -0
- package/docs/CHANGELOG.md +86 -0
- package/docs/LOCAL_CLIENT.md +268 -0
- package/docs/SSE_API.md +341 -0
- package/eslint.config.js +33 -0
- package/n8n/ai-agent-safety-monitor.json +355 -0
- package/openapi.json +166 -0
- package/package.json +51 -0
- package/src/config.ts +260 -0
- package/src/haClient/automations.ts +217 -0
- package/src/haClient/config.ts +41 -0
- package/src/haClient/devices.ts +653 -0
- package/src/haClient/entities.ts +128 -0
- package/src/haClient/events.ts +456 -0
- package/src/haClient/history.ts +68 -0
- package/src/haClient/index.ts +287 -0
- package/src/haClient/request.ts +127 -0
- package/src/haClient/services.ts +45 -0
- package/src/haClient/states.ts +60 -0
- package/src/haClient/updates.ts +58 -0
- package/src/index.ts +99 -0
- package/src/localAI/index.ts +88 -0
- package/src/localAI/prompts.ts +50 -0
- package/src/localAI/providers/base.ts +120 -0
- package/src/localAI/providers/ollama.ts +78 -0
- package/src/localAI/providers/openai.ts +86 -0
- package/src/localAI/types.ts +67 -0
- package/src/resources/index.ts +266 -0
- package/src/server/common.ts +38 -0
- package/src/server/eventSubscription.ts +318 -0
- package/src/server/http.ts +546 -0
- package/src/server/rateLimiter.ts +195 -0
- package/src/server/sse.ts +120 -0
- package/src/server/stdio.ts +22 -0
- package/src/server/stream.ts +113 -0
- package/src/tools/callService.ts +114 -0
- package/src/tools/getEntitiesByDomain.ts +92 -0
- package/src/tools/getState.ts +103 -0
- package/src/tools/getStates.ts +80 -0
- package/src/tools/index.ts +9 -0
- package/src/tools/registry.ts +1521 -0
- package/src/tools/searchEntities.ts +92 -0
- package/src/types/entity.ts +110 -0
- package/src/types/errors.ts +33 -0
- package/src/types/haConfig.ts +7 -0
- package/src/types/index.ts +5 -0
- package/src/types/request.ts +6 -0
- package/src/types/serviceCall.ts +18 -0
- package/src/types.ts +2 -0
- package/src/utils/config-validations.ts +46 -0
- package/src/utils/logger.ts +114 -0
- package/src/wrapper.ts +340 -0
- package/tests/config.test.ts +332 -0
- package/tests/haClient/automations.test.ts +133 -0
- package/tests/haClient/config.test.ts +96 -0
- package/tests/haClient/entities.test.ts +188 -0
- package/tests/haClient/history.test.ts +170 -0
- package/tests/haClient/index.test.ts +221 -0
- package/tests/haClient/request.test.ts +217 -0
- package/tests/haClient/services.test.ts +120 -0
- package/tests/haClient/states.test.ts +119 -0
- package/tests/haClient/updates.test.ts +193 -0
- package/tests/index.test.ts +164 -0
- package/tests/localAI/index.test.ts +168 -0
- package/tests/localAI/ollama.test.ts +187 -0
- package/tests/localAI/openai.test.ts +257 -0
- package/tests/server/common.test.ts +64 -0
- package/tests/server/http.test.ts +326 -0
- package/tests/server/sse.test.ts +240 -0
- package/tests/server/stdio.test.ts +102 -0
- package/tests/server/stream.test.ts +287 -0
- package/tests/tools/registry.test.ts +355 -0
- package/tests/utils/config-validations.test.ts +289 -0
- package/tests/utils/logger.test.ts +327 -0
- package/tsconfig.json +25 -0
- package/vitest.config.ts +26 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Operations for Home Assistant API
|
|
3
|
+
* Handles entity state retrieval
|
|
4
|
+
*/
|
|
5
|
+
import { ApiError } from '../types/index.js';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
/**
|
|
8
|
+
* State-related operations for the Home Assistant API.
|
|
9
|
+
*/
|
|
10
|
+
export class StateOperations {
|
|
11
|
+
request;
|
|
12
|
+
constructor(request) {
|
|
13
|
+
this.request = request;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get all states (entities)
|
|
17
|
+
*/
|
|
18
|
+
async getStates() {
|
|
19
|
+
logger.debug('Fetching all states');
|
|
20
|
+
const states = await this.request.get('/states');
|
|
21
|
+
logger.info('Fetched states', { count: states.length });
|
|
22
|
+
return states;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get state of a specific entity
|
|
26
|
+
*/
|
|
27
|
+
async getState(entityId) {
|
|
28
|
+
logger.debug('Fetching state', { entityId });
|
|
29
|
+
try {
|
|
30
|
+
const state = await this.request.get(`/states/${entityId}`);
|
|
31
|
+
return state;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error instanceof ApiError && error.statusCode === 404) {
|
|
35
|
+
logger.warn('Entity not found', { entityId });
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get all sensors (sensor.* and binary_sensor.* entities)
|
|
43
|
+
*/
|
|
44
|
+
async getAllSensors() {
|
|
45
|
+
logger.debug('Fetching all sensors');
|
|
46
|
+
const allStates = await this.getStates();
|
|
47
|
+
const sensors = allStates.filter(entity => entity.entity_id.startsWith('sensor.') ||
|
|
48
|
+
entity.entity_id.startsWith('binary_sensor.'));
|
|
49
|
+
logger.info('Fetched sensors', { count: sensors.length });
|
|
50
|
+
return sensors;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=states.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"states.js","sourceRoot":"","sources":["../../src/haClient/states.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C;;GAEG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAW,SAAS,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAS,WAAW,QAAQ,EAAE,CAAC,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC9C,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa;QACjB,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAErC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACxC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAC9C,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC;IACjB,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update Operations for Home Assistant API
|
|
3
|
+
* Handles checking for available updates
|
|
4
|
+
*/
|
|
5
|
+
import type { Entity, UpdateInfo } from '../types/index.js';
|
|
6
|
+
import type { EntityOperations } from './entities.js';
|
|
7
|
+
/**
|
|
8
|
+
* Update-related operations for the Home Assistant API.
|
|
9
|
+
*/
|
|
10
|
+
export declare class UpdateOperations {
|
|
11
|
+
private readonly entityOps;
|
|
12
|
+
constructor(entityOps: EntityOperations);
|
|
13
|
+
/**
|
|
14
|
+
* Get available updates by checking update.* entities
|
|
15
|
+
* Works with regular long-lived access tokens
|
|
16
|
+
*/
|
|
17
|
+
getAvailableUpdates(): Promise<{
|
|
18
|
+
updates: UpdateInfo[];
|
|
19
|
+
entities: Entity[];
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=updates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updates.d.ts","sourceRoot":"","sources":["../../src/haClient/updates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD;;GAEG;AACH,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,gBAAgB;IAExD;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CAmCH"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Update Operations for Home Assistant API
|
|
3
|
+
* Handles checking for available updates
|
|
4
|
+
*/
|
|
5
|
+
import { logger } from '../utils/logger.js';
|
|
6
|
+
/**
|
|
7
|
+
* Update-related operations for the Home Assistant API.
|
|
8
|
+
*/
|
|
9
|
+
export class UpdateOperations {
|
|
10
|
+
entityOps;
|
|
11
|
+
constructor(entityOps) {
|
|
12
|
+
this.entityOps = entityOps;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Get available updates by checking update.* entities
|
|
16
|
+
* Works with regular long-lived access tokens
|
|
17
|
+
*/
|
|
18
|
+
async getAvailableUpdates() {
|
|
19
|
+
logger.debug('Fetching available updates from update entities');
|
|
20
|
+
// Get all update entities
|
|
21
|
+
const updateEntities = await this.entityOps.getEntitiesByDomain('update');
|
|
22
|
+
// Filter to only those with updates available (state = 'on')
|
|
23
|
+
const updates = [];
|
|
24
|
+
for (const entity of updateEntities) {
|
|
25
|
+
const attrs = entity.attributes;
|
|
26
|
+
const installedVersion = attrs.installed_version;
|
|
27
|
+
const latestVersion = attrs.latest_version;
|
|
28
|
+
const title = attrs.title || attrs.friendly_name || entity.entity_id;
|
|
29
|
+
// state 'on' means update is available
|
|
30
|
+
if (entity.state === 'on' && installedVersion && latestVersion) {
|
|
31
|
+
updates.push({
|
|
32
|
+
update_type: entity.entity_id.includes('core') ? 'core' :
|
|
33
|
+
entity.entity_id.includes('supervisor') ? 'supervisor' :
|
|
34
|
+
entity.entity_id.includes('operating_system') ? 'os' : 'addon',
|
|
35
|
+
name: title,
|
|
36
|
+
version_current: installedVersion,
|
|
37
|
+
version_latest: latestVersion,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
logger.info('Fetched available updates', { updateCount: updates.length, totalEntities: updateEntities.length });
|
|
42
|
+
return {
|
|
43
|
+
updates,
|
|
44
|
+
entities: updateEntities,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=updates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updates.js","sourceRoot":"","sources":["../../src/haClient/updates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,SAA2B;QAA3B,cAAS,GAAT,SAAS,CAAkB;IAAG,CAAC;IAE5D;;;OAGG;IACH,KAAK,CAAC,mBAAmB;QAIvB,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;QAEhE,0BAA0B;QAC1B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAE1E,6DAA6D;QAC7D,MAAM,OAAO,GAAiB,EAAE,CAAC;QAEjC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;YAChC,MAAM,gBAAgB,GAAG,KAAK,CAAC,iBAAuC,CAAC;YACvE,MAAM,aAAa,GAAG,KAAK,CAAC,cAAoC,CAAC;YACjE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAe,IAAI,KAAK,CAAC,aAAuB,IAAI,MAAM,CAAC,SAAS,CAAC;YAEzF,uCAAuC;YACvC,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,gBAAgB,IAAI,aAAa,EAAE,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC;oBACX,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;wBAC5C,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;4BACxD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;oBAC3E,IAAI,EAAE,KAAK;oBACX,eAAe,EAAE,gBAAgB;oBACjC,cAAc,EAAE,aAAa;iBAC9B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhH,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,cAAc;SACzB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Home Assistant API Client
|
|
3
|
+
* Handles authentication and API requests
|
|
4
|
+
*/
|
|
5
|
+
import type { EnvironmentConfig } from './config.js';
|
|
6
|
+
import { type Entity, type ServiceCallData, type ServiceCallResponse, type Automation, type DomainSummary, type HaVersion, type LogbookEntry, type UpdateInfo } from './types/index.js';
|
|
7
|
+
export declare class HaClient {
|
|
8
|
+
private httpsAgent?;
|
|
9
|
+
private baseUrl;
|
|
10
|
+
private token;
|
|
11
|
+
private timeout;
|
|
12
|
+
constructor(config: EnvironmentConfig);
|
|
13
|
+
/**
|
|
14
|
+
* Make authenticated request to Home Assistant API
|
|
15
|
+
*/
|
|
16
|
+
private request;
|
|
17
|
+
/**
|
|
18
|
+
* Get all states (entities)
|
|
19
|
+
*/
|
|
20
|
+
getStates(): Promise<Entity[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Get state of a specific entity
|
|
23
|
+
*/
|
|
24
|
+
getState(entityId: string): Promise<Entity | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Call a service
|
|
27
|
+
*/
|
|
28
|
+
callService(data: ServiceCallData): Promise<ServiceCallResponse>;
|
|
29
|
+
/**
|
|
30
|
+
* Get entities filtered by domain
|
|
31
|
+
*/
|
|
32
|
+
getEntitiesByDomain(domain: string): Promise<Entity[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Search entities by name or entity_id
|
|
35
|
+
*/
|
|
36
|
+
searchEntities(query: string): Promise<Entity[]>;
|
|
37
|
+
/**
|
|
38
|
+
* Get config
|
|
39
|
+
*/
|
|
40
|
+
getConfig(): Promise<Record<string, unknown>>;
|
|
41
|
+
/**
|
|
42
|
+
* Check API (health check)
|
|
43
|
+
*/
|
|
44
|
+
checkApi(): Promise<{
|
|
45
|
+
message: string;
|
|
46
|
+
}>;
|
|
47
|
+
/**
|
|
48
|
+
* Get all sensors (sensor.* and binary_sensor.* entities)
|
|
49
|
+
*/
|
|
50
|
+
getAllSensors(): Promise<Entity[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Get historical data for an entity
|
|
53
|
+
*/
|
|
54
|
+
getHistory(entityId: string, hours?: number): Promise<Entity[][]>;
|
|
55
|
+
/**
|
|
56
|
+
* Get Home Assistant version and configuration info
|
|
57
|
+
*/
|
|
58
|
+
getVersion(): Promise<HaVersion>;
|
|
59
|
+
/**
|
|
60
|
+
* Get all automations
|
|
61
|
+
*/
|
|
62
|
+
getAutomations(): Promise<Automation[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Restart Home Assistant
|
|
65
|
+
*/
|
|
66
|
+
restartServer(): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Get system log entries from the logbook
|
|
69
|
+
* Returns recent events/state changes, optionally filtered by entity
|
|
70
|
+
*/
|
|
71
|
+
getSystemLog(options?: {
|
|
72
|
+
hours?: number;
|
|
73
|
+
entity_id?: string;
|
|
74
|
+
}): Promise<LogbookEntry[]>;
|
|
75
|
+
/**
|
|
76
|
+
* Get domain summary with entity counts and state breakdown
|
|
77
|
+
*/
|
|
78
|
+
getDomainSummary(domain: string): Promise<DomainSummary>;
|
|
79
|
+
/**
|
|
80
|
+
* List entities with optional filtering
|
|
81
|
+
*/
|
|
82
|
+
listEntities(options?: {
|
|
83
|
+
domain?: string;
|
|
84
|
+
search?: string;
|
|
85
|
+
limit?: number;
|
|
86
|
+
state?: string;
|
|
87
|
+
}): Promise<Entity[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Get available updates by checking update.* entities
|
|
90
|
+
* Works with regular long-lived access tokens
|
|
91
|
+
*/
|
|
92
|
+
getAvailableUpdates(): Promise<{
|
|
93
|
+
updates: UpdateInfo[];
|
|
94
|
+
entities: Entity[];
|
|
95
|
+
}>;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=haClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"haClient.d.ts","sourceRoot":"","sources":["../src/haClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAEL,KAAK,MAAM,EACX,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,UAAU,EAGhB,MAAM,kBAAkB,CAAC;AAG1B,qBAAa,QAAQ;IACnB,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,iBAAiB;IAcrC;;OAEG;YACW,OAAO;IAwErB;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAOpC;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAexD;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAmBtE;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgB5D;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBtD;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAKnD;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAK9C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAaxC;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAuB3E;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;IAOtC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAmB7C;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAWpC;;;OAGG;IACG,YAAY,CAAC,OAAO,GAAE;QAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAsBhC;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA6B9D;;OAEG;IACG,YAAY,CAAC,OAAO,GAAE;QAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiC1B;;;OAGG;IACG,mBAAmB,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC;CAmCH"}
|
package/dist/haClient.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Home Assistant API Client
|
|
3
|
+
* Handles authentication and API requests
|
|
4
|
+
*/
|
|
5
|
+
import https from 'https';
|
|
6
|
+
import { AuthenticationError, ApiError, } from './types/index.js';
|
|
7
|
+
import { logger } from './utils/logger.js';
|
|
8
|
+
export class HaClient {
|
|
9
|
+
httpsAgent;
|
|
10
|
+
baseUrl;
|
|
11
|
+
token;
|
|
12
|
+
timeout;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
this.baseUrl = config.baseUrl;
|
|
15
|
+
this.token = config.token;
|
|
16
|
+
this.timeout = config.timeout;
|
|
17
|
+
// Create HTTPS agent with custom SSL settings
|
|
18
|
+
if (!config.strictSsl) {
|
|
19
|
+
this.httpsAgent = new https.Agent({
|
|
20
|
+
rejectUnauthorized: false,
|
|
21
|
+
});
|
|
22
|
+
logger.warn('SSL certificate validation is disabled');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Make authenticated request to Home Assistant API
|
|
27
|
+
*/
|
|
28
|
+
async request(path, options = {}) {
|
|
29
|
+
const url = new URL(`${this.baseUrl}/api${path}`);
|
|
30
|
+
// Add query parameters
|
|
31
|
+
if (options.params) {
|
|
32
|
+
Object.entries(options.params).forEach(([key, value]) => {
|
|
33
|
+
url.searchParams.append(key, String(value));
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
const headers = {
|
|
37
|
+
'Authorization': `Bearer ${this.token}`,
|
|
38
|
+
'Content-Type': 'application/json',
|
|
39
|
+
...options.headers,
|
|
40
|
+
};
|
|
41
|
+
logger.debug('Making API request', {
|
|
42
|
+
method: options.method ?? 'GET',
|
|
43
|
+
path,
|
|
44
|
+
params: options.params,
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
const response = await fetch(url.toString(), {
|
|
48
|
+
method: options.method ?? 'GET',
|
|
49
|
+
headers,
|
|
50
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
51
|
+
// @ts-expect-error - agent is valid but not in types
|
|
52
|
+
agent: this.httpsAgent,
|
|
53
|
+
signal: AbortSignal.timeout(this.timeout),
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) {
|
|
56
|
+
const errorText = await response.text();
|
|
57
|
+
if (response.status === 401) {
|
|
58
|
+
throw new AuthenticationError('Invalid Home Assistant token', { status: response.status, body: errorText });
|
|
59
|
+
}
|
|
60
|
+
throw new ApiError(`API request failed: ${response.statusText}`, response.status, { path, body: errorText });
|
|
61
|
+
}
|
|
62
|
+
// Handle empty responses
|
|
63
|
+
const contentType = response.headers.get('content-type');
|
|
64
|
+
if (!contentType?.includes('application/json')) {
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
const data = await response.json();
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
if (error instanceof AuthenticationError || error instanceof ApiError) {
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
throw new ApiError(`Request failed: ${error instanceof Error ? error.message : String(error)}`, 500, { path });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ===== API Methods =====
|
|
78
|
+
/**
|
|
79
|
+
* Get all states (entities)
|
|
80
|
+
*/
|
|
81
|
+
async getStates() {
|
|
82
|
+
logger.debug('Fetching all states');
|
|
83
|
+
const states = await this.request('/states');
|
|
84
|
+
logger.info('Fetched states', { count: states.length });
|
|
85
|
+
return states;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get state of a specific entity
|
|
89
|
+
*/
|
|
90
|
+
async getState(entityId) {
|
|
91
|
+
logger.debug('Fetching state', { entityId });
|
|
92
|
+
try {
|
|
93
|
+
const state = await this.request(`/states/${entityId}`);
|
|
94
|
+
return state;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof ApiError && error.statusCode === 404) {
|
|
98
|
+
logger.warn('Entity not found', { entityId });
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Call a service
|
|
106
|
+
*/
|
|
107
|
+
async callService(data) {
|
|
108
|
+
logger.info('Calling service', {
|
|
109
|
+
domain: data.domain,
|
|
110
|
+
service: data.service,
|
|
111
|
+
hasTarget: !!data.target,
|
|
112
|
+
});
|
|
113
|
+
const path = `/services/${data.domain}/${data.service}`;
|
|
114
|
+
const body = {
|
|
115
|
+
...data.service_data,
|
|
116
|
+
...data.target,
|
|
117
|
+
};
|
|
118
|
+
return await this.request(path, {
|
|
119
|
+
method: 'POST',
|
|
120
|
+
body,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get entities filtered by domain
|
|
125
|
+
*/
|
|
126
|
+
async getEntitiesByDomain(domain) {
|
|
127
|
+
logger.debug('Fetching entities by domain', { domain });
|
|
128
|
+
const allStates = await this.getStates();
|
|
129
|
+
const filtered = allStates.filter(entity => entity.entity_id.startsWith(`${domain}.`));
|
|
130
|
+
logger.info('Filtered entities by domain', {
|
|
131
|
+
domain,
|
|
132
|
+
count: filtered.length
|
|
133
|
+
});
|
|
134
|
+
return filtered;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Search entities by name or entity_id
|
|
138
|
+
*/
|
|
139
|
+
async searchEntities(query) {
|
|
140
|
+
logger.debug('Searching entities', { query });
|
|
141
|
+
const allStates = await this.getStates();
|
|
142
|
+
const lowerQuery = query.toLowerCase();
|
|
143
|
+
const results = allStates.filter(entity => {
|
|
144
|
+
const entityIdMatch = entity.entity_id.toLowerCase().includes(lowerQuery);
|
|
145
|
+
const nameMatch = entity.attributes.friendly_name &&
|
|
146
|
+
String(entity.attributes.friendly_name).toLowerCase().includes(lowerQuery);
|
|
147
|
+
return entityIdMatch || nameMatch;
|
|
148
|
+
});
|
|
149
|
+
logger.info('Search completed', { query, results: results.length });
|
|
150
|
+
return results;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get config
|
|
154
|
+
*/
|
|
155
|
+
async getConfig() {
|
|
156
|
+
logger.debug('Fetching config');
|
|
157
|
+
return await this.request('/config');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Check API (health check)
|
|
161
|
+
*/
|
|
162
|
+
async checkApi() {
|
|
163
|
+
logger.debug('Checking API health');
|
|
164
|
+
return await this.request('/');
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get all sensors (sensor.* and binary_sensor.* entities)
|
|
168
|
+
*/
|
|
169
|
+
async getAllSensors() {
|
|
170
|
+
logger.debug('Fetching all sensors');
|
|
171
|
+
const allStates = await this.getStates();
|
|
172
|
+
const sensors = allStates.filter(entity => entity.entity_id.startsWith('sensor.') ||
|
|
173
|
+
entity.entity_id.startsWith('binary_sensor.'));
|
|
174
|
+
logger.info('Fetched sensors', { count: sensors.length });
|
|
175
|
+
return sensors;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get historical data for an entity
|
|
179
|
+
*/
|
|
180
|
+
async getHistory(entityId, hours = 24) {
|
|
181
|
+
logger.debug('Fetching history', { entityId, hours });
|
|
182
|
+
const endTime = new Date();
|
|
183
|
+
const startTime = new Date(endTime.getTime() - hours * 60 * 60 * 1000);
|
|
184
|
+
const path = `/history/period/${startTime.toISOString()}`;
|
|
185
|
+
const history = await this.request(path, {
|
|
186
|
+
params: {
|
|
187
|
+
filter_entity_id: entityId,
|
|
188
|
+
end_time: endTime.toISOString(),
|
|
189
|
+
},
|
|
190
|
+
});
|
|
191
|
+
logger.info('Fetched history', {
|
|
192
|
+
entityId,
|
|
193
|
+
hours,
|
|
194
|
+
records: history[0]?.length ?? 0
|
|
195
|
+
});
|
|
196
|
+
return history;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get Home Assistant version and configuration info
|
|
200
|
+
*/
|
|
201
|
+
async getVersion() {
|
|
202
|
+
logger.debug('Fetching Home Assistant version');
|
|
203
|
+
const config = await this.request('/config');
|
|
204
|
+
logger.info('Fetched version', { version: config.version });
|
|
205
|
+
return config;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get all automations
|
|
209
|
+
*/
|
|
210
|
+
async getAutomations() {
|
|
211
|
+
logger.debug('Fetching automations');
|
|
212
|
+
const allStates = await this.getStates();
|
|
213
|
+
const automations = allStates
|
|
214
|
+
.filter(entity => entity.entity_id.startsWith('automation.'))
|
|
215
|
+
.map(entity => ({
|
|
216
|
+
id: entity.entity_id,
|
|
217
|
+
alias: String(entity.attributes.friendly_name || entity.entity_id.replace('automation.', '')),
|
|
218
|
+
state: entity.state,
|
|
219
|
+
last_triggered: entity.attributes.last_triggered,
|
|
220
|
+
description: entity.attributes.description,
|
|
221
|
+
mode: entity.attributes.mode,
|
|
222
|
+
}));
|
|
223
|
+
logger.info('Fetched automations', { count: automations.length });
|
|
224
|
+
return automations;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Restart Home Assistant
|
|
228
|
+
*/
|
|
229
|
+
async restartServer() {
|
|
230
|
+
logger.warn('Restarting Home Assistant');
|
|
231
|
+
await this.request('/services/homeassistant/restart', {
|
|
232
|
+
method: 'POST',
|
|
233
|
+
body: {},
|
|
234
|
+
});
|
|
235
|
+
logger.info('Home Assistant restart initiated');
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get system log entries from the logbook
|
|
239
|
+
* Returns recent events/state changes, optionally filtered by entity
|
|
240
|
+
*/
|
|
241
|
+
async getSystemLog(options = {}) {
|
|
242
|
+
const hours = options.hours || 24;
|
|
243
|
+
logger.debug('Fetching system log', { hours, entity_id: options.entity_id });
|
|
244
|
+
const endTime = new Date();
|
|
245
|
+
const startTime = new Date(endTime.getTime() - hours * 60 * 60 * 1000);
|
|
246
|
+
let path = `/logbook/${startTime.toISOString()}`;
|
|
247
|
+
const params = {
|
|
248
|
+
end_time: endTime.toISOString(),
|
|
249
|
+
};
|
|
250
|
+
if (options.entity_id) {
|
|
251
|
+
params.entity = options.entity_id;
|
|
252
|
+
}
|
|
253
|
+
const entries = await this.request(path, { params });
|
|
254
|
+
logger.info('Fetched system log', { count: entries.length, hours });
|
|
255
|
+
return entries;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Get domain summary with entity counts and state breakdown
|
|
259
|
+
*/
|
|
260
|
+
async getDomainSummary(domain) {
|
|
261
|
+
logger.debug('Fetching domain summary', { domain });
|
|
262
|
+
const entities = await this.getEntitiesByDomain(domain);
|
|
263
|
+
// Count states
|
|
264
|
+
const states = {};
|
|
265
|
+
const entityList = [];
|
|
266
|
+
for (const entity of entities) {
|
|
267
|
+
states[entity.state] = (states[entity.state] || 0) + 1;
|
|
268
|
+
entityList.push({
|
|
269
|
+
entity_id: entity.entity_id,
|
|
270
|
+
state: entity.state,
|
|
271
|
+
friendly_name: entity.attributes.friendly_name,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
const summary = {
|
|
275
|
+
domain,
|
|
276
|
+
count: entities.length,
|
|
277
|
+
states,
|
|
278
|
+
entities: entityList,
|
|
279
|
+
};
|
|
280
|
+
logger.info('Fetched domain summary', { domain, count: summary.count });
|
|
281
|
+
return summary;
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* List entities with optional filtering
|
|
285
|
+
*/
|
|
286
|
+
async listEntities(options = {}) {
|
|
287
|
+
logger.debug('Listing entities', options);
|
|
288
|
+
let entities = await this.getStates();
|
|
289
|
+
// Filter by domain
|
|
290
|
+
if (options.domain) {
|
|
291
|
+
entities = entities.filter(e => e.entity_id.startsWith(`${options.domain}.`));
|
|
292
|
+
}
|
|
293
|
+
// Filter by state
|
|
294
|
+
if (options.state) {
|
|
295
|
+
entities = entities.filter(e => e.state === options.state);
|
|
296
|
+
}
|
|
297
|
+
// Filter by search query
|
|
298
|
+
if (options.search) {
|
|
299
|
+
const query = options.search.toLowerCase();
|
|
300
|
+
entities = entities.filter(e => e.entity_id.toLowerCase().includes(query) ||
|
|
301
|
+
String(e.attributes.friendly_name || '').toLowerCase().includes(query));
|
|
302
|
+
}
|
|
303
|
+
// Apply limit
|
|
304
|
+
if (options.limit && options.limit > 0) {
|
|
305
|
+
entities = entities.slice(0, options.limit);
|
|
306
|
+
}
|
|
307
|
+
logger.info('Listed entities', { count: entities.length, ...options });
|
|
308
|
+
return entities;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Get available updates by checking update.* entities
|
|
312
|
+
* Works with regular long-lived access tokens
|
|
313
|
+
*/
|
|
314
|
+
async getAvailableUpdates() {
|
|
315
|
+
logger.debug('Fetching available updates from update entities');
|
|
316
|
+
// Get all update entities
|
|
317
|
+
const updateEntities = await this.getEntitiesByDomain('update');
|
|
318
|
+
// Filter to only those with updates available (state = 'on')
|
|
319
|
+
const updates = [];
|
|
320
|
+
for (const entity of updateEntities) {
|
|
321
|
+
const attrs = entity.attributes;
|
|
322
|
+
const installedVersion = attrs.installed_version;
|
|
323
|
+
const latestVersion = attrs.latest_version;
|
|
324
|
+
const title = attrs.title || attrs.friendly_name || entity.entity_id;
|
|
325
|
+
// state 'on' means update is available
|
|
326
|
+
if (entity.state === 'on' && installedVersion && latestVersion) {
|
|
327
|
+
updates.push({
|
|
328
|
+
update_type: entity.entity_id.includes('core') ? 'core' :
|
|
329
|
+
entity.entity_id.includes('supervisor') ? 'supervisor' :
|
|
330
|
+
entity.entity_id.includes('operating_system') ? 'os' : 'addon',
|
|
331
|
+
name: title,
|
|
332
|
+
version_current: installedVersion,
|
|
333
|
+
version_latest: latestVersion,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
logger.info('Fetched available updates', { updateCount: updates.length, totalEntities: updateEntities.length });
|
|
338
|
+
return {
|
|
339
|
+
updates,
|
|
340
|
+
entities: updateEntities,
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=haClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"haClient.js","sourceRoot":"","sources":["../src/haClient.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|