Steuerung der MAX Thermostat

Begonnen von ritchie, 26 Mai 2013, 20:24:15

Vorheriges Thema - Nächstes Thema

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
#

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.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

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?
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

ritchie


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.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

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:

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

FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

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.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv

Markus M.

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()}
FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

abc2006

Kann man die funktion auch stündlich um 5 nach aufrufen?
also

00:05
01:05
...
12:05
usw.?
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX