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

Mit ** gekennzeichne Links auf dieser Seite sind Affiliatelinks.

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

FHEM-Kurs

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 &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));
}

Newsletter

Trage Dich jetzt in den Newsletter ein und genieße dadurch viele Vorteile:

  • 5€-Gutschein als Dankeschön
  • Zugang zu exklusiven Inhalten
  • Rabattaktionen für Kurse
  • Angebote für Produkte

* Durch Angabe meiner E-Mail-Adresse erkläre ich mich damit einverstanden, dass mir regelmäßig Informationen und Produktempfehlungen aus dem Fachgebiet Smart Home zugesendet werden. Mit dem Eintrag akzeptieren Sie unsere Datenschutzbestimmungen. Meine Einwilligung kann ich jederzeit widerrufen.

Matthias Kleine

Matthias Kleine

Großer Fan und Anhänger von OpenSource-Projekten und erweiterbaren Haus-Automatisierungskomponenten. Je offener und flexibler das System, desto besser. Ich lege mich ungern auf einzelne Protokolle oder Standards fest, sondern probiere aus allen Welten das Beste zu verheiraten. Unterwegs als Softwareentwickler, Trainer und Blogger im Bereich Smart Home.

Auf YouTube und hier im Blog gibt es bereits unzählige kostenlose Videos, Informationen und Tutorials. Wenn Dir das noch nicht reicht, ist ein Training genau das richtige für Dich! Die folgenden Trainings haben den Vorteil, dass immer von Anfang an gestartet wird und Du ohne Vorwissen teilnehmen kannst.