====== UKHASnet logtail -> MQTT ======
TODO: Split the flow out to a separate git repo, and host code on GitHub instead of here
NOTE: This is not a strict parser. Garbage in, garbage out.
{{ :oddstr13:node-red_ukhasnet_overview.png?nolink |}}
===== Mapping config =====
Topic: ''config''
Inject once after: ''0.1''s
{
"OSs2": {
"_comment": "Zone/Building/Area/(air,soil,water)/type(temp,hum)/id",
"_example": "Solvang/+/+/air/temp/#",
"temperature_1_1": "Solvang/_/Drivhus/air/temp/1"
}
}
===== UKHASnet parse =====
const type_map = {
V: 'voltage',
I: 'current',
T: 'temperature',
H: 'humidity',
P: 'pressure',
X: 'custom',
S: 'sun',
R: 'rssi',
C: 'count',
W: 'windspeed',
L: 'location',
Z: 'zombie',
};
const packet_re = /^([0-9])([a-z])([^:\[]+)?(?::([^\[]*))?\[([^\]]*)\]$/;
const values_re = /([A-Z])([^A-Z]*)/g;
const value_re = /([0-9.+-]+)/g;
function parse(packet) {
let pp = packet.match(packet_re);
let result = {};
let _track = {};
result.hops = parseInt(pp[1]);
result.sequence = pp[2];
result.comment = pp[4];
result.path = pp[5].split(',');
result.values = {};
if (pp[3]) {
let values;
while ((values = values_re.exec(pp[3])) !== null) {
let type = values[1];
let value_list = values[2].match(value_re);
let name = type_map[type] || type;
let num = (_track[type] || 0) + 1;
_track[type] = num;
for (let j in value_list) {
let num2 = parseInt(j) + 1;
let id = name + '_' + num + '_' + num2;
result.values[id] = parseFloat(value_list[j]);
}
}
}
return result;
}
let gw = msg.payload.gateway;
let rssi = msg.payload.rssi;
let raw_packet = msg.payload.packet;
let packet = parse(raw_packet);
packet.gw = gw;
packet.rssi = rssi;
return [{payload:packet}];
===== Filter and map MQTT =====
if (msg.topic == 'config') {
flow.set('ukhasnet2mqtt', msg.payload);
} else {
let map = flow.get('ukhasnet2mqtt');
let packet = msg.payload;
let sender = packet.path[0];
let output = [];
if (map[sender]) {
for (let k in map[sender]) {
if (typeof(packet.values[k]) !== 'undefined') {
let mqtt = {
topic: map[sender][k],
payload: packet.values[k],
}
output.push(mqtt);
}
}
}
return [output];
}
===== Change node =====
Maps some of the logtail key names to human friendly versions.
{{ :oddstr13:node-red_ukhasnet_change_keys.png?nolink |}}