calcul position du soleil

Discussion et échanges de scripts pour la box eedomus

Re: calcul position du soleil

Messagepar gougol69 » 26 Oct 2016 14:34

Bonjour,

Dans la dernière version il y a une erreur sur la fin de l'heure d'été :

Code : Tout sélectionner
// SI JOUR > A 87 ET < A 297 = HEURE D'ETE: TIME_ZONE = 2 SINON : TIME_ZONE = 1
if ($day_year >= 87 && $day_year <= 297)


Il faut remplacer le 297 par 303 pour l'année 2016.

Sinon si vous utilisez l'élévation pour gérer les volets ils se lèvent 1h trop tôt et se ferment 1h trop tôt.
gougol69
 
Messages : 19
Inscription : 14 Jan 2015

Re: calcul position du soleil

Messagepar iparent » 30 Oct 2016 23:10

Bonsoir,

je souhaite utiliser le script position_soleil.php sur un rspie.
J'ai suivi la procédure, voici mon URL d'appel : http://@RSPIE/position_soleil.php?&latitude=[VAR1]&longitude=[VAR2].
J'ai le chiffre 1 au niveau du champ correspondant au XML. J'ai fait le changement de 297 à 303.
Merci d'avance.
iparent
 
Messages : 67
Inscription : 22 Sep 2014

Re: calcul position du soleil

Messagepar gougol69 » 31 Oct 2016 19:12

Pour régler le problème du changement d'horaire définitivement et éviter de changer les numéros de jours tous les ans, il existe une fonction php.
En l'utilisant il faut remplacer :
Code : Tout sélectionner
// Time zone par défaut = Heure d'hiver
$time_zone = 1;
$day_year = date('z');

// SI JOUR > A 87 ET < A 297 = HEURE D'ETE: TIME_ZONE = 2 SINON : TIME_ZONE = 1
if ($day_year >= 87 && $day_year <= 302)
{
   // Heure d'été
   $time_zone = 2;
}


Par

Code : Tout sélectionner
$day_year = date('z');

// SI HEURE D'ETE alors 1 sinon 0
$heure_ete = date('I');

if ($heure_ete == 1)
{
   // Heure d'été
  $time_zone = 2;
}
else
{
   // Heure d'hiver
  $time_zone = 1;
}
gougol69
 
Messages : 19
Inscription : 14 Jan 2015

Re: calcul position du soleil

Messagepar dplein » 28 Juin 2017 04:46

Bonjour,

Merci pour le script, tout à l'air de fonctionner. J'ai seulement une question à poser par rapport à l'élévation du soleil : A partir de combien de degrés, devient il "néfaste" en été ??? (C'est surtout pour ma ma façade EST)

Je suis en train de réfléchir pour fermer mes volets avec l'azimut et l'élévation du soleil... Auparavant, je fonctionnait avec la température extérieure.

Merci pour vos lumières....
Irradié.... RAC v2
dplein
 
Messages : 1680
Inscription : 28 Oct 2012
Localisation : Lorraine

Re: calcul position du soleil

Messagepar vva » 30 Juin 2017 22:00

Bonsoir dplein,

Je dirai que ça dépend de ton terrain et de l'ensoleillement de ta façade. Il faudrait à mon avis que tu fasses l'exercice de mesurer l'ombre portée sur ta façade et de noter l'azimut mais je ne suis pas sur que se soit la solution ...

