UNPKG

@virtualbat/balance-neto-horario

Version:

Get readings from solax inputs and calculate a battery slot which represents de energy transferred to the virtual battery in a range time.

92 lines (73 loc) 3.3 kB
import { ChronoField, ChronoUnit, LocalDateTime } from "@js-joda/core"; import { BalanceNetoHorario} from "@virtualbat/entities/dist/src/BalanceNetoHorario.js"; import { BatterySlot } from "@virtualbat/entities/dist/src/BatterySlot.js"; export class NodeBalanceNetoHorario{ node:any=null; nodeContext:any=null; balance:BalanceNetoHorario|null=null; reset={lastResetWas:LocalDateTime.now(),resetTimeout:null}; constructor(node:any,config:any){ this.node=node; this.reset.resetTimeout=config.resetTimeout; } setNodeContext(nodeContext:any){ this.nodeContext=nodeContext; } onInput(msg:any,send:any,done:any){ this.node.log("Received Battery slot: "+msg); try{ /*if(_isJson(msg.payload)){ msg.payload=JSON.parse(msg.payload); }*/ this.balance?.addBatterySlot(new BatterySlot(msg.payload)); this.serialize(); }catch(error){ this.node.log(error); this.node.error(error,"Cannot add battery slot"); } this.balance=this.needsResetAndSend(send); let debugmsg=this.balance?.get(); this.node.status({fill:"green",shape:"dot",text:"SLOTS IN "+this.balance?.batterySlots.length+"|"+debugmsg?.balanceNetoHorario.feeded+"|"+debugmsg?.balanceNetoHorario.produced}); done(); } serialize(){ this.nodeContext.set("lastPayload",JSON.stringify(this.balance?.get())); // this.startTime=LocalDateTime.now().withMinute(0).withSecond(0).withNano(0); // this.endTime=this.startTime.plusHours(1); // this.batterySlots=new List(); // this.readTimeStamp=null; // this.length=null; // this.isConsolidable=false; } unSerialize(){ let lastPayload=this.nodeContext.get("lastPayload"); if(lastPayload!==undefined){ this.balance=new BalanceNetoHorario(JSON.parse(lastPayload).balanceNetoHorario); if(LocalDateTime.parse(this.balance.startTime.toString()).until(LocalDateTime.now(),ChronoUnit.MINUTES)>60){ this.balance=new BalanceNetoHorario(undefined); } // lastPayload.batterySlots.forEach(element=>{ // balance.addBatterySlot(element); // }); }else{ this.balance=new BalanceNetoHorario(undefined); } return this.balance; } needsResetAndSend(send:any){ var msg:any={payload:"empty"}; msg.payload=this.balance?.get().balanceNetoHorario; if(this.balance!==null){ if(LocalDateTime.parse(this.balance?.endTime.toString()).isBefore(LocalDateTime.now()) || LocalDateTime.now().isAfter(this.reset.lastResetWas.plusSeconds(this.reset.resetTimeout!==null?this.reset.resetTimeout/1000:0))){ this.balance.endTime=LocalDateTime.now(); this.balance.consolidable=true; msg.payload=this.balance.get().balanceNetoHorario; this.balance=new BalanceNetoHorario(undefined); this.reset.lastResetWas=LocalDateTime.now(); } this.node.log("Sending:"+JSON.stringify(msg)); send(msg); } return this.balance; } }