[GELÖST] DOIF_Readings mit readingList

Begonnen von SirBen, 17 Oktober 2019, 07:00:38

Vorheriges Thema - Nächstes Thema

SirBen

ZitatErzeugen berechneter Readings

Mit Hilfe des Attributes DOIF_Readings können eigene Readings innerhalb des DOIF definiert werden, auf die man im selben DOIF-Moduls zugreifen kann. Die Nutzung ist insbesondere dann sinnvoll, wenn zyklisch sendende Sensoren, im Perl-Modus oder mit dem Attribut do always, abgefragt werden. DOIF_Readings-Berechnungen funktionieren ressourcenschonend ohne Erzeugung FHEM-Events nach außen. Änderungen dieser Readings triggern allerdings das eigene DOIF-Modul, allerdings nur, wenn sich deren Inhalt ändert.

Syntax

Code: [Auswählen]
attr <DOIF-Modul> DOIF_Readings <readingname1>:<definiton>, <readingname2>:<definition>,...

<definition>: Beliebiger Perlausdruck ergänzt um DOIF-Syntax in eckigen Klammern. Angaben in eckigen Klammern wirken triggernd und aktualisieren das definierte Reading.

Kann es sein, dass mein Reading sich nicht aktualisiert weil ich keine eckigen Klammern bei DOIF_Readings habe?  ???
Gibt es dafür einen Workaround?

Per

Du kannst eckige Klammern drum machen wie du willst, das ist eine (bzw. zwei) Funktion(en).

Versuch es mal mit:
{hms2secs([DOIF_Klingel:Waittime])}
und
WaitSec:{hms2secs([$SELF:Waittime])}

Zitat von: SirBen am 17 Oktober 2019, 12:52:31Ich denke, das hat mit meiner Problematik nur nichts zu tun.  :-\
Doch, das angesprochene Attribut Selftrigger!

Damian

#17
So würde ich es machen, hier als Zweizeiler mit List-Attributen zum Setzen des aktiv-Readings:

defmod klingel_di DOIF {if ([Klingel] eq "on" and [?$SELF:aktiv] eq "on") {fhem_set"Gong on"}}\
{if ([$SELF:aktiv] eq "on") {set_Exec("timer",3600,'set_Reading("aktiv","off")')}}

attr klingel_di readingList aktiv
attr klingel_di setList aktiv:on,off


Das Reading aktiv kann per set on/off Kommando im DOIF gesetzt werden. Es wird dann nach 3600 Sekunden automatisch wieder auf off gesetzt. Wenn aktiv auf on gesetzt ist und die Klingel gedrückt wird, dann geht der Gong an.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SirBen

#18
Zitat von: Damian am 17 Oktober 2019, 14:45:37
So würde ich es machen, hier als Zweizeiler mit List-Attributen zum Setzen des aktiv-Readings:

defmod klingel_di DOIF {if ([Klingel] eq "on" and [?$SELF:aktiv] eq "on") {fhem_set"Gong on"}}\
{if ([$SELF:aktiv] eq "on") {set_Exec("timer",3600,'set_Reading("aktiv","off")')}}

attr klingel_di readingList aktiv
attr klingel_di setList aktiv:on,off


Das Reading aktiv kann per set on/off Kommando im DOIF gesetzt werden. Es wird dann nach 3600 Sekunden automatisch wieder auf off gesetzt. Wenn aktiv auf on gesetzt ist und die Klingel gedrückt wird, dann geht der Gong an.
Puh, wie kann ich hier den laufenden Timer in ein Reading schreiben?

Zitat von: Per am 17 Oktober 2019, 14:09:58
Du kannst eckige Klammern drum machen wie du willst, das ist eine (bzw. zwei) Funktion(en).

