Astronomische Berechnungen

Hallo Bernd,

Super! Hast Du vielleicht noch ein Beispiel zur Berechnung von Mond und Sonnen Azimut und Elavation?
Deine Darstellung in https://www.symcon.de/forum/threads/31419-In-HTML-Box?p=291039#post291039 finde ich Genial

Hallo Bernd,

Daumen hoch und vielen Dank für die vielen Functions.
Muss eine heidenarbeit gewesen sein.

Ein paar Functions sind noch unkommentiert.

man hat ja sonst nichts zu tun

Könntest Du die irgend wann noch kurz kommentieren?

Werd mal sehen was ich da so rausbekomme.

Grüsse,

Wolfgang

Hallöchen,
war nicht ohne die Umsetzung von vba in php, vor allen Dingen sind da Formeln bei die den „goto“ Befehl verwenden…
ja und ohne das Buch wird es schwierig mit den einzelnen Formeln etwas vernünftiges rauszubekommen

hier geht’s dann mal weiter…
hab alles in Post #2 eingefügt

Hallo Bernd,

ich bekommst einfach nicht hin. Die berechneten Werte passen nicht. Habs mal Online berechnen lassen und mit denen aus Deinem Skript verglichen.
Was mache ich falsch?
Brauche eigentlich (vorrangig) nur Sonne/Mond Azimut und Höhe um Dein anderes Skript nutzen zu können.

Danke für Deine Hilfe.

Hallo Jürgen,
ich hab’s bei mir auch nochmal mit der Onlineberechnung auf http://lexikon.astronomie.info/java/sunmoon/index.html verglichen, da ist kaum ein Unterschied…
Online und im Script genau die gleichen Koordinaten eingetragen ?

Hallo Bernd,

ja habe ich:

Läuft das Hauptscript fehlerfrei durch wenn du da auf ausführen gehst ?

Ja, komplett ohne Fehler. Versteh ich nicht:confused:

Am Betriebssystem wirds wohl nicht liegen? Ich habe Win7 64Bit mit IPS 4 und Du?

Hab’s unter IPS 3.4 auf Win7 64bit laufen…
Hast du mal Zeit/Datum auf deinem System kontrolliert ?

Ja, alles ok.
Mit diesem Skript hier aus dem Forum klappt wenigstens der Sonnenstand genau wie in der Onlineberechnung:

<?
// Quelle: http://www.ip-symcon.de/forum/f52/sonnenstand-berechnen-azimut-elevation-14925/

 //  Coordinates format is the pair of latitude and longitude, with sign minus (-) for the direction south latitude and west longitude separate by comma simbol (,), here some example:
 //    52.5163 , 13.3779
 //    40.7682 , -73.9816
 //    -22.9708 , -43.1830

//function calcSunPos( $iYear, $iMonth, $iDay, $dHours,    $dMinutes, $dSeconds, $dLongitude, $dLatitude)


$long         = getValue(34991 /*[Scripte\Stammdaten\Longitude]*/); // Längengrad
$lat          = getValue(31837 /*[Scripte\Stammdaten\Latitude]*/ ); // Breitengrad


calcSunPos( gmdate("y"), gmdate("m"), gmdate("d"), gmdate("H"), gmdate("i"), 0, $long, $lat); // location Hamburg Öjendorf, Germany


