DOIF neue Features: Generalisierung, $DEVICE, $EVENT, Attribut notexist

Begonnen von Damian, 28 Dezember 2015, 22:06:42

Vorheriges Thema - Nächstes Thema

Damian

Liebe DOIF-Freunde,

ich habe u. a. Weihnachtstage genutzt und etwas an DOIF gebastelt.

1. Man kann nun in der Bedingung Eventtrigger wie folgt angeben:

["<Regexp für Devices>:<Regexp für Events>"]

Bespiele:

["FS"] triggert auf alle Devices, die "FS" im Namen beinhalten.
["^FS"] triggert auf alle Devices, die mit "FS" im Namen anfangen.
["FS:temp"] triggert auf alle Devices, die "FS" im Namen und "temp" im Event beinhalten
([":^temp"]) triggert auf beliebige Devices, die im Event mit "temp" beginnen.
(["^FS$:^temp$"] trigger auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt.
[""] triggert auf alles.

Selbstverständlich sind alle Möglichkeiten bei der Nutzung von regulären Ausdrücken gegeben.

2. In der Bedingung und im Ausführungsteil, kann nun  $DEVICE für das aktuelle Device und $EVENT genutzt werden.

3. Mit dem Attribut notexist, lässt sich ein Defaultwert für Readings, Stati usw. angeben, falls diese nicht existieren (wurde bereits mehrfach gewünscht)

Beispiel für Batteriezustandsanzeige für alle Devices mit einem DOIF:

define Battery dummy

define di_battery DOIF ([":battery. low"] and [?Battery:$DEVICE] ne "low")
  ({Log 3, "Batteriewarnung von $DEVICE"}, setreading Battery $DEVICE low)
DOELSEIF ([":battery. ok"] and [?Battery:$DEVICE] ne "ok")
  ({Log 3, "Batterie wieder ok von $DEVICE"}, setreading Battery $DEVICE ok)

attr di_battery do always
attr di_battery notexist novalue


Damit hat man im Dummy Battery eine schöne Übersicht über den Batteriestatus aller Devices, die battery-Meldung senden.

Das Modul ist abwärtskompatibel zum bisherigen.

Es handelt sich um eine Testversion, sie kann hier zum Ausprobieren geladen werden. (Zum Einspielen muss das System durchgestartet werden, kein reload).

Viel Spaß beim Ausprobieren.

Edit: Aktuelle Version wurde eingecheckt.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

marvin78

Gibt es einen speziellen Grund, warum du $DEVICE verwendet hast und nicht $NAME, wie im notify?

Da man das hier ja aktuell immer dabei sagen muss: Das soll keine Kritik sein.

Damian

Zitat von: marvin78 am 29 Dezember 2015, 10:57:53
Gibt es einen speziellen Grund, warum du $DEVICE verwendet hast und nicht $NAME, wie im notify?

Da man das hier ja aktuell immer dabei sagen muss: Das soll keine Kritik sein.

ja, das steht noch zur Diskussion. Ich hatte zuerst $NAME drin gehabt, habe mich aber dann doch erst mal für $DEVICE entschieden, damit es keine Wechslung mit notifys gibt, da die Syntax bei DOIF oft ähnlich, aber doch anders als beim notify ist. Insb. z. B. bei der Angabe des Regexp wird bei notify intern ^ vorangestellt und $ am Ende hinzugefügt. Bei DOIF passiert das beim neuen Eventtrigger nicht, auch der Doppelpunkt gilt als Trennzeichen und gehört nicht zu Regexp, bei Events sind auch Leerzeichen erlaubt usw. usw.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

marvin78

Ich würde trotz allem $NAME bevorzugen. Das erleichtert am Ende ganz sicher den Support hier. Ich würde das "Verwechseln" mit notify eher als weniger problematisch sehen, als dass die Uneinheitlichkeit erstmal unlogisch wirkt (auch wenn Unterschiede ohnehin offensichtlich sind). Für jemanden, der nur DOIFS verwendet, ist das sicher gar kein Problem. Derjenige der aber denkt (und damit recht hat), dass manche Dinge doch deutlich einfacher mit notify zu lösen sind, wird die Inkonsistenz massiv stören. Für Umsteiger gilt das gleiche.

Damian

Zitat von: marvin78 am 29 Dezember 2015, 12:09:03
Ich würde trotz allem $NAME bevorzugen. Das erleichtert am Ende ganz sicher den Support hier. Ich würde das "Verwechseln" mit notify eher als weniger problematisch sehen, als dass die Uneinheitlichkeit erstmal unlogisch wirkt (auch wenn Unterschiede ohnehin offensichtlich sind). Für jemanden, der nur DOIFS verwendet, ist das sicher gar kein Problem. Derjenige der aber denkt (und damit recht hat), dass manche Dinge doch deutlich einfacher mit notify zu lösen sind, wird die Inkonsistenz massiv stören. Für Umsteiger gilt das gleiche.

ja, das können wir hier gerne besprechen. Andererseits könnte man DOIF mit notify kombinieren, wenn es unterschiedlich heißt (ob das jemals einer macht, ist eine andere Frage). Auch bei $EVENT bin ich mir noch nicht sicher, da es nicht das Gleiche ist wie beim notify.


Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

marvin78

Ich habe nach dem Schreiben auch überlegt, dass man es kombinieren könnte und man konsequenterweise dann $EVENT auch anders bezeichnen müsste, weil es im DOIF, nach meinem Verständnis, ja nicht haargenau das gleiche sein muss, wie im notify. Schwierig.

Zunächst hatte ich hauptsächlich an Umsteiger gedacht, die ihre notifys zunächst 1zu1 zu DOIFs wandeln möchten. Betrachtet man es getrennt, verschwimmt die Argumentation.

Damian

Zitat von: marvin78 am 29 Dezember 2015, 12:25:15
Ich habe nach dem Schreiben auch überlegt, dass man es kombinieren könnte und man konsequenterweise dann $EVENT auch anders bezeichnen müsste, weil es im DOIF, nach meinem Verständnis, ja nicht haargenau das gleiche sein muss, wie im notify. Schwierig.

Zunächst hatte ich hauptsächlich an Umsteiger gedacht, die ihre notifys zunächst 1zu1 zu DOIFs wandeln möchten. Betrachtet man es getrennt, verschwimmt die Argumentation.

So ist das, denn das Schlimmste wäre den gleichen Bezeichner zu nutzen, der sich manchmal anders verhält, daher werde ich mir noch etwas für $EVENT einfallen lassen müssen, da es oft gleich, aber (funktionsbedingt) nicht immer das Gleiche ist, wie beim notify.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

kostra

Einfach nur mal ein großes DANKE, da $EVENT und $DEVICE (oder welche Bezeichner man dann auch immer für wählt) wirklich SEHR gefehlt haben.
Ich nutze das DOIF u.a., um eine Warnung bei offenstehenden Fenstern zu erhalten, und da macht es schon Sinn zu wissen, welches Fenster da so lange offensteht :-)

