mit einem DOIF auf 2 Ereignisse reagieren

Begonnen von Kurt77, 12 Mai 2022, 17:55:56

Vorheriges Thema - Nächstes Thema

Kurt77

Hallo,
ich will erreichen, dass bei Unterschreitung einer Helligkeitsgrenze bei 2 Geräten jeweils die gleiche Aktivität ausgelöst wird.

Code:
-----------------------
(["licht:illuminance_lux",20] < 10)
(Mach irgendwas)
DOELSE
-----------------------
Das kann nicht funktionieren, Weil wenn licht1 auslöst, löst licht 2 erst dann aus, wenn licht1 oder licht 2 >=10.
Wie kann man das Problem lösen?

Danke und Gruß,
Kurt

Damian

Zwei Ereignisse können in FHEM nicht zu einem Zeitpunkt vorkommen. Du musst jeweils die Readings mit Trigger abfragen und mit and verknüpfen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Kurt77

Zitat von: Damian am 12 Mai 2022, 18:19:05
Zwei Ereignisse können in FHEM nicht zu einem Zeitpunkt vorkommen. Du musst jeweils die Readings mit Trigger abfragen und mit and verknüpfen.
Danke, aber ich bin mir nicht sicher, ob Du mich richtig verstanden hast.
Es geht nicht darum, zu einem Zeitpunkt auszulösen, sondern zu verschiedenn Zeitpunkt die gleiche Aktivität durchzuführen.

Danke und Gruß,
Kurt

gestein

Eigenlich müsste es ja gehen, wenn Du im Trigger eine regex für den Device-Namen nimmst.
Also z.B. "licht.*" (oder halt komplexer).

lg, Gerhard

Kurt77

Zitat von: gestein am 12 Mai 2022, 18:34:03
Eigenlich müsste es ja gehen, wenn Du im Trigger eine regex für den Device-Namen nimmst.
Also z.B. "licht.*" (oder halt komplexer).

lg, Gerhard
Hallo Gerhard,
das ist besser, funktioniert aber immer noch nicht vollständig:
Wenn licht1 und licht2 < 10 und danach licht1 > 10, dann löst licht2 erneut aus.

Danke und Gruß,
Kurt

gestein

Dann habe ich Dein Vohaben nicht ganz verstanden.
Könntest Du es vielleicht besser erklären?

Kurt77

Zitat von: gestein am 12 Mai 2022, 21:59:47
Dann habe ich Dein Vohaben nicht ganz verstanden.
Könntest Du es vielleicht besser erklären?
Hallo Gerhard,
ich möchte, dass jedes event, also licht1 oder licht2 < 10, genau einmal ausgelöst wird. Der 2. Auslöser soll nur kommen, wenn zuvor lichtX >= 10 eintritt.
Es besteht keine Abhängigkeit zwischen licht1 und licht2. Ich will die Funktionalität nur in einem DOIF Zusammenfassen. Mit 2 DOIF wäre das sehr einfach.

Danke und Gruß,
Kurt

Kurt77

hallo,
ich versuch's nochmal.
Wo ich eigentlich hin will, ist, dass bei einer Systemerweiterung um licht3 dieses neue Gerät "automatisch" funktionieren würde.
Noch irgendwelche Ideen?

Danke und Gruß,
Kurt

Damian

#8
Zitat von: Kurt77 am 13 Mai 2022, 08:56:59
hallo,
ich versuch's nochmal.
Wo ich eigentlich hin will, ist, dass bei einer Systemerweiterung um licht3 dieses neue Gerät "automatisch" funktionieren würde.
Noch irgendwelche Ideen?

Danke und Gruß,
Kurt

Das geht nur im Perlmodus mit Templates. Und selbst da müsste man die Devices angeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

MadMax-FHEM

Zitat von: Kurt77 am 13 Mai 2022, 08:56:59
hallo,
ich versuch's nochmal.
Wo ich eigentlich hin will, ist, dass bei einer Systemerweiterung um licht3 dieses neue Gerät "automatisch" funktionieren würde.
Noch irgendwelche Ideen?

Danke und Gruß,
Kurt

Was genau soll wann passieren?

Also Licht1, Licht2, Licht3, Lichtn müssen ALLE Lux < 10 haben und dann was?

Oder reicht eines davon unter 10 und dann was?

Wenn eines davon dann über 10 geht, dann was?

