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

Kein Problem … habe einen Screenshot dazu gemacht, damit evtl. verständlicher wird, was das Script macht.

Das Script „GetTimes“ ist das Astro-Script hier aus dem Forum. Bei jeder Aktion wird das Script „SetVariable“ getriggert - wie im Bild zu sehen ist.

Hier das Script „SetVariable“:

<?
  /*
  astronomische Morgendämmerung = astronomicTwilightStart
  nautische Morgendämmerung = nauticTwilightStart
  zivile Morgendämmerung = civilTwilightStart
  Sonnenaufgang = sunrise
  Sonnenuntergang = sunset
  nautische Abenddämmerung = nauticTwilightEnd
  astronomische Abenddämmerung = astronomicTwilightEnd
  zivile Abenddämmerung = civilTwilightEnd
  */

  $Trigger = $IPS_EVENT;
  $Variablen = IPS_GetChildrenIDs(41528 /*[Allgemein\Tag / Nacht\Variablen]*/ );

  // Variable herausfinden, welche auf TRUE gesetzt werden soll
  switch($Trigger){
	 case 48038  :
      $VariableToChange = 21529 /*[Allgemein\Tag / Nacht\Variablen\astronomicTwilightStart]*/  ;
	 break;

	 case 15597 :
	   $VariableToChange = 53637 /*[Allgemein\Tag / Nacht\Variablen
auticTwilightStart]*/  ;
	 break;

	 case 38308 :
		$VariableToChange = 24702 /*[Allgemein\Tag / Nacht\Variablen\civilTwilightStart]*/  ;
	 break;

	 case 43471 ;
      $VariableToChange = 43513 /*[Allgemein\Tag / Nacht\Variablen\sunrise]*/ ;
    break;

	 case 29801 ;
      $VariableToChange = 54846 /*[Allgemein\Tag / Nacht\Variablen\sunset]*/ ;
    break;

	 case 42830 ;
      $VariableToChange = 15606 /*[Allgemein\Tag / Nacht\Variablen
auticTwilightEnd]*/  ;
    break;
    
    case 29520 :
      $VariableToChange = 48277 /*[Allgemein\Tag / Nacht\Variablen\civilTwilightEnd]*/  ;
    break;

	 case 41074  :
      $VariableToChange = 50504 /*[Allgemein\Tag / Nacht\Variablen\astronomicTwilightEnd]*/ ;
    break;
  }

  // die zum triggernden Trigger gehörende Variable wird auf TRUE gesetzt, alle anderen auf FALSE
  foreach ($Variablen as $ScriptID => $value){
	 if ($Variablen[$ScriptID] != $VariableToChange){
    SetValueBoolean($Variablen[$ScriptID], false);
	 }
	 else{
      SetValueBoolean($Variablen[$ScriptID], true);
	 }
  }

  // Variable "dunkel" auf TRUE oder FALSE setzen
  $civilTwilightEnd = GetValueBoolean(48277 /*[Allgemein\Tag / Nacht\Variablen\civilTwilightEnd]*/ );
  $nauticTwilightEnd = GetValueBoolean(15606 /*[Allgemein\Tag / Nacht\Variablen
auticTwilightEnd]*/ );
  $astronomicTwilightEnd = GetValueBoolean(50504 /*[Allgemein\Tag / Nacht\Variablen\astronomicTwilightEnd]*/ );
  $nauticTwilightStart = GetValueBoolean(53637 /*[Allgemein\Tag / Nacht\Variablen
auticTwilightStart]*/ );
  $astronomicTwilightStart = GetValueBoolean(21529 /*[Allgemein\Tag / Nacht\Variablen\astronomicTwilightStart]*/ );
  $civilTwilightStart = GetValueBoolean(24702 /*[Allgemein\Tag / Nacht\Variablen\civilTwilightStart]*/ );
  
  if ($civilTwilightEnd || $nauticTwilightEnd || $astronomicTwilightEnd || $nauticTwilightStart || $astronomicTwilightStart || $civilTwilightStart){
	 SetValueBoolean (48538 /*[Allgemein\Tag / Nacht\Variablen Übersicht\dunkel]*/ , TRUE);
  }
  else{
    SetValueBoolean (48538 /*[Allgemein\Tag / Nacht\Variablen Übersicht\dunkel]*/ , FALSE);
  }
  
?>

Wie man sieht, ist immer eine der Variablen „TRUE“. Durch Abfragen der einzelnen Variablen finde ich z.B. heraus, ob gerade „zivile Abenddämmerung“ oder „Sonnenaufgang“ etc. aktiv ist. Gleichzeitig setzt das Script die Variable „dunkel“ auf TRUE. In Scripten, wo ich wissen möchte, ob es dunkel ist, frage ich diese Variable einfach ab. Klappt hier ganz gut … Hoffe, es ist einigermaßen verständlich.

Gruß,
Christoph

Kann mich jemand bezüglich Timer-Verhalten belehren? Nehmen wir Folgendes an:

[ul]
[li]ein Timer wird auf 10 Minuten gesetzt mittels IPS_SetScriptTimer($IPS_SELF, 600)
[/li][li]nach 5 Minuten kommt wieder das gleiche Befehl ( IPS_SetScriptTimer($IPS_SELF, 600):wink:
[/li][/ul]

Was passiert? Wird der Timer wieder auf 10 Minuten zurückgesetzt? Oder wird der 2. Befehl ignoriert? Oder wird die Zeit auf 15 (10+5) Minuten gesetzt?

danke
AAG

das kann man ja ausprobieren.
Den Timer mit IPS_SetScriptTimer($IPS_SELF, 600) ansteuern heißt ja noch lange nicht das der Timer startet /wann der Timer startet.
Um hier ganz sicher zu gehen setze ich bei meinen Timern nicht nur die Timer-Laufzeit sondern auch den Startzeitpunkt und aktiviere den Timer anschließend:


   IPS_SetEventCyclic($EH_Timer_ID, 0, 0, 0, 0, 1, 45);
   IPS_SetEventCyclicTimeBounds($EH_Timer_ID, time(), 0);
   IPS_SetEventActive($EH_Timer_ID, true);

Warum eigentlich?

Das wäre mir neu, ich starte alle Scripttimer so und sie laufen auch seit langer Zeit korrekt ;).

Und da es nur einen Scripttimer gibt, wird er durch ein Folgekommando aktualisiert.

Lt. Service_Doku_… :eek:

Wie kann ich…?: IP-Symcon :: Automatisierungssoftware

Gruß
Bruno

ScriptTimer und Event sind meiner Meinung nach auch zwei unterschiedliche Dinge.

Vielleicht kann uns paresy dazu erleuchten :D.

ScriptTimer und Event sind meiner Meinung nach auch zwei unterschiedliche Dinge.

Richtig, sofern paresy nichts daran geändert hat. Beim Scripttimer kann ich den Namen nicht ändern, beim Event wohl. Wird beim Scripttimer der Namen geändert wird ein neuer Scripttimer mit neuer ID angelegt.

Der Scripttimer setzt sich immer wieder auf 0 bei erneutem Aufruf.

Der ScriptTimer ist im Prinzip auch ein Zyklisches Ereignis… Nur mit festem Namen und einer etwas andere Funktionsweise beim setzen.

Hier etwas genauer beschrieben: http://www.ip-symcon.de/forum/117015-post23.html

paresy

Hallo Horst,

ich habe das Script auf die 2.6 anpassen wollen $IPS_SELF durch $_IPS[‘SELF’] ersetzt. Danach läuft das Script nicht mehr.
Kannst du mir bitte erklären was ich falsch mache?

Andreas

Hi Lukky,

Horst hat aktuell etwas höhere Delays, deswegen melde ich mich dazu.
Hier meine „migrierte“ version, ich denke, nicht allzuviel drin rumgepfuscht zu haben :smiley:
evtl. noch die Koordinaten anpassen

<?php
    /*****
    *Quelle: http://www.ip-symcon.de/forum/f53/automatischer-skriptstart-astronomischen-ereignissen-sonnenaufgang-daemmerung-8059/index5.html
    *
    * 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
    $longitude = getValueFloat(49362 /*[Astro, Geo, Sommerzeit\Standortdaten\Longitude]*/ );    // Breitengrad
    $latitude = getValueFloat(15067 /*[Astro, Geo, Sommerzeit\Standortdaten\Latitude]*/ );    // 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" => 26786, "offset" => 0, "type" => "civilTwilightStart");
    $scripts[] = array("id" => 41239, "offset" => 0, "type" => "sunset");
    $scripts[] = array("id" => 36995, "offset" => 60, "type" => "sunset");
     $scripts[] = array("id" => 56286, "offset" => 0, "type" => "sunrise");
     $scripts[] = array("id" => 40337, "offset" => -60, "type" => "sunrise");
    $scripts[] = array("id" => 35883, "offset" => -15, "type" => "civilTwilightEnd");
    $scripts[] = array("id" => 43438, "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 Raketenschnecke,

danke für die Rückantwort.

//global $_IPS['SELF'];

Du hast die Zeilen auskommentiert - das wird es sein. :smiley: Werde es heute Abend ausprobieren.

Andreas

Hallo,
nur ganz kurz eine Frage in die Runde.
Habe bei mir dieses Skript laufen…


 <?php
    /*****
    *Quelle: http://www.ip-symcon.de/forum/f53/automatischer-skriptstart-astronomischen-ereignissen-sonnenaufgang-daemmerung-8059/index5.html
    *
    * 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
    $longitude = 50.88;    // Breitengrad
    $latitude =  	12.94;    // 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" => 34766, "offset" => 0, "type" => "astronomicTwilightEnd");
    

    /***** 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;
    }
?>

Leider stimmen die Zeiten nicht wirklich, die das Skript ausspuckt.

Sonnenuntergang: 16.49 Uhr
Zivile Abenddämmerung: 17.11 Uhr
astronomische Abenddämmerung: 18.01 Uhr

Die Geo daten sind laut Google für meinen Wohnort „Chemnitz“ korrekt.

Wo liegt denn hier der Fehler?

$scripts[] = array("id" => 34766, "offset" => 0, "type" => "astronomicTwilightEnd"); 

id sollte durch die id des eigenen scripts ersetzt werden

nur so zur Info.

Geodaten Weltweit bekommt man hier.

http://geoco.org/deutschland-de.html

Aber das ändert ja trotzdem nichts an den komischen Zeiten oder?

@ wibo050447:

Diese Seite spuckt mir die gleichen Daten aus.

„Chemnitz 50.83° (50° 50’) 12.92° (12° 55’)“

Also muss der Fehler wo anders liegen.

Oder sind die Zeiten etwa normal? Kann mir das nicht vorstellen. Wird doch nicht so zeitig dunkel.

… vertausche doch mal die beiden Werte Longitude und Latitude …:slight_smile:

Also habe die mal vertauscht.

Naja jetzt ist zumindestens die zivile Abenddämmerung auf 20.30 Uhr und der Sonnenaufgang auf 6.21 Uhr.

Damit kann ich jetzt zumindestens wieder meine Skripte versorgen.

Was zeigt bei euch die astronomische Abenddämmerung? Bei mir steht da 22.01 Uhr

Bei mir etwa eine 1/2 Stunde später. Sollte passen.

Bzgl. Begriffserklärung siehe z.B. Info hier:

Falls nochmal jemand das Problem hat … die Werte müssen natürlich richtig in das Skript übernommen werden … :rolleyes:

Die Suche bei Google nach „Chemnitz latitude longitude“ ergibt z.B. Latitude 50.8278 und Longitude 12.92 :eek: