DOIF auf Userreading eines Devices triggert nicht

Begonnen von OK_DE, 07 April 2023, 00:14:09

Vorheriges Thema - Nächstes Thema

OK_DE

Hallo,

ich hab mir einen Shellyi4 zugelegt und würde nun gerne per DOIF auf die einzelen Taster reagieren können.
Problem das DOIF wird nicht ausgelöst und ich komme nicht drauf woran es liegt.
Vielleicht habt ihr eine Lösung.

Zum Shellyi4 Device:
====================
Bei Betätigen einer der 4 angeschlossenen Taster werden zwei Readings gefüllt, .._id ist die Tasternummer "0..3" und .._event gibt "single_push" oder "double_push" zurück.
params_events_1_event single_push
params_events_1_id 1

Daraus mache ich mittels dem Attribut userreading für jeden Taster einen userreading (button_0 bis button_3)
userReadings
button_0 {if(ReadingsVal($name,"params_events_1_id","")==0){ReadingsVal($name,"params_events_1_event","")}},
button_1 {if(ReadingsVal($name,"params_events_1_id","")==1){ReadingsVal($name,"params_events_1_event","")}},
button_2 {if(ReadingsVal($name,"params_events_1_id","")==2){ReadingsVal($name,"params_events_1_event","")}},
button_3 {if(ReadingsVal($name,"params_events_1_id","")==3){ReadingsVal($name,"params_events_1_event","")}}

Die Userreadings sehen dann so aus (drei sind "" und einer enthält das letzte push event)
button_0
button_1 single_push
button_2
button_3

Ein event soll nur bei einer Änderung der 4 Userreadings erfolgen
event-on-change-reading button_0, button_1, button_2, button_3
___________________________

Nun zum DOIF:
define EG_TREPPENHAUS_TASTER_1_DOIF DOIF ([EG_TREPPENHAUS_TASTER:button_1] =~ "single_push") (set GARTEN_WEG_BELEUCHTUNG on, { Log 1, "Gartenweg an" }) DOELSEIF ([EG_TREPPENHAUS_TASTER:button_1] =~ "double_push") (set GARTEN_WEG_BELEUCHTUNG off, { Log 1, "Gartenweg aus" })

Leider wird nie die Beleuchtung an-/abgeschaltet oder ein Logfile Eintrag erstellt.

Habt ihr eine Idee wo mein Denkfehler liegt.
   




Adimarantis

Raspberry 4 + HM-MOD-RPI-PCB (pivCCU)/RfxTrx433XL/Zigbee
Module: 50_Signalbot, 48_HomeConnect, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Sany

Zitat von: OK_DE am 07 April 2023, 00:14:09Habt ihr eine Idee wo mein Denkfehler liegt.
da sind vermutlich mehrere Denkfehler drin.... :)

so wie Du das angegeben hast würden die userReadings bei JEDEM Event vom Shelly ausgeführt (also nochmal 4  Events dazu..), allerdings im Moment GAR NICHT, da Du event-on-change-readings auf die 4 zu erzeugenden Readings gesetzt hast.
damit ein userReadings ausgeführt wird braucht es aber einen Event.
event-on-change-reading (und seine Verwandten event-on-update-reading, event-min-interval) sind FILTER, Du kannst damit nur Events einschränken. Sobald eines dieser Attribute gesetzt ist gibts nur noch Events, die durch diesen Filter durchkommen, alle anderen werden nicht durchgelassen!
Nächster Fehler zu userreadings: in der cref steht: A comma-separated list of definitions of user-defined readings
da steht nix von Leerzeichen (siehe auch https://forum.fhem.de/index.php?topic=132829.0) Es würde nur button_0 durchgelassen, die anderen ignoriert.

Vorschlag: die userreadings mit einem Trigger versehen, das kann z.B. params_events_1_event sein:

userReadings
button_0:params_events_1_event.* {if(ReadingsVal($name,"params_events_1_id","")==0){ReadingsVal($name,"params_events_1_event","")}},
button_1:params_events_1_event.* {if(ReadingsVal($name,"params_events_1_id","")==1){ReadingsVal($name,"params_events_1_event","")}},
button_2:params_events_1_event.* {if(ReadingsVal($name,"params_events_1_id","")==2){ReadingsVal($name,"params_events_1_event","")}},
button_3:params_events_1_event.* {if(ReadingsVal($name,"params_events_1_id","")==3){ReadingsVal($name,"params_events_1_event","")}}

event-on-change-reading params_events_1_event 
event-on-update-reading button_ .*

Vorausgesetzt params_events_1_id und params_events_1_event kommen gleichzeitig, dann bekommst Du bei Druck auf einen Taster nur dessen Event aus button_X. Die Readings button_ werden, nachdem alle Taster mal gedrückt wurden, immer nur single oder double annehmen, auch mehrmals hintereinander, aber jedesmal ein Event senden. Deshalb dann im DOIF keine Vergleichsabfrage machen, sondern auf den Event triggern (siehe cref zu DOIF Ereignis-steuerung).
Dazu öffnest Du den Event-monitor, setzt den Filter auf den Shelly und drückst die Taster. Dann kannst Du (wie im Wiki zu event-monitor ausführlich beschrieben) eine der Zeilen mit dem gewünschten Event markieren und Dir direkt das DOIF (oder notify oder Filelog....) erzeugen lassen oder zumindest die Definition kopieren und in Dein eigenes DOIF einfügen.
Es würde auch gehen, aus den beiden params-events Readings nur ein userreading zu erzeugen, was aus den Inhalten zusammengesetzt wird, also z.B. ein Reading "button" was dann mit single_push_1 oder double_push_0 gefüllt wird und Du auf diese Events im DOIF triggerst.
Probier da mal eine wenig rum. Und bitte dann vollständige lists posten, nicht nur Teildefinitionen,Danke.


Viel Erfolg!


Sany
fhem als LXC auf Proxmox auf einem minix Z100 , weitere LXC mit ZigBee2MQTT, MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

OK_DE

#3
Danke an die Tippgeber.

Hier die funktionierende Lösung falls es jemand brauchen kann.

Shelly in ShellyApp anlernen und Eingänge von Default Schalter auf Taster Betrieb stellen.
In Shelly App MQTT freischalten.
MQTT Server muss bereits in FHEM eingebunden sein.
In FHEM den Shelly per Autocreate anlegen lassen.
attrTemplate im Webinterace auf shellyPlus_i4 stellen -> Passende readingList wird dann automatisch erzeugt.

Die Definitionen für das Shelly i4 Device.
Statusanzeige wie nachfolgend anpassen, dann wird folgendes angezeigt wenn der zweite Eingang des Shellys einmal betätigt wurde. "button_1 : single_push":
attr DEVICENAME stateFormat {"button_".ReadingsVal($name,"params_events_1_id","")." : ".ReadingsVal($name,"params_events_1_event","")}

Nur auf Änderungen der folgenden Readings reagieren.
attr DEVICENAME event-on-change-reading params_events_1_event,button_1,button_2,button3_button_4

Nachfolgend legen wir 4 Userreadings an und befüllen sie mit den passenden Events.
Wir reagieren hier nur auf Events die mit push aufhören da die Implementierung des Shellys hier nicht ganz sauber ist und er wie beim Schalterbetrieb auch BTN_up und BTN_down für Schalter oben und Schalter unten zusätzlich sendet.
Das userreading befüllt nur den als letzten gedrückten button mit single_push oder double_push. Die anderen button_... werden "" gesetzt.
attr DEVICENAME userReadings button_0:params_events_1_event.*push {if(ReadingsVal($name,"params_events_1_id","")==0){ReadingsVal($name,"params_events_1_event","")}},\
button_1:params_events_1_event.*push {if(ReadingsVal($name,"params_events_1_id","")==1){ReadingsVal($name,"params_events_1_event","")}},\
button_2:params_events_1_event.*push {if(ReadingsVal($name,"params_events_1_id","")==2){ReadingsVal($name,"params_events_1_event","")}},\
button_3:params_events_1_event.*push {if(ReadingsVal($name,"params_events_1_id","")==3){ReadingsVal($name,"params_events_1_event","")}}


Das DOIF für einen Beispiel Taster
Hier wird der zweite Tastereingang am Shelly ausgewertet. Bei einer einfach Betätigung -> ein bei zweifach Betätigung -> aus
Für die anderen 3 Buttons entsprechende DOIFs erzeugen.
define DEVICENAME_BUTON_1_DOIF DOIF ([DEVICENAME:button_1] =~ "single_push") ({ Log 1, Zu schaltenes Device an" }) DOELSEIF ([DEVICENAME:button_1] =~ "double_push") ({ Log 1, "Zu schaltenes Device aus" })