Feiertage mit 2 HGs abbilden und dann in anderen HGs benutzen

Hallo zusammen,
da wieder einige Feiertage vor der Tür stehen und ich eine Kalenderfunktion schmerzlich vermisse, habe ich vielleicht eine Variante für mich gefunden (inspiriert durch @shamrock Integration von Feiertagen). Allerdings muss ich die erst noch testen.

HG 1 (Status HG) wird nur zum aktivieren und deaktivieren benötigt.
Auslöser abspielen
aktion pushnachricht (eigentlich egal)

HG2 Feiertage aktivieren und deaktivieren:
Auslöser: Datum 1. Feiertag (Zeit, Einmalig 00:00)
und Datum 2. Feiertag
usw.
Bedingung: Nur wenn Modus nicht auf Urlaub steht (Da sind mir die Feiertage eigentlich egal)
Aktion: HG1 aktivieren und
HG1 nach 23h 55min wieder deaktivieren.

So was ähnliches werde ich mir mit den Schulferien der Kinder basteln, da brauche ich dann aber für jeden Zeitraum (Ferien) ein HG.

Ich werde berichten, ob es funktioniert.

Vielleicht hat noch jemand Ideen oder Verbesserungsvorschläge.

Viele Grüße
Daniel

4 Like

Cooler Ansatz - etwas besseres fällt mir auch nicht ein.
:coffee:

Halte uns auf jeden Fall auf dem Laufenden. Meine Lösung funktioniert bei mir und deckt Feiertage und Ferien seit einiger Zeit gut ab, ich bin mir aber sicher, dass dies noch verbessert werden kann.

Insofern bin ich natürlich an Deinen Ergebnissen sehr interessiert.

Vielen Dank schon mal, Dieter

Aussee den beiden anderen Vorschlägen mit IFTTT+Officeholiday und Fritzbox+Googlekalender, ginge vielleicht noch IFTTT+Office365Kalender. Im Job arbeite ich mit Outlook, also quasi der Vorläufer von Office365 und dort konnte man die Feiertage immer für das ganze Jahr “vorinstallieren”. Würde mich wundern, wenn es das bei Office365 nicht gibt.

Wenn ich dazu komme, kann ich berichten. Wird aber noch ein paar Tage dauern.

Gruß
Andreas

So. Ich hab’s mal versucht.
Allerdings muss man wohl bezahltechnisch Kunde bei Office365 sein. Das bin ich wohl nicht.
Daher scheidet für mich und andere Nicht-Nutzer von Office365 dieser Weg aus.

Fehlermeldung vom Microsoft System:

“Leider können wir Sie nicht anmelden.
Es wurde eine ungültige Anforderung empfangen.”

Im Kleingedruckten wird dann erklärt, dass man in deren Datenbank für die Applikation Offcie365 nicht existent sei.

Gruß
Andreas

