Location Control richtig benutzen

Danke lueralba,
Vielen dank für das script.
Du hast es genau richtig für mich erklärt.

Ich werde es ausprobieren und poste hier das Ergebnis.

:loveips:

So nach dem ich jetzt noch nicht der große PHP Freak bin, habe ich mal versucht das alte Astroscript umzuschreiben das es auch auf dem Pi2 läuft.

Wer möchte kann es gerne mal testen. Bis jetzt habe ich noch keinen Fehler bei mir feststellen können aber ich übernehme natürlich keine Garantie das das wirklich bei jedem Funktioniert.

<?php
    
    /***** Konfiguration *****/

    // Geokoordinaten des Wohnortes

 $latitude = 48.09;    // Breitengrad
 $longitude = 10.86;   // 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" => 37825, "offset" => 60, "type" => "sunrise");
    $scripts[] = array("id" => 37825, "offset" => 30, "type" => "sunset");
  //  $scripts[] = array("id" => 18658, "offset" => -30, "type" => "sunrise");
  //  $scripts[] = array("id" => 32814, "offset" => 30, "type" => "sunset");
  //  $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 Morgendaemmerung", 3, "~String"), date("H:i:s", $civilTwilightStart));
    SetValueString(CreateVariableByName($_IPS['SELF'], "zivile Abenddaemmerung", 3, "~String"), date("H:i:s", $civilTwilightEnd));
    SetValueString(CreateVariableByName($_IPS['SELF'], "nautische Morgendaemmerung", 3, "~String"), date("H:i:s", $nauticTwilightStart));
    SetValueString(CreateVariableByName($_IPS['SELF'], "nautische Abenddaemmerung", 3, "~String"), date("H:i:s", $nauticTwilightEnd));
    SetValueString(CreateVariableByName($_IPS['SELF'], "astronomische Morgendaemmerung", 3, "~String"), date("H:i:s", $astronomicTwilightStart));
    SetValueString(CreateVariableByName($_IPS['SELF'], "astronomische Abenddaemmerung", 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);

//--------- Timestamp zerlegen ---------

	     $tsStunde  = date("H", $ts);

        $tsMinute  = date("i", $ts);

        $tsSekunde = date("s", $ts);

//--------- Timestamp zerlegen  ende ---------



IPS_SetEventCyclicTimeFrom($eid, intval($tsStunde), intval($tsMinute), intval($tsSekunde)); //Timestamp in Timer schreiben


		 return $eid;
    }
	 ?>

Wäre nett wenn ihr mir Rückmeldung geben könntet ob es bei euch funktioniert oder nicht. Würde mir beim erlernen von PHP sehr helfen.

Vielen Dank schon mal und viel Spaß beim ausprobieren !!

Gruß
mirank

Hallo mirank,
danke für deine Arbeit.
Ich habe das script mal auf einem raspi probiert.
Es bringt bei mir Fehler beim 1. Durchlauf wenn die Varablen erstellt werden müssen, an den Scrpts.

Danach scheint es zu funktionieren.
Ich muss es aber genauer untersuchen, war auf die Schnelle.
Kann etwas dauern, melde mich die Tage.
Vorerst besten Danke
Gruß
duk64

Ich habe das ganze mal probiert.
was ich im obgen Post geschrieben habe stimmt.
Nach dem 1. anlegen der Variable AstroTimer vom script aus zeigt der raspi einen Fehler.
Bei allen nachfolgenden Aufrufen des scriptes wird die Zeit in den Variablen richtig gesetzt.
So weit so gut.

Nun habe ich folgendes Problem:
wenn ich mich über ssh mit dem Raspi verbinde bekomme ich bei Eingabe von
date -R
> Sat, 21 Mar 2015 17:48:00 +0000

Die richtige Zeit wäre 18:48:00
Wenn ich die Rollade1 mit dem Location Control schalten möchte steht in der Variable 18:48:07
Über das Astroscript 18:51:44 (incl. offset)


Die Rollade ist um 18:48:07 herunter gefahren worden, so wie in der Variable vom Location Control.

Rollade 2, wo nur der AstroTimer angebunden ist, fährt die Rollade nicht herunter

Bin gespannt wann sie herunter fährt?!?

Jep pünktlich um 19:49


wie kann das?
was ist da falsch?

Ich kapiere das nicht!

Hallo duk64.

Hattest Du einen RasPi?

Dann stell doch mal deine Localtime ein:

sudo raspi-config
Menüpunkt: „Internationalisation Options“
Menüpunkt: „Timezone“ (dauert einen Moment…)
Geographic area: --> Europe (Enter)
Timezone: --> Berlin (Enter)

Dann folgt die Anzeige:

Current default time zone: ‚Europe/Berlin‘
Local time is now: Sat Mar 21 21:34:25 CET 2015.
Universal Time is now: Sat Mar 21 20:34:25 UTC 2015.

Danach mit TAB auf <Finish> und Enter.

Fettich.
Probiers mal damit.
Dann hast Du erstmal eine Basis zum Spielen.

Solltest aber vielleicht noch 24h abwarten bis sich alle Zeiten (Timer, Berechnungen, etc.) „normalisiert“ haben.

Gruß
lueralba

Hallo lueralba,
ja ich habe einen raspi.

