Zeit- und temperaturabhängiges Steuern von Aktoren

Mit meinem Beitrag über den Weekday-Timer habe ich bereits über das zeitabhängige Schalten von Aktoren  geschrieben. Der Weekday-Timer erlaubt das Einrichten von unterschiedlichen Schaltzeiten an bestimmten Tagen. 

Ein Blogleser von mir hatte ich jedoch den Wunsch neben dem zeitabhängigen noch ein temperaturabhängiges Schalten zu integrieren. Das Ziel war es eine Fußbodenheizung abhängig vom Tag und der Temperatur schalten zu können. In seinem Fall wurde die Fußbodenheizung durch eine Funksteckdose an- bzw. ausgeschaltet. Es soll zwischen 7 Uhr und 20 Uhr und einer Temperatur von unter 20°C die Fußbodenheizung eingeschaltet werden und bei einer Temperatur von 22°C wieder ausgeschaltet werden. 

In diesem Beitrag werde ich auf diesen Anwendungsfall etwas näher eingehen und euch zeigen, wie ihr Aktoren in FHEM zeit- und temperaturabhängig schalten könnt.

Dieser Beitrag wird sich dabei den obigen Fall widmen. Diese Beschreibung lässt sich aber natürlich auch auf andere Szenarien anwenden. Da ich jedoch keine Fußbodenheizung besitze habe ich einen anderen Aktor verwendet. Aber das Prinzip bleibt gleich. Ein Aktor (Funksteckdose) abhängig vom Tag und Temperatur (Temperatursensor) schalten. Als zu schaltendes Gerät wird eine PCA301-Steckdose mit dem Namen "WZ_Papierlampe" verwendet. Die Temperatur wird mit einem 1Wire-Temperatursensor mit dem Namen "FL_Temperatur" gemessen. 

WeekdayTimer

Wenn ich etwas zeitgesteuert und vor allem tagesabhängig schalten möchte, dann fällt mir sofort der WeekdayTimer ein. Mit diesem Hilfsmodul lassen sich leicht tagesabhängige Schaltvorgänge realisieren. Aus diesem Grund habe ich mich für den WeekdayTimer als Grundgerüst entschieden. 

Der WeekdayTimer wird mit folgendem Syntax definiert:

define <name> WeekdayTimer <device> [<language>] [weekdays] <profile> <command>|<condition>

Ich werde hier jetzt nicht zu stark auf die Definition eingehen. Wer mehr zum WeekdayTimer wissen möchte,  kann sich gerne auf meinem Blogbeitrag zum Thema informieren. 

tagesabhängiges Schalten

Begonnen wird mit dem tagesabhängigen Schalten. Nimmt man den oben beschriebenen Fall, so lautet die Definition des WeekdayTimers wie folgt:

define Heizungssteuerung WeekdayTimer WZ_Papierlampe 78|07:00|on 567|20:00|off

Die WZ_Stehlampe wird an allen Tagen um 7 Uhr angeschaltet und um 20 Uhr wieder ausgeschaltet.

temperaturabhängiges Schalten

Nun fehlt jedoch noch das temperaturabhängige Schalten. Dazu schauen wir uns nochmal die Syntax vom WeekdayTimer an. Interessant ist hier nämlich der Eintrag "condition". Hier lassen sich zusätzliche Bedingungen angeben, welche erfüllt sein müssen. Also im Grunde genau das was wir wollen.

define Heizungssteuerung WeekdayTimer WZ_Papierlampe 78|07:00|on 78|20:00|off (ReadingsVal("FL_Temperatur","temperature",0) <= 20)

Obige Definition erweitert den WeekdayTimer nun um die Bedingung, dass die Temperatur gleich oder kleiner als 20 Grad sein muss. Das Problem ist nun jedoch, dass nur um 7 Uhr überprüft wird, ob diese Zusatzbedingung wahr ist. Danach wird nicht erneut überprüft. Sollte also um 7:30 Uhr die Temperatur unter 20 Grad sinken, soll ja die Fußbodenheizung eingeschaltet werden und nicht erst am nächsten Morgen um 7 Uhr. 

