class DataToTbHandler { constructor(index) { this.index = index; // time, after new value for the given key will be resend to tb (e.g. {status: "OK"}) this.timeToHoldTbValue = 30*60; //30 minutes this.previousValues = {}; this.debug = false; this.messageCounter = 0; this.sender = ""; } dump() { console.log("----------------------------"); console.log("previousValues", this.previousValues); console.log("----------------------------"); } setSender(sender) { this.sender = sender; } isEmptyObject( obj ) { for ( var name in obj ) { return false; } return true; } sendToTb(dataToTb, instance) { if(!FLOW.OMS_brokerready) { return dataToTb; } let keys = Object.keys(dataToTb); if(keys.length == 0) { if(this.debug) console.log("sendToTb received epty object", dataToTb); return; } let tbname = keys[0]; let ts; let arrayOfValues = dataToTb[tbname]; let arrayOfValuesToSend = []; for(let i = 0; i < arrayOfValues.length; i++) { ts = arrayOfValues[i].ts; //console.log("sendToTb------------>before", arrayOfValues[i].values, tbname); let values = this.prepareValuesForTb(tbname, ts, arrayOfValues[i].values); //console.log("sendToTb------------>after", values); if(!this.isEmptyObject(values)) { arrayOfValuesToSend.push({ts: ts, values: values}); } } if(arrayOfValuesToSend.length == 0) { //if(this.debug) console.log("data not sent - empty array"); return; } /* let dataToTb = { [tbname]: [ { "ts": Date.now(), "values": values } ] } */ this.messageCounter++; let dataToTbModified = { [tbname]: arrayOfValuesToSend } //console.log(this.sender + " DATA SEND TO TB ", tbname, this.messageCounter, new Date(ts), dataToTbModified[tbname][0].values, this.instance); //if(this.debug) console.log(this.sender + " DATA SEND TO TB ", this.index, tbname, arrayOfValuesToSend); instance.send(this.index, dataToTbModified); } getDiffTimestamp(key) { //TODO set different value for given key!!! //if(key == "status") this.timeToHoldTbValue = 2*60*60;//2h return this.timeToHoldTbValue * 1000; } prepareValuesForTb(tbname, timestamp, values) { let keys = Object.keys(values); if(!this.previousValues.hasOwnProperty(tbname)) { this.previousValues[tbname] = {}; } //if(this.debug) console.log("prepareValuesForTb", tbname, timestamp, values); for(let i = 0; i < keys.length; i++) { let key = keys[i]; let value = values[key]; if(!this.previousValues[tbname].hasOwnProperty(key)) { this.previousValues[tbname][key] = {ts: timestamp, value: value}; continue; } if(this.previousValues[tbname][key].value === value) { let diff = timestamp - this.previousValues[tbname][key].ts; let timestampDiffToRemoveKey = this.getDiffTimestamp(key); if(diff > timestampDiffToRemoveKey) { this.previousValues[tbname][key].ts = Date.now(); //if(this.debug) console.log(this.sender + ": update ts for key", key, "diff is", diff, "messageCounter", this.messageCounter); } else { delete values[key]; //if(this.debug) console.log(this.sender + ": delete key", key, "diff is", diff, "messageCounter", this.messageCounter, timestampDiffToRemoveKey); } } else { this.previousValues[tbname][key].value = value; this.previousValues[tbname][key].ts = timestamp; } } return values; } } module.exports = DataToTbHandler;