DOIF im Frontend mit Defaultwert aus Dummy

Begonnen von Fredi69, 02 Dezember 2020, 08:18:51

Vorheriges Thema - Nächstes Thema

Fredi69

Nachdem ich viele Jahre jede Menge DOIFs nur zur Steuerung im Hintergrund genutzt habe, beschäftige ich mich jetzt das erste mal mit DOIF im Frontend.
Um damit laufen zu lernen habe ich mir mal ein Beispiel aus der Commandref gezogen:
define time_switch DOIF (["$SELF:mybutton: on"] or [[$SELF:mybegin,"00:00"]])
(set lamp on)
DOELSEIF (["$SELF:mybutton: off"] or [[$SELF:myend,"00:00"]])
(set lamp off)

attr time_switch cmdState on|off
attr time_switch readingList mybutton mybegin myend
attr time_switch setList mybutton:on,off mybegin:time myend:time
attr time_switch webCmd mybutton:mybegin:myend


Meine Frag ist, kann ich z.B. mybeginmit einem Defaultwert aus einem Dummy vorbelegen?
Sollte sich der Inhalt des Dummys ändern, sollte auch der wieder der Defaultwert angenommen werden.
Geht das automatisch oder muss ich bei Berechnung des Dummys den Wert auch in mybegin schreiben?

Danke
fhem auf Raspberry Pi 3
FRITZ!Box7490, Fritz!Box 3270 AP, 3xHMLAN, CUL868, nanoCUL 433 für IT, JeeLink für LaCrosse, HUE Bridge 2.0, Samsung UE46C8790 (STV), mehrere Homematic, Intertechno, Shelly und LaCrosse Komponenten

Damian

#1
setList ist ein FHEM-Attribut, das nur auf eigene Readings anwendbar ist. Das Vorbelegen des Readings musst du separat programmieren.

Ich persönlich arbeite innerhalb des DOIF-Moduls mit dem Attribut uiTable, damit kann ich beliebige Readings (auch fremder Module)  visualisieren und über die Oberfläche ändern.

siehe: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#2
so sieht eine vergleichbare Definition mit uiTable aus:

defmod time_switch DOIF {if ([[start:state,"00:00"]]) {fhem_set "lamp on"} elsif ([[end:state,"00:00"]]) {fhem_set"lamp off"}}
attr time_switch uiTable {package ui_Table}\
WID([start],"time")|WID([end],"time")|switch([lamp])


alternativ ohne if:

defmod time_switch DOIF \
{[[start:state,"00:00"]];;fhem_set"lamp on"}\
{[[end:state,"00:00"]];;fhem_set"lamp off"}
attr time_switch uiTable {package ui_Table}\
WID([start],"time")|WID([end],"time")|switch([lamp])


alternativ im FHEM-Modus:

defmod time_switch DOIF ([[start:state,"00:00"]])(set lamp on) DOELSEIF ([[end:state,"00:00"]]) (set lamp off)
attr time_switch uiTable {package ui_Table}\
WID([start],"time")|WID([end],"time")|switch([lamp])


Da man fremde Devices einbinden kann, lässt sich lamp unmittelbar über die Benutzeroberfläche schalten, ohne sie in der Bedingung abfragen zu müssen. start und end sind Dummys.

Allerdings macht es prinzipiell Sinn Informationen innerhalb eines Moduls zu kapseln, hier also start und end als Reading zu definieren, statt extra Dummys dafür zu definieren.

Alle Definitionen fallen kürzer aus und man braucht nur ein Attribut statt sonst drei.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Um auf die ursprüngliche Frage zu kommen -  es geht doch :)

[[$SELF:mybegin,ReadingsVal("mydummy","state")]]

da habe ich wohl mehr programmiert, als ich dachte ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF