node-red-iskra-info-tlg
Version:
Node-RED node for parsing Iskra SML protocol messages, extracting energy values and indices from data buffers.
199 lines (160 loc) • 5.97 kB
JavaScript
module.exports = function (RED) {
function iskra_sml_parser(config) {
RED.nodes.createNode(this, config);
var node = this;
//> modul global variable
let output = Array(11);
output[0] = { 'payload': 0 };
output[1] = { 'payload': 0 };
output[2] = { 'payload': 0 };
//> dso declaration:
node.on('input', function (msg) {
//> implement:
let push_tlg = Buffer.from(msg.payload);
output[0].payload = decode_secIndex_by_Listname(push_tlg);
output[1].payload = decode_obis_valueInt64(push_tlg, [0x01, 0x00, 0x01, 0x08, 0x00, 0xFF]);
output[2].payload = decode_obis_valueInt32(push_tlg, [0x01, 0x00, 0x10, 0x07, 0x00, 0xFF]);
node.send([output[0], output[1], output[2]]);
});
}
RED.nodes.registerType("node-red-iskra-info-tlg", iskra_sml_parser);
}
//>@ decode energie Uint64
function decode_obis_valueInt64(tlg, obisi) {
let retVal = 0;
const offset = 13;
let start = 0;
let end = 0;
let devider_arr = [];
let value_buffer = new Uint8Array(8); //> Wert aus 8 byte
let devider = 1;
const status_byte = 0x65;
let status_offset = 0;
//> implement:
let obis_index = search_obis_index(tlg, obisi); //> console.log('obis_index=', obis_index);
if (obis_index > 0) {
//>---status----
if (status_byte === tlg[obis_index + 6]) {
status_offset = 4;
}
//>---status----
//>----value buffer---
start = obis_index + offset + status_offset;
end = start + 8; //> Int64
value_buffer = tlg.slice(start, end); //>for (let i of buffer) console.log(i);
//>----value buffer---
//--devider--
devider_arr = tlg.slice(obis_index + 11 + status_offset, obis_index + 12 + status_offset); //>for (let i of devider_arr) console.log(i);
let viewInt = new DataView(devider_arr.buffer, devider_arr.byteOffset, devider_arr.byteLength);
devider = Math.pow(10, viewInt.getInt8(0));//> 10^(-x)
//> console.log('devider=', devider);
//--devider--end--
let view = new DataView(value_buffer.buffer, value_buffer.byteOffset, value_buffer.byteLength);
retVal = Number(view.getBigInt64(0)) * devider;
}
return retVal.toFixed(2);
}
//>@ decode sekunden_index uint32
function decode_secIndex_by_Listname(tlg) {
let retVal = 0;
let start = 0;
let end = 0;
let value_buffer = new Uint8Array(4);
let listName = new Uint8Array([0x01, 0x00, 0x62, 0x0A, 0xFF, 0xFF]);
let index = search_obis_index(tlg, listName); console.log('index=', index);
if (index > 0) {
//>----value buffer---
start = index + 10;
end = start + 4; //> Int32
value_buffer = tlg.slice(start, end); //>for (let i of value_buffer) console.log(i);
//>----value buffer---
let view = new DataView(value_buffer.buffer, value_buffer.byteOffset, value_buffer.byteLength);
retVal = view.getInt32(0);
}
return retVal;
}
//>@ decode value Int32
function get_obis_valueInt16(tlg, obisi) {
let retVal = 0;
const offset = 13;
let start = 0;
let end = 0;
let devider_arr = [];
let devider = 1;
let value_buffer = new Uint8Array(2); //> Value aus 2 Byte
const status_byte = 0x65;
let status_offset = 0;
//> implement:
let obis_index = search_obis_index(tlg, obisi);
if (obis_index > 0) {
//>---status----
if (status_byte === tlg[obis_index + 6]) {
status_offset = 4;
}
//>---status--end--
//>----value buffer---
start = obis_index + offset + status_offset;
end = start + 2; //> Uint16
value_buffer = tlg.slice(start, end);
//>----value buffer--end--
//--devider--
//> devider_arr = tlg.slice(obis_index + 11, obis_index + 12);
devider_arr = tlg.slice(obis_index + status_offset + (offset - 2), obis_index + status_offset + (offset - 1));
let viewInt = new DataView(devider_arr.buffer, devider_arr.byteOffset, devider_arr.byteLength);
devider = Math.pow(10, viewInt.getInt8(0));//> 10^(-x)
//>console.log('devider=', devider);
//--devider--end--
let view = new DataView(value_buffer.buffer, value_buffer.byteOffset, value_buffer.byteLength);
retVal = view.getUint16(0) * devider;
}
return retVal.toFixed(2);
}
function decode_obis_valueInt32(tlg, obisi) {
let retVal = 0;
const offset = 13; //> bis zu Value
let start = 0;
let end = 0;
let devider_arr = [];
let value_buffer = new Uint8Array(4);//> Wert aus 4 Byte
let devider = 1;
const status_byte = 0x65;
let status_offset = 0;
//> implement:
let obis_index = search_obis_index(tlg, obisi);
if (obis_index > 0) {
//>---status----
if (status_byte === tlg[obis_index + 6]) {
status_offset = 4;
}
//>---status--end--
//>----value buffer---
start = obis_index + offset;
end = start + 4;
value_buffer = tlg.slice(start, end);
//>----value buffer---
//--devider--
devider_arr = tlg.slice(obis_index + 11 + status_offset, obis_index + 12 + status_offset);
let viewInt = new DataView(devider_arr.buffer, devider_arr.byteOffset, devider_arr.byteLength);
devider = Math.pow(10, viewInt.getInt8(0)); //> 10^(-x)
//> console.log('devider=', devider);
//--devider--end--
let view = new DataView(value_buffer.buffer, value_buffer.byteOffset, value_buffer.byteLength);
retVal = Number(view.getInt32(0)) * devider;
}
return retVal.toFixed(2);
}
function search_obis_index(tlg, obis) {
let retVal = 0;
for (let i = 0; i < tlg.length; i++) {
if (tlg[i + 0] === obis[0])
if (tlg[i + 1] === obis[1])
if (tlg[i + 2] === obis[2])
if (tlg[i + 3] === obis[3])
if (tlg[i + 4] === obis[4])
if (tlg[i + 5] === obis[5]) {
retVal = i;
break;
}
}
return retVal;
}