Also DANKE für die viele Arbeit.

kostra
FHEM version Fhem 5.8
auf einer RasPi
via CUL868 V1.55

marvin78

Stimmt. Das habe ich vergessen: Der Weg den DOIF jetzt nimmt, gefällt mir. DOIF war für mich und mein System bisher nur an wenigen Stellen brauchbar. Dieser Schritt ändert das ;)

AndreasHH

Moin,

Vielen, vielen Dank für das Modul.

Ich bin gerade dabei meinen Wildwuchs an Notifies zu bereinigen,  da kommen mir die Neuerungen gerade recht.

Habe jetzt 2 Probleme, an denen ich seit Stunden hänge.

Gehe ich recht in der Annahme, dass $EVTPART im Gegensatz zu $EVENT nicht implementiert ist ?
Bekomme mit  folgender Definition Fehlermeldungen im DOIF:

e_regexp_c1:

di_FHT_desired:error: { Log 3, "FHT-desired PID20.OGBad $EVTPART0"}: Global symbol "$EVTPART0" requires explicit package name at (eval 5943) line 1.



error:
{ Log 3, "FHT-desired PID20.OGBad $EVTPART0"}: Global symbol "$EVTPART0" requires explicit package name at (eval 5943) line 1.



define di_FHT_desired DOIF ([":desired"])\
  ({ Log 3, "FHT-desired $DEVICE" $EVTPART0})