Anstelle also als "condition" die Temperatur-Bedingung anzugeben, werden wir ein paar Hilfsmodule verwenden um auch nach dem erstmaligen Schalten um 7 Uhr die Temperaturbedingung überprüfen zu können. 

Zum Einen wird ein dummy-Device definiert, welches vom WeekdayTimer geschaltet wird. So können wir abfragen, ob die Heizung aktuell an- bzw. ausgeschaltet werden muss

define Heizung dummy

Das WeekdayTimer-Device wird nun angepasst, so dass das eingerichtete Dummy geschaltet wird.

define Heizungssteuerung WeekdayTimer Heizung 78|07:00|on 78|20:00|off

Zu den angegebenen Zeiten wird nun das Dummy auf "on" bzw. "off" geschaltet. Diesen Dummy geben wir nun zusätzlich die Temperatur-Grenzen als Reading mit.

setreading Heizung tempMax 22; 
setreading Heizung tempMin 20;

Die eigentliche Abfrage ob die Temperaturbereiche eingehalten werden wird nun in einer extra Subroutine realisiert. Wie man eine Subroutine einrichtet, könnt ihr auf meinem Blogbeitrag nachlesen. Die Routine hat die Aufgabe zu überprüfen ob die Steckdose bereits an ist und ob der Temperaturbereich eingehalten wird. Je nach Ergebnis wird entweder ein true (1) oder ein false (0) zurückgegeben. Dies entspricht Heizung an bzw. Heizung aus.

Die Subroutine hat den Namen "Heizungssteuerung()" und hat folgenden Inhalt:

###################################################
# Heizungssteuerung
###################################################

sub subHeizungssteuerung () {

my $statusSteckdose = ReadingsVal("WZ_Papierlampe","state",0);
my $Temperatur = ReadingsVal("FL_Temperatur","temperature",0);

my $tempMax = ReadingsVal("Heizung","tempMax",0);
my $tempMin = ReadingsVal("Heizung","tempMin",0);

my $return_value = 0;

if($statusSteckdose eq "on")
{
# Heizung an und Temperatur über $tempMax? Ja: Heizung aus --> Return 0
if($Temperatur >= $tempMax) {$return_value = 0;}
# Heizung an und Temperatur unter $tempMax? Ja: Heizung an --> Return 0
else {$return_value = 1;}
}
else
{
# Heizung aus und Temperatur unter $tempMin? Ja: Heizung an --> Return 1
if($Temperatur <= $tempMin) {$return_value = 1;}
else
{
# Heizung aus und Temperatur über $tempMax? Ja: Heizung aus --> Return 0
if($Temperatur >= $tempMax) {$return_value = 0;}
# Heizung aus und Temperatur unter $tempMax? Ja: Heizung an --> Return 1
else {$return_value = 1;}
}
}

return $return_value;

}

Die Subroutine wird nun in einem at-Device aufgerufen:

define atHeizungssteuerung at +*00:05:00 {
my $status = ReadingsVal("Heizung","state",0);;
if(($status eq "on") && (subHeizungssteuerung())){fhem("set WZ_Papierlampe on")}
else{fhem("set WZ_Papierlampe off")}
}

Es wird nun alle 5 Minuten überprüft, ob die Heizung aufgrund der Tageszeit (durch den WeekdayTimer) und ob der Temperatur eingeschaltet werden soll (Rückgabewert der Subroutine). Ist dies der Fall, so wird die Steckdose eingeschaltet. Ansonsten ausgeschaltet.

Fazit

Mit dem WeekdayTimer, einem atDevice und einer kleinen Subroutine lässt sich relativ simpel ein Aktor temperatur- und zeitabhängig schalten. Wer jedoch direkt ein Device hat, welches die Temperatur misst und die Heizung steuert, wie zum Beispiel ein Thermostat für die Heizung, dem empfehle ich das Modul Heating_Control.

Letzte Aktualisierung am 23.10.2017 / Affiliate Links / Bilder von der Amazon Product Advertising API

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

Benachrichtige mich zu:
avatar
Fotos und Bilder
 
 
 
sonstiges Dateiformat
 
 
 
wpDiscuz