Node-Red als Frontend

Begonnen von Master_Nick, 26 Oktober 2017, 13:07:28

Vorheriges Thema - Nächstes Thema

Master_Nick

Hehe,
schön zu hören - leider bin ich immer noch arg zurück geworfen aktuell.
Viel um die Ohren und dann Bau ich gerade eine komplette Steuerung neu weil sie unzuverlässig war.

Aber mein  10" Touchdisplay mit ZeroW hat immerhin schon eine Rahmung und ist Montagebereit.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Master_Nick

Zitat von: d.mrugalla am 08 Januar 2018, 22:23:58
Habe heute mein TabletUI durch die MQTT/NodeRed-Dashboardlösung ersetzt und bin begeistert.
Die größte Herausforderung war lediglich den Output von der Log-Datenbank für die Charts aufzubereiten.
Der Rest ging quasi im Handumdrehen.
Das Dashboard lädt schnell und reagiert praktisch ohne erkennbare Verzögerung.
Bei mir laufen Fhem, postgres, Mosquitto und Node-RED auf einer Intel-NUC in Containern.

Allerdings muss ich sagen, dass die TabletUI von Fhem sehr viel umfangreicher und teilweise auch hübscher ist als das Node-Red-Dashboard. Leider ist mir da aber die Einrichtung zu frickelig und die Performance auch nur so lala.
Für mich ist damit der größte Knackpunkt von Fhem, nämlich das fehlende, saubere und flotte  Anwender-Frontend, behoben bzw. umschifft.

Kannst du mir deine Lösung etwas offenlegen ;-)

Wie schaltest du deine nicht MQTT Geräte in FHEM mit Node-RED? Das Tool von hexenmeister kann ja bisher nur publishen nicht aber auslesen, soweit ich gelesen habe.

Ich plane aktuell Node-RED wirklich nur als Interface zu nutzen ohne Logik.
Also soll es INFOS von FHEM über alle Devices bekommen (hexenmeisters Modul würde das bringen).
Es soll aber ebenso alle Geräte schalten können (da fehlt mir aktuell die Möglichkeit NICHT MQTT Geräte zu schalten in FHEM (klar könnte man per CURL machen erst mal...)
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Darrol

#32
Zitat von: Master_Nick am 05 Februar 2018, 14:31:53
Kannst du mir deine Lösung etwas offenlegen ;-)


Na klar doch.

Im Grunde ist es bloß eine Umsetzung von dem dieses Tutorials hier:
https://haus-automatisierung.com/nodered/2017/12/13/node-red-tutorial-reihe-part-4-verbindung-fhem.html
Ich glaube hexenmeister hat das entsprechende YT-Video dazu ja auch schon hier gepostet.

Das man einen laufenden MQTT-Server und eine dazu passende Broker-Verbindung zu FHEM hat sehe ich mal als gegeben

Zunächst benötigt man dazu zwei zusätzliche Userattribute auf dem Global-Device:
attr global userattr mqttName mqttRoom <und das was hier vorher schon stand>

Als nächstes richtet man ein Notify ein, das alle Events von Geräten published, die diese beiden Attribute gesetzt haben:
defmod ntfy_publish_mqtt notify .*:.* {\
my $mqttRoom = AttrVal($NAME, 'mqttRoom', '');;\
my $mqttName = AttrVal($NAME, 'mqttName', '');;\
\
    if ($mqttRoom ne '' && $mqttName ne '') {\
        my $reading = "";;\
        my $message = "";;\
\
        if ($EVENT =~ qr/(.*?): (.*)/p) {\
            $reading = $1;;\
            $message = $2;;\
        } else {\
            $reading = "state";;\
            $message = $EVENT;;\
        }\
\
        my $topic = "/$mqttRoom/$mqttName/$reading";;\
\
        fhem("set Mosquitto publish $topic $message");;\
    }\
}


Damit wäre die Kommunikation von FHEM in Richtung Node-REd schonmal startklar.

Für die andere Richtung benötigt man ein zusätzliches MQTT_DEVICE welches die Kommandos von NR empfängt
und ein weiters Notify welches diese ausführt:

