UNPKG

@ecoflow-api/rest-client

Version:

A rest client for the Ecoflow API for NodeJS

2 lines (1 loc) 16.5 kB
"use strict";var j=Object.defineProperty;var se=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var ie=Object.prototype.hasOwnProperty;var X=s=>{throw TypeError(s)};var ce=(s,r)=>{for(var e in r)j(s,e,{get:r[e],enumerable:!0})},me=(s,r,e,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of oe(r))!ie.call(s,n)&&n!==e&&j(s,n,{get:()=>r[n],enumerable:!(t=se(r,n))||t.enumerable});return s};var de=s=>me(j({},"__esModule",{value:!0}),s);var W=(s,r,e)=>r.has(s)||X("Cannot "+e);var R=(s,r,e)=>(W(s,r,"read from private field"),e?e.call(s):r.get(s)),p=(s,r,e)=>r.has(s)?X("Cannot add the same private member more than once"):r instanceof WeakSet?r.add(s):r.set(s,e),B=(s,r,e,t)=>(W(s,r,"write to private field"),t?t.call(s,e):r.set(s,e),e),a=(s,r,e)=>(W(s,r,"access private method"),e);var he={};ce(he,{RestClient:()=>V});module.exports=de(he);var M=require("crypto");function le(s,r,e){for(let t=0;t<r.length;t++)typeof r[t]=="object"?Object.assign(s,G(r[t],`${e}[${t}]`)):s[`${e}[${t}]`]=r[t]}function G(s,r=""){let e={};for(let[t,n]of Object.entries(s)){let d=Array.isArray(s)?`[${t}]`:t,A=r?`${r}.${d}`:d;typeof n=="object"&&n!==null?Array.isArray(n)?le(e,n,A):Object.assign(e,G(n,A)):e[A]=n}return e}var E,N,U,Y,O=class{constructor(r,e){p(this,U);p(this,E);p(this,N);B(this,E,r),B(this,N,e)}buildDataString(r){let e=G(r),t=[],n=Object.keys(e).sort();for(let d of n)t.push(`${d}=${e[d]}`);return t.join("&")}createSignature(r){let e=(0,M.createHmac)("sha256",R(this,N)),t=Date.now().toString(),n=(0,M.randomUUID)(),d=a(this,U,Y).call(this,this.buildDataString(r??{}),n,t),A=e.update(d).digest("hex");return{nonce:n,timestamp:t,signature:A,accessKey:R(this,E)}}};E=new WeakMap,N=new WeakMap,U=new WeakSet,Y=function(r,e,t){let n=`accessKey=${R(this,E)}&nonce=${e}&timestamp=${t}`;return r?`${r}&${n}`:n};var v=require("@ecoflow-api/schemas");var L,D,x,Z,ee,_=class{constructor(r){p(this,D);p(this,L);B(this,L,r)}async get(r){return a(this,D,x).call(this,r,"GET")}async post(r,e){return a(this,D,x).call(this,r,"POST",e)}async put(r,e){return a(this,D,x).call(this,r,"PUT",e)}};L=new WeakMap,D=new WeakSet,x=async function(r,e,t){let n=await fetch(r,a(this,D,Z).call(this,e,t)),d=await n.json();if(n.status!==200)throw new Error(`Request failed with status ${n.status}, ${JSON.stringify(d,null,2)}`);return d},Z=function(r,e){let t=R(this,L).createSignature(e),n={method:r,headers:a(this,D,ee).call(this,t)};return typeof e<"u"&&(n.body=JSON.stringify(e)),n},ee=function(r){return[["accessKey",r.accessKey],["timestamp",r.timestamp],["nonce",r.nonce],["sign",r.signature],["Content-Type","application/json;charset=UTF-8"]]};var b=require("@ecoflow-api/schemas");var S=class{constructor(r,e){this.restClient=r;this.sn=e}async sendCommand(r,e){return this.restClient.setCommandPlain(e.parse(r))}async getProperties(){let r=await this.restClient.getDevicePropertiesPlain(this.sn);return this.parseProperties(r.data)}};var w=require("@ecoflow-api/schemas");var I,F,k=class extends S{constructor(e,t){super(e,t);p(this,I);if(!(0,w.isSmartPlugSn)(t))throw new Error("Invalid serial number for smart plug device.")}parseProperties(e){return w.smartPlugQuotaAllSchema.parse(e)}async deleteTask(e){let t={sn:this.sn,cmdCode:"WN511_SOCKET_DELETE_TIME_TASK",params:{taskIndex:e}};return this.sendCommand(t,w.SmartPlugDeleteTimeTaskCommandSchema)}async setLedBrightness(e){let t={sn:this.sn,cmdCode:"WN511_SOCKET_SET_BRIGHTNESS_PACK",params:{brightness:e}};return this.sendCommand(t,w.SmartPlugIndicatorBrightnessCommandSchema)}async switchOn(){return a(this,I,F).call(this,1)}async switchOff(){return a(this,I,F).call(this,0)}};I=new WeakSet,F=async function(e){let t={sn:this.sn,cmdCode:"WN511_SOCKET_SET_PLUG_SWITCH_MESSAGE",params:{plugSwitch:e}};return this.sendCommand(t,w.smartPlugSwitchOnOffCommandSchema)};var H=class extends S{parseProperties(r){return r}};var g=require("@ecoflow-api/schemas"),Q=class extends S{constructor(r,e){if(super(r,e),!(0,g.isPowerStreamSerialNumber)(e))throw new Error("Invalid serial number for powerStream device.")}parseProperties(r){return g.powerStreamQuotaAllSchema.parse(r)}async setPowerSupplyPriority(r){let t={cmdCode:"WN511_SET_SUPPLY_PRIORITY_PACK",params:{supplyPriority:{powerSupply:0,battery:1}[r]},sn:this.sn};return this.sendCommand(t,g.powerSupplyPrioritySchema)}async setCustomLoadPower(r){let e={cmdCode:"WN511_SET_PERMANENT_WATTS_PACK",params:{permanentWatts:r},sn:this.sn};return this.sendCommand(e,g.customLoadPowerSettingsSchema)}async setLowerChargingLevel(r){let e={cmdCode:"WN511_SET_BAT_LOWER_PACK",params:{lowerLimit:r},sn:this.sn};return this.sendCommand(e,g.lowerChargingLevelSchema)}async setUpperChargingLevel(r){let e={cmdCode:"WN511_SET_BAT_UPPER_PACK",params:{upperLimit:r},sn:this.sn};return this.sendCommand(e,g.upperChargingLevelSchema)}async setLedBrightness(r){let e={sn:this.sn,cmdCode:"WN511_SET_BRIGHTNESS_PACK",params:{brightness:r}};return this.sendCommand(e,g.indicatorLightBrightnessSchema)}async deleteTask(r){let e={sn:this.sn,cmdCode:"WN511_DELETE_TIME_TASK",params:{taskIndex:r}};return this.sendCommand(e,g.powerStreamDeleteTaskSchema)}};var c=require("@ecoflow-api/schemas");var C,f,$=class extends S{constructor(e,t){super(e,t);p(this,C);if(!(0,c.isDelta2SerialNumber)(t))throw new Error("Invalid serial number for Delta2 device.")}parseProperties(e){return c.delta2QuotaAllSchema.parse(e)}async setCarStandByDuration(e){let t={...a(this,C,f).call(this,5),operateType:"carStandby",params:{standbyMins:e}};return this.sendCommand(t,c.carStandBySchema)}async setSilentMode(e){let t={...a(this,C,f).call(this,5),operateType:"quietMode",params:{enabled:e}};return this.sendCommand(t,c.buzzerSilentModeSchema)}async setCarCharger(e){let t={...a(this,C,f).call(this,5),operateType:"mpptCar",params:{enabled:e}};return this.sendCommand(t,c.carChargerSwitchSchema)}async setAcStandByTime(e){let t={...a(this,C,f).call(this,5),operateType:"standbyTime",params:{standbyMins:e}};return this.sendCommand(t,c.acStandbyTimeSchema)}async setCarInput(e){let t={...a(this,C,f).call(this,5),operateType:"dcChgCfg",params:{dcChgCfg:e}};return this.sendCommand(t,c.carChargerDcSchema)}async setEnergyManagement(e){let t={...a(this,C,f).call(this,1),operateType:"watthConfig",params:e};return this.sendCommand(t,c.energyManagementSchema)}async setDeviceTimeout(e){let t={...a(this,C,f).call(this,1),operateType:"standbyTime",params:{standbyMin:e}};return this.sendCommand(t,c.pdStandByTime)}async enableUsbOutput(e){let t={...a(this,C,f).call(this,1),operateType:"dcOutCfg",params:{enabled:e}};return this.sendCommand(t,c.dcUsbSwitchSchema)}async setLcdTimeout(e){let t={...a(this,C,f).call(this,1),operateType:"lcdCfg",params:{delayOff:e,brightLevel:3}};return this.sendCommand(t,c.lcdConfigSchema)}async enablePvChargingPriority(e){let t={...a(this,C,f).call(this,1),operateType:"pvChangePrio",params:{pvChangeSet:e}};return this.sendCommand(t,c.pvPrioritySchema)}async setAcAutoOutConfig(e,t){let n={...a(this,C,f).call(this,1),operateType:"acAutoOutConfig",params:{acAutoOutConfig:e,minAcOutSoc:t}};return this.sendCommand(n,c.acAlwaysOnSchema)}};C=new WeakSet,f=function(e){return{moduleType:e,id:123456789,version:"1.0",sn:this.sn}};var m=require("@ecoflow-api/schemas");var P,T,K=class extends S{constructor(e,t){super(e,t);p(this,P);if(!(0,m.isGlacierSerialNumber)(t))throw new Error("Invalid serial number for Glacier device.")}parseProperties(e){return m.glacierQuotaAllSchema.parse(e)}async setTemperature({right:e,left:t,middle:n}){let d={...a(this,P,T).call(this),operateType:"temp",params:{tmpR:e,tmpL:t,tmpM:n}};return this.sendCommand(d,m.glacierSetTemperatureSchema)}async enableEcoMode(e){let t={...a(this,P,T).call(this),operateType:"ecoMode",params:{mode:e}};return this.sendCommand(t,m.glacierSetEcoModeSchema)}async enableBuzzer(e){let t={...a(this,P,T).call(this),operateType:"beepEn",params:{flag:e}};return this.sendCommand(t,m.glacierSetBuzzerSchema)}async setBuzzerBeep(e){let t={...a(this,P,T).call(this),operateType:"beep",params:{flag:e}};return this.sendCommand(t,m.glacierSetBuzzerCommandSchema)}async setScreenTimeout(e){let t={...a(this,P,T).call(this),operateType:"blTime",params:{time:e}};return this.sendCommand(t,m.glacierSetScreenTimeoutSchema)}async setTemperatureUnit(e){if(e!=="C"&&e!=="F")throw new Error("Invalid temperature unit. Use 'C' for Celsius or 'F' for Fahrenheit");let t={...a(this,P,T).call(this),operateType:"tmpUnit",params:{unit:e==="C"?0:1}};return this.sendCommand(t,m.glacierSetTemperatureUnitSchema)}async setIceMaking(e,t){if(t!=="small"&&t!=="large")throw new Error("Invalid ice shape. Use 'small' or 'large'");let n={...a(this,P,T).call(this),operateType:"iceMake",params:{enable:e,iceShape:t==="small"?0:1}};return this.sendCommand(n,m.glacierSetIceMakingSchema)}async setIceDetaching(e){let t={...a(this,P,T).call(this),operateType:"deIce",params:{enable:e}};return this.sendCommand(t,m.glacierSetIceDetachingSchema)}async setSensorDetectionBlocking(e){let t={...a(this,P,T).call(this),operateType:"sensorAdv",params:{sensorAdv:e}};return this.sendCommand(t,m.glacierSetSensorDetectionSchema)}async setBatteryProtectionLevel(e,t){let n={...a(this,P,T).call(this),operateType:"protectBat",params:{level:t,state:e}};return this.sendCommand(n,m.glacierSetBatteryProtectionSchema)}};P=new WeakSet,T=function(){return{moduleType:1,id:123456789,version:"1.0",sn:this.sn}};var o=require("@ecoflow-api/schemas");var l,u,z=class extends S{constructor(e,t){super(e,t);p(this,l);if(!(0,o.isSmartHomePanelSerialNumber)(t))throw new Error("Invalid serial number for SmartHomePanel device.")}parseProperties(e){return o.shpQuotaAllSchema.parse(e)}async setRtcTime({sec:e,min:t,hour:n,day:d,week:A,month:re,year:ae}){let ne=a(this,l,u).call(this,{id:3,sec:e,min:t,hour:n,day:d,week:A,month:re,year:ae});return this.sendCommand(ne,o.shpRtcTimeUpdateSchema)}async setLoadChannelControl({ch:e,ctrlMode:t,sta:n}){let d=a(this,l,u).call(this,{id:16,ch:e,ctrlMode:t,sta:n});return this.sendCommand(d,o.shpLoadChannelControlSchema)}async setStandbyChannelControl({ch:e,ctrlMode:t,sta:n}){let d=a(this,l,u).call(this,{id:17,ch:e,ctrlMode:t,sta:n});return this.sendCommand(d,o.shpStandbyChannelControlSchema)}async setSplitPhaseInfoConfig(e){let t=a(this,l,u).call(this,{id:18,cfgList:e});return this.sendCommand(t,o.shpSplitPhaseInfoConfigSchema)}async setChannelCurrentConfiguration({channel:e,cur:t}){let n=a(this,l,u).call(this,{id:20,chNum:e,cur:t});return this.sendCommand(n,o.shpChannelCurrentConfigSchema)}async setGridPowerConfiguration({gridVol:e,gridFreq:t}){let n=a(this,l,u).call(this,{id:22,gridVol:e,gridFreq:t});return this.sendCommand(n,o.shpGridPowerParamConfigSchema)}async enableEpsMode(e){let t=a(this,l,u).call(this,{id:24,eps:e});return this.sendCommand(t,o.shpEpsModeConfigSchema)}async enableChannelStatus({channel:e,enable:t}){let n=a(this,l,u).call(this,{id:26,isEnable:t,chNum:e});return this.sendCommand(n,o.shpChannelEnableStatusConfigSchema)}async setLoadChannelInfo({channel:e,channelName:t,iconInfo:n}){let d=a(this,l,u).call(this,{id:32,chNum:e,info:{chName:t,iconInfo:n}});return this.sendCommand(d,o.shpLoadChannelInfoConfigSchema)}async setRegionInfo(e){let t=a(this,l,u).call(this,{id:34,area:e});return this.sendCommand(t,o.shpRegionInfoConfigSchema)}async setEmergencyMode({isCfg:e,backupMode:t,overloadMode:n,chSta:d}){let A=a(this,l,u).call(this,{id:64,isCfg:e,backupMode:t,overloadMode:n,chSta:d});return this.sendCommand(A,o.shpEmergencyModeSchema)}async setScheduledChargingJob({cfgIndex:e,cfg:t}){let n=a(this,l,u).call(this,{id:81,cfgIndex:e,cfg:t});return this.sendCommand(n,o.shpScheduledChargingJobSchema)}async setScheduledDischargingJob({cfgIndex:e,cfg:t}){let n=a(this,l,u).call(this,{id:82,cfgIndex:e,cfg:t});return this.sendCommand(n,o.shpScheduledDischargingJobSchema)}async setConfigurationStatus(e){let t=a(this,l,u).call(this,{id:7,cfgSta:e});return this.sendCommand(t,o.shpSetConfigStatusSchema)}async setStartSelfCheck(e){let t=a(this,l,u).call(this,{id:112,selfCheckType:e});return this.sendCommand(t,o.shpStartSelfCheckSchema)}async setStandByChargingDischargingParameters({discLower:e,forceChargeHigh:t}){let n=a(this,l,u).call(this,{id:29,discLower:e,forceChargeHigh:t});return this.sendCommand(n,o.shpPushStandbyChargeDischargeParamsSchema)}};l=new WeakSet,u=function(e){return{sn:this.sn,operateType:"TCP",params:{cmdSet:11,...e}}};var i=require("@ecoflow-api/schemas");var h,y,q=class extends S{constructor(e,t){super(e,t);p(this,h);if(!(0,i.isDeltaProSerialNumber)(t))throw new Error("Invalid serial number for Delta Pro device.")}parseProperties(e){return i.deltaProQuotaAllSchema.parse(e)}async enableXboost(e,t){let n=a(this,h,y).call(this,{id:66,enabled:e,xboost:t});return this.sendCommand(n,i.deltaProSetXBoostSchema)}async enableCharger(e){let t=a(this,h,y).call(this,{id:81,enabled:e});return this.sendCommand(t,i.deltaProSetCarChargerSchema)}async setChargeLevel(e){let t=a(this,h,y).call(this,{id:49,maxChgSoc:e});return this.sendCommand(t,i.deltaProSetChargeLevelSchema)}async setDischargeLevel(e){let t=a(this,h,y).call(this,{id:51,minDsgSoc:e});return this.sendCommand(t,i.deltaProSetDischargeLevelSchema)}async setCarInput(e){let t=a(this,h,y).call(this,{id:71,currMa:e});return this.sendCommand(t,i.deltaProSetCarInputCurrentSchema)}async enableBeep(e){let t=a(this,h,y).call(this,{id:38,enabled:e});return this.sendCommand(t,i.deltaProSetBeepSchema)}async setScreenBrightness(e){let t=a(this,h,y).call(this,{id:39,lcdBrightness:e});return this.sendCommand(t,i.deltaProSetScreenBrightnessSchema)}async setSmartGeneratorAutoOnThreshold(e){let t=a(this,h,y).call(this,{id:52,openOilSoc:e});return this.sendCommand(t,i.deltaProSetSmartGeneratorAutoOnSchema)}async setSmartGeneratorAutoOffThreshold(e){let t=a(this,h,y).call(this,{id:53,closeOilSoc:e});return this.sendCommand(t,i.deltaProSetSmartGeneratorAutoOffSchema)}async setUnitTimeout(e){let t=a(this,h,y).call(this,{id:33,standByMode:e});return this.sendCommand(t,i.deltaProSetUnitTimeoutSchema)}async setScreenTimeout(e){let t=a(this,h,y).call(this,{id:39,lcdTime:e});return this.sendCommand(t,i.deltaProSetScreenTimeoutSchema)}async setAcStandbyTime(e){let t=a(this,h,y).call(this,{id:153,standByMins:e});return this.sendCommand(t,i.deltaProSetACStandbyTimeSchema)}async setAcChargingPower(e){let t=a(this,h,y).call(this,{id:69,slowChgPower:e});return this.sendCommand(t,i.deltaProSetACChargingSchema)}async setPvChargingType(e){let t=a(this,h,y).call(this,{id:82,chgType:e});return this.sendCommand(t,i.deltaProSetPVChargingSchema)}async enableAcAutoStartBypass(e){let t=a(this,h,y).call(this,{id:84,enabled:e});return this.sendCommand(t,i.deltaProSetBypassACAutoStartSchema)}};h=new WeakSet,y=function(e){return{sn:this.sn,params:{cmdSet:32,...e}}};function te(s,r){return(0,b.isSmartPlugSn)(s)?new k(r,s):(0,b.isPowerStreamSerialNumber)(s)?new Q(r,s):(0,b.isDelta2SerialNumber)(s)?new $(r,s):(0,b.isGlacierSerialNumber)(s)?new K(r,s):(0,b.isSmartHomePanelSerialNumber)(s)?new z(r,s):(0,b.isDeltaProSerialNumber)(s)?new q(r,s):new H(r,s)}var J={deviceList:"/iot-open/sign/device/list",deviceQuota:"/iot-open/sign/device/quota/all",setCmd:"/iot-open/sign/device/quota",certification:"/iot-open/sign/certification"},V=class{constructor(r){let e=t=>`${r.host}${t}`;this.requestHandler=new _(new O(r.accessKey,r.secretKey)),this.restApiHost=r.host,this.deviceListUrl=e(J.deviceList),this.deviceQuotaUrl=e(J.deviceQuota),this.setCmdUrl=e(J.setCmd),this.certificationUrl=e(J.certification)}parseResponse(r,e){let t=v.errorResponseSchema.safeParse(r);if(t.success)throw new Error(`code: ${t.data.code} | message: ${t.data.message}`);return e.parse(r)}async getMqttCredentials(){let r=this.parseResponse(await this.requestHandler.get(this.certificationUrl),v.certificationResponseSchema),{port:e}=r.data;return{...r.data,port:parseInt(e)}}async getDevicesPlain(){return this.parseResponse(await this.requestHandler.get(this.deviceListUrl),v.deviceListResponseSchema)}async getSerialNumbers(){return(await this.getDevicesPlain()).data.map(({sn:e})=>e)}async setCommandPlain(r){return this.parseResponse(await this.requestHandler.put(this.setCmdUrl,r),v.setCommandResponseSchema)}async getDevicePropertiesPlain(r){return v.quotaAllResponseSchema.parse(await this.requestHandler.get(`${this.deviceQuotaUrl}?sn=${r}`))}getDevice(r){return te(r,this)}async getDevices(){return(await this.getDevicesPlain()).data.map(({sn:e})=>this.getDevice(e))}};0&&(module.exports={RestClient});