Versuch es mal mit:
{hms2secs([DOIF_Klingel:Waittime])}
und
WaitSec:{hms2secs([$SELF:Waittime])}
Doch, das angesprochene Attribut Selftrigger!
Mit den eckigen Klammern funktioniert es jetzt.
Wenn ich
WaitSec:{hms2secs([DUMMY:Waittime])}
eintrage und den DUMMY ändere, dann ändert sich auch das Reading WaitSec!
Sehr schön.  :)
Lasse ich den DUMMY weg und ändere im DOIF das Reading Waittime, dann ändert sich das Reading WaitSec mit:
WaitSec:{hms2secs([$SELF:Waittime])}
nur, wenn das Attribut selftrigger all gesetzt ist.

Vielen Dank für die ganzen Hinweise und Ratschläge!

Damian

#19
Der Laufende Timer wird automatisch im entsprechenden Reading geschrieben. Warum willst du den auslesen? Mit set_Exec kannst du einen laufenden Timer verlängern oder vorzeitig mit del_Exec beenden, mit get_Exec kannst du die Restlaufzeit jederzeit abfragen, siehe https://fhem.de/commandref_DE.html#DOIF_Ausf%C3%BChrungstimer. Es gibt also im Perl-Modus genügend Möglichkeiten Timer zu verändern ohne irgendwelche Umrechnungsklimmzüge anzustellen.

Edit: Wenn du nur die Zeitvorgabe auswerten willst, dann kannst du das genauso machen:

defmod klingel_di DOIF {if ([Klingel] eq "on" and [?$SELF:aktiv] eq "on") {fhem_set"Gong on"}}\
{if ([$SELF:aktiv] eq "off") {set_Exec("timer",::hms2secs(ReadingsVal("klingel_di","Waittime",0)),'set_Reading("aktiv","on")')}}

attr klingel_di readingList aktiv
attr klingel_di setList aktiv:on,off



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

SirBen

Zitat von: Damian am 17 Oktober 2019, 15:18:02
Der Laufende Timer wird automatisch im entsprechenden Reading geschrieben. Warum willst du den auslesen? Mit set_Exec kannst du einen laufenden Timer verlängern oder vorzeitig mit del_Exec beenden, mit get_Exec kannst du die Restlaufzeit jederzeit abfragen, siehe https://fhem.de/commandref_DE.html#DOIF_Ausf%C3%BChrungstimer. Es gibt also im Perl-Modus genügend Möglichkeiten Timer zu verändern ohne irgendwelche Umrechnungsklimmzüge anzustellen.

Edit: Wenn du nur die Zeitvorgabe auswerten willst, dann kannst du das genauso machen:

defmod klingel_di DOIF {if ([Klingel] eq "on" and [?$SELF:aktiv] eq "on") {fhem_set"Gong on"}}\
{if ([$SELF:aktiv] eq "off") {set_Exec("timer",::hms2secs(ReadingsVal("klingel_di","Waittime",0)),'set_Reading("aktiv","on")')}}

attr klingel_di readingList aktiv
attr klingel_di setList aktiv:on,off


Habe das mal so umgesetzt.
Mein Timer Reading sieht allerdings nur so aus:
timer_timer: 17.10.2019 15:56:01
Leider ist das Reading nicht in Sekunden.

SirBen

ZitatLasse ich den DUMMY weg und ändere im DOIF das Reading Waittime, dann ändert sich das Reading WaitSec mit:
WaitSec:{hms2secs([$SELF:Waittime])}
nur, wenn das Attribut selftrigger all gesetzt ist.

Ich muss mich selbst verbessern. Die oben angegebene Variante funktioniert auch OHNE selftrigger all.
Komischerweise wird WaitSec beim ersten aktualisieren von Waittime nicht mit aktualisiert. Danach funktioniert das Aktualisieren aber jedes Mal.

Damian

Zitat von: SirBen am 17 Oktober 2019, 15:52:01
Habe das mal so umgesetzt.
Mein Timer Reading sieht allerdings nur so aus:
timer_timer: 17.10.2019 15:56:01
Leider ist das Reading nicht in Sekunden.

Und wozu brauchst du das Reading in Sekunden?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SirBen

