da ich gerade von openhab auf Home Assistant für meine Haussteuerung umsteige, versuche ich alles in die neue Steuerung einzubinden. Ziel ist mittelfristig alles über Home Assistant auslesen zu können und im Idealfall Steuern zu können. Hier hab ich bisher Probleme mit HA und den Poolcontroller.
Da ich keine fertigen Codeschnipsel gefunden habe, habe ich mich heute dran gesetzt. Vielleicht hilft es jemanden, der etwas ähnliches umsetzen möchte.
Vorbedingung:
- Home Assistant
- Node Red
- Lokaler oder Externer Zugriff auf den Poolcontroler (GetState.csv)
- hass-node-red (https://github.com/zachowj/hass-node-red) Erstellung von HA entities
- Kontinuierliche Ausführung
- HTTP Abfrage (http://poolcontroler/GetState.csv)
- Aufbereitung von den CSV in ein JSON
- Extrahieren der Daten für eine Entity/weitere Verarbeitung
- Runden & Abflachen der Daten
- Daten an Entity senden
- * Switch Daten werden von entity switch nicht übernommen (Schalter ist immer ON)
Code: Alles auswählen
function csvJSON(csv){
var lines = csv.split("\n");
var headers = lines[1].split(",");
var result = {};
var obj = {};
var line_item = '';
for(var i=2;i<lines.length;i++){
var currentline=lines[i].split(",");
switch (i) {
case 2: line_item = "unit"; break;
case 3: line_item = "offset"; break;
case 4: line_item = "gain"; break;
case 5: line_item = "rawvalue"; break;
}
for(var j=0;j<headers.length;j++){
if (i==2) {
obj[j] = {};
obj[j]["name"] = headers[j];
}
obj[j][line_item] = currentline[j];
}
}
for (var x=0;x<headers.length;x++) {
var current_obj = obj[x];
var name = current_obj["name"];
if (typeof result[name] != "undefined") {
var l = 1;
new_name = name;
while (typeof result[new_name] != "undefined") {
new_name = name + "_[" + (l++)+"]";
}
name = new_name;
}
if (name) {
result[name] = {};
result[name]['unit'] = current_obj['unit'];
if (current_obj['unit']=="h") {
var timeValue = current_obj['rawvalue'];
var minutes = timeValue%256;
var hour = (timeValue-minutes)/256;
result[name]['value'] = hour + ":" + minutes;
} else {
var rawvalue = parseFloat(current_obj['rawvalue']);
var gain = parseFloat(current_obj['gain']);
var offset = parseFloat(current_obj['offset']);
result[name]['value'] = (rawvalue*gain)+offset;
}
}
}
return JSON.stringify(result); //JSON
}
msg.payload=csvJSON(msg.payload)
return msg;Sofern es mehrere Werte mit den gleichen Label im Poolcontroller gibt, werden die Label um ein suffix (_[zähler]) erweitert. Bei mir ist dies bei "n.a." und "Absorber" der Fall.
Beispiel:
Code: Alles auswählen
{"Time":{"unit":"h","value":"15:52"},"n.a.":{"unit":"mV","value":0},"n.a._[1]":{"unit":"mV","value":0},"Filterdruck":{"unit":"mBar","value":936.4093179060001},"n.a._[2]":{"unit":"mV","value":0},"CPU Temp":{"unit":"C","value":43.53125},"Redox":{"unit":"mV","value":697.9375},"pH":{"unit":"pH","value":6.9921875},"Pool":{"unit":"C","value":22.5},"Absorber":{"unit":"C","value":14.9125},"Rücklauf":{"unit":"C","value":22.825},"Aussen":{"unit":"C","value":12.125},"Pool Ablauf":{"unit":"C","value":23.3625},"n.a._[3]":{"unit":"C","value":0},"Zulauf":{"unit":"C","value":24.05},"Messzelle":{"unit":"C","value":22.125},"FilterPumpe":{"unit":"--","value":1} ... ... ... ... Funktion: Extrahieren eines Wertes aus den JSON (sensor)
Code: Alles auswählen
var data = JSON.parse(msg.payload);
msg.payload = data['Pool']['value'];
return msg;Code: Alles auswählen
var data = JSON.parse(msg.payload);
var current_mode = data['FilterPumpe']['value'];
switch (current_mode) {
case 0: msg.payload = "off" //auto off
break;
case 1: msg.payload = "on" //auto on"
break;
case 2: msg.payload = "off" //manual off"
break;
case 3: msg.payload = "on" //manual on"
break;
}
return msg;LG
Tim
