FHT-Boost - erweiterte Version

Begonnen von broadway, 04 Januar 2013, 13:29:49

Vorheriges Thema - Nächstes Thema

broadway

Hallo zusammen,

inspiriert durch den FHT-Boost aus diesem Beitrag von samuelengelking@me.com (samuelengelking@me.com) habe ich die Funktionalität erweitert. Leider öffnen die FHT Ventile selbst bei kalten Innentemperaturen max. 80% wodurch die Aufheizzeit unnötig lange dauert. Durch Vorgabe von 30° Solltemperatur kann man dies verbessern.

Bei meiner Version wird der eingestellte Sollwert im dummy "Target" zwischengespeichert, so dass nach dem Boost nicht statisch 21° eingestellt wird. Somit ist durch Einstellen eines neuen Sollwerts auch ein Abbruch möglich.

Der Status Boost aktiv ja/nein ist im dummy "State" sichtbar. Ein minütlicher at Befehl prüft die Soll/Isttemperatur und deaktiviert sich bei Ende des Boosts.

define Bd.Boost.State dummy
define Bd.Boost.Target dummy

define Bd.Boost.Notify notify Bd.FHT.Thermostat:desired-temp:.* {\
     my $soll=ReadingsVal("Bd.FHT.Thermostat", "desired-temp", 0);;\
     if($soll lt 30.0){\
            fhem "set Bd.Boost.Target $soll";;\
            if(Value("Bd.Boost.State") eq "off"){\
                my $ist=ReadingsVal("Bd.FHT.Thermostat", "measured-temp", 0);;\
                if(($soll-$ist) gt 1.5){\
                   fhem "set Bd.FHT.Thermostat desired-temp 30.0";;\
                   fhem "set Bd.Boost.State on";;\
                   fhem "attr Bd.Boost.Check disable 0";;\
                }\
            }\
    }\
}

define Bd.Boost.Check at +*00:01:00 {\
 if(Value("Bd.Boost.State") eq "on"){\
          if((Value("Bd.Boost.Target") - ReadingsVal("Bd.FHT.Thermostat", "measured-temp", 0)) lt 1){\
                my $daytemp=Value("Bd.Boost.Target");;\
                fhem "set Bd.FHT.Thermostat desired-temp $daytemp";;\
                fhem "set Bd.Boost.State off";;\
                fhem "attr Bd.Boost.Check disable 1";;\
          }\
     }\
 else {\
          fhem "set Bd.Boost.State off";;\
          fhem "attr Bd.Boost.Check disable 1";;\
 }\
}
attr Bd.Boost.Check disable 1
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Jumbo

hmm

irgendwie hab ich was verpasst....

hab's mal ausprobiert bei mir , soll temperatur auf 30 grad gesetzt, und ich habe trotzdem beim

Bd.Boost.Check
disabled

und

Bd.Boost.State
???
Bd.Boost.Target
27.0

keine ahnung wieso 27.

der actuator ist auf 96%

müsste er dann nicht auch auf 100% gehen sobald ich 27 grad z,b. mache ?

broadway

Bd.Boost.State muss einmalig auf "off" gesetzt werden. Fehlt oben, sorry.

Die Soll-Temperatur 30° ist für den Boost selbst "reserviert". Wer will es wirklich so warm haben?

Wenn Target auf 27 steht, hat der FHT dies so an FHEM gemeldet.
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

broadway

Hier die korrigierte Version. "State" muss nicht von Hand gesetzt werden, da auf "not equal" abgefragt wird.

define Bd.Boost.State dummy
define Bd.Boost.Target dummy

define Bd.Boost.Notify notify Bd.FHT.Thermostat:desired-temp:.* {\
     my $soll=ReadingsVal("Bd.FHT.Thermostat", "desired-temp", 0);;\
     if($soll lt 30.0){\
            fhem "set Bd.Boost.Target $soll";;\
            if(Value("Bd.Boost.State") ne "on"){\
                my $ist=ReadingsVal("Bd.FHT.Thermostat", "measured-temp", 0);;\
                if(($soll-$ist) gt 1.5){\
                   fhem "set Bd.FHT.Thermostat desired-temp 30.0";;\
                   fhem "set Bd.Boost.State on";;\
                   fhem "attr Bd.Boost.Check disable 0";;\
                }\
            }\
    }\
}

define Bd.Boost.Check at +*00:01:00 {\
 if(Value("Bd.Boost.State") eq "on"){\
          if((Value("Bd.Boost.Target") - ReadingsVal("Bd.FHT.Thermostat", "measured-temp", 0)) lt 1){\
                my $daytemp=Value("Bd.Boost.Target");;\
                fhem "set Bd.FHT.Thermostat desired-temp $daytemp";;\
                fhem "set Bd.Boost.State off";;\
                fhem "attr Bd.Boost.Check disable 1";;\
          }\
     }\
 else {\
          fhem "set Bd.Boost.State off";;\
          fhem "attr Bd.Boost.Check disable 1";;\
 }\
}
attr Bd.Boost.Check disable 1
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

maeb3

Wichtiger Hinweis:
damit die oben vorgestellte Lösung korrekt funktioniert, darf man nicht gleichzeitig die Funktion "addlog" verwenden, um die desired-temp in regelmäßigen Abständen ins Logfile zu schreiben.

In einem anderen Beitrag wird "addLog" empfohlen, damit im Temperatur-Plot die desired-temp keine Lücken aufweist (z.B. vom Tagesbeginn bis zur ersten Änderung des Tages bzw. von der letzten Änderung bis zum aktuellen Zeitpunkt).

  define desiredTemp_writer at +*00:30 {addLog("Thermostat_19","desired-temp")}

Wenn man diese Funktion nutzt, übernimmt das Boost-Konstrukt die 30 C nach einem addLog-Eintrag als tatsächliche Zieltemperatur. Wer das nicht berücksichtigt, heizt sich ordentlich ein (hatte gestern schon 26 C in der Wohnung als ich nach Hause kam ;-).

Nach Abschalten von addLog funktioniert Boost bei mir aber prima.

Grüße,
 Matthias

Jumbo

hi Mathias,

kannst du deinen Code bitte mal ganz posten ?

danke dir


broadway

Zitat von: maeb3 schrieb am Di, 22 Januar 2013 18:05Wichtiger Hinweis:
damit die oben vorgestellte Lösung korrekt funktioniert, darf man nicht gleichzeitig die Funktion "addlog" verwenden, um die desired-temp in regelmäßigen Abständen ins Logfile zu schreiben.

In einem anderen Beitrag wird "addLog" empfohlen, damit im Temperatur-Plot die desired-temp keine Lücken aufweist (z.B. vom Tagesbeginn bis zur ersten Änderung des Tages bzw. von der letzten Änderung bis zum aktuellen Zeitpunkt).

  define desiredTemp_writer at +*00:30 {addLog("Thermostat_19","desired-temp")}

Wenn man diese Funktion nutzt, übernimmt das Boost-Konstrukt die 30 C nach einem addLog-Eintrag als tatsächliche Zieltemperatur. Wer das nicht berücksichtigt, heizt sich ordentlich ein (hatte gestern schon 26 C in der Wohnung als ich nach Hause kam ;-).

Nach Abschalten von addLog funktioniert Boost bei mir aber prima.

Grüße,
 Matthias

Hallo Matthias,

Ich verwende die Funktion nicht. Aber das Verhalten wundert mich insofern, da mit
if($soll lt 30.0){\
            fhem "set Bd.Boost.Target $soll";;\


(also "Sollwert kleiner 30 -> aktualisiere Target") verhindert wird, dass die "reservierte" Boost Temperatur von 30° als Target gesetzt wird. Da müsste ja addLog() schon schreibend auf die desired-temp zugreifen?

Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

sengelking

Also theoretisch müsste für Ventilöffnung 100% die desired-temp auf 30.5 gestellt werden, so geht der FHT dann auf "on" bei 30 geht er nur auf 30 und öffnet die Ventile nicht bis auf 100%. Zumindest war das meine Erfahrung, daher habe ich meinen boost damals auch auf 30.5 gestellt...
FHEM aud RaspberryPi

broadway

Zitat von: sengelking schrieb am Mi, 23 Januar 2013 19:54Also theoretisch müsste für Ventilöffnung 100% die desired-temp auf 30.5 gestellt werden, so geht der FHT dann auf "on" bei 30 geht er nur auf 30 und öffnet die Ventile nicht bis auf 100%. Zumindest war das meine Erfahrung, daher habe ich meinen boost damals auch auf 30.5 gestellt...

Diese klitzekleine Optimierung kann man natürlich schnell selbst einfügen. Mein Ventil öffnet mit 30° auf 97%.
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

maeb3

Hallo,

Meine fhem.cfg sah folgendermaßen aus:

Zitatdefine 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:

Zitatdefine 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:

Zitatsub
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";
    }
}

broadway

Zitat von: maeb3 schrieb am Mi, 23 Januar 2013 22:20Hallo,
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)
Genau.

Zitat- Wenn in der Zwischenzeit aber der desiredTemp_writer zuschlägt (alle 30 Minuten), wird die aktuelle desired Temp (30 C) geschrieben
So wie ich deine Prozedur lese, "schreibt" der Temp_Writer ja nicht desired-temp 30, sondern liest diese aus und trägt sie ins LogFile ein. Der Temp_Writer löst NICHT das Boost Notify aus.

ZitatDamit 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.
WENN das Boost Notify getriggert wird, dann nur weil das FHT gerade desired-temp sendet.
Und schau mal auf deinen eigenen Satz: "...und somit ist die erste Bedingung nicht erfüllt" genau! Deswegen wird $soll=30 NICHT auf Target übertragen und die Abschaltung funktioniert.

Natürlich glaube ich dir, dass deine Bude zu warm war, aber an diesem Punkt kann es nicht liegen. Bei mir läuft der Boost jetzt schon einige Wochen auch mit Sollwertänderungen ohne Probleme.
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

sengelking

Ich habe meinen Boost-Modus im Wiki veröffentlicht: http://www.fhemwiki.de/wiki/FHT-Boost
Kann gerne als Zusatz erweitert werden!
FHEM aud RaspberryPi

maeb3

Hallo broadway,

du hast Recht. Da ich täglich die fhem.cfg wegsichere, konnte ich meinen Fehler im Nachhinein noch finden.

Ich hatte
define TC_boost_Check at *00:02:00
in meiner fhem.cfg.

Richtig ist natürlich
define TC_boost_Check at +*00:02:00
also mit + Zeichen, so wie du es auch in deinem Code-Beispiel geschrieben hattest.
Muss mir wohl beim übertragen passiert sein.

Beim Troubleshooting hatte ich dann unter anderem addlog deaktiviert und den Boost-Code nochmals neu eingetragen und nachdem es dann funktionierte fälschlicherweise angenommen, dass es am addlog lag. In Wirklichkeit lag es aber daran, dass ich beim zweiten Versuch den Code richtig (mit + Zeichen) übertragen hatte.

Danke für die Unterstützung.
Matthias

broadway

Naja, da wäre es um 00:02 Uhr ja auch wieder kühler geworden. ;)

Freut mich, wenn's funktioniert.
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

stromer-12

Ich habe es bei mir jetzt so verändert, das ich mit einen userreading je Thermostat und einem Notify für alle Thermostate den Boost für alle Thermostate realisiere.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL