Home Assistant + Node Red

Anbindung des Controllers an externe Hausautomationssysteme.
TimWHH
Beiträge: 14
Registriert: 21. April 2019, 21:18

Home Assistant + Node Red

Beitrag von TimWHH »

Hi,
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: Ablauf:
  • 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
Aktuell Offen:
  • * Switch Daten werden von entity switch nicht übernommen (Schalter ist immer ON)
Funktion: Konvertieren der GetState.csv Daten:

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;
Die Daten befinden sich dann in einen JSON Objekt (key = Name im Poolcontroller => {unit: "", value: ""}.

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} ... ... ... ... 
Der obige Code könnte erweitert werden, um mehrere Ausgänge anzubieten. Bei über 40 einzelnen Werten, war mir dies jedoch zuviel des guten.

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;
Funktion: Extrahieren eines Wertes aus den JSON (binary/switch*)

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;
Have fun.

LG
Tim
Dateianhänge
Node-Red Workflow
Node-Red Workflow
Bildschirmfoto 348.png (242.18 KiB) 755 mal betrachtet

Graefe
Beiträge: 44
Registriert: 8. August 2020, 11:39

Re: Home Assistant + Node Red

Beitrag von Graefe »

Mein Pool-Projekt ist gerade erst in der Bauphase. Aber eine Anbindung an Node Red ist genauso das, was ich suche! :D Es wäre ja schön, wenn man über Node Red auch die Relais (Licht, Abdeckung) schalten könnte.

markus
Beiträge: 168
Registriert: 23. Januar 2019, 10:57

Re: Home Assistant + Node Red

Beitrag von markus »

Hallo @TimWHH und alle anderen :-),
danke für deine Funktionen. Da ich gerade erst Anfange mit Node Red hat mich das schon weitergebracht.

Wie auch Graefe würde ich gerne bestimmte Relais über Red schalten. Dazu dachte ich mir, mach ich mir einfach einen http Reguest auf die SetState.
Leider funktioniert das aus mir unerfindlichen Gründen nicht. Die selbe URL im Browser funktioniert tadellos. Die GetState funktioniert auch ohne Probleme.

Eine Idee??

red2.png
red2.png (32.12 KiB) 687 mal betrachtet
red1.png
red1.png (67.74 KiB) 687 mal betrachtet

Benutzeravatar
DPerak
Beiträge: 404
Registriert: 26. Juni 2016, 13:09

Re: Home Assistant + Node Red

Beitrag von DPerak »

Hallo zusammen,
Hoffe ihr habt die Feiertage überlebt?
Ich beschäftigte mich jetzt erstmals mit dem Thema zentrale Steuerung der Hausautomation. Hierzu vielleicht eine etwas off-topic frage. Neben dem poolcontroller hab ich noch eine automatische Bewässerungssteuerung (Hunter), eine Solarthermie-Regelung (Seltron) sowie eine Conrad Wetterstation. Die Systeme funktionieren schon, sind aber bis auf die Wetterstation nicht vernetzbar.
Was ist das zu bevorzugende Konzept,
a) „dumme“ smarte Aktoren wie z.B. Sonoff Schalter mit wenig eigener Intelligenz und alles z.B. über einen zentralen Raspi mit HA drauf steuern und regeln lassen oder
b) neue jeweils eigene vernetzbare Controller mit eigener Absicherung (so wie der poolcontroller), und das HA System als übergeordnetes System?
VG, Daniel

markus
Beiträge: 168
Registriert: 23. Januar 2019, 10:57

Re: Home Assistant + Node Red

Beitrag von markus »

Hi,
ich glaube das kommt ganz darauf an. Ich persönlcih habe es gesplittet.

Bei einer Poolsteuerung vertraue ich auf die ProCon und Ihre Sicherheitsmaßnahmen. Da möchte ich mich keinesfalls einmischen und überwache nur Messwerte und schalte "unwichtige" Relais wie z.B. Licht.

Bei anderen Themen mache ich es über die Automation.

Bei mir ist es immer so aufgebaut, dass die Automation ausfallen kann (Ist ja auch nur ein Raspi....) und ich trotzdem alles weiter Bedienen kann, oder keine wichtigen Sachen verlieren.

Benutzeravatar
DPerak
Beiträge: 404
Registriert: 26. Juni 2016, 13:09

Re: Home Assistant + Node Red

Beitrag von DPerak »

Ja, 14 Tage später bin ich jetzt auch schlauer und hab mich für b) entschieden.
Danke & Gruß, Daniel

TimWHH
Beiträge: 14
Registriert: 21. April 2019, 21:18

Re: Home Assistant + Node Red

Beitrag von TimWHH »

Hi in die Runde,
irgendwie habe ich keine Benachrichtigungen bekommen zu den Thema bekommen :( Daher Sorry das ich nicht reagiert habe.

Vorab zum auslesen der Daten war die Node Red Lösung ganz nett, jedoch plane ich für das Pooljahr 2021 einen MQTT Dienst (mit entity autodiscovery für Home Assistant) zu bauen. Hintergrund ist das ich meine Hue Lampen mittlerweile mit Zigbee2mqtt ansteuere und seit Weihnachten an einen MQTT Dienst + Visualisierung für meine Lüftungsanlage arbeite.

@Markus
Das Thema ist vermutlich bei dir schon durch? Das einzige was mir einfallen würde, ist das die Relais nicht auf Auto eingestellt waren? Es gibt ja den Status: Auto - an, Auto - aus, Ein, Aus. Das SetState kann nur geschaltet werden, sofern Die Relais auch auf Auto eingestellt sind. (Ist eigentlich ziemlich smart als Sicherheitslösung, aber nervig wenn man es nicht weiß)

LG aus Hamburg
Tim

markus
Beiträge: 168
Registriert: 23. Januar 2019, 10:57

Re: Home Assistant + Node Red

Beitrag von markus »

Jein, bin dann mittlrweile einmal zu dem IOBroker Moduk übergegangen.

Möchte eigentlich aber wieder weg von Iobroker, weil ich den nur wegen dem Controller habe. Baue gerade langsam die Poolsteurung wieder auf NodeRed um.
Vllt. merzt sich mein Fehler von damals aus.

aroma
Beiträge: 10
Registriert: 7. September 2020, 16:37

Re: Home Assistant + Node Red

Beitrag von aroma »

Hallo!

Ich hätte heute auch versucht über NodeRed bestimmte Relais zu schalten.
Genutzt wurde die http Request Node auf mit dem SetState Befehl (Methode GET).
Leider funktioniert es nicht, es passiert überhaupt nichts, der selbe URL funktionert im Browser.
z.B. http://192.168.1.6/SetState.pl?R2=1&RT9=0
Am Befehl kann es also nicht liegen und das Relais steht in der ProCon natürlich auf Auto.
Hat das so schon jemand hinbekommen?

Lg

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: Home Assistant + Node Red

Beitrag von Alex »

- Mal ohne http:// bei der Angabe der URL probiert?
- Ist der Node Server im gleichen IP-Adresskreis wie die ProCon?
- Wird überhaupt was abgeschickt von dem?... wenn ja, kann man irgendwo kucken was?

aroma
Beiträge: 10
Registriert: 7. September 2020, 16:37

Re: Home Assistant + Node Red

Beitrag von aroma »

Alex hat geschrieben:- Mal ohne http:// bei der Angabe der URL probiert?
- Ist der Node Server im gleichen IP-Adresskreis wie die ProCon?
- Wird überhaupt was abgeschickt von dem?... wenn ja, kann man irgendwo kucken was?

Habe ich probiert aber egal ob http:// davor oder nicht, es ändert sich nichts.

Der Node Red Server hat die IP Adresse 192.168.1.10, dass sollte also auch passen.

Ich habe hinter dem http Request Node ein debug angehängt (siehe Bilder).
Dateianhänge
Image4282799550489715926.jpg
Image4282799550489715926.jpg (1.21 MiB) 505 mal betrachtet
Image4447540973614737177.jpg
Image4447540973614737177.jpg (1.12 MiB) 505 mal betrachtet

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: Home Assistant + Node Red

Beitrag von Alex »

....is irgendwie wenig aussagekräftig :)

Öffne http://192.168.1.6/diagnost.htm im Browser (kuck das sonst keine Brwoserfenster mit der Benutzeroberfläche der ProCon offen sind - nirgends im Haus)
Tippe 666 in das Command Feld ein ... dann ENTER drücken... dann über den Node-Server 'nen Request abschicken. Alles was ankommt, wird auf der Diagnost.htm angezeigt

Wenn da was am Webserver der ProCon ankommt, dann müsste das ungefähr so aussehen
Bild
(2. Zeile... hier sind aber z.B. alle Relais im Request... bei Dir wären das halt weniger)

aroma
Beiträge: 10
Registriert: 7. September 2020, 16:37

Re: Home Assistant + Node Red

Beitrag von aroma »

Da bekomme ich folgendes Ergebnis:
GET POST request header
GET /SetState.pl?R2=1RT9=0 HTTP/1.1
host: 192.168.1.14
Connection: close

IP: 192.168.1.10

Die 192.168.1.14 ist die IP des Rechners auf dem ich den Button zur Auslösung des Befehls gedrückt habe.

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: Home Assistant + Node Red

Beitrag von Alex »

Code: Alles auswählen

GET /SetState.pl?R2=1RT9=0
da fehlt das "&" zw. R2=1 und RT9=0 ...kann so nicht gehen.