Altes Thema, aber falls das noch mal jemand braucht: Ich habe es über IFTTT und google Kalender gelöst.

  • Wie oben von Daniel beschrieben zwei Homeegramme erstellen, jedoch beim 2. Homeegramm statt die Tage einzeln einzugeben als Auslöser einen Webhook verwenden.
  • Im Google Kalender (man braucht ein Google Konto) einen neuen Kalender mit dem Titel “Feiertage” erstellen
  • Auf der Seite schulferien.org (https://www.schulferien.org/deutschland/ical/) vom jeweiligen Bundesland den Kalender als *.ical runterladen und mit Doppelklick in den Kalender “Feiertage” importieren
  • In IFTTT (auch hier braucht man einen Account) unter “My applets” ein eigenes Applet erstellen
    – Als “This” das Applet “Google calender” auswählen
    – “Any event starts”
    – “Which calendar?: Feiertage”
    – Als “That” das Applet “Webhook” auswählen und die Homee Webhook URL eintragen
  • Fertig

Nachteil:

  • Man benötigt eine Internetverbindung für das setzen des Feiertags
  • Man muss nach Ablauf der importieren Feiertage jeweils eine neue iCal-Datei mit Feiertagen importieren.
    Vorteil:
  • Man muss die Feiertage nicht einzeln in homee anlegen

Möchte man die Feiertage nicht jedes Jahr neu eintragen kann man auch einen Stream abonnieren (z.B. https://calovo.de/f/nrw/feiertage).

6 Like

Ich möchte hier auch mal meine Lösung vorstellen. Sie funktioniert ohne irgendwelche Kalenderabos etc. Einzige Vorraussetzung ist ein Webserver (z.B. NAS oder Raspberry) mit php.

Als erstes habe ich ein Dummy-Gerät (OPUS greenNet Steckdosenleiste 2-Kanal) angelernt. Beschreibung dazu findet man hier in der Community.

Dann habe ich je ein HG zum Ein- und Ausschalten des Schalters1 der Steckdosenleiste erstellt. Die HGs werden durch Webhooks ausgelöst.
An Feiertagen wird der Schalter eingeschaltet und an normalen Tagen ausgeschaltet.

Letzter Schritt war dann folgendes php-Script welches jeden Tag um 00:00 Uhr ausgeführt wird.

<?php
$tag= 24*60*60; // 24h*60min*60sec
$easter=easter_date();  // Datum von Ostersontag des aktuellen Jahres als int
$thisyear=date("Y"); //Das aktuelle Jahr
$heute= date("d.m.Y"); // Das Datum des aktuellen Tages im Format Tag(zweistellig).Monat(zweistellig).Jahr(vierstellig)

// ab hier Berechnng der Feiertage
$neujahr= date("d.m.Y", (mktime(0,0,0,1,1,$thisyear))); 
$ostersonntag = date("d.m.Y", $easter);
$karfreitag = date("d.m.Y", ($easter - (2*$tag)));
$ostermontag= date("d.m.Y", ($easter + (1*$tag)));
$tagderarbeit= date("d.m.Y", (mktime(0,0,0,5,1,$thisyear)));
$himmelfahrt= date("d.m.Y", ($easter+(39*$tag)));
$pfingstsonntag= date("d.m.Y", ($easter + (49*$tag)));
$pfingstmontag= date("d.m.Y", ($easter + (50*$tag)));
$tagdereinheit= date("d.m.Y", (mktime(0,0,0,10,3,$thisyear)));
$reformationstag= date("d.m.Y", (mktime(0,0,0,10,31,$thisyear)));
$heiligabend= date("d.m.Y", (mktime(0,0,0,12,24,$thisyear)));
$weihnachtstag1= date("d.m.Y", (mktime(0,0,0,12,25,$thisyear)));
$weihnachtstag2= date("d.m.Y", (mktime(0,0,0,12,26,$thisyear)));
$silvester= date("d.m.Y", (mktime(0,0,0,12,31,$thisyear)));

// berechnete Feiertage werden zum Array $feiertage hinzugefügt
$feiertage["Neujahr"]=$neujahr;
$feiertage["Karfreitag"]=$karfreitag;
$feiertage["Ostersonntag"]=$ostersonntag;
$feiertage["Ostermontag"]=$ostermontag;
$feiertage["Christi Himmelfahrt"]=$himmelfahrt;
$feiertage["Pfingstsonntag"]=$pfingstsonntag;
$feiertage["Pfingstmontag"]=$pfingstmontag;
$feiertage["Tag der deutschen Einheit"]=$tagdereinheit;
$feiertage["Reformationstag"]=$reformationstag;
$feiertage["Heilig Abend"]=$heiligabend;
$feiertage["1. Weihnachtsfeiertag"]=$weihnachtstag1;
$feiertage["2. Weihnachtsfeiertag"]=$weihnachtstag2;
$feiertage["Silvester"]=$silvester;

// Angaben zum homee
$homee_ip = "123.123.123.123"; // IP-Adresse oder Netbios-Name vom homee
$homee_port = "7681"; // Port für die API
$homee_key = "hier-euren-Webhookschlüssel-einfügen"; // Webhookschlüssel
$feiertag="Feiertag"; // Webhook für homeegramm
$keinfeiertag="keinFeiertag"; // Webhook für homeegramm

if(in_array($heute, $feiertage)){ // Prüft ob "$heute" in Array "$feiertage" enthalten ist 
    file_get_contents("http://" . $homee_ip . ":" . $homee_port . "/api/v2/webhook_trigger?webhooks_key=" . $homee_key . "&event=" . $feiertag ); // Webhook $Feiertag wird ausgeführt wenn $heute in $feiertage enthalten ist
} else file_get_contents("http://" . $homee_ip . ":" . $homee_port . "/api/v2/webhook_trigger?webhooks_key=" . $homee_key . "&event=" . $keinfeiertag );  // Webhook $keinFeiertag wird ausgeführt wenn $heute nicht in $feiertage enthalten ist 

?>

So sind keinerlei manuelle Aktionen mehr nötig und homee weiß immer ob gerade ein Feiertag ist, oder nicht.

6 Like

Saugeil, big like.

Nächste Iteration (MVP) Input vom Bundesland, nicht jeder Feiertag ist überall ein Feiertag aber ein nice-to-have.

Das sind jetzt natürlich nur die Feiertage für mein Bundesland (Hamburg), aber das Script lässt sich ja leicht anpassen.
Ich werde das gleich noch tun, um homee zu sagen ob der nächste Tag ein Feiertag ist. :wink:

Gefällt mir sehr gut deine Lösung,

jetzt muss ich nur noch einen schlanken php-fähigen Server für meinen überladenen (node-red, Pi-hole, HA-Bridge) Raspi finden oder den code an node-red anpassen…

Viele Grüße
JayJay

1 Like

Wer es auch noch für node-red gebrauchen kann, ich habe es mir mal angepasst… Danke für die Vorlage @Wahl-HHer :
Geht sicher auch schlanker, aber ich bin ja kein Coder ;D

//Zeitstempel erstellen
var d = new Date();
    var DayOfMonth = d.getDate() < 10 ? '0' + d.getDate() : d.getDate();
    var Month = (d.getMonth() +1) < 10 ? '0' + (d.getMonth() +1) : (d.getMonth() +1) ;
    var Year = d.getFullYear();
    var heutems = Date.now();


/**
* Calculates Easter in the Gregorian/Western (Catholic and Protestant) calendar 
* based on the algorithm by Oudin (1940) from http://www.tondering.dk/claus/cal/easter.php
*/
function getEaster(year) {
	var f = Math.floor,
		// Golden Number - 1
		G = year % 19,
		C = f(year / 100),
		// related to Epact
		H = (C - f(C / 4) - f((8 * C + 13)/25) + 19 * G + 15) % 30,
		// number of days from 21 March to the Paschal full moon
		I = H - f(H/28) * (1 - f(29/(H + 1)) * f((21-G)/11)),
		// weekday for the Paschal full moon
		J = (year + f(year / 4) + I + 2 - C + f(C / 4)) % 7,
		// number of days from 21 March to the Sunday on or before the Paschal full moon
		L = I - J,
		month = 3 + f((L + 40)/44),
		day = L + 28 - 31 * f(month / 4);

	return (day < 10 ? '0' + day : day) +"." +(month < 10 ? '0' + month : month)+".";
}

var tag = (24*60*60*1000); // Tag in Millisekunden
var easterdatum = getEaster(Year)+Year;// Datum von Ostersonntag des aktuellen Jahres
var easter = easterdatum.split('.'); // Datum zur Weiterverarbeitung aufsplitten
var datum = new Date(easter[2], easter[1]-1, easter[0]); // Datum neu formatieren
var easterms = (datum.getTime());                        // und in Millisekunden umrechnen
var heute =  DayOfMonth + "." + Month + "." + Year;  // Das Datum des aktuellen Tages


// Berechnng der Feiertage
var neujahr = "01.01."+Year;
var karfreitag = mszudatum(easterms - (2*tag))+Year;
var ostersonntag = mszudatum(easterms)+Year;
var ostermontag = mszudatum(easterms + (1*tag))+Year;
var tagderarbeit = "01.05."+Year;
var himmelfahrt = mszudatum(easterms + (39*tag))+Year;
var pfingstsonntag = mszudatum(easterms + (49*tag))+Year;
var pfingstmontag = mszudatum(easterms + (50*tag))+Year;
var tagdereinheit = "03.10."+Year;
var reformationstag = "31.10."+Year;
var heiligabend = "24.12."+Year;
var weihnachtstag1 = "25.12."+Year;
var weihnachtstag2 = "26.12."+Year;
var silvester = "31.12."+Year;

//Millisekunden in Datum umwandeln
function mszudatum(unixdatum) {
var easterf = new Date(unixdatum).toLocaleString('de-DE',{day: '2-digit',month: '2-digit',year: 'numeric'});
var datum2 = easterf.split('-');
var datum3 = (datum2[2]+ "." + datum2[1]+ ".");//+ datum2[0]);

return datum3;
}


if ((heute == neujahr)||(heute == ostersonntag)||(heute == ostermontag)||(heute == karfreitag)||(heute == tagderarbeit)||(heute == himmelfahrt) ||(heute == pfingstsonntag)||(heute == pfingstmontag)||(heute == tagdereinheit)||(heute == reformationstag) ||(heute == heiligabend)||(heute == weihnachtstag1)||(heute == weihnachtstag2)||(heute == silvester))
 node.send({payload: "Heute ist ein Feiertag"});
else
 node.send({payload: "Heute ist kein Feiertag"});

if ((mszudatum((heutems)+(tag))+Year == neujahr)||(heute == ostersonntag)||(heute == ostermontag)||(heute == karfreitag)||(heute == tagderarbeit)||(heute == himmelfahrt) ||(heute == pfingstsonntag)||(heute == pfingstmontag)||(heute == tagdereinheit)||(heute == reformationstag) ||(heute == heiligabend)||(heute == weihnachtstag1)||(heute == weihnachtstag2)||(heute == silvester))
 node.send({payload: "Morgen ist ein Feiertag"});
return;
1 Like

Hier noch die Ergänzung um homee zu sagen ob der nächste Tag ein Feiertag ist. :sunglasses:
Einfach in meinem obigen Script einfügen.

$morgen= date("d.m.Y", ($heute+(1*$tag))); // Das Datum des nächsten Tages im Format Tag(zweistellig).Monat(zweistellig).Jahr(vierstellig)

$morgenfeiertag="morgenFeiertag"; // Webhook der ausgelöst wird wenn der nächste Tag ein Feiertag ist
$morgenkeinfeiertag="morgenkeinFeiertag"; // Webhook der ausgelöst wird wenn der nächste Tag kein Feiertag ist

if(in_array($morgen, $feiertage)){ // Prüft ob "$morgen" in Array "$feiertage" enthalten ist 
        file_get_contents("http://" . $homee_ip . ":" . $homee_port . "/api/v2/webhook_trigger?webhooks_key=" . $homee_key . "&event=" . $morgenfeiertag ); // Webhook $morgenFeiertag wird ausgeführt wenn $morgen in $feiertage enthalten ist
} else file_get_contents("http://" . $homee_ip . ":" . $homee_port . "/api/v2/webhook_trigger?webhooks_key=" . $homee_key . "&event=" . $morgenkeinfeiertag );  // Webhook $morgenkeinFeiertag wird ausgeführt wenn $morgen nicht in $feiertage enthalten ist 
1 Like

Ich regel das mit Feiertagen, Schulferien, Krankheitstagen für mich und meine Anforderungen mit Bordmitteln des Homee.

Die Heizpläne sind alle so angelegt, als ob ich bzw. irgendwer im Haushalt immer daheim wäre.
Wenn irgendwer (aus welchem Grund auch immer) daheim ist, laufen die Pläne einfach durch wie eingestellt. Sobald alle Personen das Haus verlassen, werden in meinem Fall die Heizpläne einfach durch die integrierte Funktion der Ausnahmen auf Abwesend gestellt und dadurch ja effektiv deaktiviert.

Wer es etwas umfangreicher braucht, könnte sich auch jeweils einen zweiten Heizplan für Abwesenheit erstellen und diesen dann entsprechend wechseln lassen. Und wer es völlig perfekt machen will kann auch für jede Person eigene Pläne bauen, die dann je nach Anwesenheit (de)aktiviert werden.

Vllt reicht dieser Lösungsansatz ja dem ein oder anderen, der sich nicht mit komplexeren Wegen, wie oben beschrieben, auskennt oder beschäftigen möchte.

2 Like

Aus aktuellem Anlass hier eine Fehlerkorrektur. Um das Datum des nächsten Tages im korrekten Format zu erhalten:

$morgen=date("d.m.Y", (strtotime(" + 1 day")));
1 Like