Hallo zusammen, ich habe mir für den Einstieg in die ZigBee-Welt einen ConBee und einen Aqara-Switch geholt.
Die Einbindung über zigbee2mqtt habe ich (Dank der Anleitungen) recht reibungslos hinbekommen. Bei Betätigung liefert der Schalter im Log auch:
2022-11-30 18:00:10 MQTT2_DEVICE MQTT2_zigbee_gw log_message: MQTT publish: topic 'zigbee2mqtt/0x00158d0008749a9e', payload '{"action":"single","battery":100,"click":"single","device_temperature":28,"linkquality":255,"power_outage_count":9,"voltage":3195}'
Soweit erstmal alles i.O.. Jetzt zum DOIF. Meine Idee war mit Einzelklick ein Gerät und mit Doppelklick ein zweites Gerät zu schalten, aber ich scheitere schon beim ersten.
([switch:action] eq "single" and [switch:click] eq "single")
(set Licht1 toggle)
schaltet die Lampe genau einmal, danach bleiben die Readings beim nächsten Einzelklick ja unverändert. Workaround mit Einzelklick ein- und Doppelklick ausschalten ist zwar möglich, aber nicht elegant
([switch:action] eq "single" and [switch:click] eq "single")
(set Licht1 on)
DOELSE
([switch:action] eq "single" and [switch:click] eq "double")
(set Licht1 off)
Leider hilft mir auf den ersten Blick event-on-update-reading auch nicht weiter, weil die Readings nicht neu gesetzt werden. Ist das auf diesem Weg überhaupt lösbar oder brauche ich einen anderen Ansatz?
Vielen Dank im Voraus für alle Meinungen.
Meine Empfehlung:
Event-on-xxx Attribute vorübergehend löschen
Event-Monitor mit Filter auf den Switch aufrufen
Den Schalter nach Gusto betätigen (single,double,triple whatever)
Direkt aus der gewünschten EventZeile die DOIF definition anzeigen lassen und wenn's passt in dein DOIF übernehmen.
Da der Switch ja mehrmals das gleiche senden kann (single,single,...) geht das nur über Event-Steuerung im DOIF. Das wird vom Eventmonitor aber passend erstellt.
Die event-on-xxx Attribute sind FILTER, es werden dadurch keine Events erzeugt, sondern nur durchgelassen oder eben nicht. Für das Switch-Event bräuchtest du dann event-on-update-reading, falls irgendwelche anderen gesetzt sind.
Viel Erfolg!
Sany
Zum toggeln müsste das Attribut do auf always gesetzt werden, da bei doif der gleiche Pfad erst nach Wechsel zu einem anderen Pfad (else) wieder getriggert wird.
Bei do always wird bei jedem Event ausgelöst.
Zitat von: Sany am 30 November 2022, 19:12:05
Direkt aus der gewünschten EventZeile die DOIF definition anzeigen lassen und wenn's passt in dein DOIF übernehmen.
Das war der entscheidende Punkt!
ein so erstelltes notify
MQTT2_zigbee_gw:log_message:.MQTT.publish:.topic.'zigbee2mqtt/0x00158d0008749a9e',.payload.'{"action":"single","battery":.*,"click":"single","device_temperature":.*,"linkquality":.*,"power_outage_count":.*,"voltage":.*}' {fhem("set Licht1 toggle")}
macht genau was es soll.
Aber warum generiert der Schalter selbst keine Events, ich bekomme das nur über das Log des Gateways?
ich kenne zigbee2mqtt nicht, nutze für zigbee das HUEBridge-Modul mit Phoscon/deConz.
Aber das ist ja nicht ganz so wichtig, sondern: Du hast ein Gateway für zigbee2mqtt, gibt es denn auch ein angelegtes Device für den Switch/Taster?
Dann wäre ein list hilfreich, evtl. noch die Ausgabe vom Eventmonitor, während der Taster bedient wird (mit Info was gemacht wurde).
Und dann wolltest Du was mit DOIF machen, da helfe ich Dir gern, nur jetzt ists irgendwie ein notify geworden, da wär ich dann raus....keine Erfahrungen mehr.
Gruß
Sany
Ich habe (wegen Tasmota.Steckdosen und Shelly) auf MQTT gesetzt, daher hab ich den ConBee gleich mit zigbee2mqtt angebunden und Phoscon gar nicht probiert
das list sieht so aus:
Internals:
CFGFN
CID zigbee_0x00158d0008749a9e
DEF zigbee_0x00158d0008749a9e
FUUID 63866752-f33f-6cf2-9580-cec99503df4ea7c4
IODev MQTT2_FHEM_Server
LASTInputDev MQTT2_FHEM_Server
MQTT2_FHEM_Server_CONN MQTT2_FHEM_Server_127.0.0.1_42212
MQTT2_FHEM_Server_MSGCNT 89
MQTT2_FHEM_Server_TIME 2022-12-02 19:06:25
MSGCNT 89
NAME MQTT2_zigbee_0x00158d0008749a9e
NR 196068
STATE Click: single Action: single
TYPE MQTT2_DEVICE
eventCount 87
Helper:
DBLOG:
action:
logdb:
TIME 1669998371.49434
VALUE single
attrTemplateVersion:
logdb:
TIME 1669825431.87089
VALUE 20201208
battery:
logdb:
TIME 1669808228.32632
VALUE 100
batteryPercent:
logdb:
TIME 1670004385.0351
VALUE 100
batteryVoltage:
logdb:
TIME 1670004385.0351
VALUE 3.175
batterymV:
logdb:
TIME 1670004385.0351
VALUE 3175
click:
logdb:
TIME 1669998371.49434
VALUE single
device_temperature:
logdb:
TIME 1670004385.0351
VALUE 27
linkquality:
logdb:
TIME 1670004385.0351
VALUE 255
power_outage_count:
logdb:
TIME 1670004385.0351
VALUE 9
state:
logdb:
TIME 1669753724.78144
VALUE attrTemplate speechcontrol_general_naming_master_template
voltage:
logdb:
TIME 1669823282.98855
VALUE 3195
JSONMAP:
battery batteryPercent
voltage batterymV
OLDREADINGS:
READINGS:
2022-11-29 21:10:58 IODev MQTT2_FHEM_Server
2022-12-02 17:26:11 action single
2022-11-29 21:10:58 associatedWith MQTT2_zigbee_gw
2022-11-30 17:23:51 attrTemplateVersion 20201208
2022-12-02 19:06:25 batteryPercent 100
2022-12-02 19:06:25 batteryVoltage 3.175
2022-12-02 19:06:25 batterymV 3175
2022-12-02 17:26:11 click single
2022-12-02 19:06:25 device_temperature 27
2022-12-02 19:06:25 linkquality 255
2022-12-02 19:06:25 power_outage_count 9
hmccu:
Attributes:
devicetopic zigbee2mqtt/0x00158d0008749a9e
genericDeviceType switch
icon control_home
jsonMap battery:batteryPercent voltage:batterymV
model zigbee2mqtt_Wireless_Button
readingList $DEVICETOPIC:.* { json2nameValue($EVENT,'',$JSONMAP) }
room MQTT2_DEVICE
stateFormat Click: click Action: action
userReadings batteryVoltage:batterymV.* {ReadingsNum($name,'batterymV',0)/1000}
Bei einem Klick taucht der im ersten Beitrag erwähnte Eintrag im Log auf (single click). Der Test mit dem notify war jetzt der Versuch, erstmal ein Ergebnis zu erhalten. Damit habe ich bei jeder (gleichen) Betätigung ein Event im Log und kann mit dem darauf "spezialisierten" notify darauf reagieren.
Also quasi jeweils ein Notify für "click", eins für "double click", usw.. Funktioniert, ist aber irgendwie nicht elegant ;)
Guten Morgen,
ZitatBei einem Klick taucht der im ersten Beitrag erwähnte Eintrag im Log auf
in welchem Log? das allgemeine Logfile oder im Log vom Gateway?
Ich vermute mal, das MQTT2_zigbee_0x00158d0008749a9e-Device hat kein eigenes Log. Ist aber eigenlich auch zweitrangig.
Im MQTT2_zigbee_0x00158d0008749a9e sehe ich das Reading "action", das hat wohl die richtigen Inhalte.
Jetzt mach den Event-monitor auf und setze den Filter auf MQTT2_zigbee_0x00158d0008749a9e.*. Dann machst Du deine "Tastübungen", also single, double usw. Lass immer ein paar Sekunden Zeit dazwischen, damit Du die Events besser zuordnen kannst. Ausser single etc werde ja noch andere kommen.....
Das ganze dann noch eine Weile ohne Klicks laufen lassen, damit findest Du raus, was noch alles, und in welchem zeitlichem Abstand, kommt. Das ist wichtig bei der Beurteilung, wie man dann später für den Betrieb die event-on-Attribute sinnvoll setzt.
Und aus den Zeilen im Event-Monitor kannst Du Dir dann das DOIF/notify basteln lassen, und zwar auf den entsprechenden Event single/double etc. vom Taster, nicht das lange json vom Gateway.
Poste bitte die Ausgabe vom Event-Monitor.
Gruß
Sany
Hier das gefilterte Event-Log:
2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e linkquality: 144
2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e action: single
2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e power_outage_count: 9
2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e click: single
2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e device_temperature: 28
2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batterymV: 3145
2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batteryPercent: 100
2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batteryVoltage: 3.145
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e linkquality: 255
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e power_outage_count: 9
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e action: double
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e device_temperature: 28
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e click: double
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batterymV: 3145
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batteryPercent: 100
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batteryVoltage: 3.145
2022-12-05 11:39:21 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batterymV: 3145
2022-12-05 11:39:21 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e linkquality: 224
2022-12-05 11:39:21 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e device_temperature: 28
2022-12-05 11:39:21 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e power_outage_count: 9
2022-12-05 11:39:21 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e action: hold
2022-12-05 11:39:21 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batteryPercent: 100
2022-12-05 11:39:21 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batteryVoltage: 3.145
2022-12-05 11:39:22 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batterymV: 3145
2022-12-05 11:39:22 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e linkquality: 236
2022-12-05 11:39:22 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e device_temperature: 28
2022-12-05 11:39:22 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e action: release
2022-12-05 11:39:22 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e power_outage_count: 9
2022-12-05 11:39:22 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batteryPercent: 100
2022-12-05 11:39:22 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e batteryVoltage: 3.145
Die Einträge kommen nur bei Betätigung, sonst passiert nichts.
Schick wäre jetzt eine Logik bei [MQTT2_zigbee_0x00158d0008749a9e:"^action:.*"])
action auswerten und je nach Bedienung verzweigen
Zitat2022-12-05 11:39:08 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e action: single
2022-12-05 11:39:13 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e action: double
2022-12-05 11:39:21 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e action: hold
2022-12-05 11:39:22 MQTT2_DEVICE MQTT2_zigbee_0x00158d0008749a9e action: release
da hast Du ja alles was Du willst.
Zitat[MQTT2_zigbee_0x00158d0008749a9e:"^action:.*"]
das sieht jetzt nach DOIF und Event-Auswertung aus. Hast Du das aus dem Event-Monitor erzeugen lassen?
Bei DOIF-Events brauchst du das .* nicht, der Ausdruck zwischen den "" muss nur "matchen". ^Anfang und Ende$ kannst du begrenzen. Ansonsten gilt: je genauer desto "schärfer" ist der Filter.
Mir ist nicht so ganz klar, was Du jetzt am Ende machen willst, aber beispielhaft könnte gehen:
([MQTT2_zigbee_0x00158d0008749a9e:"^action:.single$"])
(set Licht1 on)
DOELSEIF
([MQTT2_zigbee_0x00158d0008749a9e:"^action:.double$"])
(set Licht1 off)
schaltet bei single-click ein, bei double-klick aus
oder
([MQTT2_zigbee_0x00158d0008749a9e:"^action:.single$"])
(set Licht1 toggle)
DOELSEIF
([MQTT2_zigbee_0x00158d0008749a9e:"^action:.double$"])
(set Licht2 toggle)
schaltet bei single-click die eine Lampe an/aus, bei double-click die andere.
2 Dinge sind jetzt noch wichtig: Wenn Du beim MQTT2_zigbee_0x00158d0008749a9e irgendwelche event-on- Attribute gesetzt hast muss du ziemlich sicher event-on-update-reading für action setzen. Danach wieder mit dem Event-Monitor checken, ob eben auch mehrmals single bzw. double klick einen Event erzeugen.
Beim ersten DOIF-Beispiel schaltest Du eine Lampe an oder aus, es wird also der STATE des DOIF auch von cmd_1 auf cmd_2 etc gewechselt. Mehrmals single-click würde ja nichts bringen, wenn Lampe an ist dann ist sie an. Das DOIF würde so auch nicht nochmals den on-Befehl senden! Es MUSS ein Zustandswechsel erfolgen. Willst Du das anders muss "do always" gesetzt sein. Dann wird jedesmal, auch bei gleichen klicks, das DOIF abgearbeitet.
Für da 2te Beispiel muss "do always" gesetzt sein. Hier machen die 2 Zweige im DOIF eigentlich völlig unabhängig das jeweilige Licht an oder aus. Der Zustand des DOIF ist im Prinzip unwichtig.
Die Beispiele sind ungetestet, bitte die Bedingungen mit dem Event-Monitor vergleichen, ob ich das richtg geschrieben habe.
Ansonsten bitte auch die Anleitung vom DOIF studieren. Ettliches, was ich hier geschrieben habe, ist dort gut erklärt, auch mit vielen beispielen. Und um reinzukommen gerne auch mal damit rumspielen und verschiedene Dinge ausprobieren. Mit einem Taster und ner Lampe kann ja auch nix passieren
Zu den Attributen für das MQTT2_zigbee_0x00158d0008749a9e:
wenn das alles ist, was Du im Event-Monitor gezeigt hast, würde ich:
event-on-change-reading batteryPercent
event-on-update-reading action
setzen. Den Rest braucht man wohl eher nicht.
Und dann doch mal den Event-Monitor ein paar Stunden zuschauen lassen. Kann irgendwie nicht glauben, dass da nur bei Tastendruck was gesendet wird. Sollte z.B. BatteryPercent so alle Stunde kommen könnte man das auch als "Lebenszeichen" auswerten.
Viel Erfolg!
Sany
@Sany: Erstmal vielen Dank für deine Hilfe! Ich hab jetzt eine gute Grundlage für weitere Umsetzungen :)
Realisert hab ich erstmal:
([MQTT2_zigbee_0x00158d0008749a9e:"^action:.single$"])
(set WZ_Licht1 toggle)
DOELSEIF
([MQTT2_zigbee_0x00158d0008749a9e:"^action:.double$"])
(set MQTT2_DEV_192 toggle)
DOELSE
([MQTT2_zigbee_0x00158d0008749a9e:"^action:.hold$"])
(set MQTT2_DEV_192 off, set MQTT2_DEV_193 off)
Das lange Drücken soll irgendwann mal der "Gute-Nacht-Knopf" werden, aber das ist dann nur noch Fleißarbeit....
Wichtig war die Erkenntnis, dass sich 3 verschiedene Aktionen über einen Schalter mit einem einzigen DOIF realisieren lassen (nur 3 weil hold/release quasi eine Aktion ist)
hast Du das "hold" schon probiert?
Geht vermutlich nicht.
Warum?
Nach DOELSE kommt nur noch ein Ausführungsbefehl, keine Bedingung mehr. Hast Du mal ins Log geschaut oder im DOIF selbst, gibts da keine Fehlermeldung?
Schreib ein DOELSEIF und dann passt das.
Gruß
Sany