Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme

Begonnen von freetz, 16 November 2016, 23:02:12

Vorheriges Thema - Nächstes Thema

aorta

Oh, da bin ich in der Zeile verrutscht. Werde ich gleich ändern.
Danke
Patrick

Zitat von: CoolTux am 06 Dezember 2017, 21:49:00
Das ist von oben, sieht irgendwie anders aus

sub IstSollHeizung($@){


Die Fehlermeldung sagt doch schon was los ist. Zeile eins
ERROR evaluating { IstSollHeizung("Wohnzimmer","Leon","Leander") }: Malformed prototype for main::IstSollHeizung: "Wohnzimmer","Leon","Leander" at (eval 790) line 1

hsepm

#16
Hallo zusammen,

mit Hilfe von freetz (vielen Dank!) habe ich nun auch eine Regelung mit 50% Raumeinfluss für meine Broetje EcoCondens BBS 15E aufgesetzt. Ich benutze ein bsb_lan Interface auf einem Arduino Mega Clone von Elegoo.
Hier im Forum gibt es dafür einen Thread, ich komme als Neuling noch nicht mit der Verlinkung des Threads klar.

Die Heizungskonfi in fhem ist eine Modifikation des Beispiels in der Dokumentation zur bsb_lan Software, also nichts Wildes.

Für die bessere Darstellung habe ich noch ein Userreading Modus erstellt, dass die Betriebsart als Text formatiert.

Das Sicherheitsfeature PASSKEY habe ich hier mal aus den URLs entfernt und die URLs teilanonymisiert.


define Heizung HTTPMOD http://192.168.x.x/8950/8314/700/710/8700/8326/8740 300
attr Heizung userattr reading0Name reading0Regex reading1Name reading1Regex reading3Name reading3Regex reading4Name reading4Regex reading5Name reading5Regex reading6Name reading6Regex replacement01Mode:reading,internal,text,expression,key set00Name set00URL set01Data set01Name set01URL set02Name set02URL set0URL
attr Heizung event-on-change-reading .*
attr Heizung reading0Name Außentemperatur
attr Heizung reading0Regex 8700 .*:[ \t]+([-]?[\d\.]+)
attr Heizung reading1Name Vorlauftemperatur
attr Heizung reading1Regex 8950 .*:[ \t]+([-]?[\d\.]+)
attr Heizung reading2Name Ruecklauftemperatur
attr Heizung reading2Regex 8314 .*:[ \t]+([-]?[\d\.]+)
attr Heizung reading3Name Betriebsart
attr Heizung reading3Regex 700 .*:[ \t]+([-]?[\d\.]+)
attr Heizung reading4Name Komfortsollwert
attr Heizung reading4Regex 710 .*:[ \t]+([-]?[\d\.]+)
attr Heizung reading5Name Brennermodulation
attr Heizung reading5Regex 8326 .*:[ \t]+([-]?[\d\.]+)
attr Heizung reading6Name Raumtemperatur
attr Heizung reading6Regex 8740 .*:[ \t]+([-]?[\d\.]+)
attr Heizung readingOExpr $val=~s/[\r\n]//g;;$val
attr Heizung room Global
attr Heizung set00Name Komfortsollwert
attr Heizung set00URL http://192.168.x.x/S710=$val
attr Heizung set01Name Betriebsart
attr Heizung set01URL http://192.168.x.x/S700=$val
attr Heizung set02Name Raumtemperatur
attr Heizung set02URL http://192.168.x.x/I10000=$val
attr Heizung timeout 5
attr Heizung userReadings Spreizung { sprintf("%.1f",ReadingsVal("Heizung","Vorlauftemperatur",0)-ReadingsVal("Heizung","Ruecklauftemperatur",0));; },\
Modus { (ReadingsNum($name,"Betriebsart",0) == 0) ? "Schutzbetrieb" : ((ReadingsNum($name,"Betriebsart",0) == 1) ? "Automatik" : (ReadingsNum($name,"Betriebsart",0) == 2) ? "Reduziert" : "Komfort") }
attr Heizung verbose 0


Setzen Raumeinfluss Heizkreis 1 über bsb_lan:

http://192.168.x.x/S750=50.00


Die Raumtemperatur wird über einen einzigen Sensor vom Typ ABS700 alle 5 Minuten per at-Job an die Heizung geliefert. Hier ist zu beachten, dass die Temperatur im reading "other" ankommt.


define WZ_SE_Temperatur CUL_TCM97001 CUL_TCM97001_20
attr WZ_SE_Temperatur event-min-interval .*:600
attr WZ_SE_Temperatur event-on-change-reading .*
attr WZ_SE_Temperatur model ABS700
attr WZ_SE_Temperatur room Wohnzimmer
attr WZ_SE_Temperatur stateFormat {ReadingsVal("WZ_SE_Temperatur","other",0)}

define AT_HeizungRaumTemperatur at +*00:05:00 { fhem("set Heizung Raumtemperatur ".Value("WZ_SE_Temperatur")) }


Die Heizkörperthermostate sind nicht regelbar, aber "sinnvoll" eingestellt.

Ich werde nun mal schauen, ob die Heizung besser an die vorgegebenen Solltemperaturen (Komfort, Reduziert) heranregelt. Ohne Raumeinfluss ist das ja eher ein theoretischer Wert und nicht direkt von der Heizung mit einem Istwert vergleichbar.

Vielleicht sind diese Infos für den einen oder anderen hilfreich.

Viele Grüße,
Holger

EDIT: Nachtrag ... damit der Raumeinfluss die Kennlinie der Heizung modifizieren "darf" - in Grenzen, ist nach meinen Recherchen bei Broetje auch noch der Parameter


726 Heizkreis 1  Kennlinie Adaption: auf "Ein =255"

zu setzen.

freetz

Da ich gerade sehr gute Erfahrungen mit 100% Raumeinfluss mache (zumindest bei meiner Elco Thision, vermutlich aber auch mit allen anderen, die über eine Siemens-Steuerung verfügen, wie z.B. Brötje), weil dort über die Spreizung in Verbindung mit der Raumtemperatur gerechnet wird (ein Rücklauffühler ist dafür natürlich Voraussetzung), habe ich mein Script noch etwas modifiziert, weil die ursprüngliche Version doch zu größeren Schwankungen im Ist- und auch im Soll-Temperaturbereich geführt hat (letzters zumindest, wenn man unterschiedliche Soll-Temperaturen in verschiedenen Räumen hat). Das macht es der Therme natürlich schwerer, sich entsprechend einzuregeln.

Die jetzige Version ist zwar im Prinzip wie das Beispiel zu Anfang, nimmt aber nun als Soll-Temperatur generell die höchste Soll-Temperatur, so dass es zu deutlich weniger Sollwert-Wechseln kommt. Letztlich ist dieser Wert ja auch der, an der sich die Heizung bei der Bereitstellung der Wärme orientieren muss. Von diesem Wert wird dann bei den Räumen, die noch nicht die Soll-Temperatur erreicht haben, die gemittelte Differenz aller Räume zwischen Soll- und Ist-Temperatur abgezogen.

Wenn alle Räume das Soll erreicht oder überschritten haben, wird weiterhin die höchste Soll-Temperatur übermittelt, aber anstatt wie früher die höchste Ist-Temperatur zu nehmen, wird nun die Ist-Temperatur wie folgt gebildet: Als Grundlage dient die höchste Soll-Temperatur, zu der dann die kleinste Differenz zwischen Soll- und Ist-Temperatur auf Grundlage aller Räume hinzuaddiert wird. Das verhindert, dass bei Erreichen aller Soll-Temperaturen ein überheizter Raum zu plötzlichen starken Ausschlägen in der Ist-Temperatur führt, die dann bei Unterschreitung der Soll-Temperatur eines Raumes ebenso schlagartig wieder abfällt.

Beispiel: Alle Räume haben die Soll-Temperatur erreicht, Raum 1 (Soll: 20 Grad) wird aber durch Kamin beheizt und ist schon bei 23 Grad, wohingegen das Schlafzimmer (Soll: 19 Grad) gerade mal 19,1 Grad misst. In der vorigen Version wäre dann 20 Grad als Soll- und 23 Grad als Ist-Temperatur übermittelt worden. Nun wird als Soll weiterhin 20 Grad übertragen, aber als Ist-Temperatur die kleinste Differenz zwischen Soll- und Ist-Temperatur, also 19,1 minus 19,0 = 0,1 (was kleiner ist als 23,0 minus 20,0 = 3,0), was zu der Soll-Temperatur hinzuaddiert wird, also 20,1 Grad.

Somit bleibt die Soll-Temperatur konstant und bei der Ermittlung der Ist-Temperatur blebt berücksichtigt, dass ein Raum die Soll-Temperatur nur knapp überschritten hat. Die Therme (meine zumindest) fährt somit nicht komplett auf null, wie sie es bei einer Übermittlung von 20/23 Grad gemacht hätte, sondern moduliert erst einmal etwas runter. Umgekehrt fährt sie dann auch nicht gleich auf Volllast hoch, wenn statt 20/23 dann auf einmal 18,9/19 übermittelt wird. Das Ergebnis ist deutlich geringeres Takten, bessere Modulation und durch die längeren Laufzeiten mit geringeren Temperaturen auch ein besseres Brennwertergebnis.

Hier also der Code:

sub IstSollHeizung($@){
  my @devices = @_;
  if ($devices[0] eq "*") {
    @devices = devspec2array("TYPE=MAX:FILTER=type=.*Thermostat");
  }
  my ($device, $ist_temp, $max_ist_temp_diff, $diff_temp, $anz_rooms, $soll_temp
, $max_soll_temp) = (0)x7;
  my $max_ist_temp_diff = 99;
  foreach $device (@devices) {
    my $dev_ist_temp = ReadingsVal("$device","temperature",0);
    my $dev_soll_temp = ReadingsVal("$device","desiredTemperature",0);
    if ($dev_ist_temp - $dev_soll_temp < $max_ist_temp_diff) {
      $max_ist_temp_diff = $dev_ist_temp - $dev_soll_temp;
    }
    if ($dev_soll_temp > $max_soll_temp) { $max_soll_temp = $dev_soll_temp }

    if ($dev_ist_temp < $dev_soll_temp) {
      $anz_rooms++;
      $diff_temp = $diff_temp + $dev_ist_temp - $dev_soll_temp;
    }
#    Log 3, "$device - $dev_soll_temp - $soll_temp";
  }

  $soll_temp = $max_soll_temp;
  if ($anz_rooms > 0) {
    $ist_temp = $soll_temp + ($diff_temp / $anz_rooms);
  } else {
    $ist_temp = $max_soll_temp + $max_ist_temp_diff;
  }

  fhem("set THISION Komfortsollwert $soll_temp");
  fhem("set THISION Reduziertsollwert $soll_temp");
  fhem("set THISION Istwert $ist_temp");
  return ("Ist: $ist_temp, Soll: $soll_temp, Diff: " . sprintf("%.2f", $diff_temp) . ", Zimmer: $anz_rooms");
}
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

FunkOdyssey

Zitat von: hsepm am 04 Januar 2018, 08:45:33
EDIT: Nachtrag ... damit der Raumeinfluss die Kennlinie der Heizung modifizieren "darf" - in Grenzen, ist nach meinen Recherchen bei Broetje auch noch der Parameter


726 Heizkreis 1  Kennlinie Adaption: auf "Ein =255"

zu setzen.

Da habe ich aber andere Erfahrungen gemacht. Meine Kennlinie ist seit Jahren konstant auf 0.56 und ProgID 726 auf "Aus". Dennoch regelt die Therme runter, wenn der Raum zu warm ist.

freetz

Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

hsepm

#20
Zitat von: FunkOdyssey am 14 Februar 2018, 15:26:41
Da habe ich aber andere Erfahrungen gemacht. Meine Kennlinie ist seit Jahren konstant auf 0.56 und ProgID 726 auf "Aus". Dennoch regelt die Therme runter, wenn der Raum zu warm ist.

Die Kennlinie für die Außentemperaturführung wird bei 726=Aus per Design nicht modifiziert. Die (Differenz zwischen Solltemperatur und) Raumtemperatur fließt aber gewichtet mit dem Raumeinfluss in die Findung der benötigten Vorlauftemperatur ein.

Ich sehe zwischen deiner Aussage und meiner Aussage keinen Widerspruch.

:)

EDIT:

Die Kennlinie regelt die Heizung bei Abwesenheit einer gesicherten Information über die Raumtemperatur. Die Kennlinie bestimmt nach meinen Kenntnisstand die Vorlauftemperatur (abhängige Variable) als Funktion der Außentemperatur (unabhängige Variable). Um der Heizung zu erlauben, die Parameter der Kennlinie (meist: Steigung, Parallelverschiebung) zu modifizieren, muss 726 eingeschaltet werden. Das wäre dann eine Art Kalibrierung der Kennlinienparameter. Ob das wirklich funktioniert, steht auf einem anderen Blatt.