Chez moi la façade ESt est exposée dès le levé (pas d'arbre de ce coté).
J'utilise un thermomètre sur chaque façade pour gérer mes volets.
Avec un temps comme aujourd'hui (pluie, pluie et re-pluie), j'ai pas envie que mes volets se ferme même si le soleil est haut.

Vincent
vva
 
Messages : 381
Inscription : 12 Juin 2013

Re: calcul position du soleil

Messagepar dplein » 01 Juil 2017 00:23

Salut vva,

C'est effectivement ce que j'avais fait en attendant d'avoir une solution sur le forum...Eh bien, je resterai comme ça.... :D :D
Irradié.... RAC v2
dplein
 
Messages : 1680
Inscription : 28 Oct 2012
Localisation : Lorraine

Re: calcul position du soleil

Messagepar Phenix » 01 Août 2017 18:13

Bonjour

J'ai installé le script, pour le moment j'ai une erreur mais je ne vois pas OU

Erreur.jpg
Erreur.jpg (83.88 Kio) Consulté 22526 fois


Merci de me tenir au jus
Phenix
 
Messages : 36
Inscription : 23 Nov 2015

Re: calcul position du soleil

Messagepar dplein » 01 Août 2017 21:21

Ton chemin Xpath est faux !!!

voila le bon :

pour l'azimut: /Data/Soleil/Solar_Azimuth_round

Pour l'élévation : /Data/Soleil/Solar_Elevation_corrected_for_atm_refraction_deg
Irradié.... RAC v2
dplein
 
Messages : 1680
Inscription : 28 Oct 2012
Localisation : Lorraine

Re: calcul position du soleil

Messagepar Phenix » 02 Août 2017 07:39

ok cela fonctionne

Peux-tu m'expliquer pourquoi ces chemins pour atteindre les valeurs !!!!

Merci d'avance
Phenix
 
Messages : 36
Inscription : 23 Nov 2015

Re: calcul position du soleil

Messagepar dplein » 02 Août 2017 08:02

C'est expliqué dans le script... :D

// EXEMPLE APPEL DE SCRIPT avec variables: http://[VAR1]/script/?exec=position_soleil.php&latitude=[VAR2]&longitude=[VAR3]
// EXEMPLE APPEL DE SCRIPT dans navigateur: http://@IP_BOX_EEDOMUS/script/?exec=pos ... e=2.294496

// LE RESULTAT EST SOUS FORME XML
// L'ELEVATION CORRESPOND A L'ANGLE ENTRE L'HORIZON ET LE SOLEIL
// XPATH ELEVATION: /Data/Soleil/Solar_Elevation_corrected_for_atm_refraction_deg

// L'AZIMUT CORRESPOND A L'ANGLE ENTRE LE NORD ET LE SOLEIL
// XPATH AZIMUT: /Data/Soleil/Solar_Azimuth_round
// 0°/ 360° = NORD
// 90° = EST
// 180° = SUD
// 270° = OUEST


J'aurais pas pu l'inventé moi même vu mon niveau... :lol:
Irradié.... RAC v2
dplein
 
Messages : 1680
Inscription : 28 Oct 2012
Localisation : Lorraine

Re: calcul position du soleil

Messagepar Phenix » 02 Août 2017 08:18

je me suis mal exprimé :

pourquoi /data/soleil/ avant les variables dans le script !!!!
Ne pouvait on pas se passer de /data/soleil/ ????

Pour info je ne suis pas un programmeur donc j'essaie de comprendre :shock:
Phenix
 
Messages : 36
Inscription : 23 Nov 2015

Re: calcul position du soleil

Messagepar rover820i » 02 Août 2017 09:17

Phenix a écrit:je me suis mal exprimé :

pourquoi /data/soleil/ avant les variables dans le script !!!!
Ne pouvait on pas se passer de /data/soleil/ ????

Pour info je ne suis pas un programmeur donc j'essaie de comprendre :shock:

C'est comme une adresse.

Si tu arrives dans une ville que tu ne connais pas, qu'on te dit que tu dois aller chemin des fleurs sans te dire par où passer, tu ne sauras pas y arriver.

Si on te dit de passer rue des abricots, puis allée de la mer, et enfin tu arrives chemin des fleurs, tu trouveras.

Là, c'est pareil, c'est un chemin dans le fichier XML généré.
rover820i
 
Messages : 3363
Inscription : 23 Juil 2016

Re: calcul position du soleil

Messagepar Phenix » 04 Août 2017 10:51

Merci pour vos réponses en ayant mis le chemin cela fonctionne, mais je pense que je ne comprend pas le script ou sont écrits les data

Merci quand même.
Phenix
 
Messages : 36
Inscription : 23 Nov 2015

Re: calcul position du soleil

Messagepar timetre » 09 Août 2017 10:33

Bonjour à tous,
Je suis nouveau sur le forum et récent acquéreur d'une eedomus+ que je destine principalement à piloter mes chauffages et volets roulants.
L'une des raison m'ayant fait choisir cette box c'est justement la possibilité d'utiliser des scripts comme celui-ci et c'est donc la première chose que j'ai installée :)

Cependant, mes observations du couché du soleil comparé à l'élévation renvoyée par le script m'ont mis la puce à l'oreille que quelque chose clochait ... et effectivement, en comparant les données avec d'autres outils (dont la feuille de calcul du NOAA qui a servi de base à ce script), je me suis rendu compte qu'à ma position, le script renvoie une valeur d'azimut avec une erreur de l'ordre de 6° et une élévation erronée de 4° ! :(

Par example, à un moment donné (aujourd'hui 10h39):
La feuille de calcul du NOAA nous donne:
Image

Le calculateur en ligne du NOAA (https://www.esrl.noaa.gov/gmd/grad/solcalc/) donne bien sûr la même chose:
Image

The Photographer Ephemeris sur iPad me donne les mêmes infos:
Image

Hors, voilà ce que nous donne le script en v0.15:
Code : Tout sélectionner
<Solar_Elevation_Angle_deg>39.656185318296</Solar_Elevation_Angle_deg><Solar_Elevation_corrected_for_atm_refraction_deg>39.656185318296</Solar_Elevation_corrected_for_atm_refraction_deg>
<Solar_Azimuth>118.05513756707</Solar_Azimuth>


J'ai donc cherché la boulette et elle venait du calcul de date.
J'en ai profité pour implémenter la correction de réfraction atmosphérique qui était indiquée "A FAIRE" et pour faire afficher de manière compréhensible les diverses heures solaires (lever, coucher, zenit, ...).
Je me suis également permis de supprimer de l'affichage du script tous les calculs intermédiaires qui, j'imagine, ne parlaient pas à grand monde :D

Voici donc ce que retourne le script en v1.0:
Code : Tout sélectionner
<Data>
<Parametres>
<Latitude>...</Latitude>
<Longitude>...</Longitude>
</Parametres>
<Soleil>
<True_Solar_Time>09H01</True_Solar_Time>
<Sunrise_Time>06H29</Sunrise_Time>
<Solar_Noon>13H36</Solar_Noon>
<Sunset_Time>20H44</Sunset_Time><Sunlight_Duration_minutes_round>855</Sunlight_Duration_minutes_round>
<Solar_Elevation>43.098429226393</Solar_Elevation><Solar_Elevation_corrected_for_atm_refraction>43.115652867807</Solar_Elevation_corrected_for_atm_refraction>
<Solar_Azimuth>112.27945142982</Solar_Azimuth><Solar_Azimuth_round>112</Solar_Azimuth_round>
<Solar_Cardinal_point>6</Solar_Cardinal_point></Soleil>
</Data>


Et là, si vous comparez avec les captures d'écran des outils ci dessus, tous les paramètres collent :)

Voilà le script mis à jour en v1.0:
Code : Tout sélectionner
<?php

// Version v1.0
// CE SCRIPT EXPERIMENTAL REALISE EN PHP PERMET DE DETERMINER LA POSITION DU SOLEIL (AZIMUT + ELEVATION, ...)
// L'ALGORYTHME EST BASÉ SUR UNE ÉTUDE FAITE PAR LE National Oceanic and Atmospheric Administration

// LES VARIABLES DE LA BOX EEDOMUS:
// [VAR1] = @IP DE LA BOX
// [VAR2] = Latitude (+ => N)
// [VAR3] = Longitude (+ => E)

// Les latitude et longitude doivent contenir des "." (PAS DE VIRGULE)
// EXEMPLE: Latitude = 48.858346
//          Longitude = 2.294496
// OU
//
// EXEMPLE: Latitude = 48.387942
//          Longitude = -4.484993

// EXEMPLE APPEL DE SCRIPT avec variables: http://[VAR1]/script/?exec=position_soleil.php&latitude=[VAR2]&longitude=[VAR3]
// EXEMPLE APPEL DE SCRIPT dans navigateur: http://@IP_BOX_EEDOMUS/script/?exec=position_soleil.php&latitude=48.858346&longitude=2.294496

// LE RESULTAT EST SOUS FORME XML
// L'ELEVATION CORRESPOND A L'ANGLE ENTRE L'HORIZON ET LE SOLEIL
// XPATH ELEVATION: /Data/Soleil/Solar_Elevation_corrected_for_atm_refraction_deg

// L'AZIMUT CORRESPOND A L'ANGLE ENTRE LE NORD ET LE SOLEIL
// XPATH AZIMUT: /Data/Soleil/Solar_Azimuth_round
// 0°/ 360° = NORD
// 90° = EST
// 180° = SUD
// 270° = OUEST

//--------------------------------------------------------------

// Stocker les variables passées en argument
$ma_latitude = getArg('latitude');
$ma_longitude = getArg('longitude');

$time_zone = substr(date('O'), -4, 4);
$time_zone = $time_zone / 100;

$diff_jour = strtotime(date('Y')."-".date('m')."-".date('d')." 00:00:00");

//--------------------------------------------------------------

$heure_secondes = date('H') * 3600;
$minutes_secondes = date('i') * 60;
$heure_secondes = $heure_secondes + $minutes_secondes + date('s');

$Time_past_local_midnight = $heure_secondes/ 86400;

$Julian_Day =  $diff_jour / 86400 + 2440587.5 + $Time_past_local_midnight;

$Julian_Century = $Julian_Day - 2451545;
$Julian_Century = $Julian_Century / 36525;

$Geom_Mean_Long_Sun_deg_1 = $Julian_Century * '0.0003032';
$Geom_Mean_Long_Sun_deg_1 = '36000.76983' + $Geom_Mean_Long_Sun_deg_1;
$Geom_Mean_Long_Sun_deg_1 = $Julian_Century * $Geom_Mean_Long_Sun_deg_1;
$Geom_Mean_Long_Sun_deg = fmod('280.46646' + $Geom_Mean_Long_Sun_deg_1,360);

$Geom_Mean_Anom_Sun_deg = '0.0001537' * $Julian_Century;
$Geom_Mean_Anom_Sun_deg = '35999.05029' - $Geom_Mean_Anom_Sun_deg;
$Geom_Mean_Anom_Sun_deg = $Julian_Century * $Geom_Mean_Anom_Sun_deg;
$Geom_Mean_Anom_Sun_deg = '357.52911' + $Geom_Mean_Anom_Sun_deg;

$Eccent_Earth_Orbit = '0.0000001267'*$Julian_Century;
$Eccent_Earth_Orbit = '0.000042037' + $Eccent_Earth_Orbit;
$Eccent_Earth_Orbit = $Julian_Century * $Eccent_Earth_Orbit;
$Eccent_Earth_Orbit = '0.016708634' - $Eccent_Earth_Orbit;

$Sun_Eq_of_Ctr_1 = deg2rad(3 * $Geom_Mean_Anom_Sun_deg);
$Sun_Eq_of_Ctr_1 = sin($Sun_Eq_of_Ctr_1);
$Sun_Eq_of_Ctr_1 = $Sun_Eq_of_Ctr_1 * '0.000289';
$Sun_Eq_of_Ctr_2 = '0.000101' * $Julian_Century;
$Sun_Eq_of_Ctr_2 = '0.019993' - $Sun_Eq_of_Ctr_2;
$Sun_Eq_of_Ctr_3 = deg2rad(2* $Geom_Mean_Anom_Sun_deg);
$Sun_Eq_of_Ctr_3 = sin($Sun_Eq_of_Ctr_3);
$Sun_Eq_of_Ctr = $Sun_Eq_of_Ctr_2 * $Sun_Eq_of_Ctr_3;
$Sun_Eq_of_Ctr = $Sun_Eq_of_Ctr + $Sun_Eq_of_Ctr_1;
$Sun_Eq_of_Ctr_3 = '0.000014' * $Julian_Century;
$Sun_Eq_of_Ctr_3 = $Sun_Eq_of_Ctr_3 + '0.004817';
$Sun_Eq_of_Ctr_3 = $Julian_Century * $Sun_Eq_of_Ctr_3;
$Sun_Eq_of_Ctr_3 = '1.914602' - $Sun_Eq_of_Ctr_3;
$Sun_Eq_of_Ctr_2 = deg2rad( $Geom_Mean_Anom_Sun_deg);
$Sun_Eq_of_Ctr_2 = sin($Sun_Eq_of_Ctr_2);
$Sun_Eq_of_Ctr_2 = $Sun_Eq_of_Ctr_2*$Sun_Eq_of_Ctr_3;
$Sun_Eq_of_Ctr = $Sun_Eq_of_Ctr_2 + $Sun_Eq_of_Ctr;

$Sun_True_Long_deg = $Geom_Mean_Long_Sun_deg + $Sun_Eq_of_Ctr;

$Sun_True_Anom_deg = $Geom_Mean_Anom_Sun_deg + $Sun_Eq_of_Ctr;

$Sun_Rad_Vector_AUs_1 = deg2rad($Sun_True_Anom_deg);
$Sun_Rad_Vector_AUs_1 = cos($Sun_Rad_Vector_AUs_1);
$Sun_Rad_Vector_AUs_1 = $Eccent_Earth_Orbit * $Sun_Rad_Vector_AUs_1;
$Sun_Rad_Vector_AUs = 1 + $Sun_Rad_Vector_AUs_1;
$Sun_Rad_Vector_AUs_1  = $Eccent_Earth_Orbit*$Eccent_Earth_Orbit;
$Sun_Rad_Vector_AUs_1 = 1-$Sun_Rad_Vector_AUs_1;
$Sun_Rad_Vector_AUs_1 = '1.000001018'*$Sun_Rad_Vector_AUs_1;
$Sun_Rad_Vector_AUs = $Sun_Rad_Vector_AUs_1 / $Sun_Rad_Vector_AUs;

$Sun_App_Long_deg_1 = '1934.136'*$Julian_Century;
$Sun_App_Long_deg_1 = '125.04'-$Sun_App_Long_deg_1;
$Sun_App_Long_deg_1 = deg2rad($Sun_App_Long_deg_1);
$Sun_App_Long_deg_1 = sin($Sun_App_Long_deg_1);
$Sun_App_Long_deg_1 = '0.00478'*$Sun_App_Long_deg_1;
$Sun_App_Long_deg = $Sun_True_Long_deg - '0.00569'-$Sun_App_Long_deg_1;

$Mean_Obliq_Ecliptic_deg = $Julian_Century * '0.001813';
$Mean_Obliq_Ecliptic_deg = '0.00059'- $Mean_Obliq_Ecliptic_deg;
$Mean_Obliq_Ecliptic_deg = $Julian_Century * $Mean_Obliq_Ecliptic_deg;
$Mean_Obliq_Ecliptic_deg = '46.815' + $Mean_Obliq_Ecliptic_deg;
$Mean_Obliq_Ecliptic_deg = $Julian_Century * $Mean_Obliq_Ecliptic_deg;
$Mean_Obliq_Ecliptic_deg = '21.448' - $Mean_Obliq_Ecliptic_deg;
$Mean_Obliq_Ecliptic_deg = $Mean_Obliq_Ecliptic_deg / 60;
$Mean_Obliq_Ecliptic_deg = '26' + $Mean_Obliq_Ecliptic_deg;
$Mean_Obliq_Ecliptic_deg = $Mean_Obliq_Ecliptic_deg / 60;
$Mean_Obliq_Ecliptic_deg = 23 + $Mean_Obliq_Ecliptic_deg;

$Obliq_Corr_deg = '1934.136'*$Julian_Century;
$Obliq_Corr_deg = '125.04'-$Obliq_Corr_deg;
$Obliq_Corr_deg = deg2rad($Obliq_Corr_deg);
$Obliq_Corr_deg = cos($Obliq_Corr_deg);
$Obliq_Corr_deg = $Obliq_Corr_deg*'0.00256';
$Obliq_Corr_deg = $Mean_Obliq_Ecliptic_deg + $Obliq_Corr_deg;

$Sun_Declin_deg_1 = deg2rad($Sun_App_Long_deg);
$Sun_Declin_deg_1 = sin($Sun_Declin_deg_1);
$Sun_Declin_deg_2 = deg2rad($Obliq_Corr_deg);
$Sun_Declin_deg_2 = sin($Sun_Declin_deg_2);
$Sun_Declin_deg = asin($Sun_Declin_deg_1*$Sun_Declin_deg_2);
$Sun_Declin_deg = rad2deg($Sun_Declin_deg);

$SunRt_Ascen_deg_1 = deg2rad($Sun_App_Long_deg);
$SunRt_Ascen_deg_1 = sin($SunRt_Ascen_deg_1);
$SunRt_Ascen_deg_2 = deg2rad($Obliq_Corr_deg);
$SunRt_Ascen_deg_2 = cos($SunRt_Ascen_deg_2);
$SunRt_Ascen_deg_1 = $SunRt_Ascen_deg_2 * $SunRt_Ascen_deg_1;
$SunRt_Ascen_deg_2 = deg2rad($Sun_App_Long_deg);
$SunRt_Ascen_deg_2 = cos($SunRt_Ascen_deg_2);
$SunRt_Ascen_deg = atan2($SunRt_Ascen_deg_1, $SunRt_Ascen_deg_2);
$SunRt_Ascen_deg = rad2deg($SunRt_Ascen_deg);

$y_1 = $Obliq_Corr_deg/2;
$y_1 = deg2rad($y_1);
$y_1 = tan($y_1);
$y = $Obliq_Corr_deg/2;
$y = deg2rad($y);
$y = tan($y);
$y = $y * $y_1;

$Eq_of_Time_minutes_1 = deg2rad($Geom_Mean_Anom_Sun_deg);
$Eq_of_Time_minutes_1 = 2 * $Eq_of_Time_minutes_1;
$Eq_of_Time_minutes_1 = sin($Eq_of_Time_minutes_1);
$Eq_of_Time_minutes_1 = '1.25' * $Eccent_Earth_Orbit * $Eccent_Earth_Orbit * $Eq_of_Time_minutes_1;
$Eq_of_Time_minutes_2 = deg2rad($Geom_Mean_Long_Sun_deg);
$Eq_of_Time_minutes_2 = 4 * $Eq_of_Time_minutes_2;
$Eq_of_Time_minutes_2 = sin($Eq_of_Time_minutes_2);
$Eq_of_Time_minutes_2 = '0.5' * $y * $y * $Eq_of_Time_minutes_2;
$Eq_of_Time_minutes_3 = deg2rad($Geom_Mean_Long_Sun_deg);
$Eq_of_Time_minutes_3 = 2 * $Eq_of_Time_minutes_3;
$Eq_of_Time_minutes_3 = cos($Eq_of_Time_minutes_3);
$Eq_of_Time_minutes_4 = deg2rad($Geom_Mean_Anom_Sun_deg);
$Eq_of_Time_minutes_4 = sin($Eq_of_Time_minutes_4);
$Eq_of_Time_minutes_4 = 4 * $Eccent_Earth_Orbit * $y * $Eq_of_Time_minutes_4 * $Eq_of_Time_minutes_3;
$Eq_of_Time_minutes_5 = deg2rad($Geom_Mean_Anom_Sun_deg);
$Eq_of_Time_minutes_5 = sin($Eq_of_Time_minutes_5);
$Eq_of_Time_minutes_5 = 2 * $Eccent_Earth_Orbit * $Eq_of_Time_minutes_5;
$Eq_of_Time_minutes_6 = deg2rad($Geom_Mean_Long_Sun_deg);
$Eq_of_Time_minutes_6 = 2 * $Eq_of_Time_minutes_6;
$Eq_of_Time_minutes_6 = sin($Eq_of_Time_minutes_6);
$Eq_of_Time_minutes_6 = $y * $Eq_of_Time_minutes_6;

$Eq_of_Time_minutes = $Eq_of_Time_minutes_6 - $Eq_of_Time_minutes_5 + $Eq_of_Time_minutes_4 - $Eq_of_Time_minutes_2 - $Eq_of_Time_minutes_1;
$Eq_of_Time_minutes = 4 * rad2deg($Eq_of_Time_minutes);

$HA_Sunrise_deg_1 = deg2rad($Sun_Declin_deg);
$HA_Sunrise_deg_1 = tan($HA_Sunrise_deg_1);
$HA_Sunrise_deg_2 = deg2rad($ma_latitude);
$HA_Sunrise_deg_2 = tan($HA_Sunrise_deg_2);
$HA_Sunrise_deg_1 = $HA_Sunrise_deg_1 * $HA_Sunrise_deg_2;
$HA_Sunrise_deg_2 = deg2rad($Sun_Declin_deg);
$HA_Sunrise_deg_5 = cos($HA_Sunrise_deg_2);
$HA_Sunrise_deg_3 = deg2rad($ma_latitude);
$HA_Sunrise_deg_3 = cos($HA_Sunrise_deg_3);
$HA_Sunrise_deg_3 = $HA_Sunrise_deg_3 * $HA_Sunrise_deg_5;
$HA_Sunrise_deg_4 = deg2rad('90.833');
$HA_Sunrise_deg_4 = cos($HA_Sunrise_deg_4);
$HA_Sunrise_deg = $HA_Sunrise_deg_4 / $HA_Sunrise_deg_3;
$HA_Sunrise_deg = $HA_Sunrise_deg - $HA_Sunrise_deg_1;
$HA_Sunrise_deg = acos($HA_Sunrise_deg);
$HA_Sunrise_deg = rad2deg($HA_Sunrise_deg);

$Solar_Noon_LST = $time_zone * 60;
$Solar_Noon_LST_1 = 4 * $ma_longitude;
$Solar_Noon_LST = 720 - $Solar_Noon_LST_1 - $Eq_of_Time_minutes + $Solar_Noon_LST;
$Solar_Noon_Hours = floor($Solar_Noon_LST / 60);
$Solar_Noon_Minutes = $Solar_Noon_LST % 60;
$Solar_Noon_LST = $Solar_Noon_LST / 1440;

$Sunrise_Time_LST = $HA_Sunrise_deg*4;
$Sunrise_Time_LST = $Sunrise_Time_LST / 1440;
$Sunrise_Time_LST = $Solar_Noon_LST - $Sunrise_Time_LST;
$Sunrise_Time_Hours = floor($Sunrise_Time_LST * 1440 / 60);
$Sunrise_Time_Minutes = ($Sunrise_Time_LST * 1440) % 60;

$Sunset_Time_LST = $HA_Sunrise_deg*4;
$Sunset_Time_LST = $Sunset_Time_LST / 1440;
$Sunset_Time_LST = $Solar_Noon_LST + $Sunset_Time_LST;
$Sunset_Time_Hours = floor($Sunset_Time_LST * 1440 / 60);
$Sunset_Time_Minutes = ($Sunset_Time_LST * 1440) % 60;

$Sunlight_Duration_minutes = 8* $HA_Sunrise_deg;
 
$True_Solar_Time_min_1 = 60 * $time_zone;
$True_Solar_Time_min_2 = 4 * $ma_longitude;
$True_Solar_Time_min_3 = $Time_past_local_midnight * 1440;
$True_Solar_Time_min = $True_Solar_Time_min_3 + $Eq_of_Time_minutes + $True_Solar_Time_min_2 - $True_Solar_Time_min_1;
$True_Solar_Time_min = fmod($True_Solar_Time_min, 1440);
$True_Solar_Time_Hours = floor($True_Solar_Time_min / 60);
$True_Solar_Time_Minutes = $True_Solar_Time_min % 60;

if ($True_Solar_Time_min/4 < 0)
{
   $Hour_Angle_deg = $True_Solar_Time_min / 4;
   $Hour_Angle_deg = $Hour_Angle_deg +180;
}
else
{
   $Hour_Angle_deg = $True_Solar_Time_min / 4;
   $Hour_Angle_deg = $Hour_Angle_deg -180;
}

$Solar_Zenith_Angle_deg_1 = deg2rad($Hour_Angle_deg);
$Solar_Zenith_Angle_deg_1  = cos($Solar_Zenith_Angle_deg_1 );
$Solar_Zenith_Angle_deg_2 = deg2rad($Sun_Declin_deg);
$Solar_Zenith_Angle_deg_2  = cos($Solar_Zenith_Angle_deg_2 );
$Solar_Zenith_Angle_deg_3 = deg2rad($ma_latitude);
$Solar_Zenith_Angle_deg_3  = cos($Solar_Zenith_Angle_deg_3 );
$Solar_Zenith_Angle_deg_3 = $Solar_Zenith_Angle_deg_1 * $Solar_Zenith_Angle_deg_2 * $Solar_Zenith_Angle_deg_3;
$Solar_Zenith_Angle_deg_4 = deg2rad($Sun_Declin_deg);
$Solar_Zenith_Angle_deg_4 = sin($Solar_Zenith_Angle_deg_4);
$Solar_Zenith_Angle_deg_5 = deg2rad($ma_latitude);
$Solar_Zenith_Angle_deg_5 = sin($Solar_Zenith_Angle_deg_5);
$Solar_Zenith_Angle_deg_5 = $Solar_Zenith_Angle_deg_5  * $Solar_Zenith_Angle_deg_4;   
$Solar_Zenith_Angle_deg = $Solar_Zenith_Angle_deg_5 + $Solar_Zenith_Angle_deg_3;
$Solar_Zenith_Angle_deg = acos($Solar_Zenith_Angle_deg);
$Solar_Zenith_Angle_deg = rad2deg($Solar_Zenith_Angle_deg);

$Solar_Elevation_Angle_deg = 90 - $Solar_Zenith_Angle_deg;

if ($Solar_Elevation_Angle_deg > 85)
{
    $Approx_Atmospheric_Refraction_deg = 0;
}
else
    if ($Solar_Elevation_Angle_deg > 5)
    {
        $Approx_Atmospheric_Refraction_deg = 58.1 / tan(deg2rad($Solar_Elevation_Angle_deg)) -0.07 / pow(tan(deg2rad($Solar_Elevation_Angle_deg)),3) + 0.000086/pow(tan(deg2rad($Solar_Elevation_Angle_deg)),5);
    }
    else
        if ($Solar_Elevation_Angle_deg > -0.575)
        {
            $Approx_Atmospheric_Refraction_deg_1 = -12.79 + $Solar_Elevation_Angle_deg * 0.711;
            $Approx_Atmospheric_Refraction_deg_2 = 103.4 + $Solar_Elevation_Angle_deg * $Approx_Atmospheric_Refraction_deg_1;
            $Approx_Atmospheric_Refraction_deg_3 = -518.2 + $Solar_Elevation_Angle_deg * $Approx_Atmospheric_Refraction_deg_2;
            $Approx_Atmospheric_Refraction_deg = 1735 + $Solar_Elevation_Angle_deg * $Approx_Atmospheric_Refraction_deg_3;

//            $Approx_Atmospheric_Refraction_deg = 1735 + $Solar_Elevation_Angle_deg * (-518.2 + $Solar_Elevation_Angle_deg * (103.4 + $Solar_Elevation_Angle_deg * (-12.79 + $Solar_Elevation_Angle_deg*0.711)));
        }
        else
        {
            $Approx_Atmospheric_Refraction_deg = -20.772 / tan(deg2rad($Solar_Elevation_Angle_deg));
        }
$Approx_Atmospheric_Refraction_deg = $Approx_Atmospheric_Refraction_deg / 3600;
$Solar_Elevation_corrected_for_atm_refraction_deg = $Solar_Elevation_Angle_deg + $Approx_Atmospheric_Refraction_deg;

$Solar_Azimuth_Angle_deg_cw_from_N_1 = deg2rad($Solar_Zenith_Angle_deg);
$Solar_Azimuth_Angle_deg_cw_from_N_1 = sin($Solar_Azimuth_Angle_deg_cw_from_N_1);
$Solar_Azimuth_Angle_deg_cw_from_N_2 = deg2rad($ma_latitude);
$Solar_Azimuth_Angle_deg_cw_from_N_2 = cos($Solar_Azimuth_Angle_deg_cw_from_N_2 );
$Solar_Azimuth_Angle_deg_cw_from_N_1 = $Solar_Azimuth_Angle_deg_cw_from_N_1 * $Solar_Azimuth_Angle_deg_cw_from_N_2;
$Solar_Azimuth_Angle_deg_cw_from_N_3 = deg2rad($Sun_Declin_deg);
$Solar_Azimuth_Angle_deg_cw_from_N_3 = sin($Solar_Azimuth_Angle_deg_cw_from_N_3);
$Solar_Azimuth_Angle_deg_cw_from_N_4 = deg2rad($Solar_Zenith_Angle_deg);
$Solar_Azimuth_Angle_deg_cw_from_N_4 = cos($Solar_Azimuth_Angle_deg_cw_from_N_4);
$Solar_Azimuth_Angle_deg_cw_from_N_5 = deg2rad($ma_latitude);   
$Solar_Azimuth_Angle_deg_cw_from_N_5 = sin($Solar_Azimuth_Angle_deg_cw_from_N_5 );
$Solar_Azimuth_Angle_deg_cw_from_N_5 = $Solar_Azimuth_Angle_deg_cw_from_N_5 * $Solar_Azimuth_Angle_deg_cw_from_N_4;
$Solar_Azimuth_Angle_deg_cw_from_N_5 = $Solar_Azimuth_Angle_deg_cw_from_N_5 - $Solar_Azimuth_Angle_deg_cw_from_N_3;   
$Solar_Azimuth_Angle_deg_cw_from_N = acos($Solar_Azimuth_Angle_deg_cw_from_N_5 / $Solar_Azimuth_Angle_deg_cw_from_N_1);   

if ($Hour_Angle_deg > 0)
{
   $Solar_Azimuth_Angle_deg_cw_from_N = rad2deg($Solar_Azimuth_Angle_deg_cw_from_N);
   $Solar_Azimuth_Angle_deg_cw_from_N = $Solar_Azimuth_Angle_deg_cw_from_N + 180;
   $Solar_Azimuth_Angle_deg_cw_from_N = fmod($Solar_Azimuth_Angle_deg_cw_from_N,360);
}
else
{
   $Solar_Azimuth_Angle_deg_cw_from_N = rad2deg($Solar_Azimuth_Angle_deg_cw_from_N);
   $Solar_Azimuth_Angle_deg_cw_from_N = 540 - $Solar_Azimuth_Angle_deg_cw_from_N;
   $Solar_Azimuth_Angle_deg_cw_from_N = fmod($Solar_Azimuth_Angle_deg_cw_from_N,360);
}

$Solar_Azimuth_Angle_deg = round($Solar_Azimuth_Angle_deg_cw_from_N);

// Associé le point cardinal à l'angle
if ($Solar_Azimuth_Angle_deg < '11.25' )
   { $Solar_Cardinal_point = 1;}      // NORD
   
if ($Solar_Azimuth_Angle_deg >= '11.25')
   { $Solar_Cardinal_point = 2;}      // NORD-NORD-EST
   
 if ($Solar_Azimuth_Angle_deg >= '33.75')
   {$Solar_Cardinal_point = 3;}      //NORD-EST
   
 if ($Solar_Azimuth_Angle_deg >= '56.25')
   {$Solar_Cardinal_point = 4;}      //EST-NORD-EST
   
 if ($Solar_Azimuth_Angle_deg >= '67.5')
   {$Solar_Cardinal_point = 5;}      //EST
   
 if ($Solar_Azimuth_Angle_deg >= '101.25')
   {$Solar_Cardinal_point = 6;}      //EST-SUD-EST
   
 if ($Solar_Azimuth_Angle_deg >= '123.75')
   {$Solar_Cardinal_point = 7;}      //SUD-EST
   
 if ($Solar_Azimuth_Angle_deg >= '146.25')
   {$Solar_Cardinal_point = 8;}      //SUD-SUD-EST
   
 if ($Solar_Azimuth_Angle_deg >= '168.75')
   {$Solar_Cardinal_point = 9;}      //SUD
   
 if ($Solar_Azimuth_Angle_deg >= '191.25')
   {$Solar_Cardinal_point = 10;}      //SUD-SUD-OUEST
   
 if ($Solar_Azimuth_Angle_deg >= '213.75')
   {$Solar_Cardinal_point = 11;}      //SUD-OUEST
   
 if ($Solar_Azimuth_Angle_deg >= '236.25')
   {$Solar_Cardinal_point = 12;}      //OUEST-SUD-OUEST
   
 if ($Solar_Azimuth_Angle_deg >= '258.75')
   {$Solar_Cardinal_point = 13;}      //OUEST
   
 if ($Solar_Azimuth_Angle_deg >= '281.25')
   {$Solar_Cardinal_point = 14;}      // OUEST-NORD-OUEST
   
 if ($Solar_Azimuth_Angle_deg >= '303.75')
   {$Solar_Cardinal_point = 15;}      // NORD-OUEST
   
 if ($Solar_Azimuth_Angle_deg >= '326.25')
   {$Solar_Cardinal_point = 16;}      //NORD-NORD-OUEST

   
$content_type = 'text/xml';
sdk_header($content_type);

echo "<Data>";
echo "<Parametres>";
echo "<Latitude>".$ma_latitude."</Latitude>";
echo "<Longitude>".$ma_longitude."</Longitude>";
echo "</Parametres>";
echo "<Soleil>";
printf("<True_Solar_Time>%02dH%02d</True_Solar_Time>", $True_Solar_Time_Hours, $True_Solar_Time_Minutes);
printf("<Sunrise_Time>%02dH%02d</Sunrise_Time>", $Sunrise_Time_Hours, $Sunrise_Time_Minutes);
printf("<Solar_Noon>%02dH%02d</Solar_Noon>", $Solar_Noon_Hours, $Solar_Noon_Minutes);
printf("<Sunset_Time>%02dH%02d</Sunset_Time>", $Sunset_Time_Hours, $Sunset_Time_Minutes);
echo "<Sunlight_Duration_minutes_round>".round($Sunlight_Duration_minutes)."</Sunlight_Duration_minutes_round>";
echo "<Solar_Elevation>".$Solar_Elevation_Angle_deg."</Solar_Elevation>";
echo "<Solar_Elevation_corrected_for_atm_refraction>".$Solar_Elevation_corrected_for_atm_refraction_deg."</Solar_Elevation_corrected_for_atm_refraction>";
echo "<Solar_Azimuth>".$Solar_Azimuth_Angle_deg_cw_from_N."</Solar_Azimuth>";
echo "<Solar_Azimuth_round>".$Solar_Azimuth_Angle_deg."</Solar_Azimuth_round>";
echo "<Solar_Cardinal_point>".$Solar_Cardinal_point."</Solar_Cardinal_point>";
echo "</Soleil>";
echo "</Data>";
?>


Merci en tous cas à l'auteur initial qui a fait le plus dur !!!
timetre
 
Messages : 77
Inscription : 15 Juin 2017

Re: calcul position du soleil

Messagepar gougol69 » 05 Sep 2017 20:15

Merci @timetre

Les valeurs sont bonnes !!

Plus qu'a rajouter ce script sur le nouveau store scripts !!!
gougol69
 
Messages : 19
Inscription : 14 Jan 2015

Re: calcul position du soleil

Messagepar timetre » 12 Sep 2017 06:59

Yep, je vais m'occuper de le packager comme il faut ...
timetre
 
Messages : 77
Inscription : 15 Juin 2017

Re: calcul position du soleil

Messagepar technoman63 » 12 Sep 2017 08:28

c'est clair sur le store ça sera le top car la on sait plus trop ou on en ai des mises à jour ;)
Mes Scripts eedomus : windDirection, rainTrend

Blog: https://devotics.fr
technoman63
 
Messages : 648
Inscription : 09 Avr 2015

Re: [Store] calcul position du soleil

Messagepar timetre » 25 Jan 2018 16:12

Ca aussi c'est dans le store ;)
timetre
 
Messages : 77
Inscription : 15 Juin 2017

Re: calcul position du soleil

Messagepar TJL21 » 26 Jan 2018 19:12

@ bubu => puis-je te demander de mettre un exemple de programmation (pour Ete+chaleur+soleil qui tape par exemple) stp?
En fait, je ne vois pas trop comment utiliser les paramètres élévation, azimuth et position... ta règle me permettrait sans doute de mieux comprendre
TJL21
 
Messages : 141
Inscription : 15 Jan 2018

Re: calcul position du soleil

Messagepar timetre » 26 Jan 2018 20:02

Voilà un exemple pour fermer un de mes volets dès que le soleil commence à taper sur cette façade
Image

Évidemment pour trouver que c'est 131°, il faut avoir installé le device et surveiller sa valeur jusqu'à trouver le moment ou ça coïncide ;)

Le gros avantage, c'est que ce genre de pilotage reste fiable au cours de la saison alors que les jours rallongent ou raccourcissent et qu'une programmation par horaire deviendrait imprécise ...

Voilà un deuxième exemple où je surveille plutôt l'élévation du soleil. Dès qu'il passe derrière la colline qui est en face de chez moi, il ne tape plus sur la façade et je peux ouvrir les volets ;)
Image

La encore, si je me base juste sur l'heure ou sur l'heure de coucher du soleil "officielle", je suis dedans car moi j'ai une colline devant ... Chez moi le soleil se couche quand il passe sous 5°.

Le dernier capteur (position) est une variante de l'azimuth mais ramené en points cardinaux (Sud, sud-est, sud-sud-est, etc ...) plus grossier ... moins précis (pas au degrés près) ... Ça peut être suffisant pour certains ...

Voilà, j'espère que ça t'éclaire :)

P.s. c'est moi qui ai repris le script original et l'ai corrigé et packagé pour le store.
timetre
 
Messages : 77
Inscription : 15 Juin 2017

PrécédentSuivant

Retour vers Scripts & Périphériques du store

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 22 invité(s)

cron