UNPKG

node-red-contrib-home-assistant-websocket

Version:
596 lines (595 loc) 31.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var _Websocket_instances, _Websocket_config, _Websocket_eventBus, _Websocket_servicesLoaded, _Websocket_statesLoaded, _Websocket_stopHeartbeat, _Websocket_subscribedEvents, _Websocket_unsubCallback, _Websocket_isAreaRegistryLoaded, _Websocket_isDeviceRegistryLoaded, _Websocket_isEntityRegistryLoaded, _Websocket_isFloorRegistryLoaded, _Websocket_isLabelRegistryLoaded, _Websocket_isAllRegistriesLoaded, _Websocket_emitEvent, _Websocket_checkHomeAssistantVersion, _Websocket_checkUserType, _Websocket_clientEvents, _Websocket_haEvents, _Websocket_checkIfAllRegistriesLoaded, _Websocket_onHomeAssistantRunning, _Websocket_integrationEvent, _Websocket_stopAssignedHeartbeat; Object.defineProperty(exports, "__esModule", { value: true }); exports.ClientEvent = exports.ClientState = void 0; const debug_1 = __importDefault(require("debug")); const home_assistant_js_websocket_1 = require("home-assistant-js-websocket"); const lodash_1 = require("lodash"); const const_1 = require("../const"); const globals_1 = require("../globals"); const _1 = require("./"); const collections_1 = require("./collections"); const createSocket_1 = __importStar(require("./createSocket")); const heartbeat_1 = require("./heartbeat"); const debug = (0, debug_1.default)('home-assistant:ws'); var ClientState; (function (ClientState) { ClientState[ClientState["Connecting"] = 0] = "Connecting"; ClientState[ClientState["Connected"] = 1] = "Connected"; ClientState[ClientState["Disconnected"] = 2] = "Disconnected"; ClientState[ClientState["Error"] = 3] = "Error"; ClientState[ClientState["Running"] = 4] = "Running"; })(ClientState || (exports.ClientState = ClientState = {})); var ClientEvent; (function (ClientEvent) { ClientEvent["Close"] = "ha_client:close"; ClientEvent["Connected"] = "ha_client:connected"; ClientEvent["Connecting"] = "ha_client:connecting"; ClientEvent["Error"] = "ha_client:error"; ClientEvent["InitialConnectionReady"] = "initial_connection_ready"; ClientEvent["Integration"] = "integration"; ClientEvent["Open"] = "ha_client:open"; ClientEvent["Ready"] = "ha_client:ready"; ClientEvent["RegistriesLoaded"] = "ha_client:registries_loaded"; ClientEvent["Running"] = "ha_client:running"; ClientEvent["ServicesLoaded"] = "ha_client:services_loaded"; ClientEvent["StatesLoaded"] = "ha_client:states_loaded"; })(ClientEvent || (exports.ClientEvent = ClientEvent = {})); class Websocket { constructor(config, eventBus) { _Websocket_instances.add(this); _Websocket_config.set(this, void 0); _Websocket_eventBus.set(this, void 0); _Websocket_servicesLoaded.set(this, false); _Websocket_statesLoaded.set(this, false); _Websocket_stopHeartbeat.set(this, void 0); _Websocket_subscribedEvents.set(this, new Set()); _Websocket_unsubCallback.set(this, {}); _Websocket_isAreaRegistryLoaded.set(this, false); _Websocket_isDeviceRegistryLoaded.set(this, false); _Websocket_isEntityRegistryLoaded.set(this, false); _Websocket_isFloorRegistryLoaded.set(this, false); _Websocket_isLabelRegistryLoaded.set(this, false); _Websocket_isAllRegistriesLoaded.set(this, false); this.areas = []; this.devices = []; this.entities = new Map(); this.floors = []; this.labels = []; this.connectionState = ClientState.Disconnected; this.integrationVersion = const_1.NO_VERSION; this.isHomeAssistantRunning = false; this.states = {}; this.services = {}; this.tags = null; __classPrivateFieldSet(this, _Websocket_config, config, "f"); __classPrivateFieldSet(this, _Websocket_eventBus, eventBus, "f"); __classPrivateFieldGet(this, _Websocket_eventBus, "f").on(ClientEvent.Connecting, this.onClientConnecting.bind(this)); this.onStatesLoadedAndRunning(ClientEvent.InitialConnectionReady); } get isConnected() { return this.connectionState === ClientState.Connected; } get isStatesLoaded() { return __classPrivateFieldGet(this, _Websocket_statesLoaded, "f"); } async connect() { // Convert from http:// -> ws://, https:// -> wss:// const url = `ws${__classPrivateFieldGet(this, _Websocket_config, "f").host.substring(4)}/api/websocket`; const auth = { type: 'auth', access_token: __classPrivateFieldGet(this, _Websocket_config, "f").access_token, }; this.client = await (0, home_assistant_js_websocket_1.createConnection)({ createSocket: () => (0, createSocket_1.default)({ auth, connectionDelay: __classPrivateFieldGet(this, _Websocket_config, "f").connectionDelay, eventBus: __classPrivateFieldGet(this, _Websocket_eventBus, "f"), rejectUnauthorizedCerts: __classPrivateFieldGet(this, _Websocket_config, "f").rejectUnauthorizedCerts, url, }), }).catch((e) => { this.connectionState = ClientState.Error; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.Error); // Handle connection errors let message; switch (e) { case home_assistant_js_websocket_1.ERR_CANNOT_CONNECT: message = globals_1.RED._('home-assistant.error.cannot-connect'); break; case home_assistant_js_websocket_1.ERR_INVALID_AUTH: message = globals_1.RED._('home-assistant.error.invalid_auth'); break; case home_assistant_js_websocket_1.ERR_CONNECTION_LOST: message = globals_1.RED._('home-assistant.error.connection_lost'); break; case home_assistant_js_websocket_1.ERR_HASS_HOST_REQUIRED: message = globals_1.RED._('home-assistant.error.hass_host_required'); break; case home_assistant_js_websocket_1.ERR_INVALID_HTTPS_TO_HTTP: message = 'ERR_INVALID_HTTPS_TO_HTTP'; break; } throw message ? new Error(message) : e; }); // Check if user has admin privileges await __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkUserType).call(this); // Check if Home Assistant version is supported __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkHomeAssistantVersion).call(this); this.onClientOpen(); // emit connected for only the first connection to the server // so we can setup certain things only once like registerEvents __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.Connected); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_clientEvents).call(this); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_haEvents).call(this); } getUser() { return (0, home_assistant_js_websocket_1.getUser)(this.client); } get isAllRegistriesLoaded() { return __classPrivateFieldGet(this, _Websocket_isAllRegistriesLoaded, "f"); } async subscribeEvents(events) { const currentEvents = new Set(Object.values(events)); // If events contains '__ALL__' register all events and skip individual ones if (currentEvents.has('__ALL__')) { if (__classPrivateFieldGet(this, _Websocket_subscribedEvents, "f").has('__ALL__')) { // Nothing to do return; } __classPrivateFieldGet(this, _Websocket_subscribedEvents, "f").forEach((e) => { if (e !== '__ALL__') { __classPrivateFieldGet(this, _Websocket_unsubCallback, "f")[e](); delete __classPrivateFieldGet(this, _Websocket_unsubCallback, "f")[e]; __classPrivateFieldGet(this, _Websocket_subscribedEvents, "f").delete(e); } }); // subscribe to all event and save unsubscribe callback __classPrivateFieldGet(this, _Websocket_unsubCallback, "f").__ALL__ = await this.client.subscribeEvents((ent) => this.onClientEvents(ent)); __classPrivateFieldGet(this, _Websocket_subscribedEvents, "f").add('__ALL__'); return; } // Always need the state_changed event currentEvents.add(_1.HaEvent.StateChanged); currentEvents.add(_1.HaEvent.TagScanned); const add = new Set([...currentEvents].filter((x) => !__classPrivateFieldGet(this, _Websocket_subscribedEvents, "f").has(x))); const remove = new Set([...__classPrivateFieldGet(this, _Websocket_subscribedEvents, "f")].filter((x) => !currentEvents.has(x))); // Create new subscription list __classPrivateFieldSet(this, _Websocket_subscribedEvents, new Set([ ...[...currentEvents].filter((x) => __classPrivateFieldGet(this, _Websocket_subscribedEvents, "f").has(x)), ...add, ]), "f"); // Remove unused subscriptions remove.forEach((e) => { __classPrivateFieldGet(this, _Websocket_unsubCallback, "f")[e](); delete __classPrivateFieldGet(this, _Websocket_unsubCallback, "f")[e]; }); // Subscribe to each event type and save each unsubscribe callback for (const type of add) { __classPrivateFieldGet(this, _Websocket_unsubCallback, "f")[type] = await this.client.subscribeEvents((ent) => this.onClientEvents(ent), type); } } subscribeMessage(callback, subscribeMessage, options) { return this.client.subscribeMessage(callback, subscribeMessage, options); } onClientStates(entities) { if (!entities || Object.keys(entities).length === 0) { return; } this.states = entities; if (!__classPrivateFieldGet(this, _Websocket_statesLoaded, "f")) { __classPrivateFieldSet(this, _Websocket_statesLoaded, true, "f"); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.StatesLoaded, this.states); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkIfAllRegistriesLoaded).call(this); } } onClientServices(services) { if (!services || Object.keys(services).length === 0) { return; } this.services = services; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, const_1.HA_EVENT_SERVICES_UPDATED, this.services); if (!__classPrivateFieldGet(this, _Websocket_servicesLoaded, "f")) { __classPrivateFieldSet(this, _Websocket_servicesLoaded, true, "f"); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.ServicesLoaded); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkIfAllRegistriesLoaded).call(this); } } onStatesLoadedAndRunning(event = ClientEvent.Ready) { const statesLoaded = new Promise((resolve) => { __classPrivateFieldGet(this, _Websocket_eventBus, "f").once(ClientEvent.ServicesLoaded, resolve); }); const homeAssinstantRunning = new Promise((resolve) => { __classPrivateFieldGet(this, _Websocket_eventBus, "f").once(ClientEvent.Running, resolve); }); Promise.all([statesLoaded, homeAssinstantRunning]).then(([states]) => { __classPrivateFieldGet(this, _Websocket_eventBus, "f").emit(event, states); }); } onClientEvents(hassEvent) { var _a, _b; if (!hassEvent || !hassEvent.data) { return; } const eventType = hassEvent.event_type; const entityId = (_a = hassEvent === null || hassEvent === void 0 ? void 0 : hassEvent.data) === null || _a === void 0 ? void 0 : _a.entity_id; const event = { event_type: eventType, entity_id: entityId, event: hassEvent.data, origin: hassEvent.origin, time_fired: hassEvent.time_fired, context: hassEvent.context, }; if (eventType === _1.HaEvent.StateChanged) { const state = (_b = event === null || event === void 0 ? void 0 : event.event) === null || _b === void 0 ? void 0 : _b.new_state; // Validate a minimum state_changed event if (state && entityId) { this.states[entityId] = state; } else { debug(`Not processing ${_1.HaEvent.StateChanged} event: ${JSON.stringify(event)}`); return; } } // Emit on the event type channel if (eventType) { __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, `${const_1.HA_EVENTS}:${eventType}`, event); // Most specific emit for event_type and entity_id if (entityId) { __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, `${const_1.HA_EVENTS}:${eventType}:${entityId}`, event); } } // Emit on all channel __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, `${const_1.HA_EVENTS}:all`, event); } async onClientConfigUpdate(config) { if (config.components.includes('nodered') && this.integrationVersion === const_1.NO_VERSION) { try { const version = await this.getIntegrationVersion(); this.createIntegrationEvent(const_1.INTEGRATION_LOADED, version); } catch (e) { } } if (!this.tags && config.components.includes('tag')) { await this.updateTagList(); } // Prior to HA 0.111.0 state didn't exist if (config.state === undefined || config.state === 'RUNNING') { __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_onHomeAssistantRunning).call(this); } } async updateTagList() { var _a; try { this.tags = await this.send({ type: 'tag/list', }); } catch (e) { debug(`Error fetching tag list: ${e}`); } return (_a = this.tags) !== null && _a !== void 0 ? _a : []; } getIntegrationVersion() { return this.send({ type: 'nodered/version', }); } createIntegrationEvent(type, version) { __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_integrationEvent).call(this, { data: { type, version }, }); } onClientOpen() { this.onStatesLoadedAndRunning(); this.integrationVersion = const_1.NO_VERSION; this.isHomeAssistantRunning = false; this.connectionState = ClientState.Connected; if (__classPrivateFieldGet(this, _Websocket_config, "f").heartbeatInterval) { __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_stopAssignedHeartbeat).call(this); __classPrivateFieldSet(this, _Websocket_stopHeartbeat, (0, heartbeat_1.startHeartbeat)(this.client, __classPrivateFieldGet(this, _Websocket_config, "f").heartbeatInterval, __classPrivateFieldGet(this, _Websocket_config, "f").host), "f"); } __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.Open); } onClientClose() { debug('events connection closed, cleaning up connection'); this.resetClient(); } onClientError(data) { debug('events connection error, cleaning up connection'); debug(data); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.Error, data); this.resetClient(); } onClientConnecting() { this.connectionState = ClientState.Connecting; } close() { var _a; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_stopAssignedHeartbeat).call(this); (_a = this === null || this === void 0 ? void 0 : this.client) === null || _a === void 0 ? void 0 : _a.close(); } resetClient() { __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_stopAssignedHeartbeat).call(this); this.integrationVersion = const_1.NO_VERSION; this.isHomeAssistantRunning = false; __classPrivateFieldSet(this, _Websocket_servicesLoaded, false, "f"); __classPrivateFieldSet(this, _Websocket_statesLoaded, false, "f"); __classPrivateFieldSet(this, _Websocket_isAreaRegistryLoaded, false, "f"); __classPrivateFieldSet(this, _Websocket_isDeviceRegistryLoaded, false, "f"); __classPrivateFieldSet(this, _Websocket_isEntityRegistryLoaded, false, "f"); __classPrivateFieldSet(this, _Websocket_isFloorRegistryLoaded, false, "f"); __classPrivateFieldSet(this, _Websocket_isLabelRegistryLoaded, false, "f"); this.connectionState = ClientState.Disconnected; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.Close); } getAreas() { return (0, lodash_1.cloneDeep)(this.areas); } getArea(areaId) { return (0, lodash_1.cloneDeep)(this.areas.find((area) => area.area_id === areaId)); } getDevices() { return (0, lodash_1.cloneDeep)(this.devices); } getDevice(deviceId) { return (0, lodash_1.cloneDeep)(this.devices.find((device) => device.id === deviceId)); } async getDeviceActions(deviceId) { if (!this.isConnected || !deviceId) return []; const results = await this.send({ type: 'device_automation/action/list', device_id: deviceId, }).catch((e) => { throw e; }); return results; } async getDeviceActionCapabilities(action) { if (!this.isConnected || !action) return []; const results = await this.send({ type: 'device_automation/action/capabilities', action, }).catch((e) => { throw e; }); return results.extra_fields; } async getDeviceTriggers(deviceId) { if (!this.isConnected || !deviceId) return []; const results = await this.send({ type: 'device_automation/trigger/list', device_id: deviceId, }).catch((e) => { throw e; }); return results; } async getDeviceTriggerCapabilities(trigger) { if (!this.isConnected || !trigger) return []; const results = await this.send({ type: 'device_automation/trigger/capabilities', trigger, }).catch((e) => { throw e; }); return results.extra_fields; } getEntities() { return (0, lodash_1.cloneDeep)(this.entities); } getEntity(entityId) { return (0, lodash_1.cloneDeep)(this.entities.get(entityId)); } getFloors() { return (0, lodash_1.cloneDeep)(this.floors); } getFloor(floorId) { return (0, lodash_1.cloneDeep)(this.floors.find((floor) => floor.floor_id === floorId)); } getLabels() { return (0, lodash_1.cloneDeep)(this.labels); } getLabel(labelId) { return (0, lodash_1.cloneDeep)(this.labels.find((label) => label.label_id === labelId)); } getStates() { return (0, lodash_1.cloneDeep)(this.states); } getState(entityId) { return (0, lodash_1.cloneDeep)(this.states[entityId]); } getServices() { return (0, lodash_1.cloneDeep)(this.services); } getTag(tagId) { var _a; return (0, lodash_1.cloneDeep)((_a = this.tags) === null || _a === void 0 ? void 0 : _a.find((tag) => tag.id === tagId)); } async getTranslations(category, language) { if (!this.isConnected || !category) return []; const results = await this.send({ type: 'frontend/get_translations', language, category, }); return results.resources; } callService(domain, service, data, target) { var _a, _b; const services = this.getServices(); const returnResponse = (0, createSocket_1.atLeastHaVersion)(this.client.haVersion, 2023, 12) ? !!((_b = (_a = services[domain]) === null || _a === void 0 ? void 0 : _a[service]) === null || _b === void 0 ? void 0 : _b.response) : undefined; const serviceCall = { type: 'call_service', domain, service, service_data: data, target, return_response: returnResponse, }; return this.send(serviceCall); } send(data) { var _a; if (!this.isConnected) { throw new Error('Client is not connected'); } debug(`Send: ${JSON.stringify(data)}`); return (_a = this.client) === null || _a === void 0 ? void 0 : _a.sendMessagePromise(data); } } _Websocket_config = new WeakMap(), _Websocket_eventBus = new WeakMap(), _Websocket_servicesLoaded = new WeakMap(), _Websocket_statesLoaded = new WeakMap(), _Websocket_stopHeartbeat = new WeakMap(), _Websocket_subscribedEvents = new WeakMap(), _Websocket_unsubCallback = new WeakMap(), _Websocket_isAreaRegistryLoaded = new WeakMap(), _Websocket_isDeviceRegistryLoaded = new WeakMap(), _Websocket_isEntityRegistryLoaded = new WeakMap(), _Websocket_isFloorRegistryLoaded = new WeakMap(), _Websocket_isLabelRegistryLoaded = new WeakMap(), _Websocket_isAllRegistriesLoaded = new WeakMap(), _Websocket_instances = new WeakSet(), _Websocket_emitEvent = function _Websocket_emitEvent(event, data) { return __classPrivateFieldGet(this, _Websocket_eventBus, "f").emit(event, data); }, _Websocket_checkHomeAssistantVersion = function _Websocket_checkHomeAssistantVersion() { const [major, minor, patch] = const_1.HA_MIN_VERSION.split('.').map(Number); if (!(0, createSocket_1.atLeastHaVersion)(this.client.haVersion, major, minor, patch)) { this.connectionState = ClientState.Error; this.client.close(); throw new Error(globals_1.RED._('home-assistant.error.ha_version_not_supported', { version: this.client.haVersion, min_version: const_1.HA_MIN_VERSION, })); } }, _Websocket_checkUserType = async function _Websocket_checkUserType() { const user = await this.getUser(); if (user.is_admin === false) { this.connectionState = ClientState.Error; this.client.close(); throw new Error(globals_1.RED._('home-assistant.error.user_not_admin')); } }, _Websocket_clientEvents = function _Websocket_clientEvents() { // Client events this.client.addEventListener('ready', this.onClientOpen.bind(this)); this.client.addEventListener('disconnected', this.onClientClose.bind(this)); this.client.addEventListener('reconnect-error', this.onClientError.bind(this)); }, _Websocket_haEvents = async function _Websocket_haEvents() { // Home Assistant Events await this.client.subscribeEvents((evt) => __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_integrationEvent).call(this, evt), const_1.HA_EVENT_INTEGRATION); (0, home_assistant_js_websocket_1.subscribeConfig)(this.client, (config) => this.onClientConfigUpdate(config)); (0, home_assistant_js_websocket_1.subscribeEntities)(this.client, this.onClientStates.bind(this)); (0, home_assistant_js_websocket_1.subscribeServices)(this.client, this.onClientServices.bind(this)); (0, collections_1.subscribeAreaRegistry)(this.client, (areas) => { __classPrivateFieldSet(this, _Websocket_isAreaRegistryLoaded, true, "f"); this.areas = areas; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkIfAllRegistriesLoaded).call(this); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, _1.HaEvent.AreaRegistryUpdated, areas); }); (0, collections_1.subscribeDeviceRegistry)(this.client, (devices) => { __classPrivateFieldSet(this, _Websocket_isDeviceRegistryLoaded, true, "f"); this.devices = devices; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkIfAllRegistriesLoaded).call(this); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, _1.HaEvent.DeviceRegistryUpdated, devices); }); (0, collections_1.subscribeEntityRegistry)(this.client, (entities) => { __classPrivateFieldSet(this, _Websocket_isEntityRegistryLoaded, true, "f"); entities.forEach((entity) => this.entities.set(entity.entity_id, entity)); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkIfAllRegistriesLoaded).call(this); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, _1.HaEvent.EntityRegistryUpdated, entities); }); (0, collections_1.subscribeFloorRegistry)(this.client, (floors) => { __classPrivateFieldSet(this, _Websocket_isFloorRegistryLoaded, true, "f"); this.floors = floors; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkIfAllRegistriesLoaded).call(this); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, _1.HaEvent.FloorRegistryUpdated, floors); }); (0, collections_1.subscribeLabelRegistry)(this.client, (labels) => { __classPrivateFieldSet(this, _Websocket_isLabelRegistryLoaded, true, "f"); this.labels = labels; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkIfAllRegistriesLoaded).call(this); __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, _1.HaEvent.LabelRegistryUpdated, labels); }); }, _Websocket_checkIfAllRegistriesLoaded = function _Websocket_checkIfAllRegistriesLoaded() { if (!__classPrivateFieldGet(this, _Websocket_isAllRegistriesLoaded, "f") && __classPrivateFieldGet(this, _Websocket_isAreaRegistryLoaded, "f") && __classPrivateFieldGet(this, _Websocket_isDeviceRegistryLoaded, "f") && __classPrivateFieldGet(this, _Websocket_isEntityRegistryLoaded, "f") && __classPrivateFieldGet(this, _Websocket_isFloorRegistryLoaded, "f") && __classPrivateFieldGet(this, _Websocket_isLabelRegistryLoaded, "f") && this.isStatesLoaded && __classPrivateFieldGet(this, _Websocket_servicesLoaded, "f") && this.isHomeAssistantRunning) { __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.RegistriesLoaded); __classPrivateFieldSet(this, _Websocket_isAllRegistriesLoaded, true, "f"); } }, _Websocket_onHomeAssistantRunning = function _Websocket_onHomeAssistantRunning() { if (!this.isHomeAssistantRunning) { this.isHomeAssistantRunning = true; __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, ClientEvent.Running); if (this.integrationVersion === const_1.NO_VERSION) { this.createIntegrationEvent(const_1.INTEGRATION_NOT_LOADED); } __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_checkIfAllRegistriesLoaded).call(this); } }, _Websocket_integrationEvent = function _Websocket_integrationEvent(evt) { var _a, _b; const oldVersion = this.integrationVersion; switch ((_a = evt === null || evt === void 0 ? void 0 : evt.data) === null || _a === void 0 ? void 0 : _a.type) { case const_1.INTEGRATION_LOADED: this.integrationVersion = evt.data.version; break; case const_1.INTEGRATION_UNLOADED: this.integrationVersion = const_1.NO_VERSION; break; case const_1.INTEGRATION_NOT_LOADED: __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, const_1.INTEGRATION_EVENT, evt.data.type); return; } if (oldVersion !== this.integrationVersion) { __classPrivateFieldGet(this, _Websocket_instances, "m", _Websocket_emitEvent).call(this, const_1.INTEGRATION_EVENT, (_b = evt === null || evt === void 0 ? void 0 : evt.data) === null || _b === void 0 ? void 0 : _b.type); } }, _Websocket_stopAssignedHeartbeat = function _Websocket_stopAssignedHeartbeat() { if (typeof __classPrivateFieldGet(this, _Websocket_stopHeartbeat, "f") === 'function') { const stopHeartbeat = __classPrivateFieldGet(this, _Websocket_stopHeartbeat, "f"); __classPrivateFieldSet(this, _Websocket_stopHeartbeat, undefined, "f"); stopHeartbeat(); } }; exports.default = Websocket;