NEWS
node-red Kommunikation mit einem fenecon Wechselrichter
-
Da ich eine zu meinem Post eine Anfrage mit der Bitte um Weitergabe hatte, will ich meine Version hier mal zur Verfügung stellen und rudimentär beschreiben.
Wie im o.g. Thread zu sehen, gibt es mehrere Möglichkeiten mit einem fenecon Wechselrichter zu kommunizieren um die Daten in iob weiter zu verwenden.
Ich will die hier nicht vergleichen, schon weil ich keine Erfahrungen mit Ausnahme von Modbus habe. Und die Schnittstelle lieferte nicht alle von mir benötigten Daten.
Warum also sollte man sich das antun, dafür einen node-red flow einzusetzen.Da gibt es nicht viele Gründe. In meinem Fall sind das:
- ich wollte die vollständige Kontrolle über die Daten haben, die ich vom Wechselrichter benötige
- ich will die empfangenen Daten ohnehin mit node-red weiterverarbeiten
- weil mir der Umgang mit node-red inzwischen recht einfach von der Hand geht
Und nicht zuletzt habe ich mir angewöhnt iob-Adapter nur zu benutzen, wenn sich das Problem nicht mit vertretbarem Aufwand durch die bereits vorhandenen Möglichkeiten erledigen läßt, was sicher an der begrenzten Leistungsfähigkeit meiner Hardware liegt.
Also alles Gründe, die für die meisten unter Euch sicher nicht relevant sind. Und deshalb auch eine Warnung vorab:
Wer keinerlei Erfahrung mit node-red, JSON und Javascript hat sollte die Finger davon lassen!Ok, was tut nun der flow?
- Er baut eine Websocket-Verbindung zum fenecon-Wechselrichter (nur getestet im internen Netzwerk) auf und lässt sich die abbonierten Daten per Websocket schicken. Also genau das, was das fenecon Webinterface auch macht.
- die empfangenen Daten werden aufbereitet und berechnet.
Der Wechselrichter sendet die Daten ca. sekündlich. Da ich diese Geschwindigkeit nicht benötige und iob nicht unnötig belasten wollte,
werden die Daten gesammelt und erst nach einer administrierbaren Zeit (const calculationInterval = 30;) verarbeitet.
Zur Zeit könnten für die Verarbeitung 2 Methoden pro Channel eingestellt werden:
- avarange - bildet den Durchschnitt der innerhalb von calculationInterval erhaltenen Daten. Das macht Sinn bei allen Leistungswerten
- last - es wir der letzte empfangene Wert genommen. Das macht Sinn bei den Arbeitswerten (Zähler) Temperaturen, Fehler etc.
Hier interessiert i.d.R. immer der letzte Wert.
Weitere Kalkulationen können bei Bedarf in der Funktion calculateValue() implementiert werden. - Nach der Kalkulation werden die Daten mit einem ioBroker out - Node an iob gesendet. Die Node aktualisiert die entsprechenden Datenpunkte. Ist der noch nicht vorhanden, wird er angelegt. Es müssen also bei Erstinbetriebnahme innerhalb von iob keine Datenpunkte angelegt werden.
Vorbereitung
Es wird der node-red Adapter von iob verwendet, indem die ioBroker out - Node bereits enthalten ist. iob und der node-red Adapter sollten also aktuell sein. Ich verwende js-controller 5.0.19 und node-red Adapter v5.2.1
Prinzipiell arbeitet der flow zwar (bis auf den ioBroker out - Node) auch mit einem externen eigenständigen node-red. Allerdings muss man sich dann selber Gedanken machen, ob und wie man die Daten in den iob bekommt. Ich erwähne das deshalb, weil man die Daten u.U. vlt. nur an eine Datenbank übergeben will.
Der flow verwendet 2 JS Bibliotheken uuid und websocket. Diese müssen NICHT installiert werden! Das macht node-red in meinem flow automatisch (zumindest in aktuellen Versionen)
Achtung! Der erste deplay des flows kann deshalb etwas länger dauern, da hier die benötigten Bibliotheken installiert werden.Hier der exportierte flow zum Import
Den flow importieren ABER noch nicht deployen, da er erst konfiguriert werden muss.
Konfiguration
Die Grundkonfiguration geschieht im JSON-Format in einem change-node.Hier ein Beispiel JSON aus dem change-node.
Der Aufbau ist wie folgt:
{ "username": "xxxxx", // entspricht dem user der lokalen Wechseleichter-Website "password": "xxxxx", // entspricht dem password der lokalen Wechselrichter-Website "fems_ip": "192.168.xxx.xxx", // lokale ip Adresse des Wechselrichters "fems_port": "8085", // websocket Port "fems_request_channels": [] // Array der abbonierten Kanäle }
Aufbau eines abbonierten Kanals:
[ "_sum/EssDischargePower", // original channel name (siehe Hinweise) "", // Datentyp wird i.d.R. von den gesendeten Daten übernommen "", // Unit wird i.d.R. von den gesendeten Daten übernommen "AC-side power of Storage System -charge +discharge", // iob Datenpunkt Namensfeld "avarange", // Berechnungsmethode (avarange - es wird der Durchscnitt gebildet, last - letzter Wert wird verwendet) [] // wird intern zum speichern der werte benutzt ],
Konfiguration Kalkulationsinterval
Standardmäßig werden die iob - Datenpunkte aller 30 sek aktualisiert. Soll die Zeitspanne geändert werden, kann die in der function-node mit der Variablenconst calculationInterval = 30; // 30sec
gemacht werden.
Die iob Datenpunkte
Die Datenpunkte werden innerhalb von iob in node-red.0/fems angelegt.
Hinweise
Die Idee und die Infos habe ich vom
original HA-Fenecon-Adapter
Die Websocket Schnittstelle ist weder von Fenecon, noch von
OpenEMS voll dokumentiert.
Man kann sich die Infos aber einigermaßen bei OpenEMS zusammenlesen.Hab das Ganze zuerst als Pythonscript gebastelt und das Konzept dann als JS-Script in Node-Red umgesetzt.
Will man einen Eindruck bekommen, welche Datenpunkte prinzipiell möglich sind, kann man das über die debug-Ausgabe erfahren.
Beim Starten der Verbindung wird u.a. die Methode:
getEdgeConfig aufgerufen. Diese gibt ein JSON sämtlicher installierter Komponenten und deren Channels zurück. Ist der debug-Node „other response data“ aktiviert, wird hier beim Start der Verbindung ein JSON mit allen zur Verfügung stehenden Components und deren Channels ausgegeben.
Hier kopiert man sich am besten das Object „components“ oder das channels-object eines bestimmten channels.
Hier finden sich die Daten des channels, die dann für die Konfiguration der zu abonnierenden channels genutzt werden können.Kurzinfo zum Flow
Der Start Input-node kann zum manuellen Start des flows verwendet werden. Er ist aber so eingestellt, dass er nach dem deplay des flows auch automatisch startet.
Der Logout Input-node kann dafür benutzt werden, die Verbindung zu beenden. Was i.d.R. nie nötig ist, es sei denn man bastelt an dem Flow rum.
Über das change-node wird lediglich beim Start/Restart das config-json in das function-node injiziert. Dieses node wird nur verwendet um die Konfiguration an einer separaten Stelle durchführen zu können.
Die eigentliche Funktionalität ist komplett als Javascript im function-node implementiert. Hier gibt es 4 Ausgänge:- Ausgabe der kalkulierten abbonierten Daten als Array. Nur für debug-Zwecke oder zur evtl. Weiterverarbeitung
- Ausgabe der raw response Daten. Nur für debug-Zwecke oder zur evtl. Weiterverarbeitung
- Ausgabe der einzelnen channel Daten, aufbereitet als iob Datenpunkt daten
- Sollte die Verbindung mal Abbrechen, wird sie über diesen Ausgang neu gestartet
Das sollte es mal als grundsätzliche Information sein.
Gruß
Reiner