FHEM Tutorial-Reihe - Part 61: Heizpläne und Heizleistung errechnen
Die kalte Jahreszeit kommt langsam wieder. Umso besser sollte man vorbereitet sein. In diesem Video konfigurieren wir ein paar Heizpläne für die HomeMatic-Thermostate, welche bereits in einem anderen Projektvideo in FHEM über eine VCCU integriert wurden.
Was wird benötigt?
- Eine FHEM-Installation
- Ein paar HomeMatic-Thermostate (bereits integriert)
Video
Produkte
Befehle
Hier meine Readings-Groups für HomeMatic
define HM_TemperatureModues readingsGroup <Gerät>,<Raum>,<Wunschtemperatur>,<Ventil-Position>,<Aktuelle Temperatur>,<Control-Mode> NAME=*._Clima:?room,desired-temp,ValvePosition,measured-temp,controlMode
attr HM_TemperatureModues DbLogExclude .*
attr HM_TemperatureModues alias Raumtemperaturen
attr HM_TemperatureModues room HomeMatic
attr HM_TemperatureModues valueFormat {'desired-temp' => "%.1f °;C", 'measured-temp' => "%.1f °;C"}
attr HM_TemperatureModues valueIcon {"controlMode.manual" => 'sani_heating_manual@red', "controlMode.auto" => 'sani_heating_automatic@green'}
define tempLists readingsGroup <Name>,<Montag>,<Dienstag>,<Mittwoch>,<Donnerstag>,<Freitag>,<Samstag>,<Sonntag> NAME=.*_Clima:R_2_tempListMon,R_3_tempListTue,R_4_tempListWed,R_5_tempListThu,R_6_tempListFri,R_0_tempListSat,R_1_tempListSun
attr tempLists DbLogExclude .*
attr tempLists room HomeMatic
attr tempLists valueFormat {tempListDayFormat($DEVICE, $READING, $VALUE);;}
Für die zweite readingsGroup muss in der 99_myUtils die folgende Funktion hinzugefügt werden:
sub tempListDayFormat($$$) {
my ($DEVICE, $READING, $VALUE) = @_;
if ($READING =~ m/tempList/) {
return join(" °C<br/>", unpack("(A11)*", $VALUE)) . " °C";
} else {
return $VALUE;
}
}
Meine Heizpläne übermittle ich dann wie folgt:
sub SetTempLists() {
# Buero
fhem("set BU_Heizung_Clima sysTime");
fhem("set BU_Heizung_Clima tempListMon prep 08:00 17.0 17:00 21.0 24:00 17.0");
fhem("set BU_Heizung_Clima tempListTue prep 08:00 17.0 17:00 21.0 24:00 17.0");
fhem("set BU_Heizung_Clima tempListWed prep 08:00 17.0 17:00 21.0 24:00 17.0");
fhem("set BU_Heizung_Clima tempListThu prep 08:00 17.0 17:00 21.0 24:00 17.0");
fhem("set BU_Heizung_Clima tempListFri prep 08:00 17.0 17:00 21.0 24:00 17.0");
fhem("set BU_Heizung_Clima tempListSat prep 08:00 17.0 17:00 17.0 24:00 17.0");
fhem("set BU_Heizung_Clima tempListSun exec 08:00 17.0 17:00 17.0 24:00 17.0");
# Badezimmer
fhem("set BA_Heizung_Clima sysTime");
fhem("set BA_Heizung_Clima tempListMon prep 07:00 17.0 08:30 17.0 24:00 17.0");
fhem("set BA_Heizung_Clima tempListTue prep 07:00 17.0 08:30 17.0 24:00 17.0");
fhem("set BA_Heizung_Clima tempListWed prep 07:00 17.0 08:30 17.0 24:00 17.0");
fhem("set BA_Heizung_Clima tempListThu prep 07:00 17.0 08:30 17.0 24:00 17.0");
fhem("set BA_Heizung_Clima tempListFri prep 07:00 17.0 08:30 17.0 24:00 17.0");
fhem("set BA_Heizung_Clima tempListSat prep 07:00 17.0 08:30 17.0 24:00 17.0");
fhem("set BA_Heizung_Clima tempListSun exec 07:00 17.0 08:30 17.0 24:00 17.0");
# Schlafzimmer
fhem("set SZ_Heizung_Clima sysTime");
fhem("set SZ_Heizung_Clima tempListMon prep 07:30 21.0 18:00 17.0 24:00 21.0");
fhem("set SZ_Heizung_Clima tempListTue prep 07:30 21.0 18:00 17.0 24:00 21.0");
fhem("set SZ_Heizung_Clima tempListWed prep 07:30 21.0 18:00 17.0 24:00 21.0");
fhem("set SZ_Heizung_Clima tempListThu prep 07:30 21.0 18:00 17.0 24:00 21.0");
fhem("set SZ_Heizung_Clima tempListFri prep 07:30 21.0 18:00 17.0 24:00 21.0");
fhem("set SZ_Heizung_Clima tempListSat prep 07:30 21.0 18:00 17.0 24:00 21.0");
fhem("set SZ_Heizung_Clima tempListSun exec 07:30 21.0 18:00 17.0 24:00 21.0");
# Wohnzimmer
fhem("set WZ_HeizungZentrale_Climate sysTime");
fhem("set WZ_HeizungZentrale_Climate tempListMon prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungZentrale_Climate tempListTue prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungZentrale_Climate tempListWed prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungZentrale_Climate tempListThu prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungZentrale_Climate tempListFri prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungZentrale_Climate tempListSat prep 08:00 17.0 23:30 21.0 24:00 17.0");
fhem("set WZ_HeizungZentrale_Climate tempListSun exec 08:00 17.0 23:30 21.0 24:00 17.0");
fhem("set WZ_HeizungGross_Clima sysTime");
fhem("set WZ_HeizungGross_Clima tempListMon prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungGross_Clima tempListTue prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungGross_Clima tempListWed prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungGross_Clima tempListThu prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungGross_Clima tempListFri prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungGross_Clima tempListSat prep 08:00 17.0 23:30 21.0 24:00 17.0");
fhem("set WZ_HeizungGross_Clima tempListSun exec 08:00 17.0 23:30 21.0 24:00 17.0");
fhem("set WZ_HeizungKlein_Clima sysTime");
fhem("set WZ_HeizungKlein_Clima tempListMon prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungKlein_Clima tempListTue prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungKlein_Clima tempListWed prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungKlein_Clima tempListThu prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungKlein_Clima tempListFri prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set WZ_HeizungKlein_Clima tempListSat prep 08:00 17.0 23:30 21.0 24:00 17.0");
fhem("set WZ_HeizungKlein_Clima tempListSun exec 08:00 17.0 23:30 21.0 24:00 17.0");
# Kueche = Wohnzimmer
fhem("set KU_Heizung_Clima sysTime");
fhem("set KU_Heizung_Clima tempListMon prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set KU_Heizung_Clima tempListTue prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set KU_Heizung_Clima tempListWed prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set KU_Heizung_Clima tempListThu prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set KU_Heizung_Clima tempListFri prep 17:00 17.0 22:30 21.0 24:00 17.0");
fhem("set KU_Heizung_Clima tempListSat prep 08:00 17.0 23:30 21.0 24:00 17.0");
fhem("set KU_Heizung_Clima tempListSun exec 08:00 17.0 23:30 21.0 24:00 17.0");
}
Ausgeführt wird das ganze einmalig:
{SetTempLists()}
Dann habe ich auf jedem Clima-Gerät der Heizkörperthermostate die Größe der Heizkörper hinterlegt. Dazu wurden zwei neue Attribute hinterlegt, welche dann die neuen Werte halten.
attr <Name>_Clima userattr size-w size-h
attr <Name>_Clima size-h 90
attr <Name>_Clima size-w 40
Diese Readings-Group zeigt dann die komplette Übersicht der Größen + Ventilposition (zur Kontrolle).
defmod HM_Sizes readingsGroup <Gerät>,<Raum>,<Breite>,<Höhe>,<Ventil-Position> NAME=*._Clima:?room,?size-w,?size-h,ValvePosition
attr HM_Sizes DbLogExclude .*
attr HM_Sizes alias Heizleistung
attr HM_Sizes room HomeMatic
attr HM_Sizes valueFormat {'ValvePosition' => "%d %", 'size-h' => "%d cm", 'size-w' => "%d cm"}
Jetzt können wir mit diesen Werten natürlich anfangen zu rechnen. Die Idee ist, dass jedes Mal, wenn sich bei einem Thermostat die Ventilposition ändert, die prozentuale Gesamtleistung aktualisiert wird. Dazu werden dann immer von allen Thermostaten die jeweiligen Werte geholt, und die aktuelle Heizleistung errechnet.
define n_heizleistung notify .*_Clima:ValvePosition:.* {}
{
my @climates = devspec2array("NAME=.*_Clima:FILTER=TYPE=CUL_HM");
my $totalSize = 0;
my $heatingPerformance = 0;
foreach (@climates) {
my $sizeW = AttrNum($_, "size-w", -1);
my $sizeH = AttrNum($_, "size-h", -1);
my $valvePosition = ReadingsNum($_, "ValvePosition", 0);
if ($sizeW > -1 && $sizeH > -1) {
$totalSize += $sizeW * $sizeH;
if ($valvePosition > 0) {
$heatingPerformance += $sizeW * $sizeH * ($valvePosition / 100);
}
}
}
fhem("setreading $SELF total-size " . $totalSize);
fhem("setreading $SELF heating-performance " . $heatingPerformance);
fhem("setreading $SELF heating-performance-percent " . sprintf("%.2f", $heatingPerformance / $totalSize * 100));
}