UNPKG

freeathome-local-api-client

Version:

A client library for the BUSCH-JAEGER free@home local API implemented in TypeScript

2 lines 13.6 kB
"use strict";var U=Object.defineProperty;var ue=Object.getOwnPropertyDescriptor;var ge=Object.getOwnPropertyNames;var ye=Object.prototype.hasOwnProperty;var me=(n,s)=>{for(var e in s)U(n,e,{get:s[e],enumerable:!0})},le=(n,s,e,p)=>{if(s&&typeof s=="object"||typeof s=="function")for(let o of ge(s))!ye.call(n,o)&&o!==e&&U(n,o,{get:()=>s[o],enumerable:!(p=ue(s,o))||p.enumerable});return n};var fe=n=>le(U({},"__esModule",{value:!0}),n);var He={};me(He,{SystemAccessPoint:()=>N,VirtualDeviceType:()=>se,isChannel:()=>ae,isConfiguration:()=>$,isDevice:()=>pe,isDeviceList:()=>K,isDeviceResponse:()=>T,isGetDataPointResponse:()=>B,isSetDataPointResponse:()=>F,isVirtualDevice:()=>ne,isVirtualDeviceResponse:()=>G,isWebSocketMessage:()=>L});module.exports=fe(He);var c=require("ts-interface-checker"),Se=(0,c.iface)([],{displayName:(0,c.opt)("string"),functionID:(0,c.opt)("string"),room:(0,c.opt)("string"),floor:(0,c.opt)("string"),inputs:(0,c.opt)((0,c.iface)([],{[c.indexKey]:"InOutPut"})),outputs:(0,c.opt)((0,c.iface)([],{[c.indexKey]:"InOutPut"})),parameters:(0,c.opt)((0,c.iface)([],{[c.indexKey]:"string"})),type:(0,c.opt)("string")}),b={Channel:Se};var O=require("ts-interface-checker"),he=(0,O.iface)([],{[O.indexKey]:"SysAP"}),j={Configuration:he};var u=require("ts-interface-checker"),de=(0,u.iface)([],{displayName:(0,u.opt)("string"),room:(0,u.opt)("string"),floor:(0,u.opt)("string"),interface:(0,u.opt)("string"),nativeId:(0,u.opt)("string"),channels:(0,u.opt)((0,u.iface)([],{[u.indexKey]:"Channel"})),parameters:(0,u.opt)((0,u.iface)([],{[u.indexKey]:"string"}))}),x={Device:de};var D=require("ts-interface-checker"),ve=(0,D.iface)([],{[D.indexKey]:(0,D.array)("string")}),H={DeviceList:ve};var A=require("ts-interface-checker"),be=(0,A.iface)([],{[A.indexKey]:(0,A.iface)([],{devices:"Devices"})}),V={DeviceResponse:be};var Q=require("ts-interface-checker"),ke=(0,Q.iface)([],{[Q.indexKey]:"Device"}),P={Devices:ke};var oe=require("ts-interface-checker"),Re=(0,oe.iface)([],{code:"string",detail:"string",title:"string"}),q={Error:Re};var I=require("ts-interface-checker"),xe=(0,I.iface)([],{[I.indexKey]:(0,I.iface)([],{name:"string",rooms:"Rooms"})}),z={Floors:xe};var k=require("ts-interface-checker"),De=(0,k.iface)([],{[k.indexKey]:(0,k.iface)([],{values:(0,k.array)("string")})}),X={GetDataPointResponse:De};var E=require("ts-interface-checker"),we=(0,E.iface)([],{value:(0,E.opt)("string"),pairingID:(0,E.opt)("number")}),R={InOutPut:we};var C=require("ts-interface-checker"),Te=(0,C.iface)([],{[C.indexKey]:(0,C.iface)([],{name:"string"})}),J={Rooms:Te};var m=require("ts-interface-checker"),Ae=(0,m.iface)([],{[m.indexKey]:(0,m.iface)([],{channels:(0,m.iface)([],{[m.indexKey]:(0,m.iface)([],{outputs:(0,m.iface)([],{[m.indexKey]:(0,m.iface)([],{value:"string",pairingID:"number"})})})})})}),_={ScenesTriggered:Ae};var w=require("ts-interface-checker"),Pe=(0,w.iface)([],{[w.indexKey]:(0,w.iface)([],{[w.indexKey]:"string"})}),Y={SetDataPointResponse:Pe};var M=require("ts-interface-checker"),Ie=(0,M.iface)([],{devices:"Devices",floorplan:(0,M.iface)([],{floors:"Floors"}),sysapName:"string",users:"Users",error:(0,M.opt)("Error")}),Z={SysAP:Ie};var h=require("ts-interface-checker"),Ee=(0,h.iface)([],{[h.indexKey]:(0,h.iface)([],{enabled:"boolean",flags:(0,h.array)("string"),grantedPermissions:(0,h.array)("string"),jid:"string",name:"string",requestedPermissions:(0,h.array)("string"),role:"string"})}),ee={Users:Ee};var y=require("ts-interface-checker"),Ce=(0,y.iface)([],{type:"VirtualDeviceType",properties:(0,y.opt)((0,y.iface)([],{ttl:(0,y.opt)("string"),displayname:(0,y.opt)("string"),flavor:(0,y.opt)("string"),capabilities:(0,y.opt)((0,y.array)("number"))}))}),Me=(0,y.enumtype)({BinarySensor:"BinarySensor",BlindActuator:"BlindActuator",SwitchingActuator:"SwitchingActuator",CeilingFanActuator:"CeilingFanActuator",RTC:"RTC",DimActuator:"DimActuator",EVCharging:"evcharging",WindowSensor:"WindowSensor",SimpleDoorlock:"simple_doorlock",ShutterActuator:"ShutterActuator",WeatherStation:"WeatherStation",WeatherTemperatureSensor:"Weather-TemperatureSensor",WeatherWindSensor:"Weather-WindSensor",WeatherBrightnessSensor:"Weather-BrightnessSensor",WeatherRainSensor:"Weather-RainSensor",WindowActuator:"WindowActuator",CODetector:"CODetector",FireDetector:"FireDetector",KNXSwitchSensor:"KNX-SwitchSensor",MediaPlayer:"MediaPlayer",EnergyBattery:"EnergyBattery",EnergyInverter:"EnergyInverter",EnergyMeter:"EnergyMeter",EnergyInverterBattery:"EnergyInverterBattery",EnergyInverterMeter:"EnergyInverterMeter",EnergyInverterMeterBattery:"EnergyInverterMeterBattery",EnergyMeterBattery:"EnergyMeterBattery",AirQualityCO2:"AirQualityCO2",AirQualityCO:"AirQualityCO",AirQualityFull:"AirQualityFull",AirQualityHumidity:"AirQualityHumidity",AirQualityNO2:"AirQualityNO2",AirQualityO3:"AirQualityO3",AirQualityPM10:"AirQualityPM10",AirQualityPM25:"AirQualityPM25",AirQualityPressure:"AirQualityPressure",AirQualityTemperature:"AirQualityTemperature",AirQualityVOC:"AirQualityVOC",EnergyMeterV2:"EnergyMeterv2",HomeApplianceLaundry:"HomeAppliance-Laundry",HVAC:"HVAC",SplitUnit:"SplitUnit"}),te={VirtualDevice:Ce,VirtualDeviceType:Me};var v=require("ts-interface-checker"),We=(0,v.iface)([],{[v.indexKey]:(0,v.iface)([],{devices:(0,v.iface)([],{[v.indexKey]:(0,v.iface)([],{serial:"string"})})})}),re={VirtualDeviceResponse:We};var g=require("ts-interface-checker"),Oe=(0,g.iface)([],{[g.indexKey]:(0,g.iface)([],{datapoints:(0,g.iface)([],{[g.indexKey]:"string"}),devices:"Devices",devicesAdded:(0,g.array)("string"),devicesRemoved:(0,g.array)("string"),scenesTriggered:"ScenesTriggered",parameters:(0,g.opt)((0,g.iface)([],{[g.indexKey]:"string"}))})}),ie={WebSocketMessage:Oe};var l=require("ts-interface-checker");var se=(t=>(t.BinarySensor="BinarySensor",t.BlindActuator="BlindActuator",t.SwitchingActuator="SwitchingActuator",t.CeilingFanActuator="CeilingFanActuator",t.RTC="RTC",t.DimActuator="DimActuator",t.EVCharging="evcharging",t.WindowSensor="WindowSensor",t.SimpleDoorlock="simple_doorlock",t.ShutterActuator="ShutterActuator",t.WeatherStation="WeatherStation",t.WeatherTemperatureSensor="Weather-TemperatureSensor",t.WeatherWindSensor="Weather-WindSensor",t.WeatherBrightnessSensor="Weather-BrightnessSensor",t.WeatherRainSensor="Weather-RainSensor",t.WindowActuator="WindowActuator",t.CODetector="CODetector",t.FireDetector="FireDetector",t.KNXSwitchSensor="KNX-SwitchSensor",t.MediaPlayer="MediaPlayer",t.EnergyBattery="EnergyBattery",t.EnergyInverter="EnergyInverter",t.EnergyMeter="EnergyMeter",t.EnergyInverterBattery="EnergyInverterBattery",t.EnergyInverterMeter="EnergyInverterMeter",t.EnergyInverterMeterBattery="EnergyInverterMeterBattery",t.EnergyMeterBattery="EnergyMeterBattery",t.AirQualityCO2="AirQualityCO2",t.AirQualityCO="AirQualityCO",t.AirQualityFull="AirQualityFull",t.AirQualityHumidity="AirQualityHumidity",t.AirQualityNO2="AirQualityNO2",t.AirQualityO3="AirQualityO3",t.AirQualityPM10="AirQualityPM10",t.AirQualityPM25="AirQualityPM25",t.AirQualityPressure="AirQualityPressure",t.AirQualityTemperature="AirQualityTemperature",t.AirQualityVOC="AirQualityVOC",t.EnergyMeterV2="EnergyMeterv2",t.HomeApplianceLaundry="HomeAppliance-Laundry",t.HVAC="HVAC",t.SplitUnit="SplitUnit",t))(se||{});var{Channel:Qe}=(0,l.createCheckers)(b,R),{Configuration:Le}=(0,l.createCheckers)(j,P,x,b,R,z,J,Z,ee,q),{Device:$e}=(0,l.createCheckers)(x,b,R),{DeviceList:Ke}=(0,l.createCheckers)(H),{DeviceResponse:Be}=(0,l.createCheckers)(V,P,x,b,R),{GetDataPointResponse:Fe}=(0,l.createCheckers)(X),{SetDataPointResponse:Ge}=(0,l.createCheckers)(Y),{VirtualDevice:Ne}=(0,l.createCheckers)(te),{VirtualDeviceResponse:Ue}=(0,l.createCheckers)(re),{WebSocketMessage:je}=(0,l.createCheckers)(ie,P,x,b,R,_);function f(n,s,e,p){if(p)try{return s.check(n),!0}catch(o){return e.error("Object validation failed!",o),!1}return s.test(n)}function L(n,s,e=!1){return f(n,je,s,e)}function $(n,s,e=!1){return f(n,Le,s,e)}function K(n,s,e=!1){return f(n,Ke,s,e)}function T(n,s,e=!1){return f(n,Be,s,e)}function B(n,s,e=!1){return f(n,Fe,s,e)}function F(n,s,e=!1){return f(n,Ge,s,e)}function ne(n,s,e=!1){return f(n,Ne,s,e)}function G(n,s,e=!1){return f(n,Ue,s,e)}function ae(n,s,e=!1){return f(n,Qe,s,e)}function pe(n,s,e=!1){return f(n,$e,s,e)}var ce=require("events"),d=require("rxjs"),W=require("ws");var N=class extends ce.EventEmitter{constructor(e,p,o,i=!0,a=!1,S=console,Ve){super();this.hostName=e;this.userName=p;this.password=o;this.tlsEnabled=i;this.verboseErrors=a;this.logger=S;this.scheduler=Ve;this.basicAuthKey=Buffer.from(`${p}:${o}`,"utf8").toString("base64")}hostName;userName;password;tlsEnabled;verboseErrors;logger;scheduler;basicAuthKey;webSocket;webSocketMessageSubject=new d.Subject;webSocketKeepaliveTimerReset$=new d.Subject;webSocketKeepaliveTimer$=this.webSocketKeepaliveTimerReset$.pipe((0,d.switchMap)(()=>(0,d.interval)(3e4,this.scheduler).pipe((0,d.takeUntil)(this.webSocketKeepaliveTimerReset$))));webSocketKeepaliveSubscription;connectWebSocket(e=!0){if(this.webSocket?.readyState===W.WebSocket.OPEN)throw new Error("Web socket is already connected");this.webSocket=this.createWebSocket(e),this.webSocketKeepaliveSubscription?.unsubscribe(),this.webSocketKeepaliveSubscription=void 0,this.webSocketKeepaliveSubscription=this.webSocketKeepaliveTimer$.subscribe(()=>{this.webSocket?.readyState===W.WebSocket.OPEN&&(this.logger.log("keepalive timer expired, sending ping message..."),this.webSocket.ping())}),this.webSocketKeepaliveTimerReset$.next()}async createVirtualDevice(e,p,o){let i=await this.fetchDataViaRest("PUT",`virtualdevice/${e}/${p}`,JSON.stringify(o));return this.processRestResponse(i,G)}createWebSocket(e){this.tlsEnabled&&!e&&this.logger.warn("TLS certificate verification is disabled! This poses a security risk, activating certificate verification is strictly recommended.");let p=`${this.tlsEnabled?"wss":"ws"}://${this.hostName}/fhapi/v1/api/ws`,o={rejectUnauthorized:this.tlsEnabled&&e,headers:{Authorization:`Basic ${this.basicAuthKey}`}},i=new W.WebSocket(p,o);return i.on("error",a=>{this.emit("websocket-error",a),this.logger.error("Error received",a)}),i.on("ping",a=>{this.emit("websocket-ping",a),this.logger.debug("Ping received",a.toString("ascii")),this.webSocketKeepaliveTimerReset$.next(),i.pong(a),this.logger.debug("Pong sent",a.toString("ascii"))}),i.on("pong",a=>{this.emit("websocket-pong",a),this.logger.debug("Pong received",a.toString("ascii"))}),i.on("unexpected-response",(a,S)=>{this.emit("websocket-unexpected-response",a,S),this.logger.error("Unexpected response received")}),i.on("upgrade",a=>{this.emit("websocket-upgrade",a),this.logger.debug("Upgrade request received")}),i.on("open",()=>{this.emit("websocket-open"),this.logger.log("Connection opened")}),i.on("close",(a,S)=>{this.emit("websocket-close",a,S),this.logger.log("Connection closed"),this.webSocketKeepaliveSubscription?.unsubscribe(),this.webSocketKeepaliveSubscription=void 0}),i.on("message",(a,S)=>{this.emit("websocket-message",a,S),this.webSocketKeepaliveTimerReset$.next(),this.processWebSocketMessage(a,S)}),i}disconnectWebSocket(e=!1){if(!this.webSocket||this.webSocket.readyState===W.WebSocket.CLOSED)throw new Error("Web socket is not open");e?this.webSocket.terminate():this.webSocket.close()}async getConfiguration(){let e=await this.fetchDataViaRest("GET","configuration");return this.processRestResponse(e,$)}async getDeviceList(){let e=await this.fetchDataViaRest("GET","devicelist");return this.processRestResponse(e,K)}async getDevice(e,p){let o=await this.fetchDataViaRest("GET",`device/${e}/${p}`);return this.processRestResponse(o,T)}async getDatapoint(e,p,o,i){let a=await this.fetchDataViaRest("GET",`datapoint/${e}/${p}.${o}.${i}`);return this.processRestResponse(a,B)}getWebSocketMessages(){return this.webSocketMessageSubject.asObservable()}async setDatapoint(e,p,o,i,a){let S=await this.fetchDataViaRest("PUT",`datapoint/${e}/${p}.${o}.${i}`,a);return this.processRestResponse(S,F)}async triggerProxyDevice(e,p,o,i){let a=await this.fetchDataViaRest("GET",`proxydevice/${e}/${p}/${o}/action/${i}`);return this.processRestResponse(a,T)}async setProxyDeviceValue(e,p,o,i){let a=await this.fetchDataViaRest("PUT",`proxydevice/${e}/${p}/${o}/value/${i}`);return this.processRestResponse(a,T)}async fetchDataViaRest(e,p,o){let i=`${this.tlsEnabled?"https":"http"}://${this.hostName}/fhapi/v1/api/rest/${p}`,a={method:e,headers:{Authorization:`Basic ${this.basicAuthKey}`},body:o};return fetch(i,a)}async processRestResponse(e,p){let o,i;switch(e.status){case 200:if(o=await e.json(),!p(o,this.logger,this.verboseErrors))throw i="Received message has an unexpected type!",this.logger.error(i,o),new Error(i);return o;case 401:throw i="Authentication information is missing or invalid.",this.logger.error(i),new Error(i);case 502:throw i=await e.text(),this.logger.error(i),new Error(i);default:throw i=`Received HTTP ${e.status} status code unexpectedly: ${await e.text()}`,this.logger.error(i),new Error(i)}}processWebSocketMessage(e,p){if(p){this.logger.warn("Binary message received. Binary messages are not processed.");return}this.logger.debug("Message received");let o=e.toString(),i=JSON.parse(o);if(L(i,this.logger,this.verboseErrors)){this.webSocketMessageSubject.next(i);return}this.logger.error("Received message has an unexpected type!",o)}};0&&(module.exports={SystemAccessPoint,VirtualDeviceType,isChannel,isConfiguration,isDevice,isDeviceList,isDeviceResponse,isGetDataPointResponse,isSetDataPointResponse,isVirtualDevice,isVirtualDeviceResponse,isWebSocketMessage}); //# sourceMappingURL=index.js.map