node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
2 lines (1 loc) • 3.93 kB
JavaScript
"use strict";var b=Object.create;var c=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var I=Object.getPrototypeOf,H=Object.prototype.hasOwnProperty;var x=(s,t)=>{for(var e in t)c(s,e,{get:t[e],enumerable:!0})},p=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of U(t))!H.call(s,i)&&i!==e&&c(s,i,{get:()=>t[i],enumerable:!(n=N(t,i))||n.enumerable});return s};var h=(s,t,e)=>(e=s!=null?b(I(s)):{},p(t||!s||!s.__esModule?c(e,"default",{value:s,enumerable:!0}):e,s)),O=s=>p(c({},"__esModule",{value:!0}),s);var A={};x(A,{default:()=>E});module.exports=O(A);var v=require("lodash"),y=h(require("../../common/controllers/ExposeAsMixin")),w=h(require("../../common/controllers/OutputController")),C=h(require("../../common/errors/ConfigError")),m=require("../../common/TransformState"),d=require("../../helpers/utils"),k=(e=>(e.Unknown="unknown",e.Unavailable="unavailable",e))(k||{});const D=(0,y.default)(w.default);class E extends D{#n;#t={};#e;constructor(t){super(t),this.#n=t.comparatorService,this.#e=t.transformState}async#i(){if(this.node.config.for==="")return 0;const t=await this.typedInputService.getValue(this.node.config.for,this.node.config.forType);if(isNaN(t)||t<0)throw new C.default(["server-state-changed.error.invalid_for",{for:t,type:this.node.config.forType}]);return Number(t)}#s(t){const e=t.event?.old_state?.state,n=t.event?.new_state?.state;return!(!Object.entries(this.node.config.entities).some(([o,a])=>a?.some(r=>(0,d.shouldIncludeEvent)(t.entity_id,r,o)))||this.node.config.ignorePrevStateNull&&!t.event.old_state||this.node.config.ignorePrevStateUnknown&&e==="unknown"||this.node.config.ignorePrevStateUnavailable&&e==="unavailable"||this.node.config.ignoreCurrentStateUnknown&&n==="unknown"||this.node.config.ignoreCurrentStateUnavailable&&n==="unavailable")}async onHaEventsStateChanged(t,e=!1){if(this.isEnabled===!1||!this.homeAssistant.isHomeAssistantRunning||!this.#s(t))return;const n=this.node.config,i=(0,v.cloneDeep)(t),o=i.entity_id,a=i.event.old_state,r=i.event.new_state;a&&this.node.config.stateType!==m.TransformType.String&&(a.original_state=a.state,a.state=this.#e.transform(this.node.config.stateType,a.state)),r&&this.node.config.stateType!==m.TransformType.String&&(r.original_state=r.state,r.state=this.#e.transform(this.node.config.stateType,r.state));const S=a?a.state:void 0,u=r?r.state:void 0;if(e===!1&&n.outputOnlyOnStateChange===!0&&S===u)return;const f=await this.#n.getComparatorResult(n.ifStateOperator,n.ifState,u,n.ifStateType,{entity:r??void 0,prevEntity:a??void 0});this.#t[o]=this.#t[o]||{active:!1};const l=await this.#i(),g=l>0;if(g){if(S===u||e||n.ifState&&f&&this.#t[o].active)return;n.ifState&&!f&&(this.#t[o].active=!1)}if(!g||n.ifState&&!f){await this.output(i,f);return}const _=(0,d.getWaitStatusText)(l,this.node.config.forUnits),T=(0,d.getTimeInMilliseconds)(l,this.node.config.forUnits);this.status.setText(_),clearTimeout(this.#t[o].timeoutId),this.#t[o]={active:!0,timeoutId:setTimeout(this.output.bind(this,i,f),T)}}async output(t,e){const n=this.node.config,i={};await this.setCustomOutputs(n.outputProperties,i,{config:n,entity:t.event.new_state,entityState:t.event.new_state?.state,eventData:t.event,prevEntity:t.event.old_state,triggerId:t.entity_id}),t.event.new_state&&(t.event.new_state.timeSinceChangedMs=Date.now()-new Date(t.event.new_state.last_changed).getTime());const o=`${t.event.new_state?.state}`;if(clearTimeout(this.#t[t.entity_id].timeoutId),(n.ifState||n.ifStateType==="habool")&&!e){this.status.setFailed(o),this.node.send([null,i]);return}this.status.setSuccess(o),this.node.send([i,null])}onDeploy(){const t=this.homeAssistant.websocket.getStates();this.onStatesLoaded(t)}onStatesLoaded(t){if(this.isEnabled)for(const e in t){const n={event_type:"state_changed",entity_id:e,event:{entity_id:e,old_state:t[e],new_state:t[e]}};this.onHaEventsStateChanged(n,!0)}}}