Neues Modul - Heating_Control, WeekdayTimer

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

Vorheriges Thema - Nächstes Thema

Hans Franz

Hallo,

Ich denke du benötigst holiday2we. Siehe Commandref unter global.

Gruß
Hans
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

chriss

holiday2we habe ich schon eingerichtet, d.h., als Bedingung kann ich we und !we verwenden. Allerdings funktioniert es irgendwie nicht, wenn ich $we als Wochentag angebe. Also z.B.:


rgr_Bewohner !$we|06:45|awoken $we|09:00|awoken 1234567|24:00|asleep

statt

rgr_Bewohner 12345|06:45|awoken 67|09:00|awoken 1234567|24:00|asleep


Dietmar63

Das geht auch nicht!
Es gibt aber eine andere Möglichkeit. Poste ich gleich vom PC.
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

Macht es so:

Erstellt eine Funktion anOderAus() in 99_myUtils und ruft sie als Bedingung in HC auF.
Der Funktion anOderAus() geben wir einen Schalter mit, ob sie am WE gelten soll oder nicht:

define Heizung   Heating_Control Wandthermostat_Wohnzimmer 12345|05:30|20.5  12345|07:30|17 12345|16:30|21 12345|22:00|15 (anOderAus(0))

define Heizung_WE Heating_Control Wandthermostat_Wohnzimmer 1234567|07:45|19 1234567|08:30|20.5 1234567|11:00|18 1234567|16:00|21 1234567|22:30|15 (anOderAus(1))


anOderAus() in 99_myUtils.pm(mit Logging - kann später auskommentiert/gelöscht werden). In anOderAus() steht $we nicht zur Verfügung. Deshalb müssen wir es selbst errechnen. Im dummy HCAutomatik kann die Heizung komplet an oder ausgeschaltet werden:

sub anOderAus($) {
   my ($testWe) = @_;

   #we ermitteln
   my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime;
   my $we = (($wday==0 || $wday==6) ? 1 : 0);
   if(!$we) {
     my $h2we = $attr{global}{holiday2we};
     $we = 1 if($h2we && $value{$h2we} && $value{$h2we} ne "none");
   }
   $testWe = $we if (!defined($testWe));
   Log 3, "testWe------------>$testWe";
   Log 3, "we------------>$we";

   my $state = ReadingsVal("HCAutomatik", "state", "");
   Log 3, "state------------>$state";
   my $ret = ($state eq "on" && $testWe == $we);
   Log 3, "ret------------>$ret";
   
   return $ret;
}
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

#424
Zitat von: Basti am 21 Dezember 2014, 18:51:25
Gibt es eine Möglichkeit die (Perl basierten) Schaltzeiten beim WeekdayTimer per Kommando zu aktualisieren? Ich habs mit:
WeekdayTimer_SetAllParms ()
probiert, aber da ändert sich nichts an den Schaltzeiten.

Der Hintergrund dazu ist, dass ich 2 WeekdayTimer im Betrieb habe, welche Lichter in 2 Räumen schalten. Dabei habe ich die Ausschaltzeit des 1. and die Anschaltzeit des 2. WDT gekoppelt. Das habe ich realisiert, indem ich mit:

my $datetime = ReadingsVal($weektimer,"nextUpdate","20.12.2014 $fallback");

die nächste Schaltzeit des 2. WDT auslese. Ist nicht sehr robust, aber ich habe keine andere Möglichkeit gefunden und es funktioniert erstmal. Bin aber offen für bessere Vorschläge dies zu lösen.

Ein Problem besteht mit dieser Methode allerdings. Wenn ich z.B. die FHEM Konfig neu einlese, hat der 2. WDT noch keine echte Anschaltzeiten und das NextUpdate ist innerhalb von einer Minute oder so, was sich der 1. WDT dann als Auschaltzeit annimmt.
Das ist problematisch, wenn der 1. WDT noch gar nicht an ist, da er kann es sein, dass die Lampe des 1.WDT bis zum nächsten Tag durchläuft.

