FHEM > Codeschnipsel

Steuerung der MAX Thermostat

(1/2) > >>

ritchie:
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
#

--- Code: ---
define evt_AussenTemperatur notify outTemperatur:temperatu.* { evtHandlerThermostat('@','%');}

--- Ende Code ---

#
# Struture anlegen, wo alle zu steuernden Thermostate enthalten sind mit dem Namen "allThermostat"
#

--- Code: ---
allThermostat structure MAX kuThermostat szThermostat wzThermostat

--- Ende Code ---


#
# Dummy Variable anlegen für die Anzeige der Durchschnittstemperatur

--- Code: ---
define AvgAussenTemperatur dummy

--- Ende Code ---

#
#
# Variablen im Modul (auch für Später)
#

--- Code: ---
#
# 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;

--- Ende Code ---


hier die eigentliche Routinen:

--- Code: ---
#
# 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;
}

--- Ende Code ---



Vielleicht kann das ja jemand gebrauchen.

Gruss R.

Tobias:
Ich habe noch nicht ganz verstanden was der Codeschnipsel eigentlich macht?  Was wird wie durch was gesteuert?
Was sind Eingangs- und was Ausgangsgrößen?

ritchie:

--- Code: ---
define evt_AussenTemperatur notify outTemperatur:temperatu.* { evtHandlerThermostat('@','%');}

--- Ende Code ---


Hierdurch wird die Funktion aufgerufen. Es ist die Aussentemperatur.

Eingangsgröße: outTemperatur

Ausgangsgröße: $AvgTemp

+

--- Code: ---
     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");
         }

--- Ende Code ---



übrigens hier ist noch ein Tipfehler:


--- Code: ---
 if( $my_hour <> $my_LastHour)

--- Ende Code ---


sollte


--- Code: ---
 if( $my_hour != $my_LastHour)

--- Ende Code ---


heissen

Gruss R.

Markus M.:
Sehr ausführlich, aber meiner Meinung nach leichter Overkill.
Führst du diese Berechnungsorgie wirklich bei jeder Änderung der Außentemperatur durch?


Meine Lösung sieht so aus:

--- Code: ---
define heating_weather_automatic at *17:30:00 {checkheatingtemperature()}

--- Ende Code ---



--- Code: ---
sub checkheatingtemperature()
{
 my $tempsum = ReadingsVal("forecast","fc1_low_c",ReadingsVal("temp_outside","temperature",0)) + ReadingsVal("forecast","fc2_high_c",ReadingsVal("temp_outside","temperature",0)) + ReadingsVal("temp_outside","temperature",0);
 if ($tempsum >= 60) {fhem ("set master_heating off"); return;};
 if ($tempsum >= 45) {fhem ("set master_heating eco"); return;};
 {fhem ("set master_heating auto");};
}

--- Ende Code ---

ritchie:
Das mag sein,

ich würde auch lieber diese Funktion nur jede Stunde ausführen.
Da ich aber neu in FHEM bin, muss ich das erst herausfinden.

Meine jetzige Funktion sieht auch wieder anderes aus,
da die Durchschnittstemperatur des Tages definiert ist,
durch die Summe aller stündlich gemessenen Temperaturen / 24.

Vielleicht kannst Du mir den Tip ja geben, dann aktualisiere ich diese Funktion,
wie man einen Event stündlich aufruft.

Zudem habe ich auch noch nicht gefunden, wie man den Sendezyklus des Sensors
von 2 auf 3 Minuten ändern kann.

Gruss R.

Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln