Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme

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

Vorheriges Thema - Nächstes Thema

freetz

[EDIT: Aktualisierte Fassung für modifizierten Einsatzzweck gibt es hier: https://forum.fhem.de/index.php/topic,60900.msg755975.html#msg755975 ]

Hallo zusammen,

ich habe eine Elco-Thision-Therme, die ich dank des folgenden Therads über einen Arduino ansteuere:
https://forum.fhem.de/index.php?topic=29762.new;topicseen#new

Dazu kommen MAX!-Wand- und Heizungsthermostate, die ich ebenfalls über FHEM regele. Anstatt mir nun einen teuren Raumthermostat für die Thision zu kaufen, der dann auch nur die Temperatur eines Raumes übermittelt, lese ich die Temperaturen in den einzelnen Räumen aus und bilde daraus eine gemittelte Ist- sowie Soll-Temperatur, die ich dann regelmäßig an die Thision übermittele. Der Vorteil dabei ist, dass nicht nur die Thermostate die Heizkörper öffnen und schließen, sondern auch die Therme im Keller weiß, dass alle Räume warm genug sind und sie dann entsprechend herunterregeln kann. Die dafür eingesetzte Funktion stelle ich hier einmal ein, weil sie vielleicht auch für andere von Nutzen sein könnte. Über weitere Optimierungsvorschläge freue ich mich natürlich auch.

Aufgerufen wird die Funktion entweder über IstSollHeizung("*"), wenn alle (MAX-)Geräte in die Temperaturberechnung einfließen sollen, oder alternativ über eine kommagetrennte Auflistung der Geräte, die die Grundlage für die Berechnung liefern sollen: IstSollHeizung("WT_Kueche","WT_Bad"). Die Funktion kann relativ einfach an andere temperaturübermittelnde Geräte angepasst werden, hierzu muss lediglich der devspec2array-Typ bzw. Filter entsprechend gesetzt, bei den beiden ReadingsVal das entsprechende Reading für Ist- und Soll-Temperatur eingetragen und bei den drei fhem()-Aufrufen die set-Befehle zur Steuerung der Therme angepasst werden.

Als Basis für die Soll-Temperatur wird die höchste Soll-Temperatur des Raumes verwendet, die noch nicht erreicht worden ist. Als Ist-Temperatur wird die durchschnittliche Abweichung von den Soll-Temperaturen der Räume zugrunde gelegt, bei denen die Soll-Temperatur ebenfalls noch nicht erreicht worden ist. Diese Differenz wird dann von der im ersten Schritt übermittelten Soll-Temperatur abgezogen. Sind alle Räume oberhalb der Soll-Temperatur, wird als Soll-Temperatur 4 Grad übermittelt und als Ist-Temperatur die höchste Ist-Temperatur der angegebenen Räume. Die Heizung geht dann in den Ruhemodus.

Beispiel: 3 Räume mit Ist/Soll-Werten von 17.5/18.0, 21.5/20.0 und 18.0/19.0. Übermittelt wird 19.0 als Soll-Temperatur (der zweite Raum ist aus welchen Gründen auch immer überheizt und fließt daher nicht in die Berechnung mit ein) und 19.0-((0.5+1.0)/2) = 19.0-(1.5/2) = 19-0.75 = 18.25 als Ist-Temperatur.

Hier nun der Code dazu:

sub IstSollHeizung($@){
  my @devices = @_;
  if ($devices[0] eq "*") {
    @devices = devspec2array("TYPE=MAX:FILTER=type=.*Thermostat");
  }
  my ($device, $ist_temp, $diff_temp, $anz_rooms) = (0)x4;
  my $soll_temp = 4;
  foreach $device (@devices) {
    my $dev_ist_temp = ReadingsVal("$device","temperature",0);
    if ($dev_ist_temp > $ist_temp) {
      $ist_temp = $dev_ist_temp;
    }
    my $dev_soll_temp = ReadingsVal("$device","desiredTemperature",0);
    if ($dev_ist_temp < $dev_soll_temp) {
      $anz_rooms++;
      $diff_temp = $diff_temp + $dev_ist_temp - $dev_soll_temp;
      if ($dev_soll_temp > $soll_temp) { $soll_temp = $dev_soll_temp }
    }
  }
  if ($anz_rooms > 0) {
    $ist_temp = $soll_temp + ($diff_temp / $anz_rooms);
  }
  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_tem
p) . ", Zimmer: $anz_rooms");
}


