Hallo Zusammen,
hier mein erstes Werk. Eine Steuerung der MAX Thermostate, wobei die Temperaturkurve der Heizung durch die MAX Thermostate durchgeführt wird.
Hier werden die Thermostate nur auf off, ect und auto geschaltet, damit die Batterie länger lebt.
Es wird hier bei Durchschnittsteemperatur der letzten 5 Tage für das Verhalten verwendet.
Alle Definitionen sind in einer 99_myutils.pm untergebracht.
- Aussentemperatur Sensor verwenden mit dem Namen "outTemperatur"
#
# Notify anlegen
#
define evt_AussenTemperatur notify outTemperatur:temperatu.* { evtHandlerThermostat('@','%');}
#
# Struture anlegen, wo alle zu steuernden Thermostate enthalten sind mit dem Namen "allThermostat"
#
allThermostat structure MAX kuThermostat szThermostat wzThermostat
#
# Dummy Variable anlegen für die Anzeige der Durchschnittstemperatur
define AvgAussenTemperatur dummy
#
#
# Variablen im Modul (auch für Später)
#
#
# Global perl variables for my application
#
my @my_AvgTemperatur = (0.0,0.0,0.0,0.0,0.0);
my @my_MinTemperatur = (50.0,50.0,50.0,50.0,50.0);
my @my_MaxTemperatur = (-50.0,-50.0,-50.0,-50.0,-50.0);
my $my_isNewDayReached = 0;
my $my_TemperaturIndex = 0;
my $my_HourIndex =0;
my $my_LastHour =-1;
my $my_HeatingOffLimit = 16.0;
my $my_HeatingOnLimit = 14.0;
my $my_HeatingEcoLimit = 4.0;
my $my_HolydayFlag = 0;
my $my_sec = 0;
my $my_min = 0;
my $my_hour =0;
my $my_mday =0;
my $my_mon =0;
my $my_year =0;
my $my_wday =0;
my $my_yday =0;
my $my_isdst;
hier die eigentliche Routinen:
#
# Thermostat handler for state
#
sub evtHandlerThermostat($$)
{
my $Component = shift;
my $State = shift;
my $Buffer = " ";
my $Temperatur = 0.0;
my $AvgTemp = 0.0;
my $i = 0;
my $y = 0;
$Buffer = $State;
$Buffer =~ s/temperature:/ /;
($my_sec,$my_min,$my_hour,$my_mday,$my_mon,$my_year,$my_wday,$my_yday,$my_isdst) = localtime(time);
$Temperatur = sprintf("%.2f", $Buffer);
if( $my_MinTemperatur[$my_TemperaturIndex] > $Temperatur )
{
$my_MinTemperatur[$my_TemperaturIndex] = $Temperatur;
}
if( $my_MaxTemperatur[$my_TemperaturIndex] < $Temperatur )
{
$my_MaxTemperatur[$my_TemperaturIndex] = $Temperatur;
}
if( $my_hour <> $my_LastHour)
{
$my_HourIndex++;
$my_AvgTemperatur[$my_TemperaturIndex] += $Temperatur;
if( $my_HourIndex > 1 )
{
$my_AvgTemperatur[$my_TemperaturIndex] /= 2;
}
$my_LastHour=$my_hour;
if( $my_LastHour == 23 )
{
$my_HourIndex=0;
}
}
for ($i=0;$i<5;$i++)
{
if( $my_MinTemperatur[$i] < 50.0 )
{
$y++;
$AvgTemp += $my_AvgTemperatur[$i];
}
}
$AvgTemp /= $y;
fhem("set AvgAussenTemperatur ".$AvgTemp);
if( $my_hour == 0 && $my_isNewDayReached == 0 )
{
$my_isNewDayReached = 1;
$my_TemperaturIndex++;
if( $my_TemperaturIndex > 4 )
{
$my_TemperaturIndex = 0;
}
$my_AvgTemperatur[$my_TemperaturIndex] = 0.0;
$my_MinTemperatur[$my_TemperaturIndex] = 50.0;
$my_MaxTemperatur[$my_TemperaturIndex] = -50.0;
if( $AvgTemp > $my_HeatingOffLimit )
{
fhem("set allThermostat desiredTemperature off");
}
if( $AvgTemp < $my_HeatingOnLimit && $my_HolydayFlag == 0 )
{
fhem("set allThermostat desiredTemperature auto");
}
if( $AvgTemp < $my_HeatingEcoLimit && $my_HolydayFlag == 1 )
{
fhem("set allThermostat desiredTemperature eco");
}
}
if( $my_hour == 23 && $my_isNewDayReached == 1 )
{
$my_isNewDayReached=0;
}
return;
}
Vielleicht kann das ja jemand gebrauchen.
Gruss R.