attr di_FHT_desired room Heizung
attr di_FHT_desired group Heizung
attr di_FHT_desired do always
#


Mir schwebt als Ziel etwas derartiges vor:

set $DEVICE_Zieltemp desired-temp $EVTPART1


Mein Zeites Problem besteht darin dass nicht getriggert wird, wenn ich die Bedingung erweitere um nur dann auslösen zu lassen, wenn die desired-temp grösser 11 ist.


define di_FHT_desired DOIF ([":desired"] > 11)\
  ({ Log 3, "FHT-desired $DEVICE"})

attr di_FHT_desired room Heizung
attr di_FHT_desired group Heizung
attr di_FHT_desired do always


freue mich über jeden Tipp.


Gruss

Andreas
FHEM 5.8, FB7490, FB7390, Linux-Server, Raspi 1, Raspi 2, FHEM2FHEM, div. FS20, div. FHT, div. HMS, div. Homematic, MQTT, ESP8266, Arduino

Ellert

Zitat von: AndreasHH am 29 Dezember 2015, 16:46:33
Moin,

Vielen, vielen Dank für das Modul.

Ich bin gerade dabei meinen Wildwuchs an Notifies zu bereinigen,  da kommen mir die Neuerungen gerade recht.

Habe jetzt 2 Probleme, an denen ich seit Stunden hänge.

Gehe ich recht in der Annahme, dass $EVTPART im Gegensatz zu $EVENT nicht implementiert ist ?
Bekomme mit  folgender Definition Fehlermeldungen im DOIF:

e_regexp_c1:

di_FHT_desired:error: { Log 3, "FHT-desired PID20.OGBad $EVTPART0"}: Global symbol "$EVTPART0" requires explicit package name at (eval 5943) line 1.



error:
{ Log 3, "FHT-desired PID20.OGBad $EVTPART0"}: Global symbol "$EVTPART0" requires explicit package name at (eval 5943) line 1.



define di_FHT_desired DOIF ([":desired"])\
  ({ Log 3, "FHT-desired $DEVICE" $EVTPART0})

attr di_FHT_desired room Heizung
attr di_FHT_desired group Heizung
attr di_FHT_desired do always
#


Mir schwebt als Ziel etwas derartiges vor:

set $DEVICE_Zieltemp desired-temp $EVTPART1


Mein Zeites Problem besteht darin dass nicht getriggert wird, wenn ich die Bedingung erweitere um nur dann auslösen zu lassen, wenn die desired-temp grösser 11 ist.


define di_FHT_desired DOIF ([":desired"] > 11)\
  ({ Log 3, "FHT-desired $DEVICE"})

attr di_FHT_desired room Heizung
attr di_FHT_desired group Heizung
attr di_FHT_desired do always


freue mich über jeden Tipp.


Gruss

Andreas
Die Ereignissteile könntest Du mit split(/ /,$EVENT) selbst erzeugen

zu Zweitens:
([":desired"] and [?$DEVICE:desired-temp] > 11)

Damian

Zitat von: AndreasHH am 29 Dezember 2015, 16:46:33
Moin,

Vielen, vielen Dank für das Modul.

Ich bin gerade dabei meinen Wildwuchs an Notifies zu bereinigen,  da kommen mir die Neuerungen gerade recht.

Habe jetzt 2 Probleme, an denen ich seit Stunden hänge.

Gehe ich recht in der Annahme, dass $EVTPART im Gegensatz zu $EVENT nicht implementiert ist ?
Bekomme mit  folgender Definition Fehlermeldungen im DOIF:

e_regexp_c1:

di_FHT_desired:error: { Log 3, "FHT-desired PID20.OGBad $EVTPART0"}: Global symbol "$EVTPART0" requires explicit package name at (eval 5943) line 1.



error:
{ Log 3, "FHT-desired PID20.OGBad $EVTPART0"}: Global symbol "$EVTPART0" requires explicit package name at (eval 5943) line 1.



define di_FHT_desired DOIF ([":desired"])\
  ({ Log 3, "FHT-desired $DEVICE" $EVTPART0})

attr di_FHT_desired room Heizung
attr di_FHT_desired group Heizung
attr di_FHT_desired do always
#


Mir schwebt als Ziel etwas derartiges vor:

set $DEVICE_Zieltemp desired-temp $EVTPART1


Mein Zeites Problem besteht darin dass nicht getriggert wird, wenn ich die Bedingung erweitere um nur dann auslösen zu lassen, wenn die desired-temp grösser 11 ist.


define di_FHT_desired DOIF ([":desired"] > 11)\
  ({ Log 3, "FHT-desired $DEVICE"})

attr di_FHT_desired room Heizung
attr di_FHT_desired group Heizung
attr di_FHT_desired do always


freue mich über jeden Tipp.


Gruss

Andreas

Hallo Andreas,

ich sehe schon, ich werde noch alle Features vom notify nachbauen müssen ;)

Es wäre sicherlich ein Leichtes $EVTPART zu realisieren.

Wo man mit notifys ohne Perlcode insbesondere ohne if-Abfragen auskommt, da kann man sie auch gut weiternutzen.

Die Angabe ["..."] stellt einen Trigger dar, so wie vorher bereits [<DEVICE>:?] und kann nur wahr oder falsch sein.

Generalisierte Abfragen auf Stati und Readings gibt es nicht und kann es auch nicht geben, weil Abfragen der Art (["DEVICE1":temperature]> 0 and  ["DEVICE2":temperature]> 0) nicht funktionieren würden, wenn eines der beiden Devices triggert, denn das andere wäre nicht definiert.

Du kannst aber definieren:

define di_FHT_desired DOIF ([":desired"] and [$DEVICE:desired] > 11)...

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: Ellert am 29 Dezember 2015, 17:06:39
Die Ereignissteile könntest Du mit split(/ /,$EVENT) selbst erzeugen

zu Zweitens:
([":desired"] and [?$DEVICE:desired-temp] > 11)

Angabe mit [$DEVICE:...] triggert nicht (ich habe vorsorglich etwas mehr Intelligenz eingebaut als nur simples Ersetzen ;)), konsequenter Weise funktioniert natürlich das Fragezeichen hier auch.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

AndreasHH

Moin,

Vielen Dank für Eure Hilfe.
Habe es wie folgt gelöst:


define di_FHT_desired DOIF (["FHT_:desired-temp"] and [$DEVICE:desired-temp] > 11)\
( { my $Zieltemp=ReadingsVal("$DEVICE","desired-temp","18") ;;;;\
    fhem ("set $DEVICE_Zieltemp $Zieltemp")})


Würde mEn mit $EVTPART kürzer und übersichtlicher sein.
Möglicherweise habe ich aber auch nur nicht einen geschickteren Weg gefunden.

Gruss

Andreas

FHEM 5.8, FB7490, FB7390, Linux-Server, Raspi 1, Raspi 2, FHEM2FHEM, div. FS20, div. FHT, div. HMS, div. Homematic, MQTT, ESP8266, Arduino

Ralli

Hallo Damian,

vielen herzlichen Dank für Deine Mühe! Das sind genau die Dinge, die (mir) noch gefehlt haben, toll dass Du sie nun realisierst.
Gruß,
Ralli

Proxmox 8.3 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.3 dev, virtualisierte RaspberryMatic (3.79.6.20241122) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.1.5) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa