Schulferien

Hallo.

Ist nichts aufwendiges aber nützlich. In Abhängigkeit der Schulferien/Feiertage setze ich in meinem System für die Kinder- und das Schlafzimmer einen Ferienmodus der die Rolläden erst später hoch fährt, den Wecker abschaltet usw.

Bei den Feiertagen hatte ich über das Astroskript bereits eine Automatik implementiert, bei den Schulferien erledigt dies nun dieses kleine Skript welches einmal täglich nachts aufgerufen wird:


<?

/*
Dieses Skript ermittelt über die Webseite von www.schulferien.org ob aktuell Ferien sind.
Die Anpassung für die einzelnen Bundesländer ist denkbar einfach. Einfach unter http://www.schulferien.org/iCal/
den passenden Kalender suchen und den Link kopieren. Die Anpassung der Jahreszahl bitte beachten, diese
passt sich automatisch an und muss im Link entsprechend entfernt werden.
*/

$jahr = date("Y")-1;
$link = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_".$jahr.".ics";
$meldungvj = file($link);
$jahr = date("Y");
$link = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_".$jahr.".ics";
$meldungakt = file($link);
$meldung = array_merge($meldungvj, $meldungakt);
$ferien = "Keine Ferien";
$anzahl = (count($meldung)-1);

for ($count = 0; $count < $anzahl; $count++)
{
	if (strstr($meldung[$count], "SUMMARY:")) {
	   $name  = trim(substr($meldung[$count],8));
	   $start = trim(substr($meldung[$count+1],19));
	   $ende  = trim(substr($meldung[$count+2],17));
		$jetzt = trim(date("Ymd"));
		if ($jetzt >= $start and $jetzt <= $ende or $jetzt == $ende)
		{
		   $ferien = $name;
		}
   }
}

if ($ferien == "Keine Ferien")  // Flag für Ferienmodus setzten
{
	SetValueBoolean(12345, false);
}
else
{
	SetValueBoolean(12345, true);
}

?>

Damit entfällt die lästige manuelle Umstellung nun komplett.

Hallo Kronos,

ich fand das eine gute Idee für das Webfront.
Leider scheint das Script so nicht mehr zu funktionieren.

Könntest Du dazu eine Aktualisierung online stellen?

Danke und Gruß
Christian

Hallo Christian.

Was funktioniert denn nicht?

Hallo Kronos,

sorry, ich war nur zu blöd, und habe meinen SetValue an die falsche Stelle geschrieben.
Es geht natürlich alles korrekt.

Gruß
Christian

So unwahrscheinlich eine kurzfristige (!) Änderung an der Website einer Behörde auch sein mag :wink: - hätte ja sein können, dass die da etwas geändert haben.

Hallo,
ich versuche das Script aus #1 zu benutzen, aber es funktioniert irgendwie nicht. Ich habe „SetValueBoolean“ durch
„ModBus_WriteCoil“ ersetzt und die ObjektID angepasst um auf meine WAGO zu schreiben. Es geht aber leider nicht.
Wenn ich in Zeile 32 (false) und 36 (true) tausche, schreibt er mir ein true in die WAGO.
Bei uns in Sachsen-Anhalt sind aber heute Ferien, also sollte ohne false und tru zu tauschen ein true in der WAGO stehen.
Ich habe den Eindruck das die Auswertung von http://www.schulferien.org
sich geändert hat.

Kann es jetzt nicht ausprobieren - erst heute abend wenn ich zu hause bin.

Bau doch am Ende ein

echo $ferien; 

ein. Dann siehst Du ja welches Ergebnis das Skript von der Webseite zurück gibt oder ob Deine Modbus-Befehle den Fehler beinhalten.

Bei mir hat es jetzt in den Weihnachtsferien aber funktioniert.

Hallo kronos,
der echo Befehl sagt mir „keine Ferien“. Ansonsten erhalte ich keine Fehlermeldungen.
Hast Du einen Timer laufen, oder wie oft wird die Seite Schulferien.org abgefragt?
Ich habe auf 1x täglich 00:10 Uhr gestellt.
Ich habe mal die *.ics Datei angehangen, ich glaube da stehen für jetzt keine Ferien drinnen, weil diese schon im Dezember 2015 angefangen haben.Ferien_Sachsen_Anhalt_2016.ics.txt (2.04 KB)
MfG

Ich schaue es mir heute abend an.

Kleine Änderung am Skript in Post #1. Sollte so jetzt wieder funktionieren.

