MQTT - Homenatic-Schalter: nur geänderten Status on off übertragen

Begonnen von aisberg, 16 September 2018, 02:32:04

Vorheriges Thema - Nächstes Thema

aisberg

Also irgendwie bekomme ich es nicht, meine Homematic-Schalter mit MQTT richtig kommunizieren zu lassen.
über eine MQTT_BRIDGE habe ich definiert:
attr MQTT_licht_aussen publishReading_state fhem/licht/aussen/reading/state
dabei werden beim Schalten aber immer gleich zwei Nachrichten hintereinander übertragen:
set_on
on

set_off
off

set_toogle
on oder off, je nachdem

Wie kann ich nur den geänderten Status übertragen, ohne das vorhergehende Kommando?
Mein Problem: der "Empfänger" interpretiert offenbar alles, was nicht "on" ist als "off". Somit bewirkt jede Schaltung (jedes Kommando) ein "off" am Empfänger.

Ich habe zusätzlich auch das hier definiert:
attr MQTT_licht_aussen publishReading_state fhem/licht/aussen/reading/state
weil ja der state auch als Reading bereitgestellt wird. Mit dieser Definition wird aber gar nichts an den Broker übertragen. Warum nicht, verstehe ich nicht. Bei einem Bewegungssensor funktioniert es analog:
attr MQTT_BewegungV publishReading_brightness fhem/bewegung/vorhof/reading/brightness


hexenmeister

'set_' voran zu stellen, ist eine Homematic Eigenschaft. Wenn Befehl bestätigt wird, steht dann der Wert ohne 'set_' da. Das muss man dann eben vor dem senden entsprechend anpassen. Z. B. mit Hilfe von userReadings etc. Sonst verstehe ich dein Problem nicht wirklich, da du leider nicht wirklich beschrieben hast, was du eigentlich vor hast. Was ist der Schalter, was solle er schalten, warum deine erste zwei codeblöcke gleich sind, du aber anscheinend ein unterschiedliches Verhalten erwartest...
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

aisberg

Mein Ziel:
Austausch der Information von HomeMatic-Geräten, die über FHEM gesteuert werden, mit hassio, dass ich testweise unter anderem aufgesetzt habe, weil da auch eine Anbindung an Google Assistent enthalten ist.
Ich habe von HomeMatik:
Unterputzschalter, schaltbare Steckdosen, Bewegungsmelder

Für den Austausch zwischen fhem und hassio ist mir nichts besseres eingefallen, als MQTT. Da könnte ich auch mal mit node red experimentieren usw.
Von MQTT hatte ich zuvor keine Ahnung und taste mich da nun langsam ran. Zum Überwachen der ausgetauschten Nachrichten habe ich MQTT.fx installiert.

Die Übertragung von Readings der Bewegungsmelder von fhem zu hassio funktioniert gut und wie erwartet.
Die Übertragung eines Befehls an fhem zum Statuswechsel kann ich mit MQTT.fx gut simulieren, scheint auch zu funktionieren. Ich habe definiert:
attr MQTT_licht_aussen subscribeSet fhem/licht/aussen/state/set
und kann an dieses topic on oder off schicken, und das kommt in fhem an und schaltet die Schalter.

Nun brauche ich auch eine Möglichkeit, den Status der Schalter und Steckdosen an hassio zu übertragen.
Dort gibt es u. a. https://www.home-assistant.io/components/switch.mqtt/ um mit MQTT zu kommunizieren. Neben switch gibt es da aber auch light, sensor, binary_sensor
der Switch als Gegenstück scheint mir sinnvoll, vielleicht aber auch light. Und ich sehe gerade, dass es da auch ein value_template gibt. Vielleicht kann ich über dieses nur die on und off abfangen? Dann brauche ich in fhem nichts zu ändern.

Irgendwie bin ich von fhem sehr verwöhnt: Man ändert etwas on the fly, es wird sofort angewendet.

hassio muss man wegen fast jeder Änderung neu starten, was mehrere Minuten dauert.

Allerdings finde ich die Unterstützung von Google Assistent und das schnelle Finden von Geräten ohne groß zu programmieren, toll. Google Home Minis, Chrome Casts, Xiaomi Aquara Sensoren und Schalter, Yeelight Lampen - war fast alles sofort da, dazu noch ein Netzwerk-Drucker und ein Musik-Center. So ganz "magic like". Also ich war nach dem ersten Einschalten schon recht buff. Aber nun beginnt eben auch dort die Kleinarbeit, und ich weiß noch nicht, ob das letztendlich einfacher wird, als in fhem. fhem habe ich vor ein paar Jahren aufgesetzt, es lief und läuft sehr stabil, aber ich habe inzwischen auch die Feinheiten der Syntax vergessen, wenn ich was ändern will, und tue mich da schwer. Mit Phyton wollte ich mich schon immer mal beschäftigen, weil ich das auch auf meiner Arbeit für Machine Learning verwenden könnte, da ist also die Motivation bei mir größer, als bei Perl.

Mit fhem gab es mit neuen Komponenten ein paar Probleme: Das Xiaomi Gateway habe ich nicht eingebunden bekommen, danach reagierte fhem nicht mehr und musste immer zurückgesetzt werden. Und auch mit den Yeelight Lampen war es nicht so einfach, wie mit hassio, funktioniert aber inzwischen. Darum nun mal der Blick über den Tellerrand von fhem hinaus :-)

hexenmeister

#3
Moin!
Die Motivation verstehe ich. Es gibt auch Leben außerhalb von FHEM ;D. Ich selbst verwende auch mehrere FHEM-Instanzen parallel und aucheine NodeRED. Alles spricht miteinander über MQTT. Denke das ist keine so schlechte Wahl. Von HomeAssistant habe ich mal gehört und sogar etwas länger her schon mal kurt angeschaut, weiß jedoch nicht mehr, was mir da nicht gefallen hat. Kann Dir an der Seite leider nicht weiter helfen.

Auf der FHEM-Seite würde ich eher zu einer MQTT_GENERIC_BRIDGE (https://fhem.de/commandref_DE.html#MQTT_GENERIC_BRIDGE) greifen, sie ist noch recht neu und sicher noch nicht komplett ferhlerfrei, funktioniert aber ganz passabel. Damit kann man sich die vielen MQTT_BRIDGES sparen und MQTT-Anbindung direkt in den eingentlichen FHEM-Geräten zu konfigurieren.

Das Problem mit 'set_on' bleibt natürlich bestehen.

Eine mögliche Lösung wäre mit Hilfe von eventMap die 'state' etwas zu 'optimieren'. Zugegebenermaßen sieht etwas nach Hexerei aus ;D

Mein Test mit einem Dummy:
defmod testDummySetOn dummy
attr testDummySetOn eventMap { usr=>{'set_on'=>'on','set_off'=>'off'}, fw=>{'set_on'=>'on','set_off'=>'off'} }
attr testDummySetOn setList set_on set_off
attr testDummySetOn webCmd on:off


Eine andere Möglichkit bietet Attribut userReadings. Damit wird ein neuer Reading angelegt, jetzt mit dem gefilterten Wert. Diesen kannst Du dann per MQTT weiter reihen.

Test-Code:
defmod testDummySetOn dummy
attr testDummySetOn readingList value
attr testDummySetOn setList value set_on set_off
attr testDummySetOn stateFormat value
attr testDummySetOn userReadings value {my $nVal = ReadingsVal($name,'state','');;;; $nVal =~ s/set_//g;;;; $nVal}
attr testDummySetOn webCmd set_on:set_off

Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy