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

Mirko

Hallo
ich finde das mit dem boost ne echte geniale sache, allerdings steige ich noch nicht wirklich durch, hab schon einige Sachen verändert, aber die Funktion greift irgendwie nicht :(

Wo muss ich an den Scripten noch Anpassungen für mein System vornehmen?
Habe aktuell 2 FTH`s im Einsatz und würde gerne beide per boost ansprechen.

Gruß und Danke für die Hilfe
Mirko

broadway

Hallo,

die korrigierte Version kann man per copy und paste in die fhem.cfg einfügen. Dann noch den Bezeichner des FHT so ändern, wie dein Gerät eben heißt.

Bd.FHT.Thermostat -> der Name deines FHT, also z.B. FHT_im_Badezimmer


Für mehrere FHTs muss man den gesamten codeschnipsel vervielfachen und dabei unterschiedliche Bezeichner verwenden:

define Bd.Boost.State dummy -> define FHT_im_Badezimmer.State dummy; define FHT_im_Wohnzimmer.State dummy; ...
usw.

Die Bezeichner können auch beliebig geändert werden, Hauptsache je FHT gibt es sie nur ein Mal.


Falls es nicht klappt, einfach mal deinen code posten, am Besten in einem neuen Thread.
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro

Mirko

Perfekt, hat geklappt
mich hat das bd.FHT. etwas verwirrt ;)

LudgerR

Hallo,
habe gerade mal bei mir getestet, ob ein Start mit einer Boost-Temp von 30.0° soviel bringt, wenn man den Hobbyraum im OG von 15.0 auf 20.0 erwärmen will und war vom Ergebnis überrascht.  90% Ventil nach 5 min, 100 % nach 10 Minuten. Nach Erreichen von 100% habe ich die desired-temp bereits auf 20°  gesetzt. Das Ventil blieb bis zum Erreichen von 17° (nach weiteren 20 min) weiterhin auf 100%. Danach den Test abgebrochen.
Meine Schlussfolgerungen:
Durch das anfängliche Setzten einer Boost-Temp kann ich man das temporäre Aufheizen eines Raumes beschleunigen, insbesondere dadurch, dass man das FHT-Gerät dazu bringt sofort mit einem vollgeöffneten Ventil zu starten anstatt mit kleinen Werten zu beginnen.
Was ich jedoch nicht verstehe:
Wofür die ganze Kodierung/Konfiguration,  wenn die Steuerung des FHT-Gerät die per Boost forcierte maximale Ventilöffnung ohnehin möglichst lange bei diesen 100% hält bis die Wunschtemperatur erreicht ist?
In meinem setup habe ich nun  meine Party-Funktion (basierend auf holiday-short mode) dahingehend geändert, dass  anfänglich als desired-temp 30° gesetzt  wird   und dieser Wert 15 min später mit der eigentlichen  Wunschtemperatur überschrieben wird. D.h. zwei  ,,set"   Kommandos (einer per at) tun den Job auch.

In meinem Fall z.B.:
  set FHT_devxx mode auto holiday1 122 holiday2 5 mode holiday_short desired-temp 30 report2
  set FHT_devxx desired-temp 20 report2 2

Im Falle von  FHTs sollte man nach meinen Erfahrungen möglichst deren Funktion ausnutzen und von der Centralen nicht zuviel steuerungs- und konfigurationsmäßig eingreifen. Ab 10 und spätestens bei 12 Geräten wird es definitiv eng mit dem Funkverkehr.

Gruß,
 Ludger
Fhem/mosquitto/zigbee2mqtt  on PI 3+ , 2xCUNO, 13xFHT, EM1000 WZ/GZ, FS20,AMAD,SONOS, MQTT (Sonoff/Shelly),Buderus GB-112,CanOverEthernet(UVR67/CIM)

broadway

Zunächst mal sind wir uns einig, dass die Regelung der FHT recht träge ist, wahrscheinlich,  um ein zu starkes Überschreiten der Temperatur zu verhindern. In einer energieoptimierten Heizungsanlage (niedrige Vorlauftemperaturen) macht es also Sinn, etwas nachzuhelfen. Im Bild sieht man sehr gut wie steil während des Boost die Temperatur ansteigt. Im Normalbetrieb ist nur ein geringer Anstieg zu erkennen:


(siehe Anhang / see attachement)



Wenn dir deine Lösung reicht ist das völlig OK. Allerdings legst du damit sowohl die Temperatur als auch die Zeit fest.

- Die obige Konstruktion fährt jede Wunschtemperatur mit voll geöffneten Ventilen an und deaktiviert sich selbst, hält dann die eingestellte Temperatur.

- Je nach Gebäude und Raum (und Soll-/ Istdifferenz) ist die Aufheizzeit unterschiedlich, das wird mit dem Code ausgeglichen

- Thema Funkverkehr: Der FHT bekommt wie in deinem Vorschlag nur zwei Befehle!
Linksys NSLU2 debian + CUL | FHT80B, FS20, Elro