Automatischer Skriptstart nach astronomischen Ereignissen (Sonnenaufgang, Dämmerung)

Hier ein Skript, das andere Skripte nach verschiedenen astronomischen Ereignissen startet. Zusätzlich hat man die Zeitpunkte der Ereignisse in Variablen.

<?php
    /*****
    *
    * Automatischer Skriptstart nach astronomischen Ereignissen
    *
    * Dieses Skript sorgt für die Ausführung anderer Skripte nach den
    * Zeitpunkten astronomischer Ereignisse.
    * Im Konfigurationsbereich sind die Geokoordinaten und die zu
    * startenden Skripte anzupassen. Das Skript ist nach der Konfiguration
    * einfach auszuführen, alle Timer werden automatisch erstellt. Ein
    * automatischer Aufruf des Skripts erfolgt nach dem ersten Ausführen
    * immer um Mitternacht.
    *
    * Nach dem nachträglichen Hinzugefügen neuer Skripte reicht das erneute
    * Ausführen dieses Skriptes zu Einrichtung der Timer.
    *
    ******/

    /***** Konfiguration *****/

    // Geokoordinaten des Wohnortes
    $latitude = 53.92;    // Breitengrad
    $longitude = 10.73;    // Längengrad

    $scripts = array();
    /*
        Zu startende Skripte. Es sind beliebig viele Einträge möglich. Dazu einfach
        einen neue Zeile nach vorgegebenem Muster anfügen.

        "id":     Skript-ID,
        "offset": Skriptstart vor/nach dem astronomischen Ereignis in Minuten
        "type":   Typ des astronomischen Ereignisses
            "astronomicTwilightStart": astronomische Morgendämmerung
            "nauticTwilightStart": nautische Morgendämmerung
            "civilTwilightStart": zivile Morgendämmerung
            "sunrise": Sonnenaufgang
            "sunset": Sonnenuntergang
            "civilTwilightEnd": zivile Abenddämmerung
            "nauticTwilightEnd": nautische Abenddämmerung
            "astronomicTwilightEnd": astronomische Abenddämmerung
    */
    $scripts[] = array("id" => 28697, "offset" => 0, "type" => "civilTwilightStart");
    $scripts[] = array("id" => 28697, "offset" => 0, "type" => "sunset");
    $scripts[] = array("id" => 34567, "offset" => 30, "type" => "sunset");
    $scripts[] = array("id" => 45678, "offset" => -15, "type" => "civilTwilightEnd");
    $scripts[] = array("id" => 56789, "offset" => 60, "type" => "nauticTwilightStart");


    /***** Programmcode (ab hier nichts mehr verändern) *****/

    $timestamp = time();
    $sunrise = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 90+50/60, date("O")/100);
    $sunset = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 90+50/60, date("O")/100);
    $civilTwilightStart = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 96, date("O")/100);
    $civilTwilightEnd = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 96, date("O")/100);
    $nauticTwilightStart = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 102, date("O")/100);
    $nauticTwilightEnd = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 102, date("O")/100);
    $astronomicTwilightStart = date_sunrise($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 108, date("O")/100);
    $astronomicTwilightEnd = date_sunset($timestamp, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, 108, date("O")/100);

    SetValueString(CreateVariableByName($IPS_SELF, "Sonnenaufgang", 3, "~String"), date("H:i:s", $sunrise));
    SetValueString(CreateVariableByName($IPS_SELF, "Sonnenuntergang", 3, "~String"), date("H:i:s", $sunset));
    SetValueString(CreateVariableByName($IPS_SELF, "zivile Morgendämmerung", 3, "~String"), date("H:i:s", $civilTwilightStart));
    SetValueString(CreateVariableByName($IPS_SELF, "zivile Abenddämmerung", 3, "~String"), date("H:i:s", $civilTwilightEnd));
    SetValueString(CreateVariableByName($IPS_SELF, "nautische Morgendämmerung", 3, "~String"), date("H:i:s", $nauticTwilightStart));
    SetValueString(CreateVariableByName($IPS_SELF, "nautische Abenddämmerung", 3, "~String"), date("H:i:s", $nauticTwilightEnd));
    SetValueString(CreateVariableByName($IPS_SELF, "astronomische Morgendämmerung", 3, "~String"), date("H:i:s", $astronomicTwilightStart));
    SetValueString(CreateVariableByName($IPS_SELF, "astronomische Abenddämmerung", 3, "~String"), date("H:i:s", $astronomicTwilightEnd));

    foreach ($scripts as $num => $script)
    {
        $ts = $script['offset']*60;

        switch ($script['type'])
        {
            case "astronomicTwilightStart": $ts += $astronomicTwilightStart; break;
            case "nauticTwilightStart": $ts += $nauticTwilightStart; break;
            case "civilTwilightStart": $ts += $civilTwilightStart; break;
            case "sunrise": $ts += $sunrise; break;
            case "sunset": $ts += $sunset; break;
            case "civilTwilightEnd": $ts += $civilTwilightEnd; break;
            case "nauticTwilightEnd": $ts += $nauticTwilightEnd; break;
            case "astronomicTwilightEnd": $ts += $astronomicTwilightEnd; break;
            default: die("Ungültiger Wert: ".$script['type']);
        }
        
        if (IPS_ScriptExists($script['id']))
        {
            SetTimerByName($script['id'], "AstroTimer #".$num, $ts);
        }
        else
        {
            die("Skript #".$script['id']." existiert nicht!
");
        }
    }

    SetTimerByName($IPS_SELF, "Timer", mktime(0, 1, 0, date("m"), date("d") + 1, date("Y")));

    function CreateVariableByName($id, $name, $type, $profile = "")
    {
        global $IPS_SELF;
        $vid = @IPS_GetVariableIDByName($name, $id);
        if($vid === false)
        {
            $vid = IPS_CreateVariable($type);
            IPS_SetParent($vid, $id);
            IPS_SetName($vid, $name);
            IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
            if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
        }
        return $vid;
    }

    function SetTimerByName($id, $name, $ts)
    {
        global $IPS_SELF;
        $eid = @IPS_GetEventIDByName($name, $id);
        if($eid === false)
        {
            $eid = IPS_CreateEvent(1);
            IPS_SetParent($eid, $id);
            IPS_SetName($eid, $name);
            IPS_SetInfo($eid, "this timer was created by script #$IPS_SELF");
            IPS_SetEventScript($eid, $id);
            IPS_SetEventActive($eid, true);
        }
        IPS_SetEventCyclic($eid, 0, 0, 0, 0, 0, 0);
        IPS_SetEventCyclicTimeBounds($eid, $ts, 0);
        return $eid;
    }
?>

Hallo Horst,

tolles Script ABER,

das Script läuft z.b. heute(08.09.) um 00:00 Uhr und setzte die Ereignisse. Unter Ereigniss Informationen steht aber z.b. „nächster Aufruf 09.09.2009 19:45:14“ Also Morgen. Wenn das Script neute Nacht wieder läuft, habe ich wieder einen Tag „Offset“ und die im Array eingefügten Scripte werden nie gestartet. Deswegen habe ich den Scripaufruf manuell auf 23:55 gestellt, dann klapp es.

Gruß

Oh, ist mir gar nicht aufgefallen. paresy hat es korrigiert :).

Hallo Horst,
interessantes Script :slight_smile:

„offset“: Skriptstart vor/nach dem astronomischen Ereignis in Minuten

Die Offsetangabe ist jedoch z.Zt. in Sekunden.
Musst sie *60 nehmen :wink:

Habe ich im Skript korrigiert. Da fehlt ein *60

$ts = $script[‚offset‘]*60; <–

paresy

Servus. Das Skript ist genau das was ich suche. Allerdings verstehe ich noch nicht genau wie es arbeitet.
Wann wird denn dieses Skript ausgeführt? Ich habe es jetzt so wie beschrieben eingefügt in IPS. Bei dem Skript, welches ich bei Sonnenuntergang ausführen will wurde jetzt ein zeitliches Event hinzugefügt mit dem namen

AstroTimer #0 (Ereignis: täglich 18.57:15)

Wie kann ich das jetzt verstehen?

Das Skript macht nichts anderes als neue Ereignisse zu erstellen, die immer kurz nach Mitternacht aktualisiert werden. Du wirst also in deinem AstroTimer jeden Tag einen neuen Zeitwert drin stehen haben, der durch dieses Skript berechnet und eingefügt wurde.

paresy

Ah, super. Danke. Echt super!!!

Hallo,

wollte das Script mal testen, bei mir ist aber die Funktion IPS_SetVariableCustomProfile nicht vorhanden.

Ok, ich habe länger nichts gemacht und meine Version ist nicht die neueste. Ihr wisst ja: die Zeit…
Ab welcher Version ist die Func verfügbar?

Neues Update habe ich gerade bei Michael bestellt… :smiley:

Grüße
Fabian

Die Funktion ist seit Version 2.1 vorhanden.

Hallo zusammen,

nutze das Script um die Rollos automatisch zu fahren, Danke super sache läuft bei mir bin sehr zufrieden.

Jetzt habe ich bemerkt das nach der Winterzeitumstellung (Sonntag abend) die Rollos sehr spät heruntergefahren sind.
Habe natürlich nicht auf die Uhr geschaut, kann aber so sein das es ca. eine Stunde später war.
Bin nicht so der PHP/ Scripteschreiber/ versteher:
Die Zeit in der das Script gestartet wird ist kurz nach 24Uhr da ist noch nicht Winterzeit.
Macht es Sinn die Umstellzeit/ Startzeit-Script auf 03:05 zusetzen damit es richtig läuft?

Hat jemand das gleiche oder habe nur ich den Zeit unterschied bemerkt.

Gruß ein Anfänger
Detlef

Hallo,

ich glaube kaum, dass ein verspätetes Fahren damit begründbar ist.

Immerhin wurde die Uhr eine Stunde zurück gestellt, somit wäre wohl nur ein zu frühes Fahren durch die Zeitverschiebung zu erklären.

