UNPKG

freeathome-local-api-client

Version:

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

2 lines 12.4 kB
import{iface as R,indexKey as T,opt as m}from"ts-interface-checker";var me=R([],{displayName:m("string"),functionID:m("string"),room:m("string"),floor:m("string"),inputs:m(R([],{[T]:"InOutPut"})),outputs:m(R([],{[T]:"InOutPut"})),parameters:m(R([],{[T]:"string"})),type:m("string")}),l={Channel:me};import{iface as le,indexKey as fe}from"ts-interface-checker";var Se=le([],{[fe]:"SysAP"}),A={Configuration:Se};import{iface as P,indexKey as Y,opt as f}from"ts-interface-checker";var he=P([],{displayName:f("string"),room:f("string"),floor:f("string"),interface:f("string"),nativeId:f("string"),channels:f(P([],{[Y]:"Channel"})),parameters:f(P([],{[Y]:"string"}))}),h={Device:he};import{array as de,iface as ve,indexKey as be}from"ts-interface-checker";var ke=ve([],{[be]:de("string")}),I={DeviceList:ke};import{iface as Z,indexKey as Re}from"ts-interface-checker";var xe=Z([],{[Re]:Z([],{devices:"Devices"})}),E={DeviceResponse:xe};import{iface as De,indexKey as we}from"ts-interface-checker";var Te=De([],{[we]:"Device"}),v={Devices:Te};import{iface as Ae}from"ts-interface-checker";var Pe=Ae([],{code:"string",detail:"string",title:"string"}),C={Error:Pe};import{iface as ee,indexKey as Ie}from"ts-interface-checker";var Ee=ee([],{[Ie]:ee([],{name:"string",rooms:"Rooms"})}),M={Floors:Ee};import{array as Ce,iface as te,indexKey as Me}from"ts-interface-checker";var We=te([],{[Me]:te([],{values:Ce("string")})}),W={GetDataPointResponse:We};import{iface as Oe,opt as re}from"ts-interface-checker";var Qe=Oe([],{value:re("string"),pairingID:re("number")}),S={InOutPut:Qe};import{iface as ie,indexKey as Le}from"ts-interface-checker";var $e=ie([],{[Le]:ie([],{name:"string"})}),O={Rooms:$e};import{iface as d,indexKey as Q}from"ts-interface-checker";var Ke=d([],{[Q]:d([],{channels:d([],{[Q]:d([],{outputs:d([],{[Q]:d([],{value:"string",pairingID:"number"})})})})})}),L={ScenesTriggered:Ke};import{iface as se,indexKey as oe}from"ts-interface-checker";var Be=se([],{[oe]:se([],{[oe]:"string"})}),$={SetDataPointResponse:Be};import{iface as ne,opt as Fe}from"ts-interface-checker";var Ge=ne([],{devices:"Devices",floorplan:ne([],{floors:"Floors"}),sysapName:"string",users:"Users",error:Fe("Error")}),K={SysAP:Ge};import{array as B,iface as ae,indexKey as Ne}from"ts-interface-checker";var Ue=ae([],{[Ne]:ae([],{enabled:"boolean",flags:B("string"),grantedPermissions:B("string"),jid:"string",name:"string",requestedPermissions:B("string"),role:"string"})}),F={Users:Ue};import{array as je,enumtype as He,iface as pe,opt as b}from"ts-interface-checker";var Ve=pe([],{type:"VirtualDeviceType",properties:b(pe([],{ttl:b("string"),displayname:b("string"),flavor:b("string"),capabilities:b(je("number"))}))}),qe=He({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"}),G={VirtualDevice:Ve,VirtualDeviceType:qe};import{iface as x,indexKey as ce}from"ts-interface-checker";var ze=x([],{[ce]:x([],{devices:x([],{[ce]:x([],{serial:"string"})})})}),N={VirtualDeviceResponse:ze};import{array as ue,iface as D,indexKey as U,opt as Xe}from"ts-interface-checker";var Je=D([],{[U]:D([],{datapoints:D([],{[U]:"string"}),devices:"Devices",devicesAdded:ue("string"),devicesRemoved:ue("string"),scenesTriggered:"ScenesTriggered",parameters:Xe(D([],{[U]:"string"}))})}),j={WebSocketMessage:Je};import{createCheckers as u}from"ts-interface-checker";var ge=(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))(ge||{});var{Channel:_e}=u(l,S),{Configuration:Ye}=u(A,v,h,l,S,M,O,K,F,C),{Device:Ze}=u(h,l,S),{DeviceList:et}=u(I),{DeviceResponse:tt}=u(E,v,h,l,S),{GetDataPointResponse:rt}=u(W),{SetDataPointResponse:it}=u($),{VirtualDevice:st}=u(G),{VirtualDeviceResponse:ot}=u(N),{WebSocketMessage:nt}=u(j,v,h,l,S,L);function g(a,p,e,c){if(c)try{return p.check(a),!0}catch(n){return e.error("Object validation failed!",n),!1}return p.test(a)}function H(a,p,e=!1){return g(a,nt,p,e)}function V(a,p,e=!1){return g(a,Ye,p,e)}function q(a,p,e=!1){return g(a,et,p,e)}function k(a,p,e=!1){return g(a,tt,p,e)}function z(a,p,e=!1){return g(a,rt,p,e)}function X(a,p,e=!1){return g(a,it,p,e)}function at(a,p,e=!1){return g(a,st,p,e)}function J(a,p,e=!1){return g(a,ot,p,e)}function pt(a,p,e=!1){return g(a,_e,p,e)}function ct(a,p,e=!1){return g(a,Ze,p,e)}import{EventEmitter as ut}from"events";import{interval as gt,Subject as ye,switchMap as yt,takeUntil as mt}from"rxjs";import{WebSocket as w}from"ws";var _=class extends ut{constructor(e,c,n,s=!0,o=!1,y=console,lt){super();this.hostName=e;this.userName=c;this.password=n;this.tlsEnabled=s;this.verboseErrors=o;this.logger=y;this.scheduler=lt;this.basicAuthKey=Buffer.from(`${c}:${n}`,"utf8").toString("base64")}hostName;userName;password;tlsEnabled;verboseErrors;logger;scheduler;basicAuthKey;webSocket;webSocketMessageSubject=new ye;webSocketKeepaliveTimerReset$=new ye;webSocketKeepaliveTimer$=this.webSocketKeepaliveTimerReset$.pipe(yt(()=>gt(3e4,this.scheduler).pipe(mt(this.webSocketKeepaliveTimerReset$))));webSocketKeepaliveSubscription;connectWebSocket(e=!0){if(this.webSocket?.readyState===w.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.OPEN&&(this.logger.log("keepalive timer expired, sending ping message..."),this.webSocket.ping())}),this.webSocketKeepaliveTimerReset$.next()}async createVirtualDevice(e,c,n){let s=await this.fetchDataViaRest("PUT",`virtualdevice/${e}/${c}`,JSON.stringify(n));return this.processRestResponse(s,J)}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 c=`${this.tlsEnabled?"wss":"ws"}://${this.hostName}/fhapi/v1/api/ws`,n={rejectUnauthorized:this.tlsEnabled&&e,headers:{Authorization:`Basic ${this.basicAuthKey}`}},s=new w(c,n);return s.on("error",o=>{this.emit("websocket-error",o),this.logger.error("Error received",o)}),s.on("ping",o=>{this.emit("websocket-ping",o),this.logger.debug("Ping received",o.toString("ascii")),this.webSocketKeepaliveTimerReset$.next(),s.pong(o),this.logger.debug("Pong sent",o.toString("ascii"))}),s.on("pong",o=>{this.emit("websocket-pong",o),this.logger.debug("Pong received",o.toString("ascii"))}),s.on("unexpected-response",(o,y)=>{this.emit("websocket-unexpected-response",o,y),this.logger.error("Unexpected response received")}),s.on("upgrade",o=>{this.emit("websocket-upgrade",o),this.logger.debug("Upgrade request received")}),s.on("open",()=>{this.emit("websocket-open"),this.logger.log("Connection opened")}),s.on("close",(o,y)=>{this.emit("websocket-close",o,y),this.logger.log("Connection closed"),this.webSocketKeepaliveSubscription?.unsubscribe(),this.webSocketKeepaliveSubscription=void 0}),s.on("message",(o,y)=>{this.emit("websocket-message",o,y),this.webSocketKeepaliveTimerReset$.next(),this.processWebSocketMessage(o,y)}),s}disconnectWebSocket(e=!1){if(!this.webSocket||this.webSocket.readyState===w.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,V)}async getDeviceList(){let e=await this.fetchDataViaRest("GET","devicelist");return this.processRestResponse(e,q)}async getDevice(e,c){let n=await this.fetchDataViaRest("GET",`device/${e}/${c}`);return this.processRestResponse(n,k)}async getDatapoint(e,c,n,s){let o=await this.fetchDataViaRest("GET",`datapoint/${e}/${c}.${n}.${s}`);return this.processRestResponse(o,z)}getWebSocketMessages(){return this.webSocketMessageSubject.asObservable()}async setDatapoint(e,c,n,s,o){let y=await this.fetchDataViaRest("PUT",`datapoint/${e}/${c}.${n}.${s}`,o);return this.processRestResponse(y,X)}async triggerProxyDevice(e,c,n,s){let o=await this.fetchDataViaRest("GET",`proxydevice/${e}/${c}/${n}/action/${s}`);return this.processRestResponse(o,k)}async setProxyDeviceValue(e,c,n,s){let o=await this.fetchDataViaRest("PUT",`proxydevice/${e}/${c}/${n}/value/${s}`);return this.processRestResponse(o,k)}async fetchDataViaRest(e,c,n){let s=`${this.tlsEnabled?"https":"http"}://${this.hostName}/fhapi/v1/api/rest/${c}`,o={method:e,headers:{Authorization:`Basic ${this.basicAuthKey}`},body:n};return fetch(s,o)}async processRestResponse(e,c){let n,s;switch(e.status){case 200:if(n=await e.json(),!c(n,this.logger,this.verboseErrors))throw s="Received message has an unexpected type!",this.logger.error(s,n),new Error(s);return n;case 401:throw s="Authentication information is missing or invalid.",this.logger.error(s),new Error(s);case 502:throw s=await e.text(),this.logger.error(s),new Error(s);default:throw s=`Received HTTP ${e.status} status code unexpectedly: ${await e.text()}`,this.logger.error(s),new Error(s)}}processWebSocketMessage(e,c){if(c){this.logger.warn("Binary message received. Binary messages are not processed.");return}this.logger.debug("Message received");let n=e.toString(),s=JSON.parse(n);if(H(s,this.logger,this.verboseErrors)){this.webSocketMessageSubject.next(s);return}this.logger.error("Received message has an unexpected type!",n)}};export{_ as SystemAccessPoint,ge as VirtualDeviceType,pt as isChannel,V as isConfiguration,ct as isDevice,q as isDeviceList,k as isDeviceResponse,z as isGetDataPointResponse,X as isSetDataPointResponse,at as isVirtualDevice,J as isVirtualDeviceResponse,H as isWebSocketMessage}; //# sourceMappingURL=index.mjs.map