Heizungsprogramm anhand der Schulferien umstellen

Begonnen von strauch, 10 Januar 2014, 14:38:24

Vorheriges Thema - Nächstes Thema

strauch

Hallo,

ich habe für mein FHEM System ein paar Codeschnipsel damit innerhalb der Schulferien, bei den noch Schulpflichtigen, das Heizungsprogramm umgestellt wird und sobald die Schule wieder anfängt, wieder zurück gestellt wird. Als Basis habe ich folgende Wiki Einträge genutzt:
http://www.fhemwiki.de/wiki/Wochenende,_Feiertage_und_Schulferien
http://www.fhemwiki.de/wiki/HM-CC-RT-DN_Funk-Heizk%C3%B6rperthermostat

Als Heizungsthermostate nutze ich Homematic HM-CC-RT-DN. Mich wunderte ein wenig das ich dazu bisher nichts gefunden habe, falls es sowas doch schon gibt (evtl. ja auch deutlich eleganter oder besser gelöst, bitte melden :-) ). Vielleicht hat auch noch jemand Ergänzugen für FHT und Max! Systeme.

Als erstes habe ich 2 Heizungsprogramm in die 99_MyUtils.pm gesetzt wie hier beschrieben (http://www.fhemwiki.de/wiki/HM-CC-RT-DN_Funk-Heizk%C3%B6rperthermostat#Channel_.28Kanal.29_04_ClimRT_tr):


sub
SetTempList_xz_Heizung_Schule()
{
   { fhem ("set xz_Heizung_ClimRT_tr tempListMon prep 05:30 16.0 07:00 18.0 16:00 18.5 20:30 19.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListTue prep 05:30 16.0 07:00 18.0 16:00 18.5 20:30 19.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListWed prep 05:30 16.0 07:00 18.0 16:00 18.5 20:30 19.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListThu prep 05:30 16.0 07:00 18.0 16:00 18.5 20:30 19.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListFri prep 05:30 16.0 07:00 18.0 15:00 18.5 20:30 19.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListSat prep 07:00 16.0 09:00 18.0 15:00 18.5 21:00 19.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListSun exec 07:00 16.0 09:00 18.0 15:00 18.5 21:00 19.0 24:00 16.0")};
}
# End SetTempList_xz_Heizung_Schule


sub
SetTempList_xz_Heizung_Ferien()
{
   { fhem ("set xz_Heizung_ClimRT_tr tempListMon prep 10:00 16.0 21:30 10.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListTue prep 10:00 16.0 21:30 10.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListWed prep 10:00 16.0 21:30 10.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListThu prep 10:00 16.0 21:30 10.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListFri prep 10:00 16.0 21:30 10.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListSat prep 10:00 16.0 21:30 10.0 24:00 16.0")};
   { fhem ("set xz_Heizung_ClimRT_tr tempListSun exec 10:00 16.0 21:30 10.0 24:00 16.0")};
}
# End SetTempList_xz_Heizung_Ferien


Dann benötigen wir natürlich die Ferientage. Die können wir uns von schulferien.org holen z.B.:
define NRW_Ferien Calendar ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_2014.ics 21600

Die Sekunden für die Aktualisierung habe ich auf 21600 gestellt so wird alle 6h geprüft. Im schlimmsten Fall also am ersten Ferientag morgens um 6 Uhr.
Die Jahreszahl wird per at immer am 1. Januar aktualisiert:
define at_Ferienkalender at *00:00:01 {if($yday = 1) {fhem("modify NRW_Ferien ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_" . $year . ".ics 21600")}}


Anschließend brauchen wir noch ein Notify und ein Dummy. Der Notify stellt den Dummy auf 1 für Ferientag und 0 für Schultag:
define NRW_Ferientag dummy
attr NRW_Ferientag event-on-change-reading .*

define notify_NRW_Ferien notify NRW_Ferien { \
fhem "set NRW_Ferientag " . (ReadingsVal("NRW_Ferien", "modeStart", "") =~ "schulferien" ? 1: 0) }


Wichtig ist das event-on-change-reading, damit nicht jedes mal wenn der Kalender neu ausgelesen wird, das Heizungsprogramm neu übertragen wird.

Nun habe ich noch 2 notifys, die mir das Heizungsprogramm je nach Zustand an die Thermostate überträgt:
define notify_xz_Heizung_Ferien notify NRW_Ferientag:1 {SetTempList_xz_Heizung_Ferien}

define notify_xz_Heizung_Schule notify NRW_Ferientag:0 {SetTempList_xz_Heizung_Schule}


Falls Fehler oder Ungereimtheiten im Code sind bitte sagt mir bescheid.
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

Dietmar63

#1
Sieh dir mal Heating_Control an. Die notify kannst du weiterverwenden, wenn du passende dummys versorgst.

fhem.cfg

define HeizungKueche_wt       Heating_Control HeizungKueche de 05:35|25 06:15|22 06:50|18 12:00|25 12:30|22 14:00|19 15:30|20 17:45|22 18:30|16                     (heizungAnAus("An",  0))
define HeizungKueche_we       Heating_Control HeizungKueche de 06:45|25 07:30|22 09:00|19 12:00|22          13:15|20                   18:30|16                     (heizungAnAus("An",  1))
define HeizungWohnen_wt       Heating_Control HeizungWohnen de                                              15:00|25 15:30|21 17:30|22.5         20:00|22  22:00|16 (heizungAnAus("An",  0))
define HeizungWohnen_we       Heating_Control HeizungWohnen de                   09:00|19 12:30|21          14:00|21          17:30|22.5         20:00|22  22:00|16 (heizungAnAus("An",  1))
#
define HeizungKueche_uz_wt    Heating_Control HeizungKueche en 05:35|25 06:15|22 06:50|16                                              18:00|22 18:45|16            (heizungAnAus("Ueb", 0))
define HeizungKueche_uz_we    Heating_Control HeizungKueche de 06:45|25 07:30|22 08:30|16                                              18:00|22 18:45|16            (heizungAnAus("Ueb", 1))
define HeizungWohnen_uz       Heating_Control HeizungWohnen de                                                                         18:00|22            22:00|16 (heizungAnAus("Ueb", undef))
#
define HeizungKueche_Aus      Heating_Control HeizungKueche de So|00:05|off (heizungAnAus("Off", undef))
define HeizungWohnen_Aus      Heating_Control HeizungWohnen de So|00:05|off (heizungAnAus("Off", undef))
#
attr   HeizungKueche_wt       stateFormat state °C
attr   HeizungKueche_we       stateFormat state °C
attr   HeizungWohnen_wt       stateFormat state °C; attr   HeizungWohnen_wt       windowSensor Terrassentuer;
attr   HeizungWohnen_we       stateFormat state °C; attr   HeizungWohnen_we       windowSensor Terrassentuer;
attr   HeizungKueche_uz_wt    stateFormat state °C
attr   HeizungKueche_uz_we    stateFormat state °C
attr   HeizungWohnen_uz       stateFormat state °C
attr   HeizungKueche_Aus      stateFormat state °C
attr   HeizungWohnen_Aus      stateFormat state °C



99_myUtils:

sub heizungAnAus($$) {
   my ($myState, $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));

   my $state = ReadingsVal("Heizung", "state", "Off");
   my $ret = ($state eq $myState && $testWe == $we);
   
   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

strauch

Hallo Dietmar,

danke für den Tipp, ich sehe da brauch ich mal etwas Zeit mich rein zu denken und die Vorteile zu sehen/verstehen. Kannst du mir denn vielleicht ein Tipp geben, warum mein in Perl generierter Link zum Jahreskalender nicht funktioniert?

Danke

strauch
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

f_sieler

#3
Hallo "strauch",

ich suche auch eine Lösung um die URL dynamisch anzupassen.

Zitatdefine NRW_Ferien Calendar {fhem("ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_" . $year . ".ics 21600")}

Hast Du dazu eine Lösung gefunden?
FHEM 5.5 auf FritzBox 7390, CUL für FS20, 8x fht80b, 7x fht80TF, 3x fs20st-4,  FB_Callmonitor

djhans

Hallo,
auch mich würde die Lösung für das Kalenderjahr interessieren....
djhans

kvo1

Hallo Strauch,

Super Idee und ein echter Güter Ansatz, sowas hatte ich auch noch im Hinterkopf, wenn
denn mal der Rest soweit läuft.

Gruß
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

strauch

Ich hab leider noch keine Lösung gefunden. Ich muss jetzt auch erstmal etwas Zeit aufs Debuggen verwenden, hab so viele Funktionen in letzter Zeit eingebaut, die noch nicht perfekt rund laufen. Ich hoffe ja das hier irgendwann mal einer reinschaut mit guten perl/fhem Kenntnissen und weiß warum das mit dem Jahr nicht klappt. Ich hatte auch noch keine Zeit mir die Lösung von Dietmar anzuschauen.
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

Rince

Geht es denn, wenn du der Variable $year den Wert 2014 zuweist, geht es denn dann?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

strauch

$year ist ja von FHEM zur Verfügung gestellte Variable. Tipp einfach mal in die Kommandozeile:

{fhem("http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_" . $year . ".ics")}

Dann kommt in der Fehlermeldung der richtige Link zurück.
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

strauch

#9
Inzwischen mache ich die aktualisieren über ein "at":
define at_Ferienkalender at *00:00:01 {if($yday = 1) {fhem("modify NRW_Ferien ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_" . $year . ".ics 21600")}}
So wir dimmer am ersten Tag im Jahr der neue Kalender eingetragen.

Dann muss ich das mal auf Temperaturlisten umstellen.....
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

f_sieler

#10
danke für den Denkanstoß zur Aktualisierung der URL.
Noch ein kleiner Hinweis, wenn man nach der  "Calendar"-Definition gleich eine Aktualisierung durchführt, so sind auch nach einem Neustart von FHEM die Feriendaten verfügbar und man muss nicht bis zum 1.1. des nächsten Jahres warten. So sieht es bei mir aus:

define Thueringen_Ferien Calendar ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Thueringen_2013.ics 21600

define init_Ferienkalender at +00:00:10 {fhem("modify Thueringen_Ferien ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Thueringen_" . $year . ".ics 21600")}

define at_Ferienkalender at *00:00:01 {if($yday == 1) {fhem("modify Thueringen_Ferien ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Thueringen_" . $year . ".ics 21600")}}
FHEM 5.5 auf FritzBox 7390, CUL für FS20, 8x fht80b, 7x fht80TF, 3x fs20st-4,  FB_Callmonitor