Gruß,

F.
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

Scherheinz

Hallo freetz!

Ich habe auch ein MAX Wandthermostat installiert und bin bei der Suche auf deinen Thread hier gestoßen. Das Einbinden mit CUL hat super funktioniert und ich habe auch per Anleitung von dir schon Raumtemperatur Istwerte manuell an meine Elco Heizung geschickt. Jetzt stehe ich auf dem Schlauch und weiß nicht genau mit welchem Befehl ich die gelesene Temperatur an meine Heizung schicken muss.

Ist das die betreffende Zeile in deinem Code?

  fhem("set THISION Istwert $ist_temp");

Gruß Scherheinz

freetz

Genau, sowie die beiden Zeilen darüber. Dann brauchst Du in Deinem FHEM-Gerät, das die Heizung abbildet (bei mir "THISION") noch entsprechende set-Readings, bei mir sehen die so aus:
attr THISION set0Name Komfortsollwert
attr THISION set0URL http://192.168.1.50/S710=$val
attr THISION set1Name Reduziertsollwert
attr THISION set1URL http://192.168.1.50/S712=$val
attr THISION set2Name Istwert
attr THISION set2URL http://192.168.1.50/I10000=$val


Ggf. musst Du die URLs bei Dir noch um den Passcode ergänzen, wenn Du BSB-Lan verwendest.
Wenn das bei Dir nicht auf Anhieb läuft, schau' Dir noch mal die FHEM-Wiki-Seiten zu HTTPMOD an.

Gruß,

F.
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

Scherheinz

Danke für die schnelle Antwort!
Die set-Readings habe ich bei meiner Heizung schon drin und funktionieren manuell auch ohne Probleme. Deinen Code verstehe ich noch nicht so ganz, muss der Wert [temperature] denn erst in [$ist_temp] geschrieben werden oder könnte man auch direkt beim Wandthermostat sowas schreiben wie "set THISION Istwert temperature"??
Steht dein Code denn eigentlich in der fhem.cfg oder läuft der sonst wo ab?
Entschuldige die Anfängerfragen aber die englischen Teile der Wiki sind keine so große Hilfe für mich.

Gruß Scherheinz

freetz

Hallo Scherheinz,

die Funktion IstSollHeizung wird über den FHEM "at" Befehl alle fünf Minuten aufgerufen. Die Funktion steht in der 99_MyUtils, die set-Definitionen in der fhem.cfg. Du kannst, wenn die set-Definitionen vorliegen, aber auch manuell mit z.B. "set THISION Istwert 19.8" den Istwert auf 19,8 Grad setzen, womit HTTPMOD dann den entsprechenden BSB_Lan-Aufruf absetzt, der diesen Wert über den Parameter 10000 der Therme mitteilt.
Sorry, dass ich nicht mehr dazu schreiben kann, aber für FHEM-Grundlagen gibt es auch hier im Forum sehr ausführliche Erklärungen, wenn das Wiki nicht reicht.

Gruß,

F.
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

Scherheinz

Super! Das reicht mir schon als Ansatz, den Rest versuche ich mir zu erarbeiten! :)
Danke nochmal!

Gruß Scherheinz

aorta

Hallo
Könntest du dazu auch mal den genauen at Befehl schreiben? Ich bekomme es nicht hin. :'(
Danke und Gruß
Patrick

Zitat von: freetz am 26 Oktober 2017, 20:58:05
Hallo Scherheinz,

die Funktion IstSollHeizung wird über den FHEM "at" Befehl alle fünf Minuten aufgerufen. Die Funktion steht in der 99_MyUtils, die set-Definitionen in der fhem.cfg. Du kannst, wenn die set-Definitionen vorliegen, aber auch manuell mit z.B. "set THISION Istwert 19.8" den Istwert auf 19,8 Grad setzen, womit HTTPMOD dann den entsprechenden BSB_Lan-Aufruf absetzt, der diesen Wert über den Parameter 10000 der Therme mitteilt.
Sorry, dass ich nicht mehr dazu schreiben kann, aber für FHEM-Grundlagen gibt es auch hier im Forum sehr ausführliche Erklärungen, wenn das Wiki nicht reicht.

Gruß,

F.

CoolTux

Was genau bekommst Du nicht hin? Zeig doch mal was Du bisher hast?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

aorta

#8
Hallo
Also, ich habe mir eine 99_myUtils.pm angelegt mit dem angepassten Code von oben:sub IstSollHeizung("Wohnzimmer","Leon","Leander"){
  my @devices = @_;
  if ($devices[0] eq "*") {
    @devices = devspec2array("TYPE=LaCrosse");
  }
  my ($device, $ist_temp, $diff_temp, $anz_rooms) = (0)x4;
  my $soll_temp = 4;
  foreach $device (@devices) {
    my $dev_ist_temp = ReadingsVal("$device","temperature",0);
    if ($dev_ist_temp > $ist_temp) {
      $ist_temp = $dev_ist_temp;
    }
    my $dev_soll_temp = ReadingsVal("$device","desiredTemperature",0);
    if ($dev_ist_temp < $dev_soll_temp) {
      $anz_rooms++;
      $diff_temp = $diff_temp + $dev_ist_temp - $dev_soll_temp;
      if ($dev_soll_temp > $soll_temp) { $soll_temp = $dev_soll_temp }
    }
  }
  if ($anz_rooms > 0) {
    $ist_temp = $soll_temp + ($diff_temp / $anz_rooms);
  }
  fhem("set Broetje Komfortsollwert $soll_temp");
  fhem("set Broetje Reduziertsollwert $soll_temp");
  fhem("set Broetje Istwert $ist_temp");
  return ("Ist: $ist_temp, Soll: $soll_temp, Diff: " . sprintf("%.2f", $diff_temp) . ", Zimmer: $anz_rooms");
}

Dann in in Fhem folgendes:
define Broetje HTTPMOD http://192.168.0.88/8700/8743/8830/8314/8326/8003/8310/8000 120
attr Broetje userattr reading0Name reading0Regex reading1Name reading1Regex reading2Name reading2Regex reading3Name reading3Regex reading4Name reading4Regex reading5Name reading5Regex reading6Name reading6Regex reading7Name reading7Regex readingOExpr set0Name set0URL
attr Broetje event-on-change-reading .*
attr Broetje reading0Name Aussentemperatur
attr Broetje reading0Regex 8700 .*:[ \t]+([-]?[\d\.]+)
attr Broetje reading1Name Vorlauftemperatur
attr Broetje reading1Regex 8743 .*:[ \t]+([-]?[\d\.]+)
attr Broetje reading2Name Ruecklauftemperatur
attr Broetje reading2Regex 8314 .*:[ \t]+([-]?[\d\.]+)
attr Broetje reading3Name Trinkwassertemperatur
attr Broetje reading3Regex 8830 .*:[ \t]+([-]?[\d\.]+)
attr Broetje reading4Name Brennermodulation
attr Broetje reading4Regex 8326 .*:[ \t]+([\d]+)
attr Broetje reading5Name Status-Trinkwasser
attr Broetje reading5Regex 8003 .*:[ \t]+([\d]+ [^<]*)
attr Broetje reading6Name Kesseltemperatur
attr Broetje reading6Regex 8310 .*:[ \t]+([-]?[\d\.]+)
attr Broetje reading7Name Status-Heizung
attr Broetje reading7Regex 8000 .*:[ \t]+([\d]+ [^<]*)
attr Broetje readingOExpr $val=~s/[\r\n]//g;;$val
attr Broetje room Heizung
attr Broetje set0Name Komfortsollwert
attr Broetje set0URL http://192.168.0.88/S710=$val
attr Broetje set1Name Reduziertsollwert
attr Broetje set1URL http://192.168.0.88/S712=$val
attr Broetje set2Name Istwert
attr Broetje set2URL http://192.168.0.88/I10000=$val
attr Broetje stateFormat Temp
attr Broetje timeout 9
attr Broetje userReadings Spreizung { sprintf("%.1f",ReadingsVal("Broetje","Vorlauftemperatur",0)-ReadingsVal("Broetje","Ruecklauftemperatur",0));; }


