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