node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
2 lines (1 loc) • 4.03 kB
JavaScript
"use strict";var T=Object.create;var h=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty;var I=(a,t)=>{for(var e in t)h(a,e,{get:t[e],enumerable:!0})},g=(a,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of w(t))!P.call(a,r)&&r!==e&&h(a,r,{get:()=>t[r],enumerable:!(i=A(t,r))||i.enumerable});return a};var y=(a,t,e)=>(e=a!=null?T(R(a)):{},g(t||!a||!a.__esModule?h(e,"default",{value:a,enumerable:!0}):e,a)),N=a=>g(h({},"__esModule",{value:!0}),a);var F={};I(F,{default:()=>k});module.exports=N(F);var E=require("lodash"),v=y(require("selectn")),f=require("../../common/const"),b=y(require("../../common/controllers/InputOutputController")),H=y(require("../../common/controllers/SendSplitMixin")),C=require("../../const"),p=require("./const"),S=require("./helpers"),m=require("./operators");const D=(0,H.default)(b.default);class k extends D{#o;#t;#i;#e;#s;constructor(t){super(t),this.#o=t.comparatorService,this.#t=t.homeAssistant}async onInput({message:t,parsedMessage:e,send:i,done:r}){let u=!1;const s=await this.#a(e.rules.value,t);let o=["ha-get-entities.status.number_of_results",{count:s.length}],n=[];switch(e.outputType.value){case p.OutputType.Count:n=s.length;break;case p.OutputType.Split:if(s.length===0){u=!0;break}this.status.setSuccess(o),this.sendSplit(t,s,i),r();return;case p.OutputType.Random:{if(s.length===0){u=!0;break}const c=Number(e.outputResultsCount.value)||1,l=s.length<=c?s.length:c;n=(0,E.shuffle)(s).slice(0,l),c===1?(n=n[0],o=["ha-get-entities.status.number_of_random_resuls",{count:1}]):o=["ha-get-entities.status.number_of_random_resuls",{count:Array.isArray(n)?n.length:0}];break}case p.OutputType.Array:default:s.length===0&&!e.outputEmptyResults.value&&(u=!0),n=s;break}if(u){this.status.setFailed("ha-get-entities.status.no_results"),r();return}this.status.setSuccess(o),this.contextService.set(n,e.outputLocationType.value,e.outputLocation.value,t),i(t),r()}async#a(t,e){const i=Date.now(),r=[],u=this.#t.websocket.getStates(),s=(0,S.sortConditions)(t),o=Object.keys(u);for(let n=0;n<o.length;n++){const c=o[n],l=u[c];this.#d(),l?.last_changed&&(l.timeSinceChangedMs=i-new Date(l.last_changed).getTime());const d=this.#t.websocket.getEntity(l.entity_id);await this.#u(s,l,d,e)&&l&&r.push(l)}return r}async#u(t,e,i,r){for(let u=0;u<t.length;u++){const s=t[u];if(s.condition===f.PropertySelectorType.State||s.condition===void 0){const o=(0,v.default)(s.property,e),n=await this.#o.getComparatorResult(s.logic,s.value,o,s.valueType,{message:r,entity:e});if(s.logic!==C.TypedInputTypes.JSONata&&o===void 0||!n)return!1}else if(s.condition===f.PropertySelectorType.Label){if(!i||!await this.#l(s,i,e,r))return!1}else{const o=this.#c(s.condition,s.property,i);if(!o||!(0,m.simpleComparison)(s.logic,o,await this.typedInputService.getValue(s.value,s.valueType,{message:r,entity:e})))return!1}}return!0}async#l(t,e,i,r){const u=await this.typedInputService.getValue(t.value,t.valueType,{message:r,entity:i}),s=c=>{if(!c)return!1;for(const l of c){const d=this.#t.websocket.getLabel(l);if(!d)continue;if((0,m.simpleComparison)(t.logic,d[t.property],u))return!0}return!1};if(s(e.labels))return!0;const o=this.#r(e);if(s(o?.labels))return!0;const n=this.#n(e);return!!s(n?.labels)}#c(t,e,i){if(i)switch(t){case f.PropertySelectorType.Device:return this.#r(i)?.[e];case f.PropertySelectorType.Area:return this.#n(i)?.[e];case f.PropertySelectorType.Floor:return this.#f(i)?.[e];default:return}}#r(t){return!this.#i&&t.device_id&&(this.#i=this.#t.websocket.getDevice(t.device_id)),this.#i}#n(t){if(this.#e)return this.#e;if(t.area_id&&(this.#e=this.#t.websocket.getArea(t.area_id)),!this.#e&&t.device_id){const e=this.#r(t);e?.area_id&&(this.#e=this.#t.websocket.getArea(e.area_id))}return this.#e}#f(t){if(this.#s)return this.#s;const e=this.#n(t);return e?.floor_id&&(this.#s=this.#t.websocket.getFloor(e.floor_id)),this.#s}#d(){this.#i=void 0,this.#e=void 0,this.#s=void 0}}