Neues Modul - Heating_Control, WeekdayTimer

Begonnen von Dietmar63, 04 Januar 2013, 19:42:26

Vorheriges Thema - Nächstes Thema

AmunRe

Zitat von: c2j2 am 16 November 2016, 18:06:52


Somit ist dieser Weg verbaut. Wie kann man das am klügsten einbauen (ich will nicht überall eine Funktion aufrufen)? Oder ganz anders realisieren? Wie macht ihr so was, erst mal ohne Abwesenheitserkennung...



([HZ.Absenkung] eq "on" and [HCWZ:currValue] <= [Heizungsthermostat_WZ_Clima:desired-temp])(set Heizungsthermostat_WZ_Clima desired-temp {([HCWZ:currValue] -2)})
DOELSEIF ([HZ.Absenkung] eq "off")(set Heizungsthermostat_WZ_Clima desired-temp [HCWZ:currValue])
4 x Echo Dot, HMLAN Gateway, und diverse HM Komponenten, Philips Hue + OSRAM Plugs

c2j2

#796
OK, für die Akten: es geht. In die eigenen 99_myUtils.pm:

sub HC_Temp($)
{
  my $Temp = @_[0];
  my $degree = max($Temp - Value("TemperaturAbsenkung"), 16);
  # Log(1, "DEGREE = ". $degree . " - " . Value("TemperaturAbsenkung"));
  return $degree
}

sub HC_setTemp($$)
{
  my ($Device, $Temp) = @_;
  my $OldTemp = ReadingsVal($Device, "desiredTemperature", "0");
  Log(2, "HC_setTemp(): set $Temp deg in $Device. Was: $OldTemp");
  if ($Temp < $OldTemp || $Temp > $OldTemp) # no "!=" as it would compare strings
    {
Log(2, "FHEM: set $Device desiredTemperature $Temp");
fhem("set $Device desiredTemperature $Temp");
return 1;
}
  return 0;
}

und im FHEM:

define TemperaturAbsenkung dummy
attr TemperaturAbsenkung setList state:0,1,2,3,4,5
# attr TemperaturAbsenkung webCmd state
set TemperaturAbsenkung 0
define n_TemperaturAbsenkung notify TemperaturAbsenkung:.* {Heating_Control_SetAllTemps()}

define HC_wohnzimmer Heating_Control Heizungsventil_wohnzimmer.Nord de Mo-Fr|05:00|HC_Temp(23) <etc etc> {\
  Log(2, "HC results in: set $NAME desiredTemperature @{[eval $EVENT]} (from $EVENT)");;\
  HC_setTemp($NAME, eval $EVENT);;\
}
attr HC_wohnzimmer room Wochenprogramme


Ich bin aber gern für jede Schandtat zu haben, so sie besser ist ;)

Frage dazu: ich habe das HC_setTemp() gemacht, um überflüssige Packets über den Äther zu vermeiden. Ist das "set <device> desired Temperature <n>" von MAX optimiert, und ich brauche das nicht machen? Weß das jemand? Auf die "Schnelle" (PERL ist - ähem - nicht meine Stärke) kann ich es aus dem Modul-Code nicht ersehen.

Dietmar63

define HC_wohnzimmer Heating_Control Heizungsventil_wohnzimmer.Nord de Mo-Fr|05:00|23   {HC_temp(%)}
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

tomspatz

Moin Dietmar
bekomme heute nach fhem update und Neustart folgendes:
2016.11.17 08:32:55 1: [RolloBalkontuerAutomatik] invalid time <31:59:28> HH:MM[:SS]
2016.11.17 08:32:55 1: [RolloBalkontuerAutomatik] invalid time <31:59:28> HH:MM[:SS]
2016.11.17 08:32:55 1: [RolloBalkontuerAutomatik] invalid time <31:59:28> HH:MM[:SS]
2016.11.17 08:32:55 1: [RolloBalkontuerAutomatik] invalid time <31:59:28> HH:MM[:SS]
2016.11.17 08:32:55 1: [RolloBalkontuerAutomatik] invalid time <31:59:28> HH:MM[:SS]
2016.11.17 08:32:55 1: [RolloBalkontuerAutomatik] invalid time <31:59:28> HH:MM[:SS]
2016.11.17 08:32:55 1: [RolloBalkontuerAutomatik] invalid time <31:59:28> HH:MM[:SS]
2016.11.17 08:32:55 1: [RolloBalkontuerAutomatik] invalid time <31:59:28> HH:MM[:SS]


Die Definition ist:
defmod RolloBalkontuerAutomatik WeekdayTimer RolloBalkontuerWohnzimmer {sunrise("REAL",30)}|up {sunset("REAL",10920)}|down (ReadingsVal("Suedring111", "state", "no") ne "home")
attr RolloBalkontuerAutomatik alias Rollo Balkontür Automatik
attr RolloBalkontuerAutomatik devStateIcon active:Restart \d+.*:Restart .*:StandBy
attr RolloBalkontuerAutomatik group Rollo Einstellungen
attr RolloBalkontuerAutomatik icon fts_shutter_automatic
attr RolloBalkontuerAutomatik room Steuerung-Rollos

setstate RolloBalkontuerAutomatik inactive
setstate RolloBalkontuerAutomatik 2016-11-17 08:37:00 currValue up
setstate RolloBalkontuerAutomatik 2016-11-17 08:37:00 nextUpdate 2016-11-17 19:27:42
setstate RolloBalkontuerAutomatik 2016-11-17 08:37:00 nextValue down
setstate RolloBalkontuerAutomatik 2016-11-17 08:37:00 state inactive


Irgendwie schnallt es sunrise nicht, hat allerdings bislang so gelaufen. Die Anderen Rollos natürlich das selbe.
Hast du eine Idee?
LG
Tom

tomspatz

Habe es jetzt umgebaut, so scheint es OK zu sein:
defmod RolloBalkontuerAutomatik WeekdayTimer RolloBalkontuerWohnzimmer {sunrise_abs_dat($date,"REAL",30)}|up {sunset_abs_dat($date,"REAL",10920)}|down (ReadingsVal("Suedring111", "state", "no") ne "home")

c2j2

#800
    @Dietmar63: das geht leider nicht.

    • meinst Du HC_SetTemp()?
    • es passiert nichts, die Log-Ausgabe im HC_SetTemp wird nicht aufgerufen. Weil die Temperatur gleich bleibt, und dann die Ausführung der Funktion von vornherein verhindert wird. Nur die Angabe bei jedem Zeitpunkt (die Zeichenkette ist ja anders) verhindert diese Optimierung, scheint mir. "aktParam:21.0 newParam:21.0 - is  not disabled"

c2j2

@tomspatz:

"invalid time <31:59:28>" ist normal, wenn berechnet nach Sonnenaufgang - da werden 24 Stunden addiert, wenn der nächstmögliche Sonnenaufgang erst wieder am nächsten Tag ist.

Zitat"sunrise / sunset geben die absolute Zeit des nächsten Sonnenauf- bzw. -untergangs zurück, wobei 24 Stunden addiert werden, sofern das entsprechende Ereignis am nächsten Tag stattfindet"
http://www.fhemwiki.de/wiki/SUNRISE_EL

Also mit "at" um 0:01 2 Dummy-Variablen berechnen lassen und gut ist.

Dietmar63

so:
define HC_wohnzimmer Heating_Control Heizungsventil 19:20|23  {HC_temp($EVENT)};
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

FHEM_Starter

Hallo Dietmar,

zunächst vielen Dank für dieses tolle Modul. Eine Frage allgemein zu den Conditions: Ist es richtig, dass in einem define immer nur eine Condition zulässig ist? Wenn ja, wäre es möglich, das Modul so zu optimieren, dass pro Schaltakt eine eigene Condition denkbar ist? So hätte man in einem Define alles definiert, was die Übersichtlichkeit und den WAF Faktor erhöht.

Danke und Gruß
Wolfgang

c2j2

#804
Moin Dietmar,

das geht eben nicht, würde ich sagen, da der Parameter gleich bleibt, und gemäß


