Autor Thema: Steuerung der MAX Thermostat  (Gelesen 4578 mal)

Offline ritchie

  • Sr. Member
  • ****
  • Beiträge: 596
Steuerung der MAX Thermostat
« 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.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv
Raspberry PI (1Wire - USB) - Testsystem

Offline Tobias

  • Developer
  • Hero Member
  • ****
  • Beiträge: 3965
Aw: Steuerung der MAX Thermostat
« Antwort #1 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?
FHEM auf ASRock J3455-ITX im 19" Rack mit Homematic, MAX, PCA301, Panstamps, RPi für BLE Bodenfeuchtesenoren, Text2Speech.
Maintainer der Module: Text2Speech, TrashCal, MediaList

Meine Projekte auf https://github.com/tobiasfaust
u.a. PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM

Offline ritchie

  • Sr. Member
  • ****
  • Beiträge: 596
Aw: Steuerung der MAX Thermostat
« Antwort #2 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.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv
Raspberry PI (1Wire - USB) - Testsystem

Offline Markus M.

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2982
  • Dringenden Angelegenheiten bitte per Email
Aw: Steuerung der MAX Thermostat
« Antwort #3 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");};
}

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

Offline ritchie

  • Sr. Member
  • ****
  • Beiträge: 596
Aw: Steuerung der MAX Thermostat
« Antwort #4 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.
IPU662  Ipfire & Fhem (Homematic + MAX) - Produktiv
Cubietruck (1Wire - USB) - Produktiv
Raspberry PI (1Wire - USB) - Testsystem

Offline Markus M.

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2982
  • Dringenden Angelegenheiten bitte per Email
Aw: Steuerung der MAX Thermostat
« Antwort #5 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()}
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

Offline abc2006

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1035
Antw:Steuerung der MAX Thermostat
« Antwort #6 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.?
FHEM nightly auf Intel Atom (lubuntu) mit VDSL 50000 ;-)
Nutze zur Zeit OneWire und KNX