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

kleiner aber wichtiger Erfahrungs-Tipp für die Jalousiensteuerung (Ich steuere die seit 2 Jahren nach der nautischen Dämmerung):

Legt euch Grenzwert-Variablen fest für die Zeiten, an denen morgens frühestens und abends spätestens die Jalousien auf- oder zugefahren werden. Es ist ziemlich nervig, wenn mein Lütter im Hochsommer schon kurz nach 4 an meinem Bett steht, nur weil er wach wurde, da es in seinem Zimmer hell wurde…

Ich hab mir diese Grenzwerte 2mal angelegt, einmal für Wochentag und einmal für Wochenende.

Weiterhin hat sich eine „enabled“ Variable pro Fenster bewährt, mit der man die Automatik rechtzeitig ausschalten kann, z.B. bei Krankheit oder wenn man bis in die Nacht gearbeitet hat und ausschlafen will.

… und noch einer: Temperatur:

  1. Bei mir fahren Rollos z.B. im Wohnzimmer abends nur zu wenn es kälter als 10° ist
  2. Rollos fahren morgens nur auf, wenn es wärmer als 0° ist

Hallo zusammen,

falls ihr euren Sonnenschutz nach dem Sonnenstand steuern wollt, hier ein Programm das dies ermöglicht.

<?
   // Geographische Koordinaten des Objekts  !!! müssen angepasst werden !!!

   $latitude =    47.50;    // Breitengrad
   $longitude =  19.36;    // Längengrad

	//$timestamp = mktime($hour,$minute,$second,$month,$day,$year);
	$timestamp = time();
	
	// Zerlege Datum und Uhrzeit, Umrechnung in Weltzeit
   $monat 	= intval(gmdate("n",$timestamp));
   $tag 		= intval(gmdate("j",$timestamp));
   $jahr 	= intval(gmdate("Y",$timestamp));
   $stunde 	= intval(gmdate("G",$timestamp));
   $minute 	= intval(gmdate("i",$timestamp));
   $sekunde = intval(gmdate("s",$timestamp));

	// Berechnungen
	// Ekliptikalkoordinaten der Sonne
   $jd12 = gregoriantojd($monat,$tag, $jahr);
   $stundenanteil = $stunde >= 12 ? (($stunde)/24+$minute/(60*24)+$sekunde/(60*60*24))-0.5 : (-1*($stunde/24-$minute/(24*60)-$sekunde/(24*60*60)));
   $jd12h = $jd12 + $stundenanteil;
   $n = $jd12h - 2451545;
   $L = 280.460 + 0.9856474 * $n;
   $g = 357.528 + 0.9856003 * $n;
   $i = intval($L / 360);
   $L = $L - $i*360;
   $i = intval($g / 360);
   $g = $g - $i*360;
   $e = 0.0167;
   $eL = $L + (2*$e * sin($g/180*M_PI)+ 5/4*$e*$e*sin(2*$g/180*M_PI))*180/pi();
   $epsilon = 23.439 - 0.0000004 * $n;
   $alpha = atan(cos($epsilon/180*M_PI)*sin($eL/180*M_PI)/cos($eL/180*M_PI))*180/M_PI;
   

   if ((cos($eL/180*M_PI)<0)) $alpha += 180;
	 
   $delta = asin(sin($epsilon/180*M_PI)*sin($eL/180*M_PI))*180/M_PI;
   $jd0 = $jd12 - 0.5;
   $T0 = ($jd0 - 2451545.0) / 36525;
   $mittlere_sternzeit_greenwich = 6.697376 + 2400.05134 * $T0 + 1.002738 * ($stunde+$minute/60+$sekunde/3600);
   $i = intval($mittlere_sternzeit_greenwich / 24);
   $mittlere_sternzeit_greenwich = $mittlere_sternzeit_greenwich - $i*24;
   $stundenwinkel_fruehling_greenwich = $mittlere_sternzeit_greenwich * 15;
   $stundenwinkel_fruehling = $stundenwinkel_fruehling_greenwich + $longitude;
   $stundenwinkel_sonne = $stundenwinkel_fruehling - $alpha;
   $nenner = cos($stundenwinkel_sonne/180*M_PI)*sin($latitude/180*M_PI)-tan($delta/180*M_PI)*cos($latitude/180*M_PI);
   $azimut = atan(sin($stundenwinkel_sonne/180*M_PI)/$nenner)*180/M_PI;

	
   if ($nenner<0) $azimut+=180;
   	if ($azimut>180) $azimut -= 360;
   	$h = asin(cos($delta/180*M_PI)*cos($stundenwinkel_sonne/180*M_PI)*cos($latitude/180*M_PI)+sin($delta/180*M_PI)*sin($latitude/180*M_PI))*180/M_PI;
   	$R = 1.02 / (tan(($h+10.3/($h+5.11))/180*M_PI));
   	$elevation = round($h + ($R/60),2);

	// Von Norden ( 0 Grad) an berechnen
	$azimut = round ( $azimut += 180,2);


 
	// Himmelsrichtung der Sonne
	$SunDirectionNames = array("N", "NNO", "NO", "ONO", "O", "OSO", "SO", "SSO", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW");
	$SunDirectionName = $SunDirectionNames[(int)((round($azimut)/ 22.5))];
	
	echo "Himmelsrichtung " .(string) $azimut . " Grad" ." [ " .$SunDirectionName . " ]";
	
 	echo "    Sonnenhöhe " .(string) $elevation . " Grad" ;

?>

Gruß aus Franken
Jürgen

… passt :slight_smile: - danke
Erde und Sonne

MST

und wo ist in der Funktion der Höhenwinkel? Würd schon gerne beachten, ob die Sonne nun über Nachbars Garage hervorschaut (im Sommer) oder nicht.

Hat sich eigentlich schon mal einer dabei gemacht, Mondauf- und untergänge zu berechnen? Die Phasen da hab ich ja vor gut zwei Jahren schon mal ein ehemaliges JS-Script übersetzt und hier gepostet. Leider aber bis heute keine Zeit gefunden für die Auf- und Untergangsberechnung, die auf ähnlich umfangreiches Formelzeugs zurückgeht

Gruß Gerd

Die Höhe der Sonne wird von Script in Grad berechnet.

Über eine Winkelfunktion kannst du leicht ausrechnen, ob die Sonne drüberscheint.

Beispiel:

Garage ist 3m hoch, Sonnenhöhe 30 Grad

Schattenlänge der Garage ist 3m / tan 30 Grad

Hier für mein Beispiel einer Garage die Schattenlänge:

einfach mein Script mit diesem Code erweitern:

$Garagenhoehe = 3 ; // in Meter
Schattenlänge = $Garagenhoehe  / tan(deg2rad($elevation))

Jürgen

Legt euch Grenzwert-Variablen fest für die Zeiten, an denen morgens frühestens und abends spätestens die Jalousien auf- oder zugefahren werden. Es ist ziemlich nervig, wenn mein Lütter im Hochsommer schon kurz nach 4 an meinem Bett steht, nur weil er wach wurde, da es in seinem Zimmer hell wurde…

@ gwanjek
Kannst du mal zeigen wie du die Grenzwerte im Skript gesetzt hast
(Programmierzeilen)?
Danke!

ich habe seit gut 2 Jahren ein ganz anderes, eigenes Script zu laufen, noch aus Basis V1. Unter anderem diese Grenzwerte sind bei mir Aufrufparameter der Funktion in Grad, sozusagen Empfindlichkeitsbereich bzgl. Azimut und Höhenwinkel eines Fensters.

Wo das Fenster hinschaut, habe ich mit einem Kompass ausgemessen. Exakte Lagekoordinaten, also Längen- und Breitengrad des Hauses, stammt aus Google Earth und sollte zumindest für die nächsten Jahrtausende einigermaßen stabil sein, also als Konstanten in einer include-Lib hinterlegt…

Code hier reinzukopieren macht wenig Sinn, da dieser sich auf Librarys verteilt, wo auch noch andere Jalousiensteuernde Faktoren mit reinspielen, wie Sturmschutz, Kamerafahrt, Anwesenheits-nicht-wach-Erkennung (das nervt, wenn die Dinger beim Mittagsschlaf fahren) usw.

@Clipper
Danke, „$elevation“ war die gesuchte Antwort. Wie man das trigonometrisch umrechnet, bekomme ich schon noch hin :wink:

Code hier reinzukopieren macht wenig Sinn, da dieser sich auf Librarys verteilt,

Schade, ich habe etwas Probleme im Original Skript Grenzwerte zu setzen…
sowas wie if sunrise < „06:00“ sunrise = „06:00“ gibt es ja nicht.

Zeitberechnung ist wegen der ständigen, unregelmäßigen Grenzen wie Tag-, Monats, Jahresende eine der komplexesten Operationen überhaupt. Aber man kann es sich einfach machen:

Zeiten berechnest du am Besten mit den Integer-Zeitstempeln (= Sekunden seit 1.1.1070 00:00 GMT), NUR die kannst du direkt per < > und = vergleichen. Alles andere ist sinnlos, so du nicht alles folgendermaßen abbildest:

  1. vollständig (also immer komplett Datum und Zeit im String)

  2. in sinnvoller Syntax, am besten ISO YYYYMMDDHHMiMiSS usw, damit die einem String-Vergleich (<, > usw) entsprechen, also „langsamste“ Änderung links

Achtung: bei Stringvergleich ist „11:20“ < „2:46“!

also 3. immer(!!) in konstanter Länge, also jede funktionale Stelle (Jahr, Monat,Tag… Minute…) muß links mit 0 auf gleiche Länge aufgefüllt werden!
Dann wird „11:20“ > „02:46“.

…das alles kannst du dir aber ersparen, wenn du einfach NUMERISCH die Sekunden betrachtest in der sogenannten „Epoche“ also seit 1.1.70 usw.

Diese Werte werden in den Befehlen wie time, date usw schon geliefert bzw als Parameter erwartet

Stell dir mal vor, eine ZeitDIFFERENZ aus den echten Daten zu berechnen! Unter Beachtung von Monats- und Jahresende, die ja dazwischenliegen könnten, inkl. unterschiedlich langer Monate und Schaltjahr usw… Auch ein nur wenige Sekunden dauernder Serverprozess kann genau über so eine Grenze reichen…

Mit den Zeitstempeln ist eine solche Differenz easy. Es ist einfach die numerische Differenz der „absoluten“ Sekundenwerte beider Ereignisse. Das Ergebnis teilst du dann einfach modulo bzgl. Sekunden, Minuten, Stunden, Tag (60, 60, 24 usw.), oder du bearbeitest es numerisch als „absolute“ Sekundenwerte weiter.

Und so kannst du dan auch entscheiden, ob die aktuelle Zeit noch vor oder schon nach Sonnenauf- oder Untergang ist. Bleib einfach bei den absoluten Sekundenwerten, manchmal auch genannt „Timestamps“. Die PHP-Funktionen zum SA und SU liefern die ja eh, und time() liefert dir die aktuelle Zeit. Ansonsten gibt es Umrechnungsfunktionen.

näheres findest du unter php.net z.B. beim Befehl time() oder date()

Gruß Gerd

Habe mir das script auch mal eingebaut. Funzt super, Danke an Horst.
Ich habe ein script laufen welches das Licht im Flur anschaltet wenn ich nach Hause komme. Geht natürlich auch an wenn es noch hell ist, dies möchte ich mit dem astronomischen Ereignis verknüpfen. Ich wollte in den Nachhause kommen script eine IF Abfrage einbauen welche das Licht nur bei Dunkelheit einschaltet. Die Ereignisse liegen ja vor aber in einer String Variablen. Nun weiss ich nicht wie ich die Abfrage machen soll. Vielleicht kann mir ja jemand Helfen um dies umzusetzen.

cu uwe

Hallo Uwe,

das was in dem String drinnen stehen soll, kannst Du doch vergleichen und dann entsprechend reagieren.
Als Beispiel

$string = GetValueString(12345);
if($string == "Tag")
{
 // mach was
}



Hallo Rainer,

In den String Variablen stehen aber doch Uhrzeiten die sich täglich ändern?

cu uwe

Uwe, ich weiss nicht was da drinnen steht, ich benutze das Script nicht. Das war als Beispiel gedacht wie man einen String vergleichen kann.

Das kannst Du auch mit Zeiten machen. z.B. Zeit ist > 19:00 …

Danke Rainer werde es mal probieren.

cu uwe

…und gestern wieder mal die gleiche Frage:

Antwort dürfte also vielleicht doch von allgemeinerem Interesse sein, deshalb öffentlich hier:

wie ich zuvor schon schrieb: per PHP-Zeit-Funktionen wie „time()“ bzw.„date()“ usw., siehe php.net.

ABER: Das ist noch Stand IPS V1. Sorry, keine Zeit bisher das umzustellen (never touch a running system usw :cool: ) Ist aber billig anzupassen, betrifft ja nur die Speicher/Lesebefehle von IPS selbst, die nun nicht mehr mit Namen angesprochen werden können (oder indirekt per zwischengeschobener Funktionen, die aus Namen IDs machen muß)


// Verwendung der "$jetzt"-Variable statt direkter Verwendung des "time()"-Befehls
// dient vor allem zum Debuggen, andere "aktuelle Zeit" ist damit mit einem 
// Änderungs-Befehl schnell und problemlos simulierbar 
   $jetzt=time();

// ....

   $datum = date("d.m.Y", $jetzt);

// ....

   $wd=abs(date("w", $jetzt));


// ......

// "$tsMsUp" und "$tsMsDown" werden aus den PHP-Befehlen für den Sonnenauf-/-untergang 
// an einem Standort, zzgl./abzüglich eines Offsets gewonnen
// Alle Werte sind per IPS-Variablen aus der Oberfläche konfigurierbar!

   $offsetMsUp=GetValueInteger("conf.sun.offset.msup");     // Offset nach SA in Minuten (i.d.R. negativ!)
   $offsetMsDown=GetValueInteger("conf.sun.offset.msdown"); // Offset nach SU in Minuten

// .....

   $offsGMT = abs(date("O", $jetzt)/100);    // automatische Zeitzonen und Sommerzeitermittlung (aus der Computerzeit)
                                             // Format z.B.: +0200
   $sats = date_sunrise($jetzt, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, $zenith, $offsGMT);
   $suts = date_sunset($jetzt, SUNFUNCS_RET_TIMESTAMP, $latitude, $longitude, $zenith, $offsGMT);
   $tsMsUp = $sats + ($offsetMsUp * 60);
   $tsMsDown = $suts + ($offsetMsDown * 60);


   if (($wd == 0) or ($wd == 6)) {  // Sa, So
      $minTs = mkTs(GetValueString("conf.sun.mints.msupWE.tstr"));
      $maxTs = mkTs(GetValueString("conf.sun.maxts.msdownWE.tstr"));
   } else {                         // Mo-Fr
      $minTs = mkTs(GetValueString("conf.sun.mints.msup.tstr"));
      $maxTs = mkTs(GetValueString("conf.sun.maxts.msdown.tstr"));
   }
   $midnightTs = mkTs("00:00");
   if (($minTs > $midnightTs) and ($tsMsUp < $minTs)) {
      $tsMsUp = $minTs;
   }
   if (($maxTs > $midnightTs) and ($tsMsDown > $maxTs)) {
      $tsMsDown = $maxTs;
   }

// .....

// das sind die Merk-Variablen, wann zuletzt gefahren wurde, 
// je Geschoß (EG, OG) auf oder zu (up, down) als timestamp gespeichert
// wegen der Funklast trenne ich real nochmal nach Geschoß mit 5 min Verzögerung, 
// beim Öffnen morgens zzgl. eines initialen, nochmal 5min zuvor stattfindenden "dummy"-Zufahren (sind ja noch zu) als Synchronisation

   $tFogDown=GetValueInteger("timer.fOg.msDown.timestamp");
   $tFegDown=GetValueInteger("timer.fEg.msDown.timestamp");
   $tFogUp=GetValueInteger("timer.fOg.msUp.timestamp");
   $tFegUp=GetValueInteger("timer.fEg.msUp.timestamp");

// .......

   // Morgen-Grauen
   if ($jetzt > $tsMsUp) {   // Zeitpunkt erreicht
      $lastdatum = date("d.m.Y", $tFegUp);
      if (!($datum == $lastdatum)) {     // letztes Auslösen nicht heute

// .... Luken auf-Befehle hier einfügen

// nicht vergessen: hier neuen Timestamp merken, wann zuletzt geöffnet wurde!
            SetValueInteger("timer.fEg.msUp.timestamp", $jetzt);

      }
   }

   // dunkle Zeiten kommen
   if ($jetzt > $tsMsDown ) {   // Zeitpunkt erreicht
      $lastdatum = date("d.m.Y", $tFegDown);
      if (!($datum == $lastdatum)) {     // letztes Auslösen nicht heute

// ..... Schotten dicht - Befehle hier einfügen

      }
   }

// .....

   function mkTs($val) {   // Timestamp aus String ("Std:Min") ableiten
   // notwendig bei Sommerzeitumstellung, da sonst absolute Timestamps Fehler machen
      $ts = 0;
      $ele = array();
      $ele = explode(":", $val);
      if (sizeof($ele) > 1) {
         $std = $ele[0];
         $min = $ele[1];
         if (($std > -1) and ($min > -1) and ($std < 25) and ($min < 60)) {
            $ts = mktime($std, $min, 0);
         }
      }
      return $ts;
   }


Hoffe, das hilft erstmal weiter und erläutert das Prinzip. An das Script von Horst anpassen, dürfte dann nicht mehr schwer sein.

Gruß Gerd

Hallo,
da ich neu hier bin, und noch nicht wirklich Ahnung von der ganzen Programmierung habe, habe ich eine Frage zu diesem für mich genialen Script.
Ich habe das Skript in IPS eingefügt, es wird auch ausgeführt aber ich bekomme immer eine Fehlermeldung für die aus zuführenden Skripte. In meinem Fall möchte ich erst einmal meine Rollos im Wohnzimmer steuern.
Ich habe mal ein Bild fün der Fehlermeldung angehangen.
Ich gehe mal davonaus, das ich einen blöden Anfängerfehler gemacht habe. :rolleyes:
Hoffe ihr könnt mir weiter helfen.

Viele Grüße aus Dortmund und ein schönes WE

hallo

kann es sein, das du in den zeilen 25-28 am ende bei sunset und sunrise die $ vergessen hast?

am besten ist, wenn du den code direkt mit dem php-tag einfügst und keinen screenshot…

Hallo,

meines Wissens nach muß das Script so aussehen wie in diesem Beispiel.

$scripts[] = array("id" => 57624, "offset" => 10, "type" => "sunset"); /* Licht Garten ein*/

Das Array muß mit eindeutigen Namen und Werten gefüllt werden, sonst funktioniert das Skript weiter unten nicht. Steht aber eigentlich im Original da wie das Array gefüllt werden muß. So wie Du das gemacht hast werden jedem Arraywert nur eine Nummer zugeordnet und damit kann die Foreach Schleife nichts anfangen.

Gruß Tommy