Hallo,
Meine fhem.cfg sah folgendermaßen aus:
define TC_boost_State dummy
define TC_boost_Target dummy
define TC_boost_Notify notify Thermostat_19E4EA:desired-temp:.* {\
my $soll=ReadingsVal("Thermostat_19E4EA", "desired-temp", 0);;\
if($soll lt 30.0){\
fhem "set TC_boost_Target $soll";;\
if(Value("TC_boost_State") ne "on"){\
my $ist=ReadingsVal("Thermostat_19E4EA", "measured-temp", 0);;\
if(($soll-$ist) gt 1.5){\
fhem "set Thermostat_19E4EA desired-temp 30.0";;\
fhem "set TC_boost_State on";;\
fhem "attr TC_boost_Check disable 0";;\
}\
}\
}\
}
define TC_boost_Check at *00:02:00 {\
if(Value("TC_boost_State") eq "on"){\
if((Value("TC_boost_Target") - ReadingsVal("Thermostat_19E4EA", "measured-temp", 0)) lt 1){\
my $daytemp=Value("TC_boost_Target");;\
fhem "set Thermostat_19E4EA desired-temp $daytemp";;\
fhem "set TC_boost_State off";;\
fhem "attr TC_boost_Check disable 1";;\
}\
}\
else {\
fhem "set TC_boost_State off";;\
fhem "attr TC_boost_Check disable 1";;\
}\
}
attr TC_boost_Check disable 1
Dies habe ich mehr oder weniger direkt von oben übernommen.
Außerdem habe ich noch:
define Thermostat_19E4EA CUL_HM 19E4EA
attr Thermostat_19E4EA actCycle 000:10
attr Thermostat_19E4EA actStatus unknown
attr Thermostat_19E4EA alias Thermostat
...
define FileLog_Thermostat_19E4EA FileLog ./log/%Y-%m-Thermostat_19E4EA.log Thermostat_19E4EA
attr FileLog_Thermostat_19E4EA logtype text
attr FileLog_Thermostat_19E4EA room Logfiles
...
define desiredTemp_writer at +*00:30 {addLog("Thermostat_19E4EA","desired-temp")}
Durch die letzte Zeile (desiredTemp_writer) wird im Logfile alle 30 Minuten die aktuelle desired-temp geschrieben, selbst wenn diese sich nicht geändert hat.
Nach meinem Verständnis passiert folgendes:
- Mit jedem Update der desired-temp schlägt TC_boost_notify an (z.B. desired-temp=20,5)
- Wenn dann das Delta > 1,5 und desired < 30 ist (z.B. measured=18, desired=20,5) wird TC_boost_Target auf 20,5 gesetzt und desired auf 30
- außerdem wird dann TC_boost_State on gesetzt und der TC_boost_check gestartet
- Alle 2 Minuten wird geprüft, ob measured bis auf 1 C an TC_boost_Target rangekommen ist (damit wird dann der Boost beendet)
- Wenn in der Zwischenzeit aber der desiredTemp_writer zuschlägt (alle 30 Minuten), wird die aktuelle desired Temp (30 C) geschrieben
Damit ist beim TC_boost_notify $soll=30 und somit die erste Bedingung nicht erfüllt ( if($soll lt 30.0) ) und dann wird geheizt, bis die 30 erreicht sind.
Oder habe ich was falsch verstanden?
Grüße,
Matthias
P.S.: So sieht meine addlog-Routine aus:
sub
addLog($$) {
my ($logdevice, $reading) = @_; # device and reading to be used
my $logentry = ReadingsVal($logdevice,$reading,"addLog: invalid reading");
if ($reading =~ m,state,i) {
fhem "trigger $logdevice $logentry";
} else {
fhem "trigger $logdevice $reading: $logentry";
}
}