Autor Thema: Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme  (Gelesen 3743 mal)

Offline freetz

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1224
    • GitHub Projektseite für BSB-LAN und Robotan
[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.
« Letzte Änderung: 26 Januar 2018, 17:41:09 von 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
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Scherheinz

  • Full Member
  • ***
  • Beiträge: 134
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #1 am: 26 Oktober 2017, 11:07:48 »
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

Offline freetz

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1224
    • GitHub Projektseite für BSB-LAN und Robotan
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #2 am: 26 Oktober 2017, 12:11:36 »
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
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Scherheinz

  • Full Member
  • ***
  • Beiträge: 134
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #3 am: 26 Oktober 2017, 20:30:25 »
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

Offline freetz

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1224
    • GitHub Projektseite für BSB-LAN und Robotan
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #4 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.
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
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline Scherheinz

  • Full Member
  • ***
  • Beiträge: 134
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #5 am: 27 Oktober 2017, 07:01:08 »
Super! Das reicht mir schon als Ansatz, den Rest versuche ich mir zu erarbeiten! :)
Danke nochmal!

Gruß Scherheinz

Offline aorta

  • New Member
  • *
  • Beiträge: 29
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #6 am: 06 Dezember 2017, 19:09:34 »
Hallo
Könntest du dazu auch mal den genauen at Befehl schreiben? Ich bekomme es nicht hin. :'(
Danke und Gruß
Patrick

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.

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 20733
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #7 am: 06 Dezember 2017, 19:45:28 »
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.me/MOldenburg
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline aorta

  • New Member
  • *
  • Beiträge: 29
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #8 am: 06 Dezember 2017, 20:29:09 »
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
« Letzte Änderung: 06 Dezember 2017, 20:56:01 von aorta »

Offline Damian

  • Developer
  • Hero Member
  • ****
  • Beiträge: 6402
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #9 am: 06 Dezember 2017, 20:54:05 »
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 mit uiTable, DOIF-Perl, THRESHOLD, FHEM-Befehl: IF

Offline freetz

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1224
    • GitHub Projektseite für BSB-LAN und Robotan
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #10 am: 06 Dezember 2017, 20:58:22 »
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

Offline aorta

  • New Member
  • *
  • Beiträge: 29
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #11 am: 06 Dezember 2017, 21:19:48 »
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

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 20733
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #12 am: 06 Dezember 2017, 21:30:18 »
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.me/MOldenburg
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline aorta

  • New Member
  • *
  • Beiträge: 29
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #13 am: 06 Dezember 2017, 21:39:35 »
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

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

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

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 20733
Antw:Dynamische Soll-Ist-Temperaturübermittlung an Heizungstherme
« Antwort #14 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
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.me/MOldenburg
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

 

decade-submarginal