Weil das Switch Widget in FTUI für Data-Countdown einen Wert in Sekunden benötigt.

Damian

Zitat von: SirBen am 17 Oktober 2019, 19:36:56
Weil das Switch Widget in FTUI für Data-Countdown einen Wert in Sekunden benötigt.

Na, dann

defmod klingel_di DOIF {if ([Klingel] eq "on" and [?$SELF:aktiv] eq "on") {fhem_set"Gong on"}}\
{if ([$SELF:aktiv] eq "off") {set_Reading("waitsecs",::hms2secs(get_Reading("Waittime",0)));;set_Exec("timer",get_Reading("waitsecs"),'set_Reading("aktiv","on")')}}

attr klingel_di readingList aktiv
attr klingel_di setList aktiv:on,off


PS: DOIF_Reading auf DOIF_Readings kann nicht gut funktionieren, da DOIF_Readings keine Events nach außen produzieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SirBen

Zitat von: Damian am 17 Oktober 2019, 19:56:51
Na, dann

defmod klingel_di DOIF {if ([Klingel] eq "on" and [?$SELF:aktiv] eq "on") {fhem_set"Gong on"}}\
{if ([$SELF:aktiv] eq "off") {set_Reading("waitsecs",::hms2secs(get_Reading("Waittime",0)));;set_Exec("timer",get_Reading("waitsecs"),'set_Reading("aktiv","on")')}}

attr klingel_di readingList aktiv
attr klingel_di setList aktiv:on,off


PS: DOIF_Reading auf DOIF_Readings kann nicht gut funktionieren, da DOIF_Readings keine Events nach außen produzieren.
DOIF_Readings habe ich verwendet, weil ich nach außen keine Events haben wollte. Sonst hätte ich event_readings genommen. Das Switch Widget zieht sich den Wert beim Schalten, benötigt kein Event.

Das DOIF von dir habe ich zu Testzwecken mal eingerichtet. Funktioniert super!

Dann ist die Perl Variante von dir sicherlich Ressourcen schonender, als meine FHEM Variante, oder?

Vielen Dank für die Mühe!

SirBen

#26
@Damian
Eine Frage habe ich noch. Bei DOIF_Readings scheint ein Bug zu sein. Wenn ich irgendein Attribut vom DOIF verändere, dann reagiert das DOIF_Reading beim ersten Event nicht. Erst beim zweiten. Beim 3. und 4. usw. reagiert es auch sofort.
Kannst du das nachvollziehen?

Edit:
Habe noch ein paar Tests gemacht. Das Problem tritt nur auf, wenn im DOIF_Reading ein Reading vom DOIF selbst steht. Also z.B:
readingList Wert1
DOIF_Reading Wert2:{[$SELF:Wert1]+3}

Damian

Zitat von: SirBen am 18 Oktober 2019, 08:29:51
@Damian
Eine Frage habe ich noch. Bei DOIF_Readings scheint ein Bug zu sein. Wenn ich irgendein Attribut vom DOIF verändere, dann reagiert das DOIF_Reading beim ersten Event nicht. Erst beim zweiten. Beim 3. und 4. usw. reagiert es auch sofort.
Kannst du das nachvollziehen?

DOIF_Readings kann nur in einfacher Tiefe auf eigene Readings reagieren:

Beispiel:

defmod doif_Reading DOIF ##
attr doif_Reading DOIF_Readings test1:[FS],\
test2:[$SELF:test1],\
test3:[$SELF:test2]



FS kommt von außen, test1 und test2 werden sofort gesetzt (bei mir auch beim ersten mal), test3 funktioniert dann nicht mehr korrekt.


Perl-Modus ist halt nativ-Perl, daher ressourcenschonender und schneller. Wichtiger ist aber, dass man beliebig viele logisch unabhängige DOIFs in einem DOIF unterbringen kann.

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

SirBen

Danke für die Antwort und die Unterstützung! Dann weiß ich erstmal Bescheid.