FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: ritchie am 26 Mai 2013, 20:24:15

Titel: Steuerung der MAX Thermostat
Beitrag von: ritchie am 26 Mai 2013, 20:24:15
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.
Titel: Aw: Steuerung der MAX Thermostat
Beitrag von: Tobias am 27 Mai 2013, 13:24:19
Ich habe noch nicht ganz verstanden was der Codeschnipsel eigentlich macht?  Was wird wie durch was gesteuert?
Was sind Eingangs- und was Ausgangsgrößen?
Titel: Aw: Steuerung der MAX Thermostat
Beitrag von: ritchie am 27 Mai 2013, 21:52:46

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


Hierdurch wird die Funktion aufgerufen. Es ist die Aussentemperatur.

Eingangsgröße: outTemperatur

Ausgangsgröße: $AvgTemp

+

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



übrigens hier ist noch ein Tipfehler:


 if( $my_hour <> $my_LastHour)


sollte


 if( $my_hour != $my_LastHour)


heissen

Gruss R.
Titel: Aw: Steuerung der MAX Thermostat
Beitrag von: Markus M. am 13 Juni 2013, 02:04:07
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:

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



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

Titel: Aw: Steuerung der MAX Thermostat
Beitrag von: ritchie am 13 Juni 2013, 09:19:09
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.
Titel: Aw: Steuerung der MAX Thermostat
Beitrag von: Markus M. am 13 Juni 2013, 22:57:40
Den Sendezyklus kannst du nicht ändern.
So kannst du eine Funktion jede Stunde aufrufen, und die Temperatur dann in der Funktion auslesen:
define every_hour at +*01:00:00 {doStuff()}
Titel: Antw:Steuerung der MAX Thermostat
Beitrag von: abc2006 am 13 November 2013, 14:56:09
Kann man die funktion auch stündlich um 5 nach aufrufen?
also

00:05
01:05
...
12:05
usw.?