DOIF und Aqara Zigbee Mini Switch (Logik und Readings-Problem)

Begonnen von pcbastler, 30 November 2022, 18:19:25

Vorheriges Thema - Nächstes Thema

pcbastler

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.


Sany

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
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Nighthawk

#2
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.

pcbastler

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?

Sany

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

fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

pcbastler

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 ;)

Sany

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
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

pcbastler

#7
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

Sany

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
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

pcbastler

@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)

Sany

#10
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
fhem auf Zotac ZBox nano als LXC auf Proxmox, weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....