Habe es mir so vorgestellt die ds18b20 Sensoren messen engmaschig den Rücklauf bis er annähernd der Sollraumtemperatur entspricht dann gehen die Ventile zu. Die Raumthermostat Temperatur ist denen aber übergeortnet heisst wenn durch Sonneneinwirkung oder Gäste die Sollraumtemperatur schon voher erreicht ist stoppt er den Prozess. Ist nur so ein Gedankenspiel weiß nicht ob ich das richtig gedacht habe. Aber wollte die FBH sowieso mit Rücklaufsensoren ausstatten. Wäre schön wenn man die mit reinnehmen könnte. `
Hallo DJ Watson,
meine Name ist Twoxx. Ich bin der Entwickler des Original-Scripts dieser Heizungssteuerung im Homematic-Forum.
Ich freute mich sehr das Apollon meine Arbeit hier für ioBroker zur Verfügung stellt und das er sich die Arbeit gemacht hat, das Script zu portieren.
Und natürlich freue ich mich, dass diese Lösung so einen positiven Anklang findet.
Bei der Entwicklung des Scripts hatte ich ebenfalls Deine Gedanken und auch versucht diese umzusetzen.
Ich hatte hierfür an den Rücklauf-Schläuchen Homematic Temperaturmesser angebracht
(HM-WDS30-OT2-SM bzw. HM-WDS30-T-O). Diese messen natürlich nicht direkt die Wassertemperatur, sondern eben aussen am Schlauch die Schlauchtemperatur.
Leider mußte ich feststellen, dass diese Temperaturmesser insgesamt sehr ungenau sind bzw. nicht einheitlich messen. Teilweise unterscheiden sich die Messergebnisse der Temperaturmesser im Vergleich um 1,5 Grad und auch im Vergleich zu den Wandthermostaten gibt es nochmals Unterschiede. Ausserdem war es eine sehr teuere Lösung, abhängig wieviele Heizkreise man besitzt.
Ich hatte deshalb von dieser Variante Abstand genommen und eine andere Lösung in das Script integriert.
Anstatt die Rücklauftemperatur zu messen, rechnet mein Script die WAHRSCHEINLICHE Raumtemperaturentwicklung der nächsten beiden Schaltzyklen des Scripts VORAUS (im Standard also die nächsten 20 Minuten bzw. 40 Minuten - je nachdem welches Intervall man persönlich gewählt hat).
Vom zeitlichen Ablauf her, greift also meine Lösung bereits VOR Deinem Lösungsvorschlag mit der Rücklauftemperatur. Sofern mein Script "vermutet" das die Raumtemperatur innerhalb der nächsten Zeit die Sollemperatur erreichen wird, schaltet es bei den Aktoren bereits "reduzierte Heizzeiten" für die PWM, sodaß kein Überheizen erfolgt.
Siehe hierzu der Original-Teil des Homematic-Scripts:
ACHTUNG! KEIN IOBROKER-CODE, sondern HOMEMATIC-SCRIPT!!
Veröffentlichung dient nur zur Veranschauung!
!---------------------- Einschaltzeit berechnen -----------------
if ((dom.GetObject("isttemperaturEGBuro").Value()) <= (dom.GetObject("solltemperaturEGBuro").Value()))
{
WriteLine("Isttemperatur kleinergleich solltemperatur");
dom.GetObject("heizleistungEGBuro").State((0.0000 + ((((dom.GetObject("solltemperaturEGBuro").Value() + 0.2000) - dom.GetObject("isttemperaturEGBuro").Value()) / dom.GetObject("toleranzEGBuro").Value()) * 100.0000)));
dom.GetObject("heizzeit1EGBuro").State((0.0000 + ((dom.GetObject("ScriptintervallEGBuro").Value() * dom.GetObject("heizleistungEGBuro").Value()) / 100.0000)));
dom.GetObject("einschaltzeitvergleichtempEGBuro").State((0.0000 + ((dom.GetObject("EGBuroFBTempDiff").Value() * dom.GetObject("heizzeit1EGBuro").Value()) / dom.GetObject("EGBuroDiffStartEndHeizzeit").Value())))
dom.GetObject("OrigHeizEGBuro").State(dom.GetObject("heizzeit1EGBuro").Value());
if (((dom.GetObject("toleranzEGBuro").Value() * dom.GetObject("heizleistungEGBuro").Value()) / 100.0000) >= dom.GetObject("einschaltzeitvergleichtempEGBuro").Value())
{
WriteLine("heizzeit im original übernommen"); dom.GetObject("heizzeitEGBuro").State((dom.GetObject("heizzeit1EGBuro").Value() * 60.0000));
}
else
{
WriteLine("reduzierte heizzeit übernommen");
dom.GetObject("tempdifferenzkalkrealEGBuro").State((0.0000 + (dom.GetObject("einschaltzeitvergleichtempEGBuro").Value() - ((dom.GetObject("toleranzEGBuro").Value() * dom.GetObject("heizleistungEGBuro").Value()) / 100.0000))));
dom.GetObject("reduzierungszeitEGBuro").State(0.0000 + ((dom.GetObject("tempdifferenzkalkrealEGBuro").Value() * dom.GetObject("EGBuroDiffStartEndHeizzeit").Value()) / dom.GetObject("EGBuroFBTempDiff").Value()));
dom.GetObject("neueheizzeitEGBuro").State((0.0000 + (dom.GetObject("heizzeit1EGBuro").Value() - dom.GetObject("reduzierungszeitEGBuro").Value())));
if (dom.GetObject("neueheizzeitEGBuro").Value() <= 0.0000)
{
dom.GetObject("heizzeitEGBuro").State((0.0000 + dom.GetObject("SicherheitsheizzeitEGBuro").Value())); WriteLine("sicherheitshalber 4 Minuten heizen");
}
else
{
dom.GetObject("heizzeitEGBuro").State((0.0000 + (dom.GetObject("neueheizzeitEGBuro").Value() * 60.0000))); WriteLine("neueheizzeit übernommen");
}
}
}
else
{
WriteLine("Isttemperatur größer solltemperatur");
dom.GetObject("heizleistungEGBuro").State((0.0000 + (((dom.GetObject("hochtempEGBuro").Value() - dom.GetObject("isttemperaturEGBuro").Value()) / dom.GetObject("toleranzEGBuro").Value()) * 100.0000)));
dom.GetObject("heizzeit1EGBuro").State((0.0000 + ((dom.GetObject("ScriptintervallEGBuro").Value() * dom.GetObject("heizleistungEGBuro").Value()) / 100.0000)));
dom.GetObject("einschaltzeitvergleichtempEGBuro").State((0.0000 + (dom.GetObject("EGBuroFBTempDiff").Value() * dom.GetObject("heizzeit1EGBuro").Value() / dom.GetObject("EGBuroDiffStartEndHeizzeit").Value())));
dom.GetObject("OrigHeizEGBuro").State(dom.GetObject("heizzeit1EGBuro").Value());
if (((dom.GetObject("toleranzEGBuro").Value() * dom.GetObject("heizleistungEGBuro").Value()) / 100.0000) >= dom.GetObject("einschaltzeitvergleichtempEGBuro").Value())
{
WriteLine("heizzeit im original übernommen"); dom.GetObject("heizzeitEGBuro").State((dom.GetObject("heizzeit1EGBuro").Value() * 60));
}
else
{
WriteLine("reduzierte heizzeit übernommen");
dom.GetObject("tempdifferenzkalkrealEGBuro").State(0.0000 + (dom.GetObject("einschaltzeitvergleichtempEGBuro").Value() - ((dom.GetObject("toleranzEGBuro").Value() * dom.GetObject("heizleistungEGBuro").Value()) / 100.0000)));
dom.GetObject("reduzierungszeitEGBuro").State(0.0000 + ((dom.GetObject("tempdifferenzkalkrealEGBuro").Value() * dom.GetObject("EGBuroDiffStartEndHeizzeit").Value()) / dom.GetObject("EGBuroFBTempDiff").Value()));
dom.GetObject("neueheizzeitEGBuro").State(0.0000 + (dom.GetObject("heizzeit1EGBuro").Value() - dom.GetObject("reduzierungszeitEGBuro").Value()));
if (dom.GetObject("neueheizzeitEGBuro").Value() <= 0.0000)
{
dom.GetObject("heizzeitEGBuro").State(0.0000 + dom.GetObject("SicherheitsheizzeitEGBuro").Value()); WriteLine("sicherheitshalber 4 Minuten heizen");
}
else
{
dom.GetObject("heizzeitEGBuro").State(0.0000 + (dom.GetObject("neueheizzeitEGBuro").Value() * 60.0000)); WriteLine("neueheizzeit übernommen");
}
}
Mein Script versucht so die Trägheit der Fussbodenheizung zu kompensieren.
Wie Du ja selbst geschrieben hast, heizen sich die Fliesen der Fussbodeneizung ja auf und geben weiter Wärme ab. Dies passiert auch, wenn Du rücklauftemperaturgesteuert
die Aktoren abschaltest. Es könnte aber sein, dass hier der Zeitpunkt ebenfalls schon zu spät gewählt ist und der Raum trotzdem zu warm wird, bzw. man müsste wohl mit entsprechendem
OFFSET bei den Temperaturen arbeiten.
Hier kann man natürlich spielen und sofern man den zeitlichen Aufwand betreiben will auch eine passende Lösung entwickeln.
Was mein Script angeht, könnte man hierfür im oben dargestellten Teil des Scripts "eingreifen" und eine entsprechende Schaltzeit bzw. im Teil der Schaltlogik einen Ausschaltbefehl unterbringen.
Da ich leider für IO-Broker nicht programmieren und nicht testen kann, könnte ich so eine Lösung nur für Homematic umsetzen.
Sofern Du meine Lösung bereits umgesetzt hast (und soweit ich das Io-Broker Script von Apollon beurteilen kann, hat er meinen obigen Script-Teil auch in seine Arbeit mit übernommen), Deine Vorlauftemperatur passt und Deine Räume trozdem zu warm sind, dann müssen die Parameter auf Deine Verhältnisse angepasst werden.
Im Homematic Forum habe ich hierfür folgende Beschreibung eingestellt:
` > - Sofern der der Zuschlag bei hochtempEGBuro (im Beispiel +0,5°) zu groß gewählt wird und die aktuelle IST-Temperatur ÜBER der Solltemperatur liegt, kann es vorkommen, dass die Ist-Temperatur weit oberhalb der Soll-Temperatur gehalten wird und nie den Bereich innerhalb der Hysterese erreicht. –> Der Raum bleibt viel zu warm und kann nicht abkühlen.
- Sofern der Abschlag toleranzniederEGBuro (im Beispiel 0,8°) zu groß gewählt wird und die aktuelle IST-Temperatur UNTER der Solltemperatur liegt, kann es vorkommen, dass die IST-Temperatur
weit unterhalb der Soll-Temperatur bleibt und die Raumtemperatung nie den Bereich der Hysterese oder die Solltemperatur erreicht. --> Der Raum bleibt zu kalt.
Die beiden Werte müssen individuell durch Ausprobieren im jeweiligen Raum ermittelt werden. Als Startwerte zum Ausprobieren eigenen sich die im Beispielscript hinterlegten Werte auf jeden Fall.
Hierbei wird davon ausgegangen, dass die Einstellungen der Vorlauftemperatur der Heizung bereits VOR Umsetzung der hier dar gestellten Lösung im entsprechend für die jeweilige Heizung
erforderlichen normalen Rahmen liegen. `
Ich hoffe ich konnte etwas weiterhelfen.
Frdl. Gruß
Twoxx