node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
2 lines (1 loc) • 4.7 kB
JavaScript
"use strict";var C=Object.create;var r=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var v=Object.getPrototypeOf,l=Object.prototype.hasOwnProperty;var N=(n,e)=>{for(var t in e)r(n,t,{get:e[t],enumerable:!0})},c=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of m(e))!l.call(n,o)&&o!==t&&r(n,o,{get:()=>e[o],enumerable:!(i=u(e,o))||i.enumerable});return n};var p=(n,e,t)=>(t=n!=null?C(v(n)):{},c(e||!n||!n.__esModule?r(t,"default",{value:n,enumerable:!0}):t,n)),E=n=>c(r({},"__esModule",{value:!0}),n);var b={};N(b,{default:()=>h});module.exports=E(b);var f=require("compare-versions"),y=require("../../helpers/node"),a=require("../events/Events"),d=require("./helpers"),s=p(require("./Integration"));class h extends s.default{constructor(e){super(e),this.deviceConfigNode=e.deviceConfigNode,this.entityConfigNode=e.entityConfigNode}async init(){this.entityConfigNode.on(a.NodeEvent.Close,this.onEntityConfigNodeClose.bind(this)),this.deviceConfigNode?.on(a.NodeEvent.Close,this.onDeviceConfigNodeClose.bind(this)),super.init()}async onEntityConfigNodeClose(e,t){if(this.registered&&this.isIntegrationLoaded&&e)try{await this.unregister()}catch(i){t(i)}t()}async onDeviceConfigNodeClose(e,t){if(this.registered&&this.isIntegrationLoaded&&e)try{await this.#t()}catch(i){t(i)}t()}getDeviceInfo(){if(!this.deviceConfigNode)return;const e=this.deviceConfigNode.config;return{id:e.id,hw_version:e.hwVersion,name:e.name,manufacturer:e.manufacturer,model:e.model,sw_version:e.swVersion}}getStateData(e){if(!e)return{};let t={};if(this.entityConfigNode.config.resend&&e){const i=e.getLastPayload();i&&(t={...i})}return t}getDiscoveryPayload({config:e,remove:t,state:i}){const o=this.getDeviceInfo();return{...this.getStateData(i),type:s.MessageType.Discovery,server_id:this.entityConfigNode.config.server,node_id:this.entityConfigNode.id,config:e,component:this.entityConfigNode.config.entityType,remove:t,device_info:o}}getEntityPayload(e,t){return{type:s.MessageType.Entity,server_id:this.entityConfigNode.config.server,node_id:this.entityConfigNode.id,state:e,attributes:t}}async register(){if(!this.isIntegrationLoaded){this.entityConfigNode.error(this.notInstalledMessage),this.status.forEach(i=>i.setFailed("home-assistant.status.error"));return}if(this.isRegistered)return;const e=(0,d.createHaConfig)(this.entityConfigNode.config.haConfig),t=this.getDiscoveryPayload({config:e,state:this.state});this.debugToClient("register",t),this.entityConfigNode.debug(`Registering ${this.entityConfigNode.config.entityType} with HA`);try{await this.homeAssistant.websocket.send(t)}catch(i){this.status.forEach(g=>g.setFailed("home-assistant.status.error_registering"));const o=i instanceof Error?i.message:i;this.entityConfigNode.error(`Error registering entity. Error Message: ${o}`);return}this.saveHaConfigToContext(e),this.status.forEach(i=>i?.setSuccess("home-assistant.status.registered")),this.registered=!0}setStatus(e){this.status.push(e)}async updateStateAndAttributes(e,t){const i=this.getEntityPayload(e,t);try{await this.homeAssistant.websocket.send(i)}catch(o){this.entityConfigNode.error(`Error updating entity. Error Message: ${o}`)}if(this.entityConfigNode.config.resend){const o={state:e,attributes:t};this.state.setLastPayload(o)}return this.debugToClient("update state",i),i}async unregister(){this.entityConfigNode.debug(`Unregistering ${this.entityConfigNode.config.entityType} node from HA`);const e=this.entityConfigNode.integration.getDiscoveryPayload({remove:!0});this.debugToClient("unregister",e);try{await this.homeAssistant?.websocket.send(e)}catch(t){this.entityConfigNode.error(`Error unregistering entity. Error Message: ${t}`)}}#e(){return(0,f.compareVersions)(`${this.homeAssistant.websocket.integrationVersion}`,"1.1")>=0}async#t(){if(!(!this.deviceConfigNode||!this.#e())){this.deviceConfigNode.debug(`Removing device from Home Assistant: ${this.deviceConfigNode.config.name}`);try{await this.homeAssistant?.websocket.send({type:s.MessageType.RemoveDevice,node_id:this.deviceConfigNode.id})}catch(e){this.deviceConfigNode.error(`Error removing device. Error Message: ${e}`)}}}debugToClient(e,t){(0,y.debugToClient)(this.entityConfigNode,t,e)}getEntityConfigNode(){return this.entityConfigNode}getEntityHomeAssistantConfigValue(e){return(this.getHaConfigFromContext()??(0,d.createHaConfig)(this.entityConfigNode.config.haConfig))[e]}saveHaConfigToContext(e){const t=this.getHaConfigFromContext()??{};Object.keys(e).forEach(o=>e[o]===void 0&&delete e[o]);const i={...t,...e};this.entityConfigNode.context().set("haConfig",i)}getHaConfigFromContext(){return this.entityConfigNode.context().get("haConfig")}}