//function calcSunPos( int iYear,int iMonth,int iDay,double dHours,    double dMinutes,double dSeconds,    double dLongitude,    double dLatitude)
function calcSunPos( $iYear, $iMonth, $iDay, $dHours,    $dMinutes, $dSeconds, $dLongitude, $dLatitude)
{

    $pi = 3.14159265358979323846;
    $twopi = (2*$pi);
    $rad = ($pi/180);
    $dEarthMeanRadius = 6371.01;    // In km
    $dAstronomicalUnit = 149597890;    // In km

    // Calculate difference in days between the current Julian Day
    // and JD 2451545.0, which is noon 1 January 2000 Universal Time

    // Calculate time of the day in UT decimal hours
    $dDecimalHours = floatval($dHours) + (floatval($dMinutes) + floatval($dSeconds) / 60.0 ) / 60.0;

    // Calculate current Julian Day

    $iYfrom2000 = $iYear;//expects now as YY ;
    $iA= (14 - ($iMonth)) / 12;
    $iM= ($iMonth) + 12 * $iA -3;
    $liAux3=(153 * $iM + 2)/5;
    $liAux4= 365 * ($iYfrom2000 - $iA);
    $liAux5= ( $iYfrom2000 - $iA)/4;
    $dElapsedJulianDays= floatval(($iDay + $liAux3 + $liAux4 + $liAux5 + 59)+ -0.5 + $dDecimalHours/24.0);

    // Calculate ecliptic coordinates (ecliptic longitude and obliquity of the
    // ecliptic in radians but without limiting the angle to be less than 2*Pi
    // (i.e., the result may be greater than 2*Pi)

    $dOmega= 2.1429 - 0.0010394594 * $dElapsedJulianDays;
    $dMeanLongitude = 4.8950630 + 0.017202791698 * $dElapsedJulianDays; // Radians
    $dMeanAnomaly = 6.2400600 + 0.0172019699 * $dElapsedJulianDays;
    $dEclipticLongitude = $dMeanLongitude + 0.03341607 * sin( $dMeanAnomaly ) + 0.00034894 * sin( 2 * $dMeanAnomaly ) -0.0001134 -0.0000203 * sin($dOmega);
    $dEclipticObliquity = 0.4090928 - 6.2140e-9 * $dElapsedJulianDays +0.0000396 * cos($dOmega);

    // Calculate celestial coordinates ( right ascension and declination ) in radians
    // but without limiting the angle to be less than 2*Pi (i.e., the result may be
    // greater than 2*Pi)

    $dSin_EclipticLongitude = sin( $dEclipticLongitude );
    $dY1 = cos( $dEclipticObliquity ) * $dSin_EclipticLongitude;
    $dX1 = cos( $dEclipticLongitude );
    $dRightAscension = atan2( $dY1,$dX1 );
    if( $dRightAscension < 0.0 ) $dRightAscension = $dRightAscension + $twopi;
    $dDeclination = asin( sin( $dEclipticObliquity )* $dSin_EclipticLongitude );

    // Calculate local coordinates ( azimuth and zenith angle ) in degrees

    $dGreenwichMeanSiderealTime = 6.6974243242 +    0.0657098283 * $dElapsedJulianDays + $dDecimalHours;

    $dLocalMeanSiderealTime = ($dGreenwichMeanSiderealTime*15 + $dLongitude)* $rad;
    $dHourAngle = $dLocalMeanSiderealTime - $dRightAscension;
    $dLatitudeInRadians = $dLatitude * $rad;
    $dCos_Latitude = cos( $dLatitudeInRadians );
    $dSin_Latitude = sin( $dLatitudeInRadians );
    $dCos_HourAngle= cos( $dHourAngle );
    $dZenithAngle = (acos( $dCos_Latitude * $dCos_HourAngle * cos($dDeclination) + sin( $dDeclination )* $dSin_Latitude));
    $dY = -sin( $dHourAngle );
    $dX = tan( $dDeclination )* $dCos_Latitude - $dSin_Latitude * $dCos_HourAngle;
    $dAzimuth = atan2( $dY, $dX );
    if ( $dAzimuth < 0.0 )
        $dAzimuth = $dAzimuth + $twopi;
    $dAzimuth = $dAzimuth / $rad;
    // Parallax Correction
    $dParallax = ($dEarthMeanRadius / $dAstronomicalUnit) * sin( $dZenithAngle);
    $dZenithAngle = ($dZenithAngle + $dParallax) / $rad;
    $dElevation = 90 - $dZenithAngle;


    // IP Symcon -> Create and take your own variables
    // Save Azimuth and Elevation as Float values

        SetValueFloat(39074 /*[Scripte\Wetter_Klima_Umwelt\PositionSonneMond\Sonnenstand\AzimutSun]*/, $dAzimuth);
        SetValueFloat(39597 /*[Scripte\Wetter_Klima_Umwelt\PositionSonneMond\Sonnenstand\ElevationSun]*/ , $dElevation);



}

