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 (http://link)):
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.
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;
}
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
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?
Hallo,
auch mich würde die Lösung für das Kalenderjahr interessieren....
djhans
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ß
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.
Geht es denn, wenn du der Variable $year den Wert 2014 zuweist, geht es denn dann?
$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.
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.....
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")}}