Daher möchte ich sobald der 1.WDT anschaltet, die Schaltzeiten auffrischen, damit der 1. WDT eine richtige Ausschaltzeit für den Tag gesetzt bekommt.

Die automatische Aktualisierung um Mitternacht reicht nicht aus, da dass in den meisten Fällen schon zu spät ist.

Vielen Dank für eure Hilfe.

Gruß,
Sebastian

Du könntest es folgendermaßen machen:
Du definiert nur einen WD
define xxx WeekdayTimer   16:00|an1  17:00|an2   18:00:aus   {meineFunktion("@", "%")}

Dann bekommst du in meineFunktion() das device und den Value {an1, an2, aus }  übermittelt und kannst selbst schalten mit:


fhem  ("set lampe1 an")
fhem  ("set lampe1 aus;; set lampe2 an")
fhem  ("set lampe2 aus)

Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

chriss

#425
Zitat
Erstellt eine Funktion anOderAus() in 99_myUtils und ruft sie als Bedingung in HC auF.
Der Funktion anOderAus() geben wir einen Schalter mit, ob sie am WE gelten soll oder nicht:

Danke für das Beispiel. Demnach kann $we auch nicht in der Condition direkt verwendet werden? Hatte bisher angenommen, dass das ginge, da es relativ am Anfang auch als Beispie genannt wurde, habe aber immer nur die Verwendung von $we als Tag versucht, da man damit nur einen Timer benötigen würde. Ich probiere es dann mit der Hilfsfunktion und zwei Timern...

Dietmar63

Doch das funktioniert meines Wissens, weil dem Ausdruck der in WD ausgeführt wird,  im Gegensatz zu den Funktionen in 99_myUtils.pm der Zeitkontext($we, $wday, $hash, $mday...) bereitstellt wird.

Ich überlege mal, wie man das ändern kann, es führt nämlich immer wieder zu Missverständnissen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

chriss

Irgendetwas ist aber anders: Bei zwei Timern, einer mit der Condition ($we) und einer mit der Condition (!$we), stehen beide nach einem WeekdayTimer_setAllParams() auf "inactive". Einer sollte aber aktiv sein.

Dietmar63

#428
@chriss:
Veröffentliche mal die genauen Definitionen
Schalte mal verbose 5 ein. Ggf Logging einbauen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Basti

Zitat von: Dietmar63 am 03 Januar 2015, 20:42:10
Du könntest es folgendermaßen machen:
Du definiert nur einen WD
define xxx WeekdayTimer   16:00|an1  17:00|an2   18:00:aus   {meineFunktion("@", "%")}
Das schaut nach einer wunderbaren Lösung aus, danke!

chriss

#430
Ich habe, wie gesagt, zwei Timer definiert:

define ResidentsStateTimer_Free WeekdayTimer rgr_Bewohner 09:00|awoken 11:00|home 20:10|absent 24:00|asleep ($we)
define ResidentsStateTimer_Work WeekdayTimer rgr_Bewohner 06:45|awoken 07:15|home 08:00|absent 15:00|home 20:10|absent 24:00|asleep (!$we)


Grundsätzlich scheint das Schalten auch zu gehen. Heute um 20:10 hat der *_Free geschaltet, der *_Work aber nicht:

2015.01.04 20:10:00 4: [ResidentsStateTimer_Work] Jetzt:04.01.2015 20:10:05 -> Next: 04.01.2015 20:10:00 -> Param: absent -5.00384211540222
2015.01.04 20:10:00 5: [ResidentsStateTimer_Work] list of senors found: 'ResidentsStateTimer_Work'
2015.01.04 20:10:00 4: [ResidentsStateTimer_Work] 04.01.2015 20:10:00 ; aktParam: 0 ; newParam: absent
2015.01.04 20:10:00 4: [ResidentsStateTimer_Work] is not disabled
2015.01.04 20:10:00 4: [ResidentsStateTimer_Work] command: { fhem("set rgr_Bewohner  absent") if(!$we)} executed
2015.01.04 20:10:00 4: [ResidentsStateTimer_Work] Next switch 05.01.2015 00:00:00
2015.01.04 20:10:00 5: [ResidentsStateTimer_Work] removing Timer: ResidentsStateTimer_Work_Update
2015.01.04 20:10:00 5: [ResidentsStateTimer_Work] setting  Timer: ResidentsStateTimer_Work_Update 05.01.2015  00:00:00
2015.01.04 20:10:00 4: [ResidentsStateTimer_Free] Jetzt:04.01.2015 20:10:05 -> Next: 04.01.2015 20:10:00 -> Param: absent -5.01038002967834
2015.01.04 20:10:00 5: [ResidentsStateTimer_Free] list of senors found: 'ResidentsStateTimer_Free'
2015.01.04 20:10:00 4: [ResidentsStateTimer_Free] 04.01.2015 20:10:00 ; aktParam: 0 ; newParam: absent
2015.01.04 20:10:00 4: [ResidentsStateTimer_Free] is not disabled
2015.01.04 20:10:00 4: [ResidentsStateTimer_Free] command: { fhem("set rgr_Bewohner  absent") if($we)} executed
2015.01.04 20:10:00 2: RESIDENTS set rgr_Bewohner absent
2015.01.04 20:10:00 4: [ResidentsStateTimer_Free] Next switch 05.01.2015 00:00:00
2015.01.04 20:10:00 5: [ResidentsStateTimer_Free] removing Timer: ResidentsStateTimer_Free_Update
2015.01.04 20:10:00 5: [ResidentsStateTimer_Free] setting  Timer: ResidentsStateTimer_Free_Update 05.01.2015  00:00:00


Wenn ich aber {WeekdayTimer_SetAllParms()} aufrufe (in diesem Fall kurz danach, der *_Free sollte also auf "absent" stehen), dann gehen beide auf inactive:


2015.01.04 20:18:29 5: Cmd: >{WeekdayTimer_SetAllParms ()}<
2015.01.04 20:18:29 5: Triggering ResidentsStateTimer_Free (1 changes)
2015.01.04 20:18:29 5: Notify loop for ResidentsStateTimer_Free inactive
2015.01.04 20:18:29 5: statistics Verbraucher1_Statistics: Notify.260 Notification of 'ResidentsStateTimer_Free' received. Device not monitored.
2015.01.04 20:18:29 5: ResidentsStateController: not on any display, ignoring notify
2015.01.04 20:18:29 4: eventTypes: WeekdayTimer ResidentsStateTimer_Free inactive -> inactive
2015.01.04 20:18:29 4: eventTypes: WeekdayTimer ResidentsStateTimer_Free state: inactive -> state: inactive
2015.01.04 20:18:29 5: rg_battery: not on any display, ignoring notify
2015.01.04 20:18:29 5: Triggering ResidentsStateTimer_Work (1 changes)
2015.01.04 20:18:29 5: Notify loop for ResidentsStateTimer_Work inactive
2015.01.04 20:18:29 5: statistics Verbraucher1_Statistics: Notify.260 Notification of 'ResidentsStateTimer_Work' received. Device not monitored.
2015.01.04 20:18:29 5: ResidentsStateController: not on any display, ignoring notify
2015.01.04 20:18:29 4: eventTypes: WeekdayTimer ResidentsStateTimer_Work inactive -> inactive
2015.01.04 20:18:29 4: eventTypes: WeekdayTimer ResidentsStateTimer_Work state: inactive -> state: inactive
2015.01.04 20:18:29 5: rg_battery: not on any display, ignoring notify
2015.01.04 20:18:29 3: WeekdayTimer_SetAllParms() done!


Noch eine Ergänzung: Wenn ich z.B. die Condition im *_Free Timer von "($we)" auf "(1)" ändere, dann klappt auch das  WeekdayTimer_SetAllParms ():


2015.01.04 21:41:23 5: Cmd: >{WeekdayTimer_SetAllParms ()}<
2015.01.04 21:41:23 5: [ResidentsStateTimer_Free] list of senors found: 'ResidentsStateTimer_Free'
2015.01.04 21:41:23 4: [ResidentsStateTimer_Free] 04.01.2015 20:10:00 ; aktParam: 0 ; newParam: absent
2015.01.04 21:41:23 4: [ResidentsStateTimer_Free] is not disabled
2015.01.04 21:41:23 4: [ResidentsStateTimer_Free] command: { fhem("set rgr_Bewohner  absent") if(1)} executed
2015.01.04 21:41:23 5: Cmd: >{ fhem("set rgr_Bewohner  absent") if(1)}<
2015.01.04 21:41:23 5: Cmd: >set rgr_Bewohner  absent<
2015.01.04 21:41:23 5: RESIDENTS rgr_Bewohner: called function RESIDENTS_Set()
2015.01.04 21:41:23 2: RESIDENTS set rgr_Bewohner absent


Dietmar63

98_Heating_Control, 98_WeekdayTimer:
          big refactoring update with some minor improvements.

from now it is possible to define $we or !$we in daylist to easily allow weekend an holiday. $we !$we are coded as 7 8, when using a numeric daylist.

Some examples:

define hc    WeekdayTimer HeizungKueche de        7|23:35|25 34|23:30|22 23:30|16 23:15|22  8|23:45|16   
define hc    WeekdayTimer HeizungKueche de        fr,$we|23:35|25 34|23:30|22 23:30|16 23:15|22  12|23:45|16   
define hc    WeekdayTimer HeizungKueche de        20:35|25 34|14:30|22 21:30|16 21:15|22  12|23:00|16   

define hw    WeekdayTimer HeizungKuech  de         mo-so,$we|{sunrise_abs_dat($date)}|18       mo-so,$we|{sunset_abs_dat($date)}|22  ;
define ht    WeekdayTimer HeizungKuech  de        mo-so,!$we|{sunrise_abs_dat($date)}|18      mo-so,!$we|{sunset_abs_dat($date)}|22  ;

define hh    WeekdayTimer HeizungKuech  de        {sunrise_abs_dat($date)}|19           {sunset_abs_dat($date)}|21  ;
define hx    WeekdayTimer HeizungKueche de        22:35|25  23:00|16     



The daylist can be given globaly for the whole WD, HC:

define HeizungWohnen_an_wt    Heating_Control HeizungWohnen de  !$we     09:00|19  (heizungAnAus("Ein"))
define HeizungWohnen_an_we    Heating_Control HeizungWohnen de   $we     09:00|19  (heizungAnAus("Ein"))
define HeizungWohnen_an_we    Heating_Control HeizungWohnen de   78      09:00|19  (heizungAnAus("Ein"))
define HeizungWohnen_an_we    Heating_Control HeizungWohnen de   57      09:00|19  (heizungAnAus("Ein"))
define HeizungWohnen_an_we    Heating_Control HeizungWohnen de  fr,$we   09:00|19  (heizungAnAus("Ein"))
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

dlehmann69

Hallo,

seit dem Update erhalte ich bei jedem Vorgang von Heating_Control folgende Meldungen im Log.

2015.03.29 15:00:00 3: eval: {( 1 && ($wday ~~ [0,1,2,3,4,5,6]))}
2015.03.29 15:00:00 1: PERL WARNING: Smartmatch is experimental at (eval 1014) line 1.
2015.03.29 15:00:00 3: eval: {( 1 && ($wday ~~ [1]))}
2015.03.29 15:00:00 1: PERL WARNING: Smartmatch is experimental at (eval 1012) line 1.


Diese haben wahrscheinlich nichts schlimmes zu bedeuten. Kann man diese dann bitte unterdrücken.

Besten Dank
Dirk
FHEM 6.0 Development auf Ubuntu 20.04 GIGABYTE GB-BACE mit Intel(R) Celeron(R) CPU N3150
CUL 3.4 FW 1.53 868 MHz für FS20, FHT
CUL 3.4 FW 1.66 868 MHz für HM
configDB; DbLog
FHT80, FS20, HMS, EM1000WZ, FHTTF, HM-LC-Sw1-DR; Lightify; HM-CC-RT-DN; HM-TC-IT-WM-W-EU; HM-SEC-SCO

Dietmar63

Kannst du erst mal ignorieren. Muß ich umbauen, wird aber dauern.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm