Autor Thema: mit einem DOIF auf 2 Ereignisse reagieren  (Gelesen 892 mal)

Offline Kurt77

  • Full Member
  • ***
  • Beiträge: 261
mit einem DOIF auf 2 Ereignisse reagieren
« am: 12 Mai 2022, 17:55:56 »
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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9759
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #1 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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline Kurt77

  • Full Member
  • ***
  • Beiträge: 261
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #2 am: 12 Mai 2022, 18:30:53 »
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

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1208
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #3 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

Offline Kurt77

  • Full Member
  • ***
  • Beiträge: 261
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #4 am: 12 Mai 2022, 18:53:49 »
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

Offline gestein

  • Hero Member
  • *****
  • Beiträge: 1208
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #5 am: 12 Mai 2022, 21:59:47 »
Dann habe ich Dein Vohaben nicht ganz verstanden.
Könntest Du es vielleicht besser erklären?

Offline Kurt77

  • Full Member
  • ***
  • Beiträge: 261
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #6 am: 12 Mai 2022, 22:14:33 »
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

Offline Kurt77

  • Full Member
  • ***
  • Beiträge: 261
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #7 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

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9759
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #8 am: 13 Mai 2022, 09:17:25 »
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.
« Letzte Änderung: 13 Mai 2022, 09:21:30 von Damian »
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Offline MadMax-FHEM

  • Hero Member
  • *****
  • Beiträge: 12437
  • NIVEAu ist keine Creme...
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #9 am: 13 Mai 2022, 09:36:35 »
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)

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9759
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #10 am: 13 Mai 2022, 10:18:06 »
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

Offline Kurt77

  • Full Member
  • ***
  • Beiträge: 261
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #11 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

Offline MadMax-FHEM

  • Hero Member
  • *****
  • Beiträge: 12437
  • NIVEAu ist keine Creme...
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #12 am: 13 Mai 2022, 11:50:28 »
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)

Offline Sany

  • Full Member
  • ***
  • Beiträge: 385
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #13 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
Zitat
delete 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 deConz(ZigBee), MariaDB und Grafana. Homematic, FS20, mySensors, MQTT2, Tasmota, Shelly, Z-Wave  ....

Offline Damian

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 9759
Antw:mit einem DOIF auf 2 Ereignisse reagieren
« Antwort #14 am: 13 Mai 2022, 19:18:45 »
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

 

decade-submarginal