node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
2 lines (1 loc) • 4.68 kB
JavaScript
"use strict";var I=Object.create;var m=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var x=(i,e)=>{for(var t in e)m(i,t,{get:e[t],enumerable:!0})},S=(i,e,t,u)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of O(e))!W.call(i,a)&&a!==t&&m(i,a,{get:()=>e[a],enumerable:!(u=b(e,a))||u.enumerable});return i};var d=(i,e,t)=>(t=i!=null?I(U(i)):{},S(e||!i||!i.__esModule?m(t,"default",{value:i,enumerable:!0}):t,i)),D=i=>S(m({},"__esModule",{value:!0}),i);var P={};x(P,{default:()=>N});module.exports=D(P);var f=d(require("joi")),y=require("lodash"),w=d(require("selectn")),r=require("../../common/const"),g=d(require("../../common/controllers/InputOutputController")),v=d(require("../../common/errors/InputError")),C=require("../../common/errors/inputErrorHandler"),p=require("../../common/services/InputService"),_=require("../../const"),E=require("../../globals"),T=require("../../helpers/mustache"),h=require("../../helpers/utils");const H=f.default.object({reset:f.default.any().required()}).unknown(!0);class N extends g.default{#e=!1;#a;#i;#n;#u;#t;#s;#o;#l=!1;constructor(e){super(e),this.#a=e.comparatorService,this.#i=e.clientEvents,this.#n=e.homeAssistant,this.#u=e.jsonataService,this.addOptionalInput("reset",H,this.#c.bind(this))}async#r(e){const{event:t}=(0,y.cloneDeep)(e);if(!this.#t||!this.#e||!this.#n.isConnected||!Object.entries(this.#t.entities).some(([c,n])=>n?.some(l=>(0,h.shouldIncludeEvent)(t.entity_id,l,c)))||!await this.#a.getComparatorResult(this.#t.comparator,this.#t.value,(0,w.default)(this.#t.property,t.new_state),this.#t.valueType,{message:this.#s,entity:t.new_state}))return;const{send:s,done:o}=this.#t;clearTimeout(this.#o),this.#e=!1,this.status.setSuccess("ha-wait-until.status.true"),t.new_state&&(t.new_state.timeSinceChangedMs=Date.now()-new Date(t.new_state.last_changed).getTime()),await this.setCustomOutputs(this.node.config.outputProperties,this.#s??{},{entity:t.new_state,config:this.node.config}),s([this.#s,null]),o()}async onInput({message:e,parsedMessage:t,send:u,done:a}){clearTimeout(this.#o);const s={entities:t.entities.value,property:t.property.value,comparator:t.comparator.value,value:t.value.value,valueType:t.valueType.value,timeout:t.timeout.value,timeoutUnits:t.timeoutUnits.value,checkCurrentState:t.checkCurrentState.value,send:u,done:a};t.entityId.source===p.DataSource.Message&&(this.#l||(this.#l=!0,this.node.warn(E.RED._("ha-wait-until.error.entity_id_deprecated")))),t.entities.source===p.DataSource.Config&&(s.entities[r.IdSelectorType.Entity]=t.entities.value[r.IdSelectorType.Entity].map(n=>(0,T.renderTemplate)(n,e,this.node.context(),this.#n.websocket.getStates())));let o=Number(s.timeout);if(t.timeout.source===p.DataSource.Config&&this.node.config.timeoutType===_.TypedInputTypes.JSONata&&(o=await this.#u.evaluate(t.timeout.value,{message:e}),s.timeout=o.toString()),isNaN(o)||o<0)throw new v.default(["ha-wait-until.error.invalid_timeout",{timeout:o}],"homassistant.error.error");if(this.#i.removeListeners(),t.entities.value[r.IdSelectorType.Substring].length===0&&t.entities.value[r.IdSelectorType.Regex].length===0)for(const n of t.entities.value[r.IdSelectorType.Entity]){const l=`ha_events:state_changed:${n?.trim()}`;this.#i.addListener(l,this.#r.bind(this))}else this.#i.addListener("ha_events:state_changed",this.#r.bind(this));this.#s=e,this.#e=!0;let c="ha-wait-until.status.waiting";if(o>0&&(c=(0,h.getWaitStatusText)(o,s.timeoutUnits),o=(0,h.getTimeInMilliseconds)(o,s.timeoutUnits),this.#o=(0,C.setTimeoutWithErrorHandling)(async()=>{let n;this.#h()&&(n=this.#n.websocket.getState(s.entities[r.IdSelectorType.Entity][0]),n&&(n.timeSinceChangedMs=Date.now()-new Date(n.last_changed).getTime())),await this.setCustomOutputs(this.node.config.outputProperties,e,{entity:n,config:this.node.config}),this.#e=!1,this.status.setFailed("ha-wait-until.status.timed_out"),u([null,e]),a()},o,{done:a,status:this.status})),this.status.setText(c),this.#t=s,s.checkCurrentState===!0&&this.#h()){const n=s.entities[r.IdSelectorType.Entity][0],l=this.#n.websocket.getState(n);if(!l)throw new v.default(["ha-wait-until.error.entity_not_found",{entityId:n}],"ha-wait-until.error.not_found");await this.#r({event:{entity_id:n,new_state:l}})}}onClose(e,t){this.#i.removeListeners(),clearTimeout(this.#o),t?.()}#c(){return clearTimeout(this.#o),this.#e=!1,this.status.setText("reset"),!0}#h(){return this.node.config.entities[r.IdSelectorType.Entity].length===1&&this.node.config.entities[r.IdSelectorType.Substring].length===0&&this.node.config.entities[r.IdSelectorType.Regex].length===0}}