Die Datenquelle scheint ab diesem Jahr der Ansicht zu sein, dass die Weihnachtferien 2015-2016 nur noch im Kalender von 2015 aufzutauchen haben. Damit sind sie in 2016 nicht mehr auf dem Radar. Also lese ich jetzt zwei Jahrgänge aus - damit sind Sie wieder mit drin.

Hast Du einen Timer laufen, oder wie oft wird die Seite Schulferien.org abgefragt?

Ich frage die Seite einmal täglich um 2 Uhr nachts ab.

Funktionierte bei mir übrigens ungemerkt der Änderung tadellos (da in THR schon am 4.1. Schulanfang war)… hatte mir dadurch einige Handarbeit, durch selbst Termine eintragen, gespart.
Danke dir dafür nochmals nachträglich für die geniale Script-Idee auf die ich erst viel später aufmerksam wurde. :cool:

Und danke an Kronos für den Fix.
Er ist auch eben schon im IPS4-Modul gelandet :smiley:

Michael

Sollte die Zeile:

$jetzt = date(„Ymd“)."
";

nicht besser
$jetzt = date(„Ymd“);
lauten?

Bei mir wurden heute keine Ferien (in Bayern) festgestellt.

Gruß Klaus

Wo Du recht hast hast Du recht. Fehler im Gutenberg-Skripter (Copy & Paste) meinerseits - Sorry. :rolleyes:

… das Zusammenfügen der Kalender, letztes und dieses Jahr, scheint nicht zu funktionieren.
Ich hab’s mal so gelöst:

$jahr = date(„Y“)-1;
$link = „http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_".$jahr.".ics“;
$meldungvj = file($link);
$jahr = date(„Y“);
$link = „http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_".$jahr.".ics“;
$meldungakt = file($link);

$meldung = array_merge($meldungvj, $meldungakt);

Gruss Klaus

Hallo,
also soweit geht das Script ja nun, nur das es falsche Ferien anzeigt. Siehe Anhang1.
Wenn ich -1 in „$anzahl = (count($meldung)-1)“ in Zeile 18 ändere auf -59 dann stimmt alles.
Wenn -1 dort steht sagt mir „echo“ „Weihnachtsferien 2016“
Die Server Zeit und Datum ist aktuell, habe ich überprüft.

Könnte mir jemand die zusammenhänge erklären?


$jahr = date("Y")-1;
$link = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Sachsen_Anhalt_".$jahr.".ics";
$meldungvj = file($link);
$jahr = date("Y");
$link = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Sachsen_Anhalt_".$jahr.".ics";
$meldungakt = file($link);
$meldung = array_merge($meldungvj, $meldungakt);
$ferien = "Keine Ferien";
$anzahl = (count($meldung)-1);

for ($count = 0; $count < $anzahl; $count++)
{
    if (strstr($meldung[$count], "SUMMARY:")) {
       $name  = trim(substr($meldung[$count],8));
       $start = trim(substr($meldung[$count+1],19));
       $ende  = trim(substr($meldung[$count+2],17));
        $jetzt = (date("Ymd"));
        if ($jetzt >= $start and $jetzt <= $ende or $jetzt == $ende);
        {
           $ferien = $name;
        }
   }
}

if ($ferien == "Keine Ferien")  // Flag für Ferienmodus setzten
{
    ModBus_WriteCoil(49683 /*[Feiertage Ferien\Ferien]*/, false);
}
else
{
    ModBus_WriteCoil(49683 /*[Feiertage Ferien\Ferien]*/, true);
}
echo $ferien,$jetzt;
echo $start;
echo $ende;
?>

Anhang1.txt (1.06 KB)

In Deinem Skript hast Du in der Zeile

if ($jetzt >= $start and $jetzt <= $ende or $jetzt == $ende);

am Schluss das Zeichen „;“ (Strichpunkt, Semikolon) - da gehört keins hin!

Richtig wäre:

if ($jetzt >= $start and $jetzt <= $ende or $jetzt == $ende)

Auch ist die letzte or Bedingung überflüssig. Sie ist bereits in „<=“ enthalten.
Statt ‚and‘ und ‚or‘ sollte auch besser ‚&&‘ und ‚||‘ verwendet werden.

Gruß

Burkhard

[OFF TOPIC]
Warum?
[/OFF TOPIC]

Wegen der Operatoren-Rangfolge.
Aber die kannst du mit ein paar Klammern aushebeln :slight_smile:
Fangfrage… was ergibt $t und was $f ?

$t = true and false;
$f = true && false;
$f = (true and false);
var_dump($t);
var_dump($f);

Michael