Ich glaube das hatte ich noch nicht gemacht bei der Installation von raspian.
Ich habe das jetzt mal nachgeholt und werde morgen berichten.
Das astro Script hab ich mal von Hand ausgeführt und rechts bei der Ausführzeit erschien schonmal die aktuelle Uhrzeit.

Bleiben die Einstellungen denn nach einem Kaltstart erhalten oder muss ich da immer eine neue Uhrzeit stellen?

Gruß
duk64

Ist bis jetzt Rebootsicher.

change_timezone: Your Raspberry Pi detects the time from the Internet when you switch it on, but you’ll need to tell it what time zone you’re in when you first set it up.

Hallo lueralba,
dann sollte das passen.
heute Morgen gin gen die Rolladen schon mal nicht richtig hoch.
Statt um 08:17 um 09:17

Noch mal warten ob sich etwas ändert!

Hallo duk64,

bei mir läuft das neue/alte Astroscript ganz gut. Bis auf den von dir beschriebenen Fehler wenn das Script das erste mal ausgeführt wird.

Hallo mirank,
hast du denn auch das Zeit-Problem?
Vielleicht liegt es ja daran, dass ich mein Projekt von Windows übernommen habe.
Ich werde gleich mal ein neues Ereignis eintellen und dann sehen wir weiter.

Ich denke nicht, dass das mit der Zeit an dem Astro-script liegt. Dieses laüft gut.

Gruß
du64

Also bei mir stimmen die Zeiten. Hab auch die Zeitzone nochmal vorsichtshalber geprüft. War aber richtig eingestellt. Könnte vielleicht wirklich an deinem Import vom Windows -System liegen. Ich bin gespannt.

Hallo ,

ich benutze dieses Script und bin sehr zufrieden, Offset ist da kein Thema .

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

Das ist auch die Basis für das Script was ich gepostet hab. Da das original auf dem PI2 nicht läuft habe ich hier ein bisschen was umgeschrieben.

Hallo zusammen,
ich möchte hier das Ergebnis meiner Tests mitteilen.

Meine Vermutung, dass die Schaltzeiten nicht korrekt waren, weil ich das ganze Projekt von Windows auf raspi portiert habe, hat sich bestätigt.
Jedes Ereignis, welches ich in der Konsole Raspi neu gemacht habe wurde einwandfrei ausgeführt.
Ich habe jetzt alle Ereignisse, die mit Tag und Uhrzeit zusammen hängen neu gemacht.

Jetzt rennt alles perfekt :slight_smile:

Warum das so war kann ich leider nicht sagen.

Ich werde das Astro-Script einsetzen bis später mal die Änderungen in dem Location Control fertig sind.

Da mein Windows-PC den Geist aufgibt, fahre ich nun schon seit einer Woche mit dem Raspi

OHNE größere PROBLEME stabil.

Danke an alle die mir geholfen haben. :loveips:

Gruß
duk64

Hallo duke64,
Vielen Dank für deinen Bericht. Freut macht das das Script jetzt auch bei dir läuft. Ich werde vermutlich im Laufe der Woche meinen WindowsServer abschalten. Bin mal gespannt ob der kleine Raspi dann auch tut was er so soll.
BG
mirank

Moin ,
Das sich die über Timer erstellten Variablen vermehren habt ihr auch ? Und wie behoben ?

@Frauenhofer

Was genau meinst du?
Hast du das auf Linux oder WINOWS laufen?

Auf raspi , da verdoppeln sich nach jeder Ausführung Variablen.

Dieses Problem habe ich nicht mehr!

Hast du das Script hier oben benutzt?
Das ist etwas angepasst worden von mirank.

Solange du die Reihenfolge der arrays nicht änderst, kommen keine neuen Variablen hinzu.
Als Beispiel:

    
Zeile 1:  $scripts[] = array("id" => 56353, "offset" => 0, "type" => "sunset"); // Rollade Küche ab
Zeile 2:  $scripts[] = array("id" => 56353, "offset" => 1, "type" => "sunset"); // Rollade Küche ab

Zeile 3:  $scripts[] = array("id" => 26419, "offset" => 2, "type" => "sunset"); // Rollade Eßzimmer ab
Zeile 4:  $scripts[] = array("id" => 26419, "offset" => 3, "type" => "sunset"); // Rollade Eßzimmer ab

Zeile 5:  $scripts[] = array("id" => 37797, "offset" => 4, "type" => "sunset"); // Rollade Wohnzimmer rechts ab
Zeile 6:  $scripts[] = array("id" => 37797, "offset" => 5, "type" => "sunset"); // Rollade Wohnzimmer rechts ab

Bei ID 26419 stehen dann 2 Variablen, AstroTimer #2 und AstroTimer #3
Würdest du zwischen Zeile 2 und 3 eine weitere hinzu fügen, dann stehen bei der ID 26419 insgesammt drei Variablen, nämlich AstroTimer #2, AstroTimer #3, AstroTimer #4.

Alle darunter stehenden würden auch jeweils eine Variable mehr bekommen.

Das bedeutet immer am Schluss ein neues Ereignis einfügen.

So habe ich das für mich gemacht.

Gruß
duk64

Änderst du die Reihenfolge von zum Beispiel AstroTimer #1, wird aus der Variablen AstroTimer #1

Hallo,

habt ihr auf dem Pi auch das Problem, dass die Astronomische Abenddämmerung/Morgendämmerung nicht mehr korrekt berechnet wird?