my $aktParam  = ReadingsVal($hash->{DEVICE}, $setModifier, "");
     $aktParam  = sprintf("%.1f", $aktParam)   if ($isHeating && $aktParam =~ m/^[0-9]{1,3}$/i);
     $newParam  = sprintf("%.1f", $newParam)   if ($isHeating && $newParam =~ m/^[0-9]{1,3}$/i);
...
  #Kommando ausführen
  if ($command && !$disabled && $activeTimer
    && $aktParam ne $newParam
...


das Kommando nur ausgeführt wird, wenn sich der Parameter (wenn er numerisch ist) ändert - was er bei einem festen Wert "23" nie tut.

Angenommen, die momentane Wunschtemp ist 23 ("desiredTemperature:23.0" vom Heizungsventil) , und im "define" der Heating_Control steht auch 23, dann wird das Kommando nie ausgeführt nach einem Absenkungswunsch, obwohl ich die Absenkung auf 21 Grad möchte. Weil "23.0" mit "23.0" verglichen wird, die Absenkung (auf 21.0) aber erst im $Command passiert, was aufgrund von $aktParam ne $newParam nicht ausgeführt wird.

Mein Trick verändert die Situation, $newParam ist "HC_Temp(23)", was nie "23.0" entspricht, somit wird immer das Kommando ausgeführt.

Eigentlich müßte man statt


  my $aktParam  = ReadingsVal($hash->{DEVICE}, $setModifier, "");
     $aktParam  = sprintf("%.1f", $aktParam)   if ($isHeating && $aktParam =~ m/^[0-9]{1,3}$/i);
     $newParam  = sprintf("%.1f", $newParam)   if ($isHeating && $newParam =~ m/^[0-9]{1,3}$/i);


doch so was wie


  my $aktParam  = ReadingsVal($hash->{DEVICE}, $setModifier, "");
     $aktParam  = cleanUpParam($aktParam);
     $newParam  = cleanUpParam($newParam);


mit


sub cleanupParam($) {
my ($param) =@_;
if ($param !~ m/^\d{1,3}$/)
  $param = eval $param;
if ($param =~ m/^\d{1,3}$/)
  return sprintf("%.1f", $aktParam);
return $param;
}


schreiben.

Wäre das eine Idee?

Das löst zwar das Problem nicht, wenn der Wert erst im Command verändert wird, aber man braucht dann das Command nicht mehr, da die BErechnung des aktuellen Werts in der Temp-Tabelle steht:


define HC_wohnzimmer Heating_Control Heizungsventil 19:20|HC_Temp(23)


und HC_Temp eine Berechnung durchführen kann, und trotzdem noch die Optimierung ($newParam eq $oldParam) funktioniert.

Bisher eben

define HC_wohnzimmer Heating_Control Heizungsventil 19:20|HC_Temp(23) { HC_setTemp($NAME, eval $EVENT);; }


Dietmar63

Zitat von: FHEM_Starter am 21 November 2016, 08:51:12
Hallo Dietmar,

zunächst vielen Dank für dieses tolle Modul. Eine Frage allgemein zu den Conditions: Ist es richtig, dass in einem define immer nur eine Condition zulässig ist? Wenn ja, wäre es möglich, das Modul so zu optimieren, dass pro Schaltakt eine eigene Condition denkbar ist? So hätte man in einem Define alles definiert, was die Übersichtlichkeit und den WAF Faktor erhöht.

Danke und Gruß
Wolfgang

vorstellen kann ich mir das schon.
Mach mal einen Vorschlag, wie die Syntax aussehen soll. Dann kann ich mir besser vorstellen, was dir vorschwebt.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63



my $aktParam  = ReadingsVal($hash->{DEVICE}, $setModifier, "");
     $aktParam  = sprintf("%.1f", $aktParam)   if ($isHeating && $aktParam =~ m/^[0-9]{1,3}$/i);
     $newParam  = sprintf("%.1f", $newParam)   if ($isHeating && $newParam =~ m/^[0-9]{1,3}$/i);
...
  #Kommando ausführen
  if ($command && !$disabled && $activeTimer
#    && $aktParam ne $newParam
...


Man könnte die Zeile auch auskommentieren. Sogar mit einem Attriut abschalten.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

cwagner

Moin, Dietmar,

das tolle Modul Heating_Control benutze ich nach Abschaffung der Homematic-Raumthermostate nun sehr intensiv und dabei ist mir eine Unstimmigkeit aufgefallen, die in meinem Szenario blöde Folgen hat. Der Status des Moduls entspricht nicht immer (leider habe ich noch keine Regel gefunden) dem aktuell vom Modul geschalteten Wert. Von neun Heating_Controls habe ich heute morgen 2 "Blödmänner" gefunden. Einer davon:

Internals:
   CFGFN
   COMMAND
   CONDITION
   DEF        RR_Wohnzimmer de   so-sa|16:30|19  so-sa|18:00|22 $we|23:00|15 fr|23:00|15 mo-do|22:00|15
   DEVICE     RR_Wohnzimmer
   GlobalDaylistSpec
   LANGUAGE   de
   NAME       CC.Wohnzimmer
   NR         187
   Profil 0: Sonntag 16:30:00 19, 18:00:00 22, 23:00:00 15
   Profil 1: Montag 16:30:00 19, 18:00:00 22, 22:00:00 15
   Profil 2: Dienstag 16:30:00 19, 18:00:00 22, 22:00:00 15
   Profil 3: Mittwoch 16:30:00 19, 18:00:00 22, 22:00:00 15
   Profil 4: Donnerstag 16:30:00 19, 18:00:00 22, 22:00:00 15
   Profil 5: Freitag 16:30:00 19, 18:00:00 22, 23:00:00 15
   Profil 6: Samstag 16:30:00 19, 18:00:00 22, 23:00:00 15
   Profil 7: Wochenende 23:00:00 15
   STATE      22
   STILLDONETIME 0
   TYPE       Heating_Control
   Readings:
     2016-11-20 23:00:00   currValue       15
     2016-11-20 15:09:53   disabled        0
     2016-11-20 23:00:00   nextUpdate      2016-11-21 16:30:00
     2016-11-20 23:00:00   nextValue       19
     2016-11-20 18:00:01   state           22
   SWITCHINGTIMES:
     so-sa|16:30|19
     so-sa|18:00|22
     $we|23:00|15
     fr|23:00|15
     mo-do|22:00|15
   Timer:
     Cc.wohnzimmer_1:
       HASH       CC.Wohnzimmer
       MODIFIER   1
       NAME       CC.Wohnzimmer_1
     Cc.wohnzimmer_2:
       HASH       CC.Wohnzimmer
       MODIFIER   2
       NAME       CC.Wohnzimmer_2
     Cc.wohnzimmer_3:
       HASH       CC.Wohnzimmer
       MODIFIER   3
       NAME       CC.Wohnzimmer_3
     Cc.wohnzimmer_4:
       HASH       CC.Wohnzimmer
       MODIFIER   4
       NAME       CC.Wohnzimmer_4
     Cc.wohnzimmer_5:
       HASH       CC.Wohnzimmer
       MODIFIER   5
       NAME       CC.Wohnzimmer_5
     Cc.wohnzimmer_settimerofday:
       HASH       CC.Wohnzimmer
       MODIFIER   SetTimerOfDay
       NAME       CC.Wohnzimmer_SetTimerOfDay
       SETTIMERATMIDNIGHT 1
   Daynumber:
     !$we       8
     $we        7
     di         2
     do         4
     fr         5
     mi         3
     mo         1
     sa         6
     so         0
   Helper:
     daysRegExp (so|mo|di|mi|do|fr|sa|\$we|\!\$we)
     daysRegExpMessage (so|mo|di|mi|do|fr|sa|$we|!$we)
     Switchingtime:
       0:
         16:30:00   19
         18:00:00   22
         23:00:00   15
       1:
         16:30:00   19
         18:00:00   22
         22:00:00   15
       2:
         16:30:00   19
         18:00:00   22
         22:00:00   15
       3:
         16:30:00   19
         18:00:00   22
         22:00:00   15
       4:
         16:30:00   19
         18:00:00   22
         22:00:00   15
       5:
         16:30:00   19
         18:00:00   22
         23:00:00   15
       6:
         16:30:00   19
         18:00:00   22
         23:00:00   15
       7:
         23:00:00   15
   Longdays:
     de:
       Sonntag
       Montag
       Dienstag
       Mittwoch
       Donnerstag
       Freitag
       Samstag
       Wochenende
       Werktags
     en:
       Sunday
       Monday
       Tuesday
       Wednesday
       Thursday
       Friday
       Saturday
       weekend
       weekdays
     fr:
       Dimanche
       Lundi
       Mardi
       Mercredi
       Jeudi
       Vendredi
       Samedi
       weekend
       jours de la semaine
   Profil:
     1:
       EPOCH      1479742200
       PARA       19
       TIME       16:30
       TAGE:
         0
         1
         2
         3
         4
         5
         6
     2:
       EPOCH      1479747600
       PARA       22
       TIME       18:00
       TAGE:
         0
         1
         2
         3
         4
         5
         6
     3:
       EPOCH      1479765600
       PARA       15
       TIME       23:00
       TAGE:
         7
     4:
       EPOCH      1479765600
       PARA       15
       TIME       23:00
       TAGE:
         5
     5:
       EPOCH      1479762000
       PARA       15
       TIME       22:00
       TAGE:
         1
         2
         3
         4
   Profile_idx:
     0:
       16:30:00   1
       18:00:00   2
       23:00:00   3
     1:
       16:30:00   1
       18:00:00   2
       22:00:00   5
     2:
       16:30:00   1
       18:00:00   2
       22:00:00   5
     3:
       16:30:00   1
       18:00:00   2
       22:00:00   5
     4:
       16:30:00   1
       18:00:00   2
       22:00:00   5
     5:
       16:30:00   1
       18:00:00   2
       23:00:00   4
     6:
       16:30:00   1
       18:00:00   2
       23:00:00   3
     7:
       23:00:00   3
   Shortdays:
     de:
       so
       mo
       di
       mi
       do
       fr
       sa
       $we
       !$we
     en:
       su
       mo
       tu
       we
       th
       fr
       sa
       $we
       !$we
     fr:
       di
       lu
       ma
       me
       je
       ve
       sa
       $we
       !$we
Attributes:
   disable    0
   group      Heizung
   switchInThePast 1
   verbose    0


Natürlich ist es auch möglich, dass der "Blödmann" vor der Tastatur sitzt :-)

Und weil bald Weihnachten ist, hätte ich da noch einen Wusnchzettel:
* Ein Urlaubmodus wäre  toll: disable bis 23.12.2016 16:00; danach wieder zurück ins laufende Programm
* Eine Variante wäre der Partymodus wäre auch toll: Anheizen für die nächsten X Stunden, dann wieder zurück ins laufende Programm

Vielen Dank für das tolle Modul

Christian
PI 2B+/5 Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

FHEM_Starter

Hallo Dietmar,

ich hatte an folgende Möglichkeit gedacht:

define Timer_EG_KU_Rollo_Fenster WeekdayTimer EG_KU_Rollo_Fenster 12345|{sunrise(+40,"06:30:40","06:59:40")}|auf  (ReadingsVal("Besuch_WZI", "state", "") ne "heute")) 12345|{sunset(+40,"22:00:40","23:00:40")}|ab 6|{sunrise(+40,"07:30:40","07:59:40")}|auf  (ReadingsVal("Besuch_WZI", "state", "") ne "heute")) 6|{sunset(+40,"22:00:40","23:00:40")}|ab 0|{sunrise(+40,"08:30:40","08:59:40")}|auf  (ReadingsVal("Besuch_WZI", "state", "") ne "heute")) 0|{sunset(+40,"22:00:40","23:00:40")}|ab

Gruß Wolfgang

c2j2

#809
Zitat von: Dietmar63 am 21 November 2016, 09:20:33
Man könnte die Zeile auch auskommentieren. Sogar mit einem Attriut abschalten.

Jepp. Und nach dem nächsten Update ist wieder alles weg. Daher frage ich, ob das, was ich geschrieben habe,

a) sinnvoll ist, und wenn ja
b) in den Trunk mit aufgenommen werden kann.