Wenn alle über 10 sind dann was?

Ich würde (um generisch zu bleiben bzw. bleiben zu können) ein notify auf Licht.:Lum oder auch Licht.*:Lum o.ä. machen.
Und in einer Sub dann per devSpec ein Array mit Licht. oder Licht.* oder was halt "generisch passend ist" die Werte aller Licht. oder Licht.* abfragen und eben entscheiden ob was zu tun ist und wenn ja was und dann ausführen...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Damian

Zitat von: MadMax-FHEM am 13 Mai 2022, 09:36:35
Was genau soll wann passieren?

Also Licht1, Licht2, Licht3, Lichtn müssen ALLE Lux < 10 haben und dann was?

Oder reicht eines davon unter 10 und dann was?

Wenn eines davon dann über 10 geht, dann was?

Wenn alle über 10 sind dann was?

Ich würde (um generisch zu bleiben bzw. bleiben zu können) ein notify auf Licht.:Lum oder auch Licht.*:Lum o.ä. machen.
Und in einer Sub dann per devSpec ein Array mit Licht. oder Licht.* oder was halt "generisch passend ist" die Werte aller Licht. oder Licht.* abfragen und eben entscheiden ob was zu tun ist und wenn ja was und dann ausführen...

Gruß, Joachim

Es ist vieles nicht eindeutig formuliert. Was ich jetzt verstanden habe:

Er will eine generalisierte Definition haben, die mehrere Devices abdeckt mit gleichem Verhalten. Allerdings will er offenbar das, was ja DOIF-FHEM hier also für ein Device macht - ein Gedächtnis einbauen.

Schalte nur ein mal beim Unterschreiben und nur einmal beim Überschreiten, dazu muss man sich pro Device merken, was der letzte Schaltzustand für das jeweilige Device war.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Kurt77

Also noch ein Versuch.

Beide Geräte (licht1 und licht2) sollen sich autark verhalten.
Die Aktivität ist immer "Warnung - Licht aus $DEVICE).
Es soll nur dann einmal ausgelöst werden, wenn Gerät < 10. Das wiederholte Auslösen soll nur dann erfolgen, wenn vorher Gerät >= 10 war. und das, wiegesagt, für jedes Gerät unabhängig von dem jeweils anderen.

Danke und Gruß,
Kurt

MadMax-FHEM

Zitat von: Kurt77 am 13 Mai 2022, 11:37:41
Also noch ein Versuch.

Beide Geräte (licht1 und licht2) sollen sich autark verhalten.
Die Aktivität ist immer "Warnung - Licht aus $DEVICE).
Es soll nur dann einmal ausgelöst werden, wenn Gerät < 10. Das wiederholte Auslösen soll nur dann erfolgen, wenn vorher Gerät >= 10 war. und das, wiegesagt, für jedes Gerät unabhängig von dem jeweils anderen.

Danke und Gruß,
Kurt

Da gibt es bestimmt was von DOIF ;)

Ich würde dann eben meinen Vorschlag mit notify usw. halt anpassen/abändern: $DEVICE ist ja bekannt. Prüfen ob <10 -> Meldung und im notify oder beim $DEVICE (oder auch in einem dummy) merken, dass bereits eine Meldung für $DEVICE erfolgt ist (z.B. setreading notifyName $DEVICE sent / oder auch setreading $DEVICE sent yes) und wenn > 10 eben das Reading wieder löschen oder "zurücksetzen" (z.B. setreading $DEVICE sent no) und halt vor dem jeweiligen Senden prüfen, ob schon gesedet wurde oder eben nicht...

Ist komplett generisch, d.h. solange die Devices vom notify "eingefangen" werden (RegEx dort) und die abzufragenden Readings (bzgl. <10 / >10) gleich heißen...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Sany

Hallo Kurt,

hier mal ein Versuch in fhem-DOIF. Ich habe es hoffentlich verstanden, war ja nicht sooo einfach ;)
Du kannst die die DOIF-Definition und z.B. die licht1 und licht2 Definition per RAW-import anlegen. Alle Devices erscheinen im Raum di_licht. Die Ausgabe erscheint im Log, der command-state des DOIF ändert sich nicht, wenn z.B. licht1 und dann licht2 dunkel werden.
Das DOIF ist generisch aufgebaut, d.h. wenn Du weitere Devices lichtx mit dem selben reading illuminance_lux definierst werden diese auch berücksichtigt. Solltest Du ein Device löschen bleiben die Readings im DOIF erhalten, die musst Du dann von Hand rausnehmen, falls sie stören.

defmod di_licht DOIF (["^licht:^illuminance_lux",20] < 10 and [?$SELF:l_$DEVICE,"dunkel"] eq "hell")\
({Log3 "undef",3,"Warnung - Licht aus $DEVICE"}, setreading $SELF l_$DEVICE dunkel)\
DOELSE\
    (setreading $SELF l_$DEVICE hell)\
\
##licht1 licht2 licht3
attr di_licht do always
attr di_licht room di_Licht

das DOIF triggert auf eine Änderung von illuminance_lux eines beliebigen lichtx devices, vergleicht, ob der Wert < 10 UND das Reading l_lichtx auf hell steht. Nur dann ist der gesamte Ausdruck wahr. Das "hell" in der Abfrage ist ein default-Wert und wird für den Fall gebraucht, dass das Reading noch nicht existiert.

Zum spielen noch 2 lichtx-Devices, die Anzahl kannst Du zum testen dann beliebig erhöhen:
defmod licht1 DOIF ##
attr licht1 event-on-update-reading illuminance_lux
attr licht1 room di_Licht
attr licht1 stateFormat ist: illuminance_lux
attr licht1 uiTable {\
package ui_Table;;\
}\
\
\
widget([$SELF:illuminance_lux],"uzsuToggle,5,15")

setstate licht1 ist: 15
setstate licht1 2022-05-13 16:01:14 cmd 0
setstate licht1 2022-05-13 16:19:07 illuminance_lux 15
setstate licht1 2022-05-13 16:01:14 mode enabled
setstate licht1 2022-05-13 16:01:14 state initialized

defmod licht2 DOIF ##
attr licht2 event-on-update-reading illuminance_lux
attr licht2 room di_Licht
attr licht2 stateFormat ist: illuminance_lux
attr licht2 uiTable {\
package ui_Table;;\
}\
\
\
widget([$SELF:illuminance_lux],"uzsuToggle,8,18")

setstate licht2 ist: 8
setstate licht2 2022-05-13 16:01:14 cmd 0
setstate licht2 2022-05-13 16:18:29 illuminance_lux 8
setstate licht2 2022-05-13 16:01:14 mode enabled
setstate licht2 2022-05-13 16:01:14 state initialized




ein
Zitatdelete TYPE=DOIF:FILTER=room=di_Licht
löscht das DOIF und die lichtx Devices wieder.


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

Damian

Zitat von: Sany am 13 Mai 2022, 16:33:48
Hallo Kurt,

hier mal ein Versuch in fhem-DOIF. Ich habe es hoffentlich verstanden, war ja nicht sooo einfach ;)
Du kannst die die DOIF-Definition und z.B. die licht1 und licht2 Definition per RAW-import anlegen. Alle Devices erscheinen im Raum di_licht. Die Ausgabe erscheint im Log, der command-state des DOIF ändert sich nicht, wenn z.B. licht1 und dann licht2 dunkel werden.
Das DOIF ist generisch aufgebaut, d.h. wenn Du weitere Devices lichtx mit dem selben reading illuminance_lux definierst werden diese auch berücksichtigt. Solltest Du ein Device löschen bleiben die Readings im DOIF erhalten, die musst Du dann von Hand rausnehmen, falls sie stören.

defmod di_licht DOIF (["^licht:^illuminance_lux",20] < 10 and [?$SELF:l_$DEVICE,"dunkel"] eq "hell")\
({Log3 "undef",3,"Warnung - Licht aus $DEVICE"}, setreading $SELF l_$DEVICE dunkel)\
DOELSE\
    (setreading $SELF l_$DEVICE hell)\
\
##licht1 licht2 licht3
attr di_licht do always
attr di_licht room di_Licht

das DOIF triggert auf eine Änderung von illuminance_lux eines beliebigen lichtx devices, vergleicht, ob der Wert < 10 UND das Reading l_lichtx auf hell steht. Nur dann ist der gesamte Ausdruck wahr. Das "hell" in der Abfrage ist ein default-Wert und wird für den Fall gebraucht, dass das Reading noch nicht existiert.

Zum spielen noch 2 lichtx-Devices, die Anzahl kannst Du zum testen dann beliebig erhöhen:
defmod licht1 DOIF ##
attr licht1 event-on-update-reading illuminance_lux
attr licht1 room di_Licht
attr licht1 stateFormat ist: illuminance_lux
attr licht1 uiTable {\
package ui_Table;;\
}\
\
\
widget([$SELF:illuminance_lux],"uzsuToggle,5,15")

setstate licht1 ist: 15
setstate licht1 2022-05-13 16:01:14 cmd 0
setstate licht1 2022-05-13 16:19:07 illuminance_lux 15
setstate licht1 2022-05-13 16:01:14 mode enabled
setstate licht1 2022-05-13 16:01:14 state initialized

defmod licht2 DOIF ##
attr licht2 event-on-update-reading illuminance_lux
attr licht2 room di_Licht
attr licht2 stateFormat ist: illuminance_lux
attr licht2 uiTable {\
package ui_Table;;\
}\
\
\
widget([$SELF:illuminance_lux],"uzsuToggle,8,18")

setstate licht2 ist: 8
setstate licht2 2022-05-13 16:01:14 cmd 0
setstate licht2 2022-05-13 16:18:29 illuminance_lux 8
setstate licht2 2022-05-13 16:01:14 mode enabled
setstate licht2 2022-05-13 16:01:14 state initialized




ein  löscht das DOIF und die lichtx Devices wieder.


Viel Erfolg!


Sany

Ich würde es gleich im Perl-Modus machen, dann spart man sich das do always Attribut, es ist ohne FHEM-Befehle performanter und set_Reading als Perlfunktion ist dafür wie geschaffen. :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Sany

ZitatIch würde es gleich im Perl-Modus machen, dann spart man sich das do always Attribut, es ist ohne FHEM-Befehle performanter und set_Reading als Perlfunktion ist dafür wie geschaffen. :)

da hast Du völlig recht, würde ich auch, da ich nur noch den Perl-Modus nutze. Da Kurt aber nach einer Lösung für sein Problem gesucht hat, was er mit einem fhem-DOIF aufgeschrieben hat, wollte ich das erst mal so machen, damit er damit auch was anfangen kann.

Aber, vielleicht ist es ja noch hilfreich: hier noch die Version in perl-DOIF:
defmod di_licht_perlmode DOIF licht{\
if(["^licht:^illuminance_lux",20] < 10 and get_Reading("l_$device") eq "hell"){\
Log3 "undef",3,"(perlDOIF) Warnung - Licht aus $device";;\
set_Reading("l_$device","dunkel");;\
set_State("cmd_1");;\
} else {\
set_Reading("l_$device","hell");;\
set_State("cmd_2");;\
}\
}\
\
## die beiden Zeilen set_State dienen nur dazu, diese DOIF so aussehen zu lassen, wie das fhem-DOIF.
attr di_licht_perlmode room di_Licht


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

Damian

Zitat von: Sany am 14 Mai 2022, 08:28:32
da hast Du völlig recht, würde ich auch, da ich nur noch den Perl-Modus nutze. Da Kurt aber nach einer Lösung für sein Problem gesucht hat, was er mit einem fhem-DOIF aufgeschrieben hat, wollte ich das erst mal so machen, damit er damit auch was anfangen kann.

Aber, vielleicht ist es ja noch hilfreich: hier noch die Version in perl-DOIF:
defmod di_licht_perlmode DOIF licht{\
if(["^licht:^illuminance_lux",20] < 10 and get_Reading("l_$device") eq "hell"){\
Log3 "undef",3,"(perlDOIF) Warnung - Licht aus $device";;\
set_Reading("l_$device","dunkel");;\
set_State("cmd_1");;\
} else {\
set_Reading("l_$device","hell");;\
set_State("cmd_2");;\
}\
}\
\
## die beiden Zeilen set_State dienen nur dazu, diese DOIF so aussehen zu lassen, wie das fhem-DOIF.
attr di_licht_perlmode room di_Licht


Gruß


Sany

Wenn man schon den Status elegant per set_State setzen kann, dann kann man auch gleich mehr Information reinpacken, z. B. set_State ("$device dunkel") bzw. set_State ("$device hell")
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Kurt77

Danke, ich werde jetzt mal versuchen, Sany's Vorschlag aus #15 nachzuvollziehen.
Gruß Kurt