Wobei das Script setzt den Timer auf eine bestimmte Uhrzeit, und wenn die Systemzeit des Servers sich automtisch umstellt, passt das auch mit dem Timer.

Gruß Philipp

Naja…

Wenn vor der Umstellung berechnet wird, dann sollte doch berechent werden, das es um 19:00 drausen dunkel wird. -> das wird also als Timer gesetzt

Nach der Uhr umstellung wird nun berechnet, das es eigetnlich schon um 18:00 draussen dunkel wird aber der Timer steht noch immer auf 19 Uhr und wird erst am nächsten Tag neu berechnet … das glaub ich wird hier gemeint oder?

Philipp, Sn00py,

ja das habe ich mich auch gefragt, habe sogar eine Diagramm gezeichnet,
in dem ich die Zeiten geschrieben habe, komme aber auf keine Antwort.
Die Zeit die des späten herunterfahren war ca 40-50 min. aus der Zeit die in den Tagen vorher war, wie gesagt nicht ganz genau wahrgenommen.

Es lief jetzt eine ganze Zeit ohne problem, ich verbinde es halt mit der Winterzeitumstellung.
Wenn Ihr das Script nicht nutzt oder keine Umstellprobleme habt muss ich ein Auge auf die Rollos (Schaltzeiten) werfen und weiterhin beobachten, Danke…

Gruß Detlef

Damit ich im Webfront auch die Zeiten sehen kann, habe ich mir zusätzliche Variablen angelegt. Diese aktualisiere ich mit einem Script, das nach dem Astrotimerscript läuft.


<?
$scripts[] = array("scriptId" => 38183, "timeVariableId" => 10710, "timerId" => 2); //SchlaZi Rollo abends runter
$scripts[] = array("scriptId" => 22212, "timeVariableId" => 47238, "timerId" => 3); //Paul Rollo abends runter
$scripts[] = array("scriptId" => 45983, "timeVariableId" => 56440, "timerId" => 4); //Wohnzimmer Rollos runter
$scripts[] = array("scriptId" => 51987, "timeVariableId" => 43508, "timerId" => 5); //EssZi Rollo abends runter
$scripts[] = array("scriptId" => 47259, "timeVariableId" => 37753, "timerId" => 6); //Wohnzimmer Rollos hoch
$scripts[] = array("scriptId" => 33571, "timeVariableId" => 43307, "timerId" => 7); //EssZi Rollo morgens rauf

foreach ($scripts as $num => $script)
{
	$scriptId 			= $script['scriptId'];    				// Script id wie im Astrotimerscript
	$timeVariableId 	= $script['timeVariableId'];        // Id der Variablen mit dem Uhrzeit String zur Anzeige in Webfront
	$timerId 			= $script['timerId'];        			// Id des Astrotimers, die im Eventnamen angezeigt wird

	$scriptCheck = IPS_ScriptExists($scriptId);
	$astroTimerCheck = @IPS_GetEventIDByName("AstroTimer #" . $timerId, $scriptId);

	if ($scriptCheck == true and $astroTimerCheck != 0)
	{
		$events = IPS_GetScriptEventList($scriptId);

		foreach ($events as $num => $thisEventId)
		{
			$thisEventInfo = IPS_GetEvent($thisEventId);
			SetValue($timeVariableId, date("H:i",$thisEventInfo['NextRun']));
		}
	}

}

?>

Hallo,

ich hatte ein Skript immer beim Sonnenuntergang ausführen lassen.
Nachdem es mir zu früh war, hatte ich es auf „nauticTwilightEnd“ geändert.
Es wird aber immer noch seit Tagen beim Sonnenuntergang ausgeführt.
Ich vermute, daß das irgendwo noch ein Timer manuell zu löschen ist?
Nur wo? :confused:

Danke und Gruß,
Andreas

Bin fündig geworden. Da war beim Skript selbst noch der „alte“ Timer aktiv.

Die Sommerzeitumstellung hat nicht funktioniert. Heute gingen alle über den Astrotimer gesteuerten Ereignisse falsch. Aber es wird wohl daran liegen das die Zeiten für den Tag in der Nacht um 01:01 Uhr berechnet werden. Morgen müsste es also wieder normal gehen.

Aber dabei ist mir aufgefallen das alle Variablen mehrfach vorhanden sind. Ich würde sagen sie werden jedes mal neu erstellt wenn man IPS neu startet. Ist das bei euch auch so? Da es in meinem 7/24 Hauptsystem(V2.2#39) aufgefallen ist werde ich es erst in den nächsten Tagen kontrollieren.

PS: Ich habe gerade gesehen das Paresy im Orginalscript am 10.3.10 etwas geändert hat. Es wäre schön wenn er eine Begründung mit hinzu fügen könnte.

War nur ein Tippfehler in einer der Beispielzeilen.

Danke für den Script!

Ich nutze den Script für die Beleuchtungssteuerung meines Terrarium, passt perfekt!

Danke!!