// Funktion zur Berechnung des Sommerzeit-Startdatums
function dst_start($year) {
 return mktime(2,0,0,3,31 - date('w', mktime(2,0,0,3,31,$year)),$year);
}
// Funktion zur Berechnung des Sommerzeit-Enddatums
function dst_end($year) {
 return mktime(2,0,0,10,31 - date('w', mktime(2,0,0,10,31,$year)),$year);
}





?>

Du hast aber hier

//Breiten- und Längengrad hab ich bei mir als Variable abgelegt
$P = getvalue(29795 /*[Scripte\Sonnenauf/untergang\Breitengrad (x1000000)]*/)/1000000;
$L = getvalue(31634 /*[Scripte\Sonnenauf/untergang\Längengrad (x1000000)]*/)/1000000;

die /1000000 rausgenommen, oder ? Die hast ja bei dir in den Stammdaten direkt mit Komma angegeben…
Ich habe es mal rausgenommen hier in meinem Post :o

Simsalabim, schon geht es. Vielen vielen Dank:)

Supi :wink:
Hab die Angaben bei mir als Integer abgelegt… deswegen der Teiler :banghead: sollte ich bei mir auch mal ändern

Unter W10 und IPS4 ist bei mir das Script mit den Functions auf den Fehler:

Call to undefined function variant_fix()
gelaufen.

Ursache: die php_com_dotnet.dll fehlt.

Hab die dann von der IPS 3.4 rüber kopiert und ein mal ein IPS-Update laufen lassen. Damit wird dann automatisch die richtige Version der DLL installiert.

Danach hats funktioniert.

Anbei die dll.

php_com_dotnet.zip (32.3 KB)

Unter Ubuntu und IPS4 erzeugt das Haupt-Script den Fehler:
Call to undefined function variant_fix()

Wie kann dies korrigiert werden?
Mit freundlichen Grüßen
Matthias

Hallo Bernd,

bevor ich mich jetzt weiter mit den Functions auseinandersetze …

Hast Du eine Lösung, wie ich die Koordinaten und die aktuelle Uhrzeit an das Function-Script übergeben kann?

Das fänd ich universeller.

Dann könnt ich das selbe Script für verschiedene Anwendungen verwenden.

@Wolfgang

versuche mal das hier im Aufrufscript:

$day = date("d");
$month = date("m");
$year = date("Y");
$Hour = date("H");
$Minute = date("i");
$Second = date("s");
$summer = date("I");
if ($summer == 0){   //Summertime
	$DS = 0;}         //$DS = Daylight Saving
	else{
	$DS = 1;}
$ZC = 1; // Zone Correction to Geenwich: 1 = UTC+1
$P = getvalue(29795 /*[Scripte\Sonnenauf/untergang\Breitengrad]*/);
$L = getvalue(31634 /*[Scripte\Sonnenauf/untergang\Längengrad]*/);

include "12345.ips.php"; //Aufruf Hauptscript

... ab hier dann der Rest vom aufrufenden Script

und lösche folgende Zeilen im Hauptscript

$day = date("d");
$month = date("m");
$year = date("Y");
$Hour = date("H");
$Minute = date("i");
$Second = date("s");
$summer = date("I");
if ($summer == 0){   //Summertime
	$DS = 0;}         //$DS = Daylight Saving
	else{
	$DS = 1;}
$ZC = 1; // Zone Correction to Geenwich: 1 = UTC+1
$P = getvalue(29795 /*[Scripte\Sonnenauf/untergang\Breitengrad]*/);
$L = getvalue(31634 /*[Scripte\Sonnenauf/untergang\Längengrad]*/);

@Matthias
wie es unter Ubuntu gelöst werden kann weiß ich jetzt leider nicht…
Nur das es sich bei dem Befehl variant_fix() um eine Windowsbasierte Erweiterung handelt. Näheres siehe unter
http://php.net/manual/de/function.variant-fix.php

variant_int() meckert er dann später auch an, kommt nämlich auch vor…

Du kannst variant_fix und variant_int durch intval ersetzten dann kommt auch keine Fehlermeldung mehr.
PHP: intval - Manual