@digital-alchemy/hass 0.2.0 → 0.2.2
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/README.md +53 -0
- package/dist/extensions/call-proxy.extension.d.ts +0 -1
- package/dist/extensions/call-proxy.extension.js +16 -11
- package/dist/extensions/call-proxy.extension.js.map +1 -1
- package/dist/extensions/config.extension.js +1 -1
- package/dist/extensions/config.extension.js.map +1 -1
- package/dist/extensions/entity-manager.extension.d.ts +1 -1
- package/dist/extensions/entity-manager.extension.js +14 -11
- package/dist/extensions/entity-manager.extension.js.map +1 -1
- package/dist/extensions/fetch-api.extension.d.ts +3 -3
- package/dist/extensions/fetch-api.extension.js +20 -25
- package/dist/extensions/fetch-api.extension.js.map +1 -1
- package/dist/extensions/websocket-api.extension.d.ts +15 -3
- package/dist/extensions/websocket-api.extension.js +193 -114
- package/dist/extensions/websocket-api.extension.js.map +1 -1
- package/dist/hass.module.d.ts +14 -0
- package/dist/hass.module.js +20 -1
- package/dist/hass.module.js.map +1 -1
- package/dist/helpers/constants.helper.d.ts +0 -1
- package/dist/helpers/constants.helper.js +1 -2
- package/dist/helpers/constants.helper.js.map +1 -1
- package/dist/helpers/metrics.helper.d.ts +13 -1
- package/dist/helpers/metrics.helper.js +25 -1
- package/dist/helpers/metrics.helper.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
Welcome to `@digital-alchemy/hass`!
|
|
3
|
+
|
|
4
|
+
This repository contains generic extensions for interacting with Home Assistant, including websocket & rest api adapters, entity & event management, backup workflows, and more.
|
|
5
|
+
## Features
|
|
6
|
+
### First class editor experiences
|
|
7
|
+
|
|
8
|
+
- Did you just typo that entity name?
|
|
9
|
+
- Just what services are actually available?
|
|
10
|
+
|
|
11
|
+
Create references to entities that will always reflect their current state. Get details about all the services your setup supports and how to use them, directly in your editor.
|
|
12
|
+
|
|
13
|
+

|
|
14
|
+
|
|
15
|
+
### Managed Websocket
|
|
16
|
+
|
|
17
|
+
Don't worry about all the complexities of dealing with home assistant. Let the library help by handling all the connection logic, keeping track of events for you, formatting requests, and
|
|
18
|
+
|
|
19
|
+
## Configuration
|
|
20
|
+
### Custom Types
|
|
21
|
+
|
|
22
|
+
This library has support for customizing type definitions to match a particular Home Assistant install. This functionality requires the [type-writer](https://github.com/Digital-Alchemy-TS/type-writer) command to be installed as well.
|
|
23
|
+
|
|
24
|
+
> Add to `devDependencies`!
|
|
25
|
+
```bash
|
|
26
|
+
npm i --save-dev @digital-alchemy/type-writer
|
|
27
|
+
npx type-writer
|
|
28
|
+
```
|
|
29
|
+
Custom types only affect the development experience, and have no impact on the way the application runs.
|
|
30
|
+
|
|
31
|
+
### Supervised Support
|
|
32
|
+
|
|
33
|
+
If your code is running within a Home Assistant addon environment, it will automatically connect with no additional configuration needed.
|
|
34
|
+
|
|
35
|
+
### Manual
|
|
36
|
+
|
|
37
|
+
For code running elsewhere, manual configuration is required. You will need a **Long Lived Access Token**, which can be generated on your user profile.
|
|
38
|
+
```ini
|
|
39
|
+
[hass]
|
|
40
|
+
BASE_URL=http://localhost:8123
|
|
41
|
+
TOKEN=YOUR LONG LIVED ACCESS TOKEN
|
|
42
|
+
```
|
|
43
|
+
## Related Projects
|
|
44
|
+
|
|
45
|
+
For additional projects that build on and consume this library, check out these other projects
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
| GitHub | Description | NPM |
|
|
49
|
+
| ------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- |
|
|
50
|
+
| [synapse](https://github.com/Digital-Alchemy-TS/synapse) | Tools for generating entities within home assistant. | [@digitial-alchemy/synapse](https://www.npmjs.com/package/@digital-alchemy/synapse) |
|
|
51
|
+
| [automation](https://github.com/Digital-Alchemy-TS/automation) | Advanced automation tools for creating dynamic workflows. | [@digital-alchemy/automation](https://www.npmjs.com/package/@digital-alchemy/automation) |
|
|
52
|
+
| [type-writer](https://github.com/Digital-Alchemy-TS/terminal) | Generate custom type definitions for your setup. | [@digital-alchemy/type-writer](https://www.npmjs.com/package/@digital-alchemy/terminal) |
|
|
53
|
+
| [automation-template](https://github.com/Digital-Alchemy-TS/gotify) | Start your own Home Automation project with the `@digital-alchemy` quick start template | |
|
|
@@ -11,6 +11,7 @@ const NOT_A_DOMAIN = new Set(["then"]);
|
|
|
11
11
|
function CallProxy({ logger, lifecycle, context, hass, config, }) {
|
|
12
12
|
let domains;
|
|
13
13
|
let services;
|
|
14
|
+
const rawProxy = {};
|
|
14
15
|
/**
|
|
15
16
|
* Describe the current services, and build up a proxy api based on that.
|
|
16
17
|
*
|
|
@@ -47,7 +48,7 @@ function CallProxy({ logger, lifecycle, context, hass, config, }) {
|
|
|
47
48
|
services = await hass.fetch.listServices();
|
|
48
49
|
if (core_1.is.empty(services)) {
|
|
49
50
|
if (recursion > MAX_ATTEMPTS) {
|
|
50
|
-
logger.fatal(`
|
|
51
|
+
logger.fatal(`failed to load service list from Home Assistant`);
|
|
51
52
|
(0, process_1.exit)(FAILED);
|
|
52
53
|
}
|
|
53
54
|
logger.warn("failed to retrieve {service} list. Retrying {%s}/[%s]", recursion, MAX_ATTEMPTS);
|
|
@@ -57,32 +58,36 @@ function CallProxy({ logger, lifecycle, context, hass, config, }) {
|
|
|
57
58
|
}
|
|
58
59
|
domains = services.map(i => i.domain);
|
|
59
60
|
services.forEach(value => {
|
|
60
|
-
|
|
61
|
+
const services = Object.keys(value.services);
|
|
62
|
+
rawProxy[value.domain] = Object.fromEntries(services.map(i => [i, core_1.noop]));
|
|
63
|
+
logger.trace({ services }, `loaded domain [%s]`, value.domain);
|
|
61
64
|
});
|
|
62
65
|
}
|
|
63
66
|
/**
|
|
64
67
|
* Prefer sending via socket, if available.
|
|
65
68
|
*/
|
|
66
69
|
async function sendMessage(serviceName, service_data) {
|
|
67
|
-
|
|
70
|
+
// pause for rest also
|
|
71
|
+
if (hass.socket.pauseMessages) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
const sendViaRest = (config.hass.CALL_PROXY_ALLOW_REST === "allow" &&
|
|
75
|
+
hass.socket.connectionState !== "connected") ||
|
|
76
|
+
config.hass.CALL_PROXY_ALLOW_REST === "prefer";
|
|
77
|
+
if (sendViaRest) {
|
|
68
78
|
return await hass.fetch.callService(serviceName, service_data);
|
|
69
79
|
}
|
|
70
80
|
const [domain, service] = serviceName.split(".");
|
|
81
|
+
const type = __1.HASSIO_WS_COMMAND.call_service;
|
|
71
82
|
// User can just not await this call if they don't care about the "waitForChange"
|
|
72
|
-
return await hass.socket.sendMessage({
|
|
73
|
-
domain,
|
|
74
|
-
service,
|
|
75
|
-
service_data,
|
|
76
|
-
type: __1.HASSIO_WS_COMMAND.call_service,
|
|
77
|
-
}, true);
|
|
83
|
+
return await hass.socket.sendMessage({ domain, service, service_data, type }, true);
|
|
78
84
|
}
|
|
79
85
|
function buildCallProxy() {
|
|
80
|
-
return new Proxy(
|
|
86
|
+
return new Proxy(rawProxy, {
|
|
81
87
|
get: (_, domain) => getDomain(domain),
|
|
82
88
|
});
|
|
83
89
|
}
|
|
84
90
|
return buildCallProxy();
|
|
85
91
|
}
|
|
86
92
|
exports.CallProxy = CallProxy;
|
|
87
|
-
exports.default = CallProxy;
|
|
88
93
|
//# sourceMappingURL=call-proxy.extension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-proxy.extension.js","sourceRoot":"","sources":["../../src/extensions/call-proxy.extension.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"call-proxy.extension.js","sourceRoot":"","sources":["../../src/extensions/call-proxy.extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ function Configure({ logger, lifecycle, hass, config, internal, }) {
|
|
|
29
29
|
if (!config.hass.VALIDATE_CONFIGURATION) {
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
|
-
|
|
32
|
+
internal.logger.setLogLevel("trace");
|
|
33
33
|
logger.info(`validating credentials`);
|
|
34
34
|
try {
|
|
35
35
|
const result = await hass.fetch.checkCredentials();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.extension.js","sourceRoot":"","sources":["../../src/extensions/config.extension.ts"],"names":[],"mappings":";;;AAAA,wDAAwD;AACxD,
|
|
1
|
+
{"version":3,"file":"config.extension.js","sourceRoot":"","sources":["../../src/extensions/config.extension.ts"],"names":[],"mappings":";;;AAAA,wDAAwD;AACxD,gDAA2D;AAC3D,qCAAoC;AAEpC,0BAA0C;AAC1C,SAAgB,SAAS,CAAC,EACxB,MAAM,EACN,SAAS,EACT,IAAI,EACJ,MAAM,EACN,QAAQ,GACO;IACf;;;;OAIG;IACH,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE;QACvB,MAAM,KAAK,GAAG,aAAG,CAAC,YAAY,IAAI,aAAG,CAAC,gBAAgB,CAAC;QACvD,IAAI,SAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACxD,QAAQ,CAAC,MAAM,CAAC,GAAG,CACjB,MAAM,EACN,UAAU,EACV,aAAG,CAAC,WAAW,IAAI,wBAAwB,CAC5C,CAAC;QACF,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YACnD,IAAI,SAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtB,aAAa;gBACb,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC5B,IAAA,cAAI,EAAC,CAAC,CAAC,CAAC;YACV,CAAC;YACD,cAAc;YACd,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7B,IAAA,cAAI,EAAC,CAAC,CAAC,CAAC;QACV,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,iBAAiB;YACjB,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,wBAAwB,CAAC,CAAC;YAClD,IAAA,cAAI,EAAC,CAAC,CAAC,CAAC;QACV,CAAC;IACH,CAAC,EAAE,wBAAoB,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AArDD,8BAqDC"}
|
|
@@ -16,7 +16,7 @@ export type ByIdProxy<ENTITY_ID extends PICK_ENTITY> = ENTITY_STATE<ENTITY_ID> &
|
|
|
16
16
|
*/
|
|
17
17
|
nextState: () => Promise<ENTITY_STATE<ENTITY_ID>>;
|
|
18
18
|
};
|
|
19
|
-
export declare function EntityManager({ logger, hass, lifecycle }: TServiceParams): {
|
|
19
|
+
export declare function EntityManager({ logger, hass, lifecycle, internal, }: TServiceParams): {
|
|
20
20
|
/**
|
|
21
21
|
* Internal library use only
|
|
22
22
|
*/
|
|
@@ -12,7 +12,7 @@ const MAX_ATTEMPTS = 50;
|
|
|
12
12
|
const FAILED_LOAD_DELAY = 5;
|
|
13
13
|
const UNLIMITED = 0;
|
|
14
14
|
const RECENT = 5;
|
|
15
|
-
function EntityManager({ logger, hass, lifecycle }) {
|
|
15
|
+
function EntityManager({ logger, hass, lifecycle, internal, }) {
|
|
16
16
|
// # Local vars
|
|
17
17
|
/**
|
|
18
18
|
* MASTER_STATE.switch.desk_light = {entity_id,state,attributes,...}
|
|
@@ -28,7 +28,8 @@ function EntityManager({ logger, hass, lifecycle }) {
|
|
|
28
28
|
// # Methods
|
|
29
29
|
// ## Retrieve raw state object for entity
|
|
30
30
|
function getCurrentState(entity_id) {
|
|
31
|
-
|
|
31
|
+
const out = internal.utils.object.get(MASTER_STATE, entity_id) ?? {};
|
|
32
|
+
return out;
|
|
32
33
|
}
|
|
33
34
|
// ## Proxy version of the logic
|
|
34
35
|
function proxyGetLogic(entity, property) {
|
|
@@ -45,12 +46,12 @@ function EntityManager({ logger, hass, lifecycle }) {
|
|
|
45
46
|
if (!current) {
|
|
46
47
|
logger.error({ defaultValue, name: entity, property }, `proxyGetLogic cannot find entity`);
|
|
47
48
|
}
|
|
48
|
-
return
|
|
49
|
+
return internal.utils.object.get(current, property) || defaultValue;
|
|
49
50
|
}
|
|
50
51
|
// ## Retrieve a proxy by id
|
|
51
52
|
function byId(entity_id) {
|
|
52
53
|
if (!ENTITY_PROXIES.has(entity_id)) {
|
|
53
|
-
ENTITY_PROXIES.set(entity_id, new Proxy(
|
|
54
|
+
ENTITY_PROXIES.set(entity_id, new Proxy(getCurrentState(entity_id), {
|
|
54
55
|
// things that shouldn't be needed: this extract
|
|
55
56
|
get: (_, property) => {
|
|
56
57
|
if (property === "onUpdate") {
|
|
@@ -136,11 +137,11 @@ function EntityManager({ logger, hass, lifecycle }) {
|
|
|
136
137
|
states.forEach(entity => {
|
|
137
138
|
// ? Set first, ensure data is populated
|
|
138
139
|
// `nextTick` will fire AFTER loop finishes
|
|
139
|
-
|
|
140
|
+
internal.utils.object.set(MASTER_STATE, entity.entity_id, entity, core_1.is.undefined(internal.utils.object.get(oldState, entity.entity_id)));
|
|
140
141
|
if (!init) {
|
|
141
142
|
return;
|
|
142
143
|
}
|
|
143
|
-
const old =
|
|
144
|
+
const old = internal.utils.object.get(oldState, entity.entity_id);
|
|
144
145
|
if (core_1.is.equal(old, entity)) {
|
|
145
146
|
logger.trace({ name: entity.entity_id }, `no change on refresh`);
|
|
146
147
|
return;
|
|
@@ -150,22 +151,24 @@ function EntityManager({ logger, hass, lifecycle }) {
|
|
|
150
151
|
// Attempt to not blow up the system?
|
|
151
152
|
// TODO: does this gain anything? is a debounce needed somewhere else instead?
|
|
152
153
|
setImmediate(async () => {
|
|
153
|
-
await (0, core_1.each)(emitUpdates, async (entity) => await EntityUpdateReceiver(entity.entity_id, entity,
|
|
154
|
+
await (0, core_1.each)(emitUpdates, async (entity) => await EntityUpdateReceiver(entity.entity_id, entity, internal.utils.object.get(oldState, entity.entity_id)));
|
|
154
155
|
});
|
|
155
156
|
init = true;
|
|
156
157
|
}
|
|
157
158
|
// ## is.entity definition
|
|
158
159
|
// Actually tie the type casting to real state
|
|
159
|
-
core_1.is.entity = (entityId) => core_1.is.undefined(
|
|
160
|
+
core_1.is.entity = (entityId) => core_1.is.undefined(internal.utils.object.get(MASTER_STATE, entityId));
|
|
160
161
|
// ## Receiver function for incoming entity updates
|
|
161
162
|
function EntityUpdateReceiver(entity_id, new_state, old_state) {
|
|
162
163
|
if (new_state === null) {
|
|
163
164
|
logger.warn({ name: entity_id }, `removing deleted entity from {MASTER_STATE}`);
|
|
164
|
-
|
|
165
|
+
internal.utils.object.del(MASTER_STATE, entity_id);
|
|
165
166
|
return;
|
|
166
167
|
}
|
|
167
|
-
|
|
168
|
-
|
|
168
|
+
internal.utils.object.set(MASTER_STATE, entity_id, new_state);
|
|
169
|
+
if (!hass.socket.pauseMessages) {
|
|
170
|
+
event.emit(entity_id, new_state, old_state);
|
|
171
|
+
}
|
|
169
172
|
}
|
|
170
173
|
lifecycle.onPostConfig(async () => {
|
|
171
174
|
logger.debug(`pre populate {MASTER_STATE}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-manager.extension.js","sourceRoot":"","sources":["../../src/extensions/entity-manager.extension.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"entity-manager.extension.js","sourceRoot":"","sources":["../../src/extensions/entity-manager.extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { FilteredFetchArguments,
|
|
1
|
+
import { FilteredFetchArguments, TServiceParams } from "@digital-alchemy/core";
|
|
2
2
|
import { CalendarEvent, CalendarFetchOptions, CheckConfigResult, ENTITY_STATE, HassConfig, HassServiceDTO, HomeAssistantServerLogItem, PICK_ENTITY, PICK_SERVICE, PICK_SERVICE_PARAMETERS } from "..";
|
|
3
3
|
type SendBody<STATE extends string | number = string, ATTRIBUTES extends object = object> = {
|
|
4
4
|
attributes?: ATTRIBUTES;
|
|
5
5
|
state?: STATE;
|
|
6
6
|
};
|
|
7
|
-
export declare function FetchAPI({ logger, lifecycle, context, config, }: TServiceParams): {
|
|
7
|
+
export declare function FetchAPI({ logger, lifecycle, context, internal, config, }: TServiceParams): {
|
|
8
8
|
calendarSearch: ({ calendar, start, end, }: CalendarFetchOptions) => Promise<CalendarEvent[]>;
|
|
9
9
|
callService: <SERVICE extends PICK_SERVICE>(serviceName: SERVICE, data: PICK_SERVICE_PARAMETERS<SERVICE>) => Promise<ENTITY_STATE<PICK_ENTITY>[]>;
|
|
10
10
|
checkConfig: () => Promise<CheckConfigResult>;
|
|
@@ -12,7 +12,7 @@ export declare function FetchAPI({ logger, lifecycle, context, config, }: TServi
|
|
|
12
12
|
message: string;
|
|
13
13
|
} | string>;
|
|
14
14
|
download: (destination: string, fetchWith: FilteredFetchArguments) => Promise<void>;
|
|
15
|
-
fetch: TFetch;
|
|
15
|
+
fetch: import("@digital-alchemy/core").TFetch;
|
|
16
16
|
fetchEntityCustomizations: <T extends Record<never, unknown> = Record<"local" | "global", Record<string, string>>>(entityId: string | string[]) => Promise<T>;
|
|
17
17
|
fetchEntityHistory: <ENTITY extends PICK_ENTITY = PICK_ENTITY, T_1 extends ENTITY_STATE<ENTITY> = ENTITY_STATE<ENTITY>>(entity_id: ENTITY, from: Date, to: Date, extra?: {
|
|
18
18
|
minimal_response?: "";
|
|
@@ -5,18 +5,13 @@ const tslib_1 = require("tslib");
|
|
|
5
5
|
const core_1 = require("@digital-alchemy/core");
|
|
6
6
|
const dayjs_1 = tslib_1.__importDefault(require("dayjs"));
|
|
7
7
|
const __1 = require("..");
|
|
8
|
-
function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
function FetchAPI({ logger, lifecycle, context, internal, config, }) {
|
|
9
|
+
const fetcher = internal.createFetcher({ context });
|
|
10
|
+
const { fetch, download: downloader } = fetcher;
|
|
11
11
|
// Load configurations
|
|
12
12
|
lifecycle.onPostConfig(() => {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
context,
|
|
16
|
-
headers: { Authorization: `Bearer ${config.hass.TOKEN}` },
|
|
17
|
-
});
|
|
18
|
-
fetcher = fetch.fetch;
|
|
19
|
-
downloader = fetch.download;
|
|
13
|
+
fetcher.setBaseUrl(config.hass.BASE_URL);
|
|
14
|
+
fetcher.setHeaders({ Authorization: `Bearer ${config.hass.TOKEN}` });
|
|
20
15
|
}, __1.PostConfigPriorities.FETCH);
|
|
21
16
|
async function calendarSearch({ calendar, start = (0, dayjs_1.default)(), end, }) {
|
|
22
17
|
if (Array.isArray(calendar)) {
|
|
@@ -30,7 +25,7 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
30
25
|
: core_1.DOWN);
|
|
31
26
|
}
|
|
32
27
|
const params = { end: end.toISOString(), start: start.toISOString() };
|
|
33
|
-
const events = await
|
|
28
|
+
const events = await fetch({
|
|
34
29
|
params,
|
|
35
30
|
url: `/api/calendars/${calendar}`,
|
|
36
31
|
});
|
|
@@ -43,7 +38,7 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
43
38
|
}
|
|
44
39
|
async function callService(serviceName, data) {
|
|
45
40
|
const [domain, service] = serviceName.split(".");
|
|
46
|
-
return await
|
|
41
|
+
return await fetch({
|
|
47
42
|
body: data,
|
|
48
43
|
method: "post",
|
|
49
44
|
url: `/api/services/${domain}/${service}`,
|
|
@@ -51,7 +46,7 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
51
46
|
}
|
|
52
47
|
async function checkConfig() {
|
|
53
48
|
logger.trace(`check config`);
|
|
54
|
-
return await
|
|
49
|
+
return await fetch({
|
|
55
50
|
method: `post`,
|
|
56
51
|
url: `/api/config/core/check_config`,
|
|
57
52
|
});
|
|
@@ -65,13 +60,13 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
65
60
|
});
|
|
66
61
|
}
|
|
67
62
|
async function fetchEntityCustomizations(entityId) {
|
|
68
|
-
return await
|
|
63
|
+
return await fetch({
|
|
69
64
|
url: `/api/config/customize/config/${entityId}`,
|
|
70
65
|
});
|
|
71
66
|
}
|
|
72
67
|
async function fetchEntityHistory(entity_id, from, to, extra = {}) {
|
|
73
68
|
logger.info({ entity_id, from: from.toISOString(), to: to.toISOString() }, `fetch entity history`);
|
|
74
|
-
const result = await
|
|
69
|
+
const result = await fetch({
|
|
75
70
|
params: {
|
|
76
71
|
end_time: to.toISOString(),
|
|
77
72
|
filter_entity_id: entity_id,
|
|
@@ -88,7 +83,7 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
88
83
|
}
|
|
89
84
|
async function fireEvent(event, data) {
|
|
90
85
|
logger.trace({ name: event, ...data }, `Firing event`);
|
|
91
|
-
const response = await
|
|
86
|
+
const response = await fetch({
|
|
92
87
|
// body: data,
|
|
93
88
|
body: {},
|
|
94
89
|
method: "post",
|
|
@@ -100,15 +95,15 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
100
95
|
}
|
|
101
96
|
async function getAllEntities() {
|
|
102
97
|
logger.trace(`get all entities`);
|
|
103
|
-
return await
|
|
98
|
+
return await fetch({ url: `/api/states` });
|
|
104
99
|
}
|
|
105
100
|
async function getHassConfig() {
|
|
106
101
|
logger.trace(`get config`);
|
|
107
|
-
return await
|
|
102
|
+
return await fetch({ url: `/api/config` });
|
|
108
103
|
}
|
|
109
104
|
async function getLogs() {
|
|
110
105
|
logger.trace(`get logs`);
|
|
111
|
-
const results = await
|
|
106
|
+
const results = await fetch({
|
|
112
107
|
url: `/api/error/all`,
|
|
113
108
|
});
|
|
114
109
|
return results.map(i => {
|
|
@@ -119,11 +114,11 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
119
114
|
}
|
|
120
115
|
async function getRawLogs() {
|
|
121
116
|
logger.trace(`get raw logs`);
|
|
122
|
-
return await
|
|
117
|
+
return await fetch({ process: "text", url: `/api/error_log` });
|
|
123
118
|
}
|
|
124
119
|
async function listServices() {
|
|
125
120
|
logger.trace(`list services`);
|
|
126
|
-
return await
|
|
121
|
+
return await fetch({ url: `/api/services` });
|
|
127
122
|
}
|
|
128
123
|
async function updateEntity(entity_id, { attributes, state }) {
|
|
129
124
|
const body = {};
|
|
@@ -134,11 +129,11 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
134
129
|
body.attributes = attributes;
|
|
135
130
|
}
|
|
136
131
|
logger.trace({ ...body, name: entity_id }, `set entity state`);
|
|
137
|
-
await
|
|
132
|
+
await fetch({ body, method: "post", url: `/api/states/${entity_id}` });
|
|
138
133
|
}
|
|
139
134
|
async function webhook(name, data = {}) {
|
|
140
135
|
logger.trace({ ...data, name }, `webhook`);
|
|
141
|
-
await
|
|
136
|
+
await fetch({
|
|
142
137
|
body: data,
|
|
143
138
|
method: "post",
|
|
144
139
|
process: "text",
|
|
@@ -147,7 +142,7 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
147
142
|
}
|
|
148
143
|
async function checkCredentials() {
|
|
149
144
|
logger.trace(`check credentials`);
|
|
150
|
-
return await
|
|
145
|
+
return await fetch({
|
|
151
146
|
url: `/api/`,
|
|
152
147
|
});
|
|
153
148
|
}
|
|
@@ -157,7 +152,7 @@ function FetchAPI({ logger, lifecycle, context, config, }) {
|
|
|
157
152
|
checkConfig,
|
|
158
153
|
checkCredentials,
|
|
159
154
|
download,
|
|
160
|
-
fetch:
|
|
155
|
+
fetch: fetch,
|
|
161
156
|
fetchEntityCustomizations,
|
|
162
157
|
fetchEntityHistory,
|
|
163
158
|
fireEvent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-api.extension.js","sourceRoot":"","sources":["../../src/extensions/fetch-api.extension.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"fetch-api.extension.js","sourceRoot":"","sources":["../../src/extensions/fetch-api.extension.ts"],"names":[],"mappings":";;;;AAAA,gDAS+B;AAC/B,0DAA0B;AAE1B,0BAaY;AAUZ,SAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,SAAS,EACT,OAAO,EACP,QAAQ,EACR,MAAM,GACS;IACf,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAEhD,sBAAsB;IACtB,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE;QAC1B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzC,OAAO,CAAC,UAAU,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACvE,CAAC,EAAE,wBAAoB,CAAC,KAAK,CAAC,CAAC;IAE/B,KAAK,UAAU,cAAc,CAAC,EAC5B,QAAQ,EACR,KAAK,GAAG,IAAA,eAAK,GAAE,EACf,GAAG,GACkB;QACrB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAC5B,QAAQ,CAAC,GAAG,CACV,KAAK,EAAC,GAAG,EAAC,EAAE,CAAC,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CACjE,CACF,CAAC;YACF,OAAO,IAAI;iBACR,IAAI,EAAE;iBACN,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACb,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;gBACrB,CAAC,CAAC,gBAAS;gBACX,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;oBACxB,CAAC,CAAC,SAAE;oBACJ,CAAC,CAAC,WAAI,CACX,CAAC;QACN,CAAC;QAED,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAqB;YAC7C,MAAM;YACN,GAAG,EAAE,kBAAkB,QAAQ,EAAE;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CACV,EAAE,GAAG,MAAM,EAAE,EACb,2BAA2B,EAC3B,QAAQ,EACR,MAAM,CAAC,MAAM,CACd,CAAC;QACF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,KAAK;YACR,GAAG,EAAE,IAAA,eAAK,EAAC,GAAG,CAAC,QAAQ,CAAC;YACxB,KAAK,EAAE,IAAA,eAAK,EAAC,KAAK,CAAC,QAAQ,CAAC;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,UAAU,WAAW,CACxB,WAAoB,EACpB,IAAsC;QAEtC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,OAAO,MAAM,KAAK,CAAC;YACjB,IAAI,EAAE,IAAkB;YACxB,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,iBAAiB,MAAM,IAAI,OAAO,EAAE;SAC1C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,WAAW;QACxB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,MAAM,KAAK,CAAC;YACjB,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,+BAA+B;SACrC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,QAAQ,CACrB,WAAmB,EACnB,SAAiC;QAEjC,MAAM,UAAU,CAAC;YACf,GAAG,SAAS;YACZ,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;YAC7B,WAAW;YACX,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,yBAAyB,CAKtC,QAA2B;QAC3B,OAAO,MAAM,KAAK,CAAI;YACpB,GAAG,EAAE,gCAAgC,QAAQ,EAAE;SAChD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,kBAAkB,CAI/B,SAAiB,EACjB,IAAU,EACV,EAAQ,EACR,QAAmC,EAAE;QAErC,MAAM,CAAC,IAAI,CACT,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,WAAW,EAAE,EAAE,EAC7D,sBAAsB,CACvB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,KAAK,CAAQ;YAChC,MAAM,EAAE;gBACN,QAAQ,EAAE,EAAE,CAAC,WAAW,EAAE;gBAC1B,gBAAgB,EAAE,SAAS;gBAC3B,GAAG,KAAK;aACT;YACD,GAAG,EAAE,uBAAuB,IAAI,CAAC,WAAW,EAAE,EAAE;SACjD,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACrD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,KAAK,UAAU,SAAS,CACtB,KAAa,EACb,IAAW;QAEX,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAsB;YAChD,cAAc;YACd,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,eAAe,KAAK,EAAE;SAC5B,CAAC,CAAC;QACH,IAAI,QAAQ,EAAE,OAAO,KAAK,SAAS,KAAK,SAAS,EAAE,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,uCAAuC,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;IAED,KAAK,UAAU,cAAc;QAC3B,MAAM,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACjC,OAAO,MAAM,KAAK,CAA8B,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,UAAU,aAAa;QAC1B,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3B,OAAO,MAAM,KAAK,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,UAAU,OAAO;QACpB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,KAAK,CAA+B;YACxD,GAAG,EAAE,gBAAgB;SACtB,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YACrB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,aAAM,CAAC,CAAC;YAC/C,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,GAAG,aAAM,CAAC,CAAC;YACzD,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,UAAU;QACvB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,MAAM,KAAK,CAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,UAAU,YAAY;QACzB,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAC9B,OAAO,MAAM,KAAK,CAAmB,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,UAAU,YAAY,CAIzB,SAAsB,EACtB,EAAE,UAAU,EAAE,KAAK,EAA+B;QAElD,MAAM,IAAI,GAAoB,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,SAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC/B,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC/D,MAAM,KAAK,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,eAAe,SAAS,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,UAAU,OAAO,CAAC,IAAY,EAAE,OAAe,EAAE;QACpD,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC;YACV,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM;YACf,GAAG,EAAE,gBAAgB,IAAI,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,UAAU,gBAAgB;QAC7B,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClC,OAAO,MAAM,KAAK,CAAC;YACjB,GAAG,EAAE,OAAO;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,cAAc;QACd,WAAW;QACX,WAAW;QACX,gBAAgB;QAChB,QAAQ;QACR,KAAK,EAAE,KAAK;QACZ,yBAAyB;QACzB,kBAAkB;QAClB,SAAS;QACT,cAAc;QACd,SAAS,EAAE,aAAa;QACxB,OAAO;QACP,UAAU;QACV,YAAY;QACZ,YAAY;QACZ,OAAO;KACR,CAAC;AACJ,CAAC;AArOD,4BAqOC"}
|
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import { TBlackHole, TServiceParams } from "@digital-alchemy/core";
|
|
2
2
|
import { HASSIO_WS_COMMAND, OnHassEventOptions } from "..";
|
|
3
3
|
export declare const SOCKET_CONNECTED = "SOCKET_CONNECTED";
|
|
4
|
-
export declare function WebsocketAPI({ context, event, hass, config, lifecycle, logger, scheduler, }: TServiceParams): {
|
|
4
|
+
export declare function WebsocketAPI({ context, event, hass, config, internal, lifecycle, logger, scheduler, }: TServiceParams): {
|
|
5
|
+
/**
|
|
6
|
+
* the current state of the websocket
|
|
7
|
+
*/
|
|
8
|
+
connectionState: "invalid" | "offline" | "connecting" | "connected" | "unknown";
|
|
5
9
|
/**
|
|
6
10
|
* Convenient wrapper for sendMessage
|
|
7
11
|
*/
|
|
8
|
-
fireEvent: (event_type: string, event_data?: object) => Promise<unknown>;
|
|
9
|
-
getConnectionActive: () => boolean;
|
|
12
|
+
fireEvent: (event_type: string, event_data?: object, waitForResponse?: boolean) => Promise<unknown>;
|
|
10
13
|
/**
|
|
11
14
|
* Set up a new websocket connection to home assistant
|
|
12
15
|
*
|
|
13
16
|
* This doesn't normally need to be called by applications, the extension self manages
|
|
14
17
|
*/
|
|
15
18
|
init: () => Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* run a callback when the socket finishes connecting
|
|
21
|
+
*/
|
|
16
22
|
onConnect: (callback: () => TBlackHole) => void;
|
|
17
23
|
/**
|
|
18
24
|
* Attach to the incoming stream of socket events. Do your own filtering and processing from there
|
|
@@ -20,6 +26,12 @@ export declare function WebsocketAPI({ context, event, hass, config, lifecycle,
|
|
|
20
26
|
* Returns removal function
|
|
21
27
|
*/
|
|
22
28
|
onEvent: <DATA extends object>({ context, label, event, once, exec, }: OnHassEventOptions<DATA>) => () => void;
|
|
29
|
+
/**
|
|
30
|
+
* when true:
|
|
31
|
+
* - outgoing socket messages are blocked
|
|
32
|
+
* - entities don't emit updates
|
|
33
|
+
*/
|
|
34
|
+
pauseMessages: boolean;
|
|
23
35
|
/**
|
|
24
36
|
* Send a message to home assistant via the socket connection
|
|
25
37
|
*
|
|
@@ -10,41 +10,138 @@ const ws_1 = tslib_1.__importDefault(require("ws"));
|
|
|
10
10
|
const __1 = require("..");
|
|
11
11
|
let connection;
|
|
12
12
|
const CONNECTION_OPEN = 1;
|
|
13
|
-
let CONNECTION_ACTIVE = false;
|
|
14
13
|
const CLEANUP_INTERVAL = 5;
|
|
15
|
-
const PING_INTERVAL = 10;
|
|
16
14
|
const UNLIMITED = 0;
|
|
15
|
+
const CONNECTION_FAILED = 2;
|
|
17
16
|
let messageCount = core_1.START;
|
|
18
17
|
exports.SOCKET_CONNECTED = "SOCKET_CONNECTED";
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
/* eslint-disable @typescript-eslint/no-magic-numbers */
|
|
19
|
+
var WebsocketConnectionState;
|
|
20
|
+
(function (WebsocketConnectionState) {
|
|
21
|
+
WebsocketConnectionState[WebsocketConnectionState["offline"] = 1] = "offline";
|
|
22
|
+
WebsocketConnectionState[WebsocketConnectionState["connecting"] = 2] = "connecting";
|
|
23
|
+
WebsocketConnectionState[WebsocketConnectionState["connected"] = 3] = "connected";
|
|
24
|
+
WebsocketConnectionState[WebsocketConnectionState["unknown"] = 4] = "unknown";
|
|
25
|
+
WebsocketConnectionState[WebsocketConnectionState["invalid"] = 5] = "invalid";
|
|
26
|
+
})(WebsocketConnectionState || (WebsocketConnectionState = {}));
|
|
27
|
+
function WebsocketAPI({ context, event, hass, config, internal, lifecycle, logger, scheduler, }) {
|
|
21
28
|
/**
|
|
22
29
|
* Local attachment points for socket events
|
|
23
30
|
*/
|
|
24
31
|
const socketEvents = new events_1.default();
|
|
25
32
|
event.setMaxListeners(UNLIMITED);
|
|
26
|
-
let connecting;
|
|
27
33
|
let MESSAGE_TIMESTAMPS = [];
|
|
34
|
+
let onSocketReady;
|
|
28
35
|
const waitingCallback = new Map();
|
|
36
|
+
const isOld = (date) => core_1.is.undefined(date) || date.diff((0, dayjs_1.default)(), "s") >= config.hass.RETRY_INTERVAL;
|
|
29
37
|
// Start the socket
|
|
30
38
|
lifecycle.onBootstrap(async () => {
|
|
31
39
|
if (config.hass.AUTO_CONNECT_SOCKET) {
|
|
32
40
|
logger.debug(`auto starting connection`);
|
|
33
|
-
await
|
|
41
|
+
await ManageConnection();
|
|
34
42
|
attachScheduledFunctions();
|
|
35
43
|
}
|
|
36
44
|
});
|
|
45
|
+
let lastReceivedMessage;
|
|
46
|
+
let pingSleep;
|
|
47
|
+
let lastConnectAttempt;
|
|
48
|
+
let lastPingAttempt;
|
|
49
|
+
function setConnectionState(state) {
|
|
50
|
+
hass.socket.connectionState = state;
|
|
51
|
+
__1.SOCKET_CONNECTION_STATE.labels({ state }).set(WebsocketConnectionState[state]);
|
|
52
|
+
}
|
|
53
|
+
async function ManageConnection() {
|
|
54
|
+
const now = (0, dayjs_1.default)();
|
|
55
|
+
const name = "CheckSocket";
|
|
56
|
+
const threshold = config.hass.RETRY_INTERVAL * CONNECTION_FAILED;
|
|
57
|
+
switch (hass.socket.connectionState) {
|
|
58
|
+
case "connected":
|
|
59
|
+
if (!isOld(lastReceivedMessage)) {
|
|
60
|
+
// if hass is actively sending messages, don't do anything
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// 🦗 haven't heard from hass in a while
|
|
64
|
+
setConnectionState("unknown");
|
|
65
|
+
logger.trace({ name }, "no replies in a while {connected} => {unknown}");
|
|
66
|
+
// fall through
|
|
67
|
+
case "unknown":
|
|
68
|
+
if (!isOld(lastPingAttempt)) {
|
|
69
|
+
// if we very recently attempted a ping, do nothing
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// send a ping message to force a pong
|
|
73
|
+
logger.trace({ name }, `emitting ping`);
|
|
74
|
+
lastPingAttempt = now;
|
|
75
|
+
// emit a ping, do not wait for reply (inline)
|
|
76
|
+
sendMessage({ type: __1.HASSIO_WS_COMMAND.ping }, false);
|
|
77
|
+
// reply will be captured by this, waiting at most a second
|
|
78
|
+
pingSleep = (0, core_1.sleep)(core_1.SECOND);
|
|
79
|
+
await pingSleep;
|
|
80
|
+
pingSleep = undefined;
|
|
81
|
+
if (!isOld(lastReceivedMessage)) {
|
|
82
|
+
// received a least a pong
|
|
83
|
+
setConnectionState("connected");
|
|
84
|
+
logger.trace({ name }, `still there {unknown} => {connected}`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// 😨 hass didn't reply
|
|
88
|
+
if (lastReceivedMessage.diff(now, "s") < threshold) {
|
|
89
|
+
// take a deep breath, and try again
|
|
90
|
+
logger.warn({ name }, "failed to receive expected {pong}");
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// 🪦 oof, get rid of the current connection and try again
|
|
94
|
+
await teardown();
|
|
95
|
+
logger.warn({ name }, "hass stopped replying {unknown} => {offline}");
|
|
96
|
+
return;
|
|
97
|
+
case "connecting":
|
|
98
|
+
if (!isOld(lastConnectAttempt)) {
|
|
99
|
+
// schedule happened in the middle of a connect attempt
|
|
100
|
+
// weird but possible
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
// connect probably stalled somewhere
|
|
104
|
+
// maybe we tried to connect before hass was actually ready for an incoming connection?
|
|
105
|
+
//
|
|
106
|
+
// reset and try again
|
|
107
|
+
await teardown();
|
|
108
|
+
logger.warn({ name }, "connection failed {connecting} => {offline}");
|
|
109
|
+
await ManageConnection();
|
|
110
|
+
return;
|
|
111
|
+
// fall through
|
|
112
|
+
case "offline":
|
|
113
|
+
// ### offline
|
|
114
|
+
// * connection identifies as offline, let's attempt to fix that
|
|
115
|
+
messageCount = core_1.START;
|
|
116
|
+
lastConnectAttempt = now;
|
|
117
|
+
setConnectionState("connecting");
|
|
118
|
+
logger.debug({ name }, "initializing new socket {offline} => {connecting}");
|
|
119
|
+
try {
|
|
120
|
+
await init();
|
|
121
|
+
setConnectionState("connected");
|
|
122
|
+
logger.info("socket connected");
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
logger.error({ error, name }, "init failed {connecting} => {offline}");
|
|
126
|
+
await teardown();
|
|
127
|
+
}
|
|
128
|
+
return;
|
|
129
|
+
case "invalid":
|
|
130
|
+
// ### error
|
|
131
|
+
logger.error("socket received error, check credentials and restart application");
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
37
135
|
function attachScheduledFunctions() {
|
|
38
136
|
logger.trace(`attaching interval schedules`);
|
|
39
|
-
// Set up intervals
|
|
40
137
|
scheduler.interval({
|
|
41
|
-
exec: async () => await
|
|
42
|
-
interval:
|
|
138
|
+
exec: async () => await ManageConnection(),
|
|
139
|
+
interval: config.hass.RETRY_INTERVAL * core_1.SECOND,
|
|
43
140
|
});
|
|
44
141
|
scheduler.interval({
|
|
45
142
|
exec: () => {
|
|
46
143
|
const now = Date.now();
|
|
47
|
-
MESSAGE_TIMESTAMPS = MESSAGE_TIMESTAMPS.filter(time => time > now - core_1.SECOND);
|
|
144
|
+
MESSAGE_TIMESTAMPS = MESSAGE_TIMESTAMPS.filter(time => time > now - core_1.SECOND * config.hass.SOCKET_AVG_DURATION);
|
|
48
145
|
},
|
|
49
146
|
interval: CLEANUP_INTERVAL * core_1.SECOND,
|
|
50
147
|
});
|
|
@@ -53,58 +150,37 @@ function WebsocketAPI({ context, event, hass, config, lifecycle, logger, schedul
|
|
|
53
150
|
logger.debug(`shutdown - tearing down connection`);
|
|
54
151
|
await teardown();
|
|
55
152
|
});
|
|
56
|
-
async function ping() {
|
|
57
|
-
if (!CONNECTION_ACTIVE) {
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
try {
|
|
61
|
-
const pong = await sendMessage({ type: __1.HASSIO_WS_COMMAND.ping });
|
|
62
|
-
if (pong) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
// Tends to happen when HA resets
|
|
66
|
-
// Resolution is to re-connect when it's up again
|
|
67
|
-
logger.error(`failed to pong!`);
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
logger.error({ error }, `ping error`);
|
|
71
|
-
}
|
|
72
|
-
logger.debug(`ping teardown`);
|
|
73
|
-
await teardown();
|
|
74
|
-
logger.info(`🪃 ping re-init`);
|
|
75
|
-
await init();
|
|
76
|
-
}
|
|
77
153
|
async function teardown() {
|
|
78
154
|
if (!connection) {
|
|
155
|
+
logger.trace("HIT1");
|
|
79
156
|
return;
|
|
80
157
|
}
|
|
158
|
+
logger.trace("HIT2");
|
|
81
159
|
if (connection.readyState === CONNECTION_OPEN) {
|
|
82
160
|
logger.debug(`closing current connection`);
|
|
83
|
-
CONNECTION_ACTIVE = false;
|
|
84
161
|
connection.close();
|
|
85
162
|
}
|
|
86
163
|
connection = undefined;
|
|
164
|
+
setConnectionState("offline");
|
|
87
165
|
}
|
|
88
|
-
async function fireEvent(event_type, event_data) {
|
|
89
|
-
|
|
90
|
-
return await sendMessage({ event_data, event_type, type: "fire_event" });
|
|
166
|
+
async function fireEvent(event_type, event_data, waitForResponse = true) {
|
|
167
|
+
return await sendMessage({ event_data, event_type, type: "fire_event" }, waitForResponse);
|
|
91
168
|
}
|
|
92
169
|
async function sendMessage(data, waitForResponse = true, subscription) {
|
|
93
|
-
if (
|
|
94
|
-
logger.error("
|
|
95
|
-
|
|
96
|
-
|
|
170
|
+
if (hass.socket.connectionState === "offline") {
|
|
171
|
+
logger.error("socket is closed, cannot send message");
|
|
172
|
+
return undefined;
|
|
173
|
+
}
|
|
174
|
+
if (hass.socket.pauseMessages && data.type !== __1.HASSIO_WS_COMMAND.ping) {
|
|
97
175
|
return undefined;
|
|
98
176
|
}
|
|
99
|
-
countMessage();
|
|
177
|
+
countMessage(data.type);
|
|
178
|
+
const id = messageCount;
|
|
100
179
|
if (data.type !== __1.HASSIO_WS_COMMAND.auth) {
|
|
101
|
-
|
|
102
|
-
logger.error({ data }, `cannot send message, connection is not open`);
|
|
103
|
-
return undefined;
|
|
104
|
-
}
|
|
105
|
-
data.id = messageCount;
|
|
180
|
+
data.id = id;
|
|
106
181
|
}
|
|
107
182
|
const json = JSON.stringify(data);
|
|
183
|
+
const sentAt = new Date();
|
|
108
184
|
connection.send(json);
|
|
109
185
|
if (subscription) {
|
|
110
186
|
return data.id;
|
|
@@ -112,19 +188,38 @@ function WebsocketAPI({ context, event, hass, config, lifecycle, logger, schedul
|
|
|
112
188
|
if (!waitForResponse) {
|
|
113
189
|
return undefined;
|
|
114
190
|
}
|
|
115
|
-
return new Promise(done =>
|
|
191
|
+
return new Promise(async (done) => {
|
|
192
|
+
waitingCallback.set(id, done);
|
|
193
|
+
await (0, core_1.sleep)(config.hass.EXPECT_RESPONSE_AFTER);
|
|
194
|
+
if (!waitingCallback.has(id)) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// this could happen around dropped connections, or a number of other reasons
|
|
198
|
+
//
|
|
199
|
+
// discard the promise so whatever flow is depending on this can get garbage collected
|
|
200
|
+
waitingCallback.delete(id);
|
|
201
|
+
logger.warn({
|
|
202
|
+
message: data,
|
|
203
|
+
name: "sendMessage",
|
|
204
|
+
sentAt: internal.utils.relativeDate(sentAt),
|
|
205
|
+
}, `sent message, did not receive reply`);
|
|
206
|
+
});
|
|
116
207
|
}
|
|
117
|
-
function countMessage() {
|
|
208
|
+
function countMessage(type) {
|
|
118
209
|
messageCount++;
|
|
119
210
|
const now = Date.now();
|
|
120
211
|
MESSAGE_TIMESTAMPS.push(now);
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
212
|
+
const avgWindow = config.hass.SOCKET_AVG_DURATION;
|
|
213
|
+
const perSecondAverage = Math.ceil(MESSAGE_TIMESTAMPS.filter(time => time > now - core_1.SECOND * avgWindow)
|
|
214
|
+
.length / avgWindow);
|
|
215
|
+
__1.SOCKET_SENT_MESSAGES.labels({ type }).inc();
|
|
216
|
+
const { SOCKET_CRASH_REQUESTS_PER_SEC: crashCount, SOCKET_WARN_REQUESTS_PER_SEC: warnCount, } = config.hass;
|
|
217
|
+
if (perSecondAverage > crashCount) {
|
|
218
|
+
logger.fatal(`exceeded {CRASH_REQUESTS_PER_MIN} ([%s]) threshold`, crashCount);
|
|
124
219
|
(0, process_1.exit)();
|
|
125
220
|
}
|
|
126
|
-
if (
|
|
127
|
-
logger.warn(`message traffic
|
|
221
|
+
if (perSecondAverage > warnCount) {
|
|
222
|
+
logger.warn(`message traffic [%s] > [%s] > [%s]`, crashCount, perSecondAverage, warnCount);
|
|
128
223
|
}
|
|
129
224
|
}
|
|
130
225
|
function getUrl() {
|
|
@@ -136,66 +231,44 @@ function WebsocketAPI({ context, event, hass, config, lifecycle, logger, schedul
|
|
|
136
231
|
`${protocol}//${url.hostname}${port}${path}/api/websocket`);
|
|
137
232
|
}
|
|
138
233
|
async function init() {
|
|
139
|
-
const now = (0, dayjs_1.default)();
|
|
140
|
-
if (connecting) {
|
|
141
|
-
if (connecting.add(config.hass.RETRY_INTERVAL, "second").isAfter(now)) {
|
|
142
|
-
logger.debug("stopped, already connecting");
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
connection = undefined;
|
|
146
|
-
}
|
|
147
234
|
if (connection) {
|
|
235
|
+
// logger.error({ connection });
|
|
148
236
|
throw new core_1.InternalError(context, "ExistingConnection", `Destroy the current connection before creating a new one`);
|
|
149
237
|
}
|
|
150
|
-
connecting = now;
|
|
151
238
|
logger.debug(`CONNECTION_ACTIVE = {false}`);
|
|
152
239
|
const url = getUrl();
|
|
153
|
-
CONNECTION_ACTIVE = false;
|
|
154
240
|
try {
|
|
155
241
|
messageCount = core_1.START;
|
|
156
242
|
connection = new ws_1.default(url);
|
|
157
243
|
connection.on("message", async (message) => {
|
|
158
244
|
try {
|
|
159
|
-
|
|
245
|
+
lastReceivedMessage = (0, dayjs_1.default)();
|
|
246
|
+
const data = JSON.parse(message.toString());
|
|
247
|
+
await onMessage(data);
|
|
248
|
+
pingSleep?.kill("continue");
|
|
160
249
|
}
|
|
161
250
|
catch (error) {
|
|
162
|
-
// My expectation is `
|
|
251
|
+
// My expectation is `internal.safeExec` should trap any application errors
|
|
163
252
|
// This try/catch should actually be excessive
|
|
164
253
|
// If this error happens, something weird is happening
|
|
165
254
|
logger.error({ error }, `💣 error bubbled up from websocket message event handler`);
|
|
166
255
|
}
|
|
167
256
|
});
|
|
168
257
|
connection.on("error", async (error) => {
|
|
169
|
-
logger.error({ error: error
|
|
170
|
-
if (
|
|
171
|
-
|
|
172
|
-
await teardown();
|
|
173
|
-
logger.info("🪃 on error re-init");
|
|
174
|
-
await (0, core_1.sleep)(core_1.SECOND);
|
|
175
|
-
await init();
|
|
258
|
+
logger.error({ error: error }, "Socket error");
|
|
259
|
+
if (hass.socket.connectionState === "connected") {
|
|
260
|
+
setConnectionState("unknown");
|
|
176
261
|
}
|
|
177
262
|
});
|
|
178
263
|
connection.on("close", async () => {
|
|
179
264
|
logger.warn("connection closed");
|
|
180
265
|
await teardown();
|
|
181
|
-
await (0, core_1.sleep)(config.hass.RETRY_INTERVAL);
|
|
182
|
-
logger.info("🪃 on close re-init");
|
|
183
|
-
await init();
|
|
184
|
-
});
|
|
185
|
-
return await new Promise(done => {
|
|
186
|
-
connection.once("open", () => {
|
|
187
|
-
connecting = undefined;
|
|
188
|
-
done();
|
|
189
|
-
});
|
|
190
266
|
});
|
|
267
|
+
return await new Promise(done => (onSocketReady = done));
|
|
191
268
|
}
|
|
192
269
|
catch (error) {
|
|
193
270
|
logger.error({ error, url }, `initConnection error`);
|
|
194
|
-
|
|
195
|
-
setTimeout(async () => {
|
|
196
|
-
logger.debug(`🪃 retry re-init`);
|
|
197
|
-
await init();
|
|
198
|
-
}, config.hass.RETRY_INTERVAL);
|
|
271
|
+
setConnectionState("offline");
|
|
199
272
|
}
|
|
200
273
|
}
|
|
201
274
|
/**
|
|
@@ -216,37 +289,32 @@ function WebsocketAPI({ context, event, hass, config, lifecycle, logger, schedul
|
|
|
216
289
|
*/
|
|
217
290
|
async function onMessage(message) {
|
|
218
291
|
const id = Number(message.id);
|
|
292
|
+
__1.SOCKET_RECEIVED_MESSAGES.labels({ type: message.type }).inc();
|
|
219
293
|
switch (message.type) {
|
|
220
294
|
case __1.HassSocketMessageTypes.auth_required:
|
|
221
295
|
logger.debug(`sending authentication`);
|
|
222
|
-
|
|
296
|
+
sendMessage({ access_token: config.hass.TOKEN, type: __1.HASSIO_WS_COMMAND.auth }, false);
|
|
297
|
+
return;
|
|
223
298
|
case __1.HassSocketMessageTypes.auth_ok:
|
|
224
299
|
logger.debug(`CONNECTION_ACTIVE = {true}`);
|
|
225
300
|
// * Flag as valid connection
|
|
226
|
-
CONNECTION_ACTIVE = true;
|
|
227
|
-
connecting = undefined;
|
|
228
|
-
event.emit(exports.SOCKET_CONNECTED);
|
|
229
|
-
clearTimeout(AUTH_TIMEOUT);
|
|
230
301
|
logger.debug(`event subscriptions starting`);
|
|
231
302
|
await sendMessage({ type: __1.HASSIO_WS_COMMAND.subscribe_events }, false);
|
|
232
|
-
|
|
303
|
+
onSocketReady();
|
|
304
|
+
event.emit(exports.SOCKET_CONNECTED);
|
|
233
305
|
return;
|
|
234
306
|
case __1.HassSocketMessageTypes.event:
|
|
235
307
|
return await onMessageEvent(id, message);
|
|
236
308
|
case __1.HassSocketMessageTypes.pong:
|
|
237
309
|
// 🏓
|
|
238
|
-
if (waitingCallback.has(id)) {
|
|
239
|
-
const f = waitingCallback.get(id);
|
|
240
|
-
waitingCallback.delete(id);
|
|
241
|
-
f(message);
|
|
242
|
-
}
|
|
243
310
|
return;
|
|
244
311
|
case __1.HassSocketMessageTypes.result:
|
|
245
312
|
return await onMessageResult(id, message);
|
|
246
313
|
case __1.HassSocketMessageTypes.auth_invalid:
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
314
|
+
setConnectionState("invalid");
|
|
315
|
+
logger.fatal({ message }, "auth_invalid");
|
|
316
|
+
// ? If you have a use case for making this exit configurable, open a ticket
|
|
317
|
+
(0, process_1.exit)();
|
|
250
318
|
return;
|
|
251
319
|
default:
|
|
252
320
|
// Code error probably
|
|
@@ -273,6 +341,9 @@ function WebsocketAPI({ context, event, hass, config, lifecycle, logger, schedul
|
|
|
273
341
|
return;
|
|
274
342
|
}
|
|
275
343
|
}
|
|
344
|
+
if (hass.socket.pauseMessages) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
276
347
|
if (waitingCallback.has(id)) {
|
|
277
348
|
const f = waitingCallback.get(id);
|
|
278
349
|
waitingCallback.delete(id);
|
|
@@ -290,20 +361,10 @@ function WebsocketAPI({ context, event, hass, config, lifecycle, logger, schedul
|
|
|
290
361
|
f(message.result);
|
|
291
362
|
}
|
|
292
363
|
}
|
|
293
|
-
async function sendAuth() {
|
|
294
|
-
AUTH_TIMEOUT = setTimeout(() => {
|
|
295
|
-
logger.error(`did not receive an auth response, retrying`);
|
|
296
|
-
sendAuth();
|
|
297
|
-
}, config.hass.RETRY_INTERVAL);
|
|
298
|
-
await sendMessage({
|
|
299
|
-
access_token: config.hass.TOKEN,
|
|
300
|
-
type: __1.HASSIO_WS_COMMAND.auth,
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
364
|
function onEvent({ context, label, event, once, exec, }) {
|
|
304
365
|
logger.trace({ context, event }, `attaching socket event listener`);
|
|
305
366
|
const callback = async (data) => {
|
|
306
|
-
await
|
|
367
|
+
await internal.safeExec({
|
|
307
368
|
duration: __1.SOCKET_EVENT_EXECUTION_TIME,
|
|
308
369
|
errors: __1.SOCKET_EVENT_ERRORS,
|
|
309
370
|
exec: async () => await exec(data),
|
|
@@ -323,21 +384,33 @@ function WebsocketAPI({ context, event, hass, config, lifecycle, logger, schedul
|
|
|
323
384
|
};
|
|
324
385
|
}
|
|
325
386
|
return {
|
|
387
|
+
/**
|
|
388
|
+
* the current state of the websocket
|
|
389
|
+
*/
|
|
390
|
+
connectionState: "offline",
|
|
326
391
|
/**
|
|
327
392
|
* Convenient wrapper for sendMessage
|
|
328
393
|
*/
|
|
329
394
|
fireEvent,
|
|
330
|
-
getConnectionActive: () => CONNECTION_ACTIVE,
|
|
331
395
|
/**
|
|
332
396
|
* Set up a new websocket connection to home assistant
|
|
333
397
|
*
|
|
334
398
|
* This doesn't normally need to be called by applications, the extension self manages
|
|
335
399
|
*/
|
|
336
400
|
init,
|
|
401
|
+
/**
|
|
402
|
+
* run a callback when the socket finishes connecting
|
|
403
|
+
*/
|
|
337
404
|
onConnect: (callback) => {
|
|
338
|
-
|
|
339
|
-
await
|
|
340
|
-
}
|
|
405
|
+
const wrapped = async () => {
|
|
406
|
+
await internal.safeExec(async () => await callback());
|
|
407
|
+
};
|
|
408
|
+
if (hass.socket.connectionState === "connected") {
|
|
409
|
+
logger.warn(`added [onConnect] callback after socket was already connected, running immediately`);
|
|
410
|
+
setImmediate(wrapped);
|
|
411
|
+
// attach anyways, for restarts or whatever
|
|
412
|
+
}
|
|
413
|
+
event.on(exports.SOCKET_CONNECTED, wrapped);
|
|
341
414
|
},
|
|
342
415
|
/**
|
|
343
416
|
* Attach to the incoming stream of socket events. Do your own filtering and processing from there
|
|
@@ -345,6 +418,12 @@ function WebsocketAPI({ context, event, hass, config, lifecycle, logger, schedul
|
|
|
345
418
|
* Returns removal function
|
|
346
419
|
*/
|
|
347
420
|
onEvent,
|
|
421
|
+
/**
|
|
422
|
+
* when true:
|
|
423
|
+
* - outgoing socket messages are blocked
|
|
424
|
+
* - entities don't emit updates
|
|
425
|
+
*/
|
|
426
|
+
pauseMessages: false,
|
|
348
427
|
/**
|
|
349
428
|
* Send a message to home assistant via the socket connection
|
|
350
429
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket-api.extension.js","sourceRoot":"","sources":["../../src/extensions/websocket-api.extension.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"websocket-api.extension.js","sourceRoot":"","sources":["../../src/extensions/websocket-api.extension.ts"],"names":[],"mappings":"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"}
|
package/dist/hass.module.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { StringConfig } from "@digital-alchemy/core";
|
|
1
2
|
import { CallProxy, Configure, EntityManager, FetchAPI, Utilities, WebsocketAPI } from "./extensions";
|
|
3
|
+
type AllowRestOptions = "prefer" | "allow" | "forbid";
|
|
2
4
|
export declare const LIB_HASS: import("@digital-alchemy/core").LibraryDefinition<{
|
|
3
5
|
/**
|
|
4
6
|
* general service calling interface
|
|
@@ -40,11 +42,22 @@ export declare const LIB_HASS: import("@digital-alchemy/core").LibraryDefinition
|
|
|
40
42
|
description: string;
|
|
41
43
|
type: "string";
|
|
42
44
|
};
|
|
45
|
+
CALL_PROXY_ALLOW_REST: StringConfig<AllowRestOptions>;
|
|
46
|
+
EXPECT_RESPONSE_AFTER: {
|
|
47
|
+
default: number;
|
|
48
|
+
description: string;
|
|
49
|
+
type: "number";
|
|
50
|
+
};
|
|
43
51
|
RETRY_INTERVAL: {
|
|
44
52
|
default: number;
|
|
45
53
|
description: string;
|
|
46
54
|
type: "number";
|
|
47
55
|
};
|
|
56
|
+
SOCKET_AVG_DURATION: {
|
|
57
|
+
default: number;
|
|
58
|
+
description: string;
|
|
59
|
+
type: "number";
|
|
60
|
+
};
|
|
48
61
|
SOCKET_CRASH_REQUESTS_PER_SEC: {
|
|
49
62
|
default: number;
|
|
50
63
|
description: string;
|
|
@@ -78,3 +91,4 @@ declare module "@digital-alchemy/core" {
|
|
|
78
91
|
hass: typeof LIB_HASS;
|
|
79
92
|
}
|
|
80
93
|
}
|
|
94
|
+
export {};
|
package/dist/hass.module.js
CHANGED
|
@@ -20,11 +20,30 @@ exports.LIB_HASS = (0, core_1.CreateLibrary)({
|
|
|
20
20
|
description: "Url to reach Home Assistant at",
|
|
21
21
|
type: "string",
|
|
22
22
|
},
|
|
23
|
+
CALL_PROXY_ALLOW_REST: {
|
|
24
|
+
default: "allow",
|
|
25
|
+
description: [
|
|
26
|
+
"Send commands from hass.call via rest instead of socket",
|
|
27
|
+
"Allow = only if socket is not connected",
|
|
28
|
+
],
|
|
29
|
+
enum: ["prefer", "forbid", "allow"],
|
|
30
|
+
type: "string",
|
|
31
|
+
},
|
|
32
|
+
EXPECT_RESPONSE_AFTER: {
|
|
33
|
+
default: 5,
|
|
34
|
+
description: "If sendMessage was set to expect a response, a warning will be emitted after this delay if one is not received",
|
|
35
|
+
type: "number",
|
|
36
|
+
},
|
|
23
37
|
RETRY_INTERVAL: {
|
|
24
|
-
default:
|
|
38
|
+
default: 5,
|
|
25
39
|
description: "How often to retry connecting on connection failure (ms).",
|
|
26
40
|
type: "number",
|
|
27
41
|
},
|
|
42
|
+
SOCKET_AVG_DURATION: {
|
|
43
|
+
default: 5,
|
|
44
|
+
description: "How many seconds worth of requests to use in avg for math in REQ_PER_SEC calculations",
|
|
45
|
+
type: "number",
|
|
46
|
+
},
|
|
28
47
|
SOCKET_CRASH_REQUESTS_PER_SEC: {
|
|
29
48
|
default: 500,
|
|
30
49
|
description: "Socket service will commit sudoku if more than this many outgoing messages are sent to Home Assistant in a second. Usually indicates runaway code.",
|
package/dist/hass.module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hass.module.js","sourceRoot":"","sources":["../src/hass.module.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"hass.module.js","sourceRoot":"","sources":["../src/hass.module.ts"],"names":[],"mappings":";;;AAAA,gDAAoE;AAEpE,6CAOsB;AAIT,QAAA,QAAQ,GAAG,IAAA,oBAAa,EAAC;IACpC,aAAa,EAAE;QACb,mBAAmB,EAAE;YACnB,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,wDAAwD;YACrE,IAAI,EAAE,SAAS;SAChB;QACD,oBAAoB,EAAE;YACpB,OAAO,EAAE,IAAI;YACb,WAAW,EACT,+DAA+D;YACjE,IAAI,EAAE,SAAS;SAChB;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,iCAAiC;YAC1C,WAAW,EAAE,gCAAgC;YAC7C,IAAI,EAAE,QAAQ;SACf;QACD,qBAAqB,EAAE;YACrB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE;gBACX,yDAAyD;gBACzD,yCAAyC;aAC1C;YACD,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;YACnC,IAAI,EAAE,QAAQ;SACmB;QACnC,qBAAqB,EAAE;YACrB,OAAO,EAAE,CAAC;YACV,WAAW,EACT,gHAAgH;YAClH,IAAI,EAAE,QAAQ;SACf;QACD,cAAc,EAAE;YACd,OAAO,EAAE,CAAC;YACV,WAAW,EAAE,2DAA2D;YACxE,IAAI,EAAE,QAAQ;SACf;QACD,mBAAmB,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,WAAW,EACT,uFAAuF;YACzF,IAAI,EAAE,QAAQ;SACf;QACD,6BAA6B,EAAE;YAC7B,OAAO,EAAE,GAAG;YACZ,WAAW,EACT,oJAAoJ;YACtJ,IAAI,EAAE,QAAQ;SACf;QACD,4BAA4B,EAAE;YAC5B,OAAO,EAAE,GAAG;YACZ,WAAW,EACT,kHAAkH;YACpH,IAAI,EAAE,QAAQ;SACf;QACD,KAAK,EAAE;YACL,WAAW,EAAE,4CAA4C;YACzD,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,QAAQ;SACf;QACD,sBAAsB,EAAE;YACtB,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,qCAAqC;YAClD,IAAI,EAAE,SAAS;SAChB;QACD,aAAa,EAAE;YACb,WAAW,EAAE,8GAA8G;YAC3H,IAAI,EAAE,QAAQ;SACf;KACF;IACD,IAAI,EAAE,MAAM;IACZ,oCAAoC;IACpC,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;IAChC,QAAQ,EAAE;QACR;;WAEG;QACH,IAAI,EAAE,sBAAS;QAEf;;WAEG;QACH,SAAS,EAAE,sBAAS;QAEpB;;WAEG;QACH,MAAM,EAAE,0BAAa;QAErB;;WAEG;QACH,KAAK,EAAE,qBAAQ;QAEf;;WAEG;QACH,MAAM,EAAE,yBAAY;QAEpB;;WAEG;QACH,KAAK,EAAE,sBAAS;KACjB;CACF,CAAC,CAAC"}
|
|
@@ -2,7 +2,6 @@ export declare const HASS_ENTITY = "HASS_ENTITY";
|
|
|
2
2
|
export declare const HASS_ENTITY_GROUP = "HASS_ENTITY_GROUP";
|
|
3
3
|
export declare const ALL_ENTITIES_UPDATED = "ALL_ENTITIES_UPDATED";
|
|
4
4
|
export declare const SOCKET_READY = "SOCKET_READY";
|
|
5
|
-
export declare const ON_SOCKET_AUTH = "ON_SOCKET_AUTH";
|
|
6
5
|
export declare enum HASSIO_WS_COMMAND {
|
|
7
6
|
area_list = "config/area_registry/list",
|
|
8
7
|
auth = "auth",
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HOME_ASSISTANT_MODULE_CONFIGURATION = exports.HassSocketMessageTypes = exports.HASSIO_WS_COMMAND = exports.
|
|
3
|
+
exports.HOME_ASSISTANT_MODULE_CONFIGURATION = exports.HassSocketMessageTypes = exports.HASSIO_WS_COMMAND = exports.SOCKET_READY = exports.ALL_ENTITIES_UPDATED = exports.HASS_ENTITY_GROUP = exports.HASS_ENTITY = void 0;
|
|
4
4
|
exports.HASS_ENTITY = "HASS_ENTITY";
|
|
5
5
|
exports.HASS_ENTITY_GROUP = "HASS_ENTITY_GROUP";
|
|
6
6
|
exports.ALL_ENTITIES_UPDATED = "ALL_ENTITIES_UPDATED";
|
|
7
7
|
exports.SOCKET_READY = "SOCKET_READY";
|
|
8
|
-
exports.ON_SOCKET_AUTH = "ON_SOCKET_AUTH";
|
|
9
8
|
var HASSIO_WS_COMMAND;
|
|
10
9
|
(function (HASSIO_WS_COMMAND) {
|
|
11
10
|
// Found a use for
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.helper.js","sourceRoot":"","sources":["../../src/helpers/constants.helper.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,aAAa,CAAC;AAC5B,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AACxC,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAC9C,QAAA,YAAY,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.helper.js","sourceRoot":"","sources":["../../src/helpers/constants.helper.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,aAAa,CAAC;AAC5B,QAAA,iBAAiB,GAAG,mBAAmB,CAAC;AACxC,QAAA,oBAAoB,GAAG,sBAAsB,CAAC;AAC9C,QAAA,YAAY,GAAG,cAAc,CAAC;AAE3C,IAAY,iBA0CX;AA1CD,WAAY,iBAAiB;IAC3B,kBAAkB;IAClB,4DAAuC,CAAA;IACvC,kCAAa,CAAA;IACb,kDAA6B,CAAA;IAC7B,gEAA2C,CAAA;IAC3C,wFAAmE,CAAA;IACnE,gEAA2C,CAAA;IAC3C,oEAA+C,CAAA;IAC/C,sEAAiD,CAAA;IACjD,8CAAyB,CAAA;IACzB,wDAAmC,CAAA;IACnC,oDAA+B,CAAA;IAC/B,4EAAuD,CAAA;IACvD,gDAA2B,CAAA;IAC3B,uDAAkC,CAAA;IAClC,8CAAyB,CAAA;IACzB,8CAAyB,CAAA;IACzB,kCAAa,CAAA;IACb,gEAA2C,CAAA;IAC3C,wDAAmC,CAAA;IACnC,sDAAiC,CAAA;IACjC,4DAAuC,CAAA;IACvC,0DAAqC,CAAA;IACrC,kBAAkB;IAClB,uDAAkC,CAAA;IAClC,4EAAuD,CAAA;IACvD,0DAAqC,CAAA;IACrC,yDAAoC,CAAA;IACpC,sDAAiC,CAAA;IACjC,8DAAyC,CAAA;IACzC,qCAAqC;IACrC,4CAAuB,CAAA;IACvB,mDAA8B,CAAA;IAC9B,kDAA6B,CAAA;IAC7B,uDAAkC,CAAA;IAClC,uDAAkC,CAAA;IAClC,6DAAwC,CAAA;IACxC,wDAAmC,CAAA;IACnC,8DAAyC,CAAA;IACzC,wCAAmB,CAAA;IACnB,+DAA0C,CAAA;AAC5C,CAAC,EA1CW,iBAAiB,iCAAjB,iBAAiB,QA0C5B;AAED,IAAY,sBAOX;AAPD,WAAY,sBAAsB;IAChC,yDAA+B,CAAA;IAC/B,6CAAmB,CAAA;IACnB,yCAAe,CAAA;IACf,2CAAiB,CAAA;IACjB,uCAAa,CAAA;IACb,uDAA6B,CAAA;AAC/B,CAAC,EAPW,sBAAsB,sCAAtB,sBAAsB,QAOjC;AAEY,QAAA,mCAAmC,GAC9C,qCAAqC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Counter, Summary } from "prom-client";
|
|
1
|
+
import { Counter, Gauge, Summary } from "prom-client";
|
|
2
2
|
/**
|
|
3
3
|
* Tracks the number of times a socket event callback has been executed.
|
|
4
4
|
*/
|
|
@@ -7,7 +7,19 @@ export declare const SOCKET_EVENT_EXECUTION_COUNT: Counter<"event" | "context" |
|
|
|
7
7
|
* Counts the number of errors occurred during socket event callback executions.
|
|
8
8
|
*/
|
|
9
9
|
export declare const SOCKET_EVENT_ERRORS: Counter<"event" | "context" | "label">;
|
|
10
|
+
/**
|
|
11
|
+
* Counts the number of errors occurred during socket event callback executions.
|
|
12
|
+
*/
|
|
13
|
+
export declare const SOCKET_SENT_MESSAGES: Counter<"type">;
|
|
14
|
+
/**
|
|
15
|
+
* Counts the number of errors occurred during socket event callback executions.
|
|
16
|
+
*/
|
|
17
|
+
export declare const SOCKET_RECEIVED_MESSAGES: Counter<"type">;
|
|
10
18
|
/**
|
|
11
19
|
* Summary for Execution Time
|
|
12
20
|
*/
|
|
13
21
|
export declare const SOCKET_EVENT_EXECUTION_TIME: Summary<"event" | "context" | "label">;
|
|
22
|
+
/**
|
|
23
|
+
* Show the current state
|
|
24
|
+
*/
|
|
25
|
+
export declare const SOCKET_CONNECTION_STATE: Gauge<"state">;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SOCKET_EVENT_EXECUTION_TIME = exports.SOCKET_EVENT_ERRORS = exports.SOCKET_EVENT_EXECUTION_COUNT = void 0;
|
|
3
|
+
exports.SOCKET_CONNECTION_STATE = exports.SOCKET_EVENT_EXECUTION_TIME = exports.SOCKET_RECEIVED_MESSAGES = exports.SOCKET_SENT_MESSAGES = exports.SOCKET_EVENT_ERRORS = exports.SOCKET_EVENT_EXECUTION_COUNT = void 0;
|
|
4
4
|
const prom_client_1 = require("prom-client");
|
|
5
5
|
/**
|
|
6
6
|
* Tracks the number of times a socket event callback has been executed.
|
|
@@ -18,6 +18,22 @@ exports.SOCKET_EVENT_ERRORS = new prom_client_1.Counter({
|
|
|
18
18
|
labelNames: ["context", "label", "event"],
|
|
19
19
|
name: "digital_alchemy_home_assistant_socket_event_callback_errors",
|
|
20
20
|
});
|
|
21
|
+
/**
|
|
22
|
+
* Counts the number of errors occurred during socket event callback executions.
|
|
23
|
+
*/
|
|
24
|
+
exports.SOCKET_SENT_MESSAGES = new prom_client_1.Counter({
|
|
25
|
+
help: "Counts the number of outgoing sent messages",
|
|
26
|
+
labelNames: ["type"],
|
|
27
|
+
name: "digital_alchemy_home_assistant_socket_sent_messages",
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* Counts the number of errors occurred during socket event callback executions.
|
|
31
|
+
*/
|
|
32
|
+
exports.SOCKET_RECEIVED_MESSAGES = new prom_client_1.Counter({
|
|
33
|
+
help: "Counts the number of incoming socket messages",
|
|
34
|
+
labelNames: ["type"],
|
|
35
|
+
name: "digital_alchemy_home_assistant_socket_received_messages",
|
|
36
|
+
});
|
|
21
37
|
/**
|
|
22
38
|
* Summary for Execution Time
|
|
23
39
|
*/
|
|
@@ -27,4 +43,12 @@ exports.SOCKET_EVENT_EXECUTION_TIME = new prom_client_1.Summary({
|
|
|
27
43
|
name: "digital_alchemy_home_assistant_socket_event_callback_execution_time",
|
|
28
44
|
percentiles: [0.5, 0.9, 0.99],
|
|
29
45
|
});
|
|
46
|
+
/**
|
|
47
|
+
* Show the current state
|
|
48
|
+
*/
|
|
49
|
+
exports.SOCKET_CONNECTION_STATE = new prom_client_1.Gauge({
|
|
50
|
+
help: "The current connection to home assistant state, observable as a metrics",
|
|
51
|
+
labelNames: ["state"],
|
|
52
|
+
name: "digital_alchemy_home_assistant_socket_connection_state",
|
|
53
|
+
});
|
|
30
54
|
//# sourceMappingURL=metrics.helper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.helper.js","sourceRoot":"","sources":["../../src/helpers/metrics.helper.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"metrics.helper.js","sourceRoot":"","sources":["../../src/helpers/metrics.helper.ts"],"names":[],"mappings":";;;AAAA,6CAAsD;AAEtD;;GAEG;AACU,QAAA,4BAA4B,GAAG,IAAI,qBAAO,CAAC;IACtD,IAAI,EAAE,sEAAsE;IAC5E,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAU;IAClD,IAAI,EAAE,sEAAsE;CAC7E,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,mBAAmB,GAAG,IAAI,qBAAO,CAAC;IAC7C,IAAI,EAAE,qEAAqE;IAC3E,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAU;IAClD,IAAI,EAAE,6DAA6D;CACpE,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,oBAAoB,GAAG,IAAI,qBAAO,CAAC;IAC9C,IAAI,EAAE,6CAA6C;IACnD,UAAU,EAAE,CAAC,MAAM,CAAU;IAC7B,IAAI,EAAE,qDAAqD;CAC5D,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,wBAAwB,GAAG,IAAI,qBAAO,CAAC;IAClD,IAAI,EAAE,+CAA+C;IACrD,UAAU,EAAE,CAAC,MAAM,CAAU;IAC7B,IAAI,EAAE,yDAAyD;CAChE,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,2BAA2B,GAAG,IAAI,qBAAO,CAAC;IACrD,IAAI,EAAE,+DAA+D;IACrE,UAAU,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAU;IAClD,IAAI,EAAE,qEAAqE;IAC3E,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;CAC9B,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,uBAAuB,GAAG,IAAI,mBAAK,CAAC;IAC/C,IAAI,EAAE,yEAAyE;IAC/E,UAAU,EAAE,CAAC,OAAO,CAAU;IAC9B,IAAI,EAAE,wDAAwD;CAC/D,CAAC,CAAC"}
|