FHEM Tutorial-Reihe - Part 61: Heizpläne und Heizleistung errechnen

Mit ** gekennzeichnete Links auf dieser Seite sind Affiliatelinks.

FHEM Tutorial-Reihe - Part 61: Heizpläne und Heizleistung errechnen
FHEM Tutorial-Reihe - Part 61: Heizpläne und Heizleistung errechnen
  • Matthias Kleine
  • 25.09.2018
  • Hardware
  • Integration

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.

Achtung: Dieser Inhalt wurde vor mehreren Jahren aufgenommen und ist nicht mehr aktuell! Es ist nicht empfohlen nach dieser Anleitung vorzugehen.

Was wird benötigt?

  • Eine FHEM-Installation
  • Ein paar HomeMatic-Thermostate (bereits integriert)

Video

Hausbau-Kurs

Produkte

HomeMatic Smart Home Funk-Heizkörperthermostat, 105155, 1er **

HomeMatic Funk-Heizkoerperthermostat 3er Set **

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 &deg;;C", 'measured-temp' => "%.1f &deg;;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));
}
Du willst mehr?

Smart-Home-Trainings von A-Z

Steig noch tiefer in die Themen ein und meistere Deine Projekte! Über 13.000 Teilnehmer konnten sich schon von der Qualität der Online-Kurse überzeugen.

ioBroker-Master-Kurs

ioBroker-Master-Kurs

Mehr Infos
Hausbau-Kurs

Hausbau mit KNX

Mehr Infos
Lox-Kurs

Lox-Kurs

Mehr Infos
Node-RED-Master-Kurs

Node-RED-Master-Kurs

Mehr Infos