node-red-contrib-home-assistant-websocket
Version:
Node-RED integration with Home Assistant through websocket and REST API
2 lines (1 loc) • 2.84 kB
JavaScript
;var E=Object.create;var u=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var k=(r,t)=>{for(var e in t)u(r,e,{get:t[e],enumerable:!0})},h=(r,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of N(t))!C.call(r,o)&&o!==e&&u(r,o,{get:()=>t[o],enumerable:!(i=B(t,o))||i.enumerable});return r};var n=(r,t,e)=>(e=r!=null?E(x(r)):{},h(t||!r||!r.__esModule?u(e,"default",{value:r,enumerable:!0}):e,r)),_=r=>h(u({},"__esModule",{value:!0}),r);var H={};k(H,{default:()=>I});module.exports=_(H);var g=n(require("slugify")),b=n(require("../../common/controllers/InputOutputController")),v=n(require("../../common/errors/InvalidPropertyValueError")),w=n(require("../../common/errors/NoConnectionError")),P=require("../../common/services/InputService"),T=require("../../const"),S=n(require("../errors/BaseError")),d=n(require("../errors/HomeAssistantError")),f=n(require("../errors/InputError"));class I extends b.default{async onInput({parsedMessage:t,message:e,send:i,done:o}){if(!this.integration?.isConnected)throw new w.default;if(!this.integration.isIntegrationLoaded)throw new f.default("home-assistant.error.integration_not_loaded","home-assistant.error.error");let a=t.state.value,p=t.stateType.value;if(this.node.config.inputOverride==="block"?(a=this.node.config.state,p=this.node.config.stateType):t.state.source===P.DataSource.Message&&p!=="message"&&(p="str"),a=await this.typedInputService.getValue(a,p,{message:e}),a===void 0)throw new v.default("home-assistant.error.invalid_state","home-assistant.error.error");const O=this.#t(t);let y={};try{y=await O.reduce(async(s,l)=>{const m=await s,A=(0,g.default)(l.property,{replacement:"_",remove:/[^A-Za-z0-9-_~ ]/,lower:!0});return m[A]=await this.typedInputService.getValue(l.value,l.valueType,{message:e}),m},Promise.resolve({}))}catch(s){throw s instanceof S.default?s:new f.default(`Attribute: ${s}`)}let c;try{c=await this.integration?.updateStateAndAttributes(a,y),this.status.setSuccess(c?.state)}catch(s){throw(0,d.isHomeAssistantApiError)(s)?new d.default(s,"home-assistant.error.error"):new Error(`Error updating state and attributes. ${JSON.stringify(s)}`)}this.status.setSuccess(a),await this.setCustomOutputs(this.node.config.outputProperties,e,{config:this.node.config,data:c}),i(e),o()}#t(t){let e=[];if(t.attributes.source!=="message"||this.node.config.inputOverride==="block")e=this.node.config.attributes;else{if(this.node.config.inputOverride==="merge"){const i=Object.keys(t.attributes.value).map(o=>o.toLowerCase());this.node.config.attributes.forEach(o=>{i.includes(o.property.toLowerCase())||e.push(o)})}for(const[i,o]of Object.entries(t.attributes.value))e.push({property:i,value:o,valueType:T.TypedInputTypes.String})}return e}}