Kann ich Dir aber nicht sagen, wie man das in die Node-Red Oberfläche eingeben muss, damit dass das auch korrekt überträgt. Evtl maskieren mit \& ...
also z.B. http://192.168.1.6/SetState.pl?R2=1\&RT9=0 oder codieren mit %26 http://192.168.1.6/SetState.pl?R2=1%26RT9=0
Wird aber vermutlich beides nicht funktionieren...
...ansonsten... einzeln schicken

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: Home Assistant + Node Red

Beitrag von Alex »

...noch vergessen: RT9 alleine macht auch nix. "RT9=" ist nur der Timer für Relais 9, "R9=" wäre das Relais
Also entweder schickst nur R9=1 ... oder R9=1&RT9=5000 (wenn R9 für 5 Sekunden EIN soll)... aber "RT9=5000" alleine macht mit dem Relais 9 nichts

aroma
Beiträge: 10
Registriert: 7. September 2020, 16:37

Re: Home Assistant + Node Red

Beitrag von aroma »

Ich habe es heute nochmal mit dem gleichen Einstellungen (bis auf das RT2, statt RT9) von gestern getestet und jetzt kommt folgendes an:
GET POST request header
GET /SetState.pl?R2=1&RT2=0 HTTP/1.1
host: 192.168.1.14
Connection: close

Also genau das, was ankommen soll aber es funktioniert leider nicht.
Die ProCon schaltet nichts ein.
Im Browser funktioniert der Link.

Testweise habe ich auch nur http://http://192.168.1.6/SetState.pl?R2=1 probiert, da kommt folgendes an:
GET POST request header
GET /SetState.pl?R2=1
host: 192.168.1.14
Connection: close

Also auch wieder das richtige Ergebnis aber es passiert wieder nichts.

Benutzeravatar
Alex
Administrator
Beiträge: 9988
Registriert: 28. Mai 2014, 23:00

Re: Home Assistant + Node Red

Beitrag von Alex »

Ich habe es heute nochmal mit dem gleichen Einstellungen (bis auf das RT2, statt RT9) von gestern getestet und jetzt kommt folgendes an:
GET POST request header
GET /SetState.pl?R2=1&RT2=0 HTTP/1.


...wenn Du sonst "nichts geändert" hast, kann ja heute nicht plötzlich das & mit ankommen? ... gestern war's ja auch nicht da.
Mach das "http" auf jedenfall mal in der Zeile mit der "URL" weg. Ansonsten ... ohne zu wissen was und wie das Node-Ding den Request schickt - kommst dann nicht weiter.

aroma
Beiträge: 10
Registriert: 7. September 2020, 16:37

Re: Home Assistant + Node Red

Beitrag von aroma »

Schade, so ist meine ganze Integration in Home Assitant mit meinen Buttons und den hinterlegten Timern zur Steuerung der Relais total umsonst gewesen.
Ich habe jetzt beim URL 192.168.1.6/SetState.pl?R2=1 (was auch vollkommen reichen würde, da ich per Timer das Relais wieder abschalten würde) eingegeben aber leider schaltet das Relais bei der ProCon nicht.
Folgendes kommt an:
GET POST request header
GET /SetState.pl?R2=1 HTTP/1.1

Gibts keine Node Red Spezialisten in diesem Forum? ;)

Wäre echte der Hammer, wenn das funktionieren würde!! :)

markus
Beiträge: 168
Registriert: 23. Januar 2019, 10:57

Re: Home Assistant + Node Red

Beitrag von markus »

Ich hatte ja genau das selbe Problem. Vllt. sollten wir uns mal nach einer anderen HTTP Node umsehen, bzw. es per TCP direkt schicken.
Ich stelle gerade wieder von IoBroker auf Nodered um, und werde mich dem Thema nochmal annehmen.

aroma
Beiträge: 10
Registriert: 7. September 2020, 16:37

Re: Home Assistant + Node Red

Beitrag von aroma »

Ich konnte es nun endlich lösen!! :D

Anstatt einer HTTP Node verwende ich jetzt eine exec mit folgendem Inhalt und es funktioniert perfekt! :D
exec_Node.JPG
exec_Node.JPG (62.6 KiB) 453 mal betrachtet
@Alex: Ich verwende beim Node Red auch das /GetState, also zum Beipiel http://192.168.1.6/GetState.csv um die Daten der ProConIP im Home Assistant anzeigen zu lassen, dass funktioniert wirklich wunderbar.
Mir ist jedoch aufgefallen, das in der GetState.csv bei Time wenn die Uhrzeit bei der ProConIP zum Beispiel 13:05 Uhr ist, bei der GetState.csv 13:5 und nicht 13:05 als Wert rauskommt.
Sobald die Minuten zweistellig werden, passt die Anzeige zu 100%, also 13:10 Uhr in der ProConIP, dann kommt auch in der GetState.csv 13:10 Uhr als Wert an.