defmod SYS_MQTT MQTT_DEVICE
attr SYS_MQTT userattr subscribeReading_cmnd
attr SYS_MQTT DbLogExclude .*
attr SYS_MQTT IODev Mosquitto
attr SYS_MQTT alias MQTT-Command
attr SYS_MQTT group Dienste
attr SYS_MQTT icon mqtt_device
attr SYS_MQTT room System
attr SYS_MQTT stateFormat Letztes Kommando: cmnd
attr SYS_MQTT subscribeReading_cmnd /Service/fhem/cmnd


defmod n_SYS_MQTT_cmnd notify SYS_MQTT:cmnd:.* {\
if ($EVENT =~ qr/.*?: (.*)/p) {\
        my $cmnd = $1;;\
        fhem($cmnd);;\
    }\
}


Und nun ein paar dazu passende Nodes:
Hier ein Schieberegler, der ein Homematic-Thermostat regelt
[[{"id":"49c5d0bf.e83b4","type":"mqtt in","z":"4908d1e9.14cae","name":"Zieltemperatur, Wohnzimmer","topic":"/OG/Wohnzimmer/Heizung/desired-temp","qos":"2","broker":"b0a683bf.368fb","x":140,"y":120,"wires":[["8342fd3f.af6d7","113b53a8.f839fc"]]},{"id":"8342fd3f.af6d7","type":"ui_slider","z":"4908d1e9.14cae","name":"Zieltemperatur, Slider","label":"","group":"12eafd47.715883","order":3,"width":"6","height":"1","passthru":false,"topic":"set HM_5AD3D3_Clima desired-temp ","min":"12","max":"30","step":"0.5","x":400,"y":120,"wires":[["2f199b9a.6e7e54","113b53a8.f839fc"]]},{"id":"113b53a8.f839fc","type":"ui_text","z":"4908d1e9.14cae","group":"12eafd47.715883","order":2,"width":"6","height":"1","name":"Zieltemperatur","label":"Zieltemperatur","format":"{{msg.payload}}","layout":"col-center","x":600,"y":160,"wires":[],"inputLabels":["Zieltemperatur"]},{"id":"161c33aa.36577c","type":"mqtt out","z":"4908d1e9.14cae","name":"Heizung stellen","topic":"/Service/fhem/cmnd","qos":"2","retain":"false","broker":"b0a683bf.368fb","x":1020,"y":120,"wires":[]},{"id":"5f2cf46f.806f8c","type":"function","z":"4908d1e9.14cae","name":"Aufbau Fhem-CMD","func":"return { payload: msg.topic + msg.payload };","outputs":1,"noerr":0,"x":810,"y":120,"wires":[["161c33aa.36577c"]]},{"id":"2b9861fa.96dc3e","type":"ui_toast","z":"4908d1e9.14cae","position":"top right","displayTime":"3","highlight":"","outputs":0,"ok":"OK","cancel":"","topic":"neue Zieltemperatur","name":"Zieltemperatur","x":1020,"y":80,"wires":[]},{"id":"10763929.3c1587","type":"function","z":"4908d1e9.14cae","name":"Zieltemp. toString","func":"var pl = msg.payload.toString();\nmsg.payload = pl + \"°C\";\nreturn msg;","outputs":1,"noerr":0,"x":810,"y":80,"wires":[["2b9861fa.96dc3e"]]},{"id":"2f199b9a.6e7e54","type":"trigger","z":"4908d1e9.14cae","op1":"","op2":"","op1type":"nul","op2type":"payl","duration":"1500","extend":true,"units":"ms","reset":"","name":"","x":600,"y":120,"wires":[["5f2cf46f.806f8c","10763929.3c1587"]]},{"id":"b0a683bf.368fb","type":"mqtt-broker","z":"","broker":"100.10.1.6","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"12eafd47.715883","type":"ui_group","z":"","name":"Raumklima","tab":"3a31dbc6.b1d4e4","order":1,"disp":true,"width":"6"},{"id":"3a31dbc6.b1d4e4","type":"ui_tab","z":"","name":"Wohnzimmer","icon":"dashboard","order":2}]]

Und ein einfacher Schalter, der ein Fibaro-Wandschalter umschaltet:
[{"id":"49c5d0bf.e83b4","type":"mqtt in","z":"4908d1e9.14cae","name":"Zieltemperatur, Wohnzimmer","topic":"/OG/Wohnzimmer/Heizung/desired-temp","qos":"2","broker":"b0a683bf.368fb","x":140,"y":120,"wires":[["8342fd3f.af6d7","113b53a8.f839fc"]]},{"id":"8342fd3f.af6d7","type":"ui_slider","z":"4908d1e9.14cae","name":"Zieltemperatur, Slider","label":"","group":"12eafd47.715883","order":3,"width":"6","height":"1","passthru":false,"topic":"","min":"12","max":"30","step":"0.5","x":400,"y":120,"wires":[["2f199b9a.6e7e54","113b53a8.f839fc"]]},{"id":"113b53a8.f839fc","type":"ui_text","z":"4908d1e9.14cae","group":"12eafd47.715883","order":2,"width":"6","height":"1","name":"Zieltemperatur","label":"Zieltemperatur","format":"{{msg.payload}}","layout":"col-center","x":600,"y":160,"wires":[],"inputLabels":["Zieltemperatur"]},{"id":"161c33aa.36577c","type":"mqtt out","z":"4908d1e9.14cae","name":"Heizung stellen","topic":"/Service/fhem/cmnd","qos":"2","retain":"false","broker":"b0a683bf.368fb","x":1020,"y":120,"wires":[]},{"id":"5f2cf46f.806f8c","type":"function","z":"4908d1e9.14cae","name":"Aufbau Fhem-CMD","func":"return { payload: \"set HM_5AD3D3_Clima desired-temp \" + msg.payload };","outputs":1,"noerr":0,"x":810,"y":120,"wires":[["161c33aa.36577c"]]},{"id":"2b9861fa.96dc3e","type":"ui_toast","z":"4908d1e9.14cae","position":"top right","displayTime":"3","highlight":"","outputs":0,"ok":"OK","cancel":"","topic":"neue Zieltemperatur","name":"Zieltemperatur","x":1020,"y":80,"wires":[]},{"id":"10763929.3c1587","type":"function","z":"4908d1e9.14cae","name":"Zieltemp. toString","func":"var pl = msg.payload.toString();\nmsg.payload = pl + \"°C\";\nreturn msg;","outputs":1,"noerr":0,"x":810,"y":80,"wires":[["2b9861fa.96dc3e"]]},{"id":"2f199b9a.6e7e54","type":"trigger","z":"4908d1e9.14cae","op1":"","op2":"","op1type":"nul","op2type":"payl","duration":"1500","extend":true,"units":"ms","reset":"","name":"","x":600,"y":120,"wires":[["5f2cf46f.806f8c","10763929.3c1587"]]},{"id":"b0a683bf.368fb","type":"mqtt-broker","z":"","broker":"100.10.1.6","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""},{"id":"12eafd47.715883","type":"ui_group","z":"","name":"Raumklima","tab":"3a31dbc6.b1d4e4","order":1,"disp":true,"width":"6"},{"id":"3a31dbc6.b1d4e4","type":"ui_tab","z":"","name":"Wohnzimmer","icon":"dashboard","order":2}]

IntelNUC
-Fhem 5.8 in Ubuntu 16.04-Container
-dbLog & configDB auf Postgres-DB

Master_Nick

#33
 ;D ;D Ich gebe zu ich hatte mich versucht mit einigen Tutorials an Node-RED zu bringen - hatte da aber völlig falsche Verwendungszwecke innerhalb der Tutorials, so das es sich nicht adaptieren ließ (Websocket - http und wer weiß was.. völlig verrant).

Habe jetzt meine ersten Dinge fertig und es ist ja unglaublich flach und einfach gehalten (man kann es natürlich auch voll pumpen mit Kram). Aber im eigentlich reichen 4 Nodes (MQTT Input -> JSON -> switch -> MQTT Output) für einen simplen Schalter mit MQTT.

Bin sehr zufrieden und werde nun nach und nach alle devices mittels der hier im Forum oder schon in FHEM angebotenen Wege an den MQTT Broker bringen und dann ist die Visualisierung in Node-Red ein Klacks.

Hier mal ein super minimalistisches Beispiel (der erste in Betrieb genommene SonOff S20) der UI die Node-RED am Handy oder aber auch am Touchscreen bereitstellt :D.
Und die Config die dafür in Node-RED gemacht werden muss (gut der Broker muss auch einmal angelegt werden und der Raum braucht einen Namen und die Gruppe)

Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Darrol

#34
Zitat von: Master_Nick am 07 Februar 2018, 15:19:31
Habe jetzt meine ersten Dinge fertig und es ist ja unglaublich flach und einfach gehalten (man kann es natürlich auch voll pumpen mit Kram). Aber im eigentlich reichen 4 Nodes (MQTT Input -> JSON -> switch -> MQTT Output) für einen simplen Schalter mit MQTT.

Yup und v.a. kann man superschnell per copy/paste ganze Node-Gruppen duplizieren und muss, wenn man richtig voregeabreitet hat, nur noch den Raum- und Gerätenamen anpassen damit die laufen.
So hat man im Handumdrehen für alle Räume eine Dashboard-Seite eingerichtet.

Knifflig wird es allerdings wenn man xy-chart aus dem fhem-db-log füttern möchte. Die sind nämlich darauf ausgerichtet erstmal selbst Daten zu sammeln anstatt einfach einen vollständigen Datensatz darzustellen.

Hier eine Node-Kette zum darstellen eines Temperaturplots über die Vergangenen 24h:
[{"id":"134e6bc.9411a94","type":"postgres","z":"4908d1e9.14cae","postgresdb":"","name":"Fhem-Datenbank","output":true,"outputs":1,"x":370,"y":720,"wires":[["fb2198d8.03ff28","7c6a0d59.71e564"]]},{"id":"89378517.545228","type":"inject","z":"4908d1e9.14cae","name":"Datenselektion","topic":"Query Luftfeuchtigkeit","payload":"select timestamp as x, value::float as y1 from public.history  where device='ESP_Wohnzimmer' and reading='Temperatur'  order by timestamp desc limit 576","payloadType":"str","repeat":"150","crontab":"","once":true,"x":120,"y":720,"wires":[["134e6bc.9411a94"]]},{"id":"e9adfacc.187088","type":"ui_chart","z":"4908d1e9.14cae","name":"Verlauf Temperatur","group":"3dfb78a5.81ceb8","order":0,"width":"0","height":"0","label":"Verlauf Temperatur","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"bezier","nodata":"Lade Daten","dot":false,"ymin":"10","ymax":"30","removeOlder":"24","removeOlderPoints":"576","removeOlderUnit":"3600","cutout":0,"useOneColor":false,"colors":["#ff0000","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"useOldStyle":false,"x":930,"y":720,"wires":[[],[]],"outputLabels":["O",""]},{"id":"fb2198d8.03ff28","type":"function","z":"4908d1e9.14cae","name":"SQL-Output zu Chart-Array","func":"// name of the time column values:\nvar tcol = \"x\";\n// list of columns to be charted:\nvar cols = [\"y1\"];\n\n// iterate over each column of the query results\nvar data = cols.map(function(col) {\n    // iterate over each row of the query results\n    var vals = msg.payload.map(function(row) {\n        // return a data point for each col\n        return [ +row[tcol], +row[col] ];\n    });\n\n    // return data object for each line on the chart\n    return { key: \"Temperatur\", values: vals };\n});\n\n// now put the new chart data in the payload\nmsg.payload = data;\nreturn msg;","outputs":1,"noerr":0,"x":660,"y":720,"wires":[["e9adfacc.187088","d65dc628.33a998"]]},{"id":"d65dc628.33a998","type":"debug","z":"4908d1e9.14cae","name":"plotdata","active":true,"console":"false","complete":"payload","x":900,"y":760,"wires":[]},{"id":"7c6a0d59.71e564","type":"debug","z":"4908d1e9.14cae","name":"db-Output","active":true,"console":"false","complete":"payload","x":600,"y":760,"wires":[]},{"id":"3dfb78a5.81ceb8","type":"ui_group","z":"","name":"Zeitlinie","tab":"3a31dbc6.b1d4e4","order":4,"disp":true,"width":"6"},{"id":"3a31dbc6.b1d4e4","type":"ui_tab","z":"","name":"Wohnzimmer","icon":"dashboard","order":2}]

Man muss dazu das Array aus der Datenbank in einen Haufen einzelner Datenpunkte(Arrays) zerlegen.
Dafür hab ich diesen Codeschnipsel hier gefunden:
// name of the time column values:
var tcol = "x";
// list of columns to be charted:
var cols = ["y1"];

// iterate over each column of the query results
var data = cols.map(function(col) {
    // iterate over each row of the query results
    var vals = msg.payload.map(function(row) {
        // return a data point for each col
        return [ +row[tcol], +row[col] ];
    });

    // return data object for each line on the chart
    return { key: "Temperatur", values: vals };
});

// now put the new chart data in the payload
msg.payload = data;
return msg;

Der ist glaube ich auch nicht postgres-spezifisch.


IntelNUC
-Fhem 5.8 in Ubuntu 16.04-Container
-dbLog & configDB auf Postgres-DB

Master_Nick

Sehr sexy!  ;)

Das kann ich direkt mal schauen wie ich das umsetze.

Temp und Hygro hab ich in jedem Raum.

Du sprichst von Datenbank? Du machst also kein FileLog? :-D Oder welche Datenbank meinst du?
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Darrol

Zitat von: Master_Nick am 08 Februar 2018, 21:57:22

Du sprichst von Datenbank? Du machst also kein FileLog? :-D Oder welche Datenbank meinst du?

Genau das.
Ich nutze sowohl configDB als auch DbLog in einer Postgres-Datenbank.

Gesendet von meinem YD201 mit Tapatalk
IntelNUC
-Fhem 5.8 in Ubuntu 16.04-Container
-dbLog & configDB auf Postgres-DB

Master_Nick

Ich gestehe ich bin bei beidem noch oldschool.  :-\
Aber muss jetzt eh einmal alles umziehen da neue Hardware.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Master_Nick

#38
Auf das DbLog bin ich noch immer nich geswitched aber ich habe mittels der MQTT Generic Bridge nun meiner Thermostate schon mal (lesend) drin.

Unfassbar einfach ist das mit Node-Red.


Ich denke, wenn ich einen guten Stand habe, kann ich mal eine Doku schreiben von der Installation von Node-Red über die Nutzung mit der MQTT Generic Bridge (https://forum.fhem.de/index.php/topic,81418.0.html) und normalen MQTT Devices. :-)

*Edit* Man kann die Finger nicht von lassen ;-) Hab es erweitert.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

hexenmeister

Sieht gut aus! Postest Du für Nachahmer Nodes-Export?
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Master_Nick

Klar kein Thema hier dann also die fertig gestellte "Klima" Seite

Siehe Anhang - es war einfach zu viel für in den Post  8)
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Shojo

Habe mal eben was für mein Handy fertig gemacht....
FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

Master_Nick

Auch eine gute Idee spart man 2 Elemente indem man den einen Kringel da nimmt - welcher ist das? ;-) Donut?
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Shojo

FHEM auf: Shuttle PC (x64) (Docker)
Bridge: SignalESP 433mHz, ConBee (deCONZ in Docker)
Rest: ESP8266, SONOFF, Sonos, Echo Dot, Xiaomi Vacuum (root), ESP RGBWW Wifi Led Controller, Node-RED, LEDMatrix, Pixel It

Master_Nick

Ah da war ich vor kurzem auch mal drüber gehuscht :-D

Jo sieht gut aus - mal sehen ;-D
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)