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