FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: bismosa am 27 Juni 2022, 14:17:00

Titel: [gelöst] Verständnisfragen DOIF mit Template (wait)
Beitrag von: bismosa am 27 Juni 2022, 14:17:00
Hallo!
Einige kurze Verständnisfragen zum DOIF mit Template.

Bisher hatte ich meine Beschattungssteuerung mit meinen Thermofühlern für jedes Gerät so umgesetzt:
Die Werte für "Autom_DiffTemp" und "Autom_DiffTempHysterese" werden mit einem anderen DOIF (UI) eingestellt und weichen für jedes Device ab.
- Durch die wait-Timer wird der Status "Dunkel (0)" erst nach 5Min. gesetzt (wenn nicht zwischendurch ein anderer Zustand erreicht wurde)
- Der Status "Hell (1)" wird nach 1Min. Wartezeit gesetzt.
So sollten die Rolläden nicht bei jeder kleinen Wolke durch die Gegend fahren.

([DS18B20_Sonne:DiffTemp] < ([Rolladen_Buero:Autom_DiffTemp] - [Rolladen_Buero:Autom_DiffTempHysterese]))(
{
fhem("setreading Rolladen_Buero Sonnensensor_state 0"); ##Dunkel
}
) DOELSEIF ([DS18B20_Sonne:DiffTemp] < [Rolladen_Buero:Autom_DiffTemp])(
##Nichts unternehmen, Zwischenzustand! -> ggf. Timer löschen
) DOELSEIF ([DS18B20_Sonne:DiffTemp] > [Rolladen_Buero:Autom_DiffTemp])(
{
fhem("setreading Rolladen_Buero Sonnensensor_state 1"); ##Hell
}
)



attr di_Rolladen_Buero_Sonnensensor do always
attr di_Rolladen_Buero_Sonnensensor wait 300:0:60


Bisher funktioniert dies problemlos.

Nun möchte ich dies umsetzen in einem Perl-DOIF mit einem Template (finde ich richtig praktisch!!)

DEF TPL_Sonnensensor ({
if ([DS18B20_Sonne:DiffTemp] < ([$2] - [$3])){
del_Exec("Timer3$1");
set_Exec("Timer1$1", 300, fhem("setreading $1 Sonnensensor_state 0"));
}
elsif ([DS18B20_Sonne:DiffTemp] < [$2]){
##Zwischenzustand -> Timer entfernen
del_Exec("Timer1$1");
del_Exec("Timer3$1");
}
elsif ([DS18B20_Sonne:DiffTemp] > [$2]){
del_Exec("Timer1$1");
set_Exec("Timer3$1", 60, fhem("setreading $1 Sonnensensor_state 1"));
}
})

##Definitionen mit Hilfe des Templates
TPL_Sonnensensor(Rolladen_Buero,Rolladen_Buero:Autom_DiffTemp,Rolladen_Buero:Autom_DiffTempHysterese)
TPL_Sonnensensor(Rolladen_WC,Rolladen_WC:Autom_DiffTemp,Rolladen_WC:Autom_DiffTempHysterese)
TPL_Sonnensensor(Rolladen_Gaeste,Rolladen_Gaeste:Autom_DiffTemp,Rolladen_Gaeste:Autom_DiffTempHysterese)


Nun die Fragen:
1.) Die Timer muss ich immer selbst löschen. Richtig?

2.) Müssen die Timer so eindeutig benannt werden? (ich habe $1 hinzugefügt, das diese für jede Instanz anders benannt werden)

3.) Ein Attribut "Do always" wird hier ja nicht mehr benötigt (bzw. gibt es nicht mehr). In diesem Fall benötige ich es aber auch nicht zwingend.
(Das obige Beispiel funktioniert trotzdem, denn laufende Timer werden bei erneutem Wahrwerden nicht abgebrochen)
Jedoch müsste bei jeder Temperaturänderung im PERL-DOIF der Timer neu gesetzt werden...das ist hier ja nicht gewünscht.

3a) Funktioniert setState auch im Template-DOIF? Dann könnte man mit get_State prüfen, in welchem Zustand sich das DOIF befindet.
Gibt es denn für jede Instanz ein eigenen Status? Oder erzeuge ich mir dafür besser ein eigenes Reading?
Wird der Status nicht in jeder Instanz dann "überschrieben"?
Wird der Status noch für etwas anderes benötigt, außer der Anzeige? (Wenn man diese denn benötigt)

3b) Wäre DOIF_Readings eine bessere Alternative? Nur wie? Ich müsste ja alle Bedingungen dann schon hier abdecken...

3c) Oder den Timer selbst prüfen? mittels get_Exec(<timerName>)?
Sieht für mich derzeit am einfachsten aus...

Danke!

Gruß
Bismosa

Titel: Antw:Verständnisfragen DOIF mit Template (wait)
Beitrag von: Damian am 27 Juni 2022, 14:56:30
Zitat von: bismosa am 27 Juni 2022, 14:17:00

Nun die Fragen:
1.) Die Timer muss ich immer selbst löschen. Richtig?


ja, wenn er nicht auslösen soll. Oder er wird neu gesetzt, falls man durch einen anderen Zweig eine Verzögerung benötigt. Beim Wait gibt es nur einen einzigen Timer für alle Zweige, da ist es nicht anders.


Zitat
2.) Müssen die Timer so eindeutig benannt werden? (ich habe $1 hinzugefügt, das diese für jede Instanz anders benannt werden)

Innerhalb eines DOIF-Devices müssen Timer eindeutig sein, wenn sie unabhängig von einander sein sollen.

Zitat
3.) Ein Attribut "Do always" wird hier ja nicht mehr benötigt (bzw. gibt es nicht mehr). In diesem Fall benötige ich es aber auch nicht zwingend.
(Das obige Beispiel funktioniert trotzdem, denn laufende Timer werden bei erneutem Wahrwerden nicht abgebrochen)
Jedoch müsste bei jeder Temperaturänderung im PERL-DOIF der Timer neu gesetzt werden...das ist hier ja nicht gewünscht.

Man kann Abfragen, ob ein Timer noch läuft, dann sollte er nicht neu gesetzt werden.

Zitat
3a) Funktioniert setState auch im Template-DOIF? Dann könnte man mit get_State prüfen, in welchem Zustand sich das DOIF befindet.
Gibt es denn für jede Instanz ein eigenen Status? Oder erzeuge ich mir dafür besser ein eigenes Reading?
Wird der Status nicht in jeder Instanz dann "überschrieben"?
Wird der Status noch für etwas anderes benötigt, außer der Anzeige? (Wenn man diese denn benötigt)

Nein, Status ist im Perl-Modus dem User überlassen. Es gibt für ein DOIF-Devices auch mit Templates nur einen Status für alle.

Zitat
3b) Wäre DOIF_Readings eine bessere Alternative? Nur wie? Ich müsste ja alle Bedingungen dann schon hier abdecken...

Wenn du pro Template Informationen visualisieren willst, dann kannst du es über interne Readings machen und diese wiederum über uiTable darstellen. Es gibt auch für uiTable Templates, siehe https://wiki.fhem.de/wiki/DOIF/Automatisierung. Das Besondere ist, dass man für die Steuerung und auch für die Visualisierung auf gleiche Instanzvariablen zugreifen kann.
Zitat

3c) Oder den Timer selbst prüfen? mittels get_Exec(<timerName>)?
Sieht für mich derzeit am einfachsten aus...

ja, siehe oben
Titel: Antw:Verständnisfragen DOIF mit Template (wait)
Beitrag von: bismosa am 28 Juni 2022, 08:36:43
Hallo!

Danke für die schnelle Aufklärung und Hilfe! Da bekommt man schon manchmal einen kleinen Knoten im Kopf und sieht den Wald vor lauter Bäumen nicht mehr  ;)

Dann bin ich ja gar nicht so sehr auf dem Holzweg.  :)
Thema gelöst.

Gruß
Bismosa
Titel: Antw:[gelöst] Verständnisfragen DOIF mit Template (wait)
Beitrag von: Damian am 28 Juni 2022, 09:11:12
Mein Vorschlag zur Vorgehensweise bei der Erstellung von Templates für mehrere gleich aufgebaute Szenarien:

1) Erstelle ein DOIF im Perl-Modus für ein bestimmtes Device
2) Verallgemeinere die Definition aus 1 für mehrere Devices mit Platzhaltern $1, $2 durch ein Template
3) Nutze das Template mehrfach für verschiedene Devices

Optional mit Visualisierung über das Attribut uiTable

4) Erstelle eine uiTable für Visualisierung der Daten für ein Device (z. B. eine Zeile)
5) Verallgemeinere die Definition aus 4 für mehrere Devices mit Platzhaltern $1, $2 durch ein Template
6) Nutze das Template mehrfach für die Visualisierung verschiedener Devices (mehrere Zeilen)

Wenn man das geschafft hat, dann kann man die nächste Abstraktionsstufe umsetzen, die komplexer zum Programmieren ist, aber einfacher in der Anwendung.

1) Überlege welche Informationen für die Steuerung und Visualisierung für ein Szenario wichtig sind
2) Definiere eine (Array) Liste: je Zeile Daten für ein Szenario
3) Definiere ein Template für die Steuerung eines Szenarios
4) Rufe das Template auf für alle Szenarien (Zeilen des Arrays) über eine FOR-Schleife
5) Definiere ein Template für Visualisierung für ein Szenario
6) Rufe das Template auf für alle Szenarien (Zeilen des Arrays) über eine FOR-Schleife

Der Vorteil ist, dass man durch Hinzufügen einer Zeile der Liste sowohl die Steuerung als auch die Visualisierung für ein weiters Szenario erstellt.
Titel: Antw:[gelöst] Verständnisfragen DOIF mit Template (wait)
Beitrag von: bismosa am 28 Juni 2022, 09:31:45
Hallo!

Danke für die Tipps. Ich werde mich da schrittweise nähern (müssen).
Der Tipp erstmal nur das DOIF für ein Device zu machen ist gut!
Ich hatte den Fall bei einem anderen DOIF gerade...testen am Live-System war schwierig, da nur sehr selten Werte kommen. Also habe ich alles mit einem zusätzlichen Dummy (mit slider etc.) erst trocken getestet und hinterher wieder geändert.
So kann man es natürlich hier auch machen. Erst nur das funktionierende Perl-Doif. Erst dann mit den Platzhaltern arbeiten. Spart einiges an Fehlersuche.
Dabei ist mir jetzt auch aufgefallen, dass ich in dem Beispiel gar nicht so viele Parameter benötige. Statt
TPL_Sonnensensor(Rolladen_Buero,Rolladen_Buero:Autom_DiffTemp,Rolladen_Buero:Autom_DiffTempHysterese)
reicht sogar:
TPL_Sonnensensor(Rolladen_Buero)

Die mittlerweile sehr komplexe UI-Table habe ich in einem anderen DOIF. Das hier ist nur ein sehr kleiner Teil  ;)

uiTable mit Template ist natürlich auch eine sehr tolle Sache! Da kann ich mir sehr vieles vereinfachen!

Ich übe noch! Habe aber schon mehrere Ideen was ich alles umsetzen möchte. Schrittweise  :)

Danke!
Gruß
Bismosa