Ich möchte gerne halt den Mittelwert der 3 Räume alle paar Minuten an den Kessel senden. Ein Raum würde mir auch schon reichen. Was muss ich noch machen bzw. was ist alles falsch. Bin halt nicht der Programmierer.  :-\ Oder gibt es einen anderen Weg?

Danke
Patrick

Damian

Mit der aktuellen DOIF-Version ist es ein Dreizeiler, dabei wird die Durchschnitts-Temperatur nur gesendet, wenn sich der Wert ändert:

define di_average DOIF ([SELF:average])(set ... [$SELF:average])
attr di_average do always
attr di average DOIF_Readings average:[#average:d:":temperature":temperature:$TYPE eq "LaCrosse"]

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

freetz

defmod Ist_Soll_an_Heizung at +*00:05:00 { IstSollHeizung("Wohnzimmer_Wandthermostat","Schlafzimmer_Wandthermostat","Kinderzimmer_Thermostat","Kinderzimmer_oben_Thermostat","Ingrids_Arbeitszimmer_Thermostat") }
attr Ist_Soll_an_Heizung DbLogExclude .*
attr Ist_Soll_an_Heizung room Heizung
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

aorta

Hallo
Danke erstmal. Mit Doif habe ich noch nichts gemacht. Da muss ich mich mal einlesen.
Den Code von freetz habe ich mal getestet. Kommt aber ne Fehlermeldung.
2017.12.06 21:15:16 1: ERROR evaluating { IstSollHeizung("Wohnzimmer","Leon","Leander") }: Malformed prototype for main::IstSollHeizung: "Wohnzimmer","Leon","Leander" at (eval 790) line 1.

2017.12.06 21:15:16 3: Ist_Soll_an_Heizung: Malformed prototype for main::IstSollHeizung: "Wohnzimmer","Leon","Leander" at (eval 790) line 1.

2017.12.06 21:16:16 1: ERROR evaluating { IstSollHeizung("Wohnzimmer","Leon","Leander") }: Malformed prototype for main::IstSollHeizung: "Wohnzimmer","Leon","Leander" at (eval 794) line 1.

2017.12.06 21:16:16 3: Ist_Soll_an_Heizung: Malformed prototype for main::IstSollHeizung: "Wohnzimmer","Leon","Leander" at (eval 794) line 1.

Gruß
Patrick

CoolTux


sub IstSollHeizung("Wohnzimmer","Leon","Leander"){


Das ist totaler Unsinn. Bitte lese Dich in Perl Programmierung ein!
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

aorta

Ich habe von Perl kein Plan. Habe es so oben aus dem Code übernommen und angepasst.
Können die Fehlermeldungen kommen, weil ich keine Soll Temperatur habe?
Gruß
Patrick

Zitat von: CoolTux am 06 Dezember 2017, 21:30:18

sub IstSollHeizung("Wohnzimmer","Leon","Leander"){


Das ist totaler Unsinn. Bitte lese Dich in Perl Programmierung ein!

CoolTux

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
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

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.