Table des matières
Mise à jour – 20 janvier 2023
Saisir les données météorologiques avec SmartHome et les visualiser sur le téléphone portable ou la tablette via AIO Creator n'est en général pas une nécessité, mais un "nice to have".
Le service météorologique en ligne weatherstack.com propose à cet effet - gratuitement et de manière limitée - jusqu'à 250 interrogations par mois. Si l'on veut vraiment avoir des données météorologiques actuelles, il faut choisir le pack standard. 50.000 interrogations permettent des intervalles de quelques minutes.
Les autres forfaits disponibles se distinguent principalement par le nombre de demandes et les prévisions météorologiques à 7 ou 14 jours.
Les données suivantes sont incluses dans tous les forfaits :
- Latitude et longitude
- Lieu
- Région
- Pays
- Fuseau horaire
- Heure et date locales
- Décalage UTC
- Heure actuelle de collecte des données
- Température de l'air
- Description du temps
- Vitesse du vent
- Direction du vent numérique / géographique
- Pression atmosphérique
- Quantité de pluie
- Humidité
- Densité de la nébulosité
- Chill température
- Indice UV
- Vue
L'inscription, quel que soit le forfait, nécessite les informations habituelles et les données de paiement. Un abonnement annuel, contrairement à un abonnement mensuel, bénéficie d'une remise de 20%.
Une fois cette procédure terminée avec succès, on obtient un code API (Application Programming Interface) que l'on copie dans l'URL de la requête. La réponse est une sortie XML qui contient les catégories de données et les valeurs susmentionnées. Les données sont extraites par des scripts appropriés et stockées dans des variables. Celles-ci peuvent ensuite être utilisées pour la visualisation dans l'AIO Creator.
Une description détaillée de tous les paramètres possibles dans la sortie XML, ainsi que les possibilités de requêtes optionnelles contenues dans les packs plus chers, y compris divers exemples de code, ici consultable.
programme
En raison du grand nombre de données, le programme est assez volumineux. C'est pourquoi les différentes sections sont présentées ici de manière séquentielle. Tous les extraits de code peuvent finalement être regroupés en un seul programme.
Outre les données susmentionnées, le programme calcule des données supplémentaires et les met à disposition pour la visualisation :
- Elévation et azimut du soleil
- Recommandation de facteur de protection solaire

En-tête du programme
L'en-tête ne contient que l'URL, qui doit être complétée par la clé API, représentée ici par xxx, ainsi que par le lieu (en texte clair ou, à chaque fois séparé par une virgule, comme indication de latitude et de longitude, marqué par yyy) :
var url = "http://api.weatherstack.com/current?access_key=xxx&query=yyy" ;
Conversion US en DE Format de l'heure
Comme le tarif libre et le tarif standard ne permettent pas de choisir la langue d'affichage, et donc uniquement le format d'heure AM / PM, la conversion s'effectue ici en 24 heures.
Variable à créer :
W_LDUdu type chaîne de caractères
Code :
! Conversion AM/PM - Enregistrer dans W_LDU
var posValueStart;
var posValueEnd;
var posStart;
var posEnd; chaîne stderr ; chaîne sortie standard ;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr) ;
WriteLine(stdout);
string wetter_xml = stdout ;
chaîne de caractères mot = 'observation_time" :"' ;
integer word_laenge = word.Length() ;
integer word_position = wetter_xml.Find(word) ;
string daten = wetter_xml.Substr((word_position + word_longueur), 5) ;
integer word_position = daten.Find(word) ;
données = données.Substr(0, (word_position -2)) ;
chaîne de caractères mot = 'observation_time" :"' ;
integer word_laenge = word.Length() ;
integer word_position = wetter_xml.Find(word) ;
string PM = wetter_xml.Substr((word_position + word_longueur +6), 2) ;
integer word_position = PM.Find(mot) ;
PM = PM.Substr(0, (word_position -2)) ;
WriteLine("AM/PM");WriteLine(PM) ;
chaîne de caractères mot = 'observation_time" :"' ;
integer word_laenge = word.Length() ;
integer word_position = wetter_xml.Find(word) ;
string HH = wetter_xml.Substr((word_position + word_laenge) + 1, 1) ;
integer word_position = HH.Find(word) ;
HH = HH.Substr(0, (word_position -2)) ;
WriteLine("HH");WriteLine(HH) ;
chaîne de caractères mot = 'observation_time" :"' ;
integer word_laenge = word.Length() ;
integer word_position = wetter_xml.Find(word) ;
string MM = wetter_xml.Substr((word_position + word_longueur) +3, 2) ;
integer word_position = MM.Find(mot) ;
MM = MM.Substr(0, (word_position -2)) ;
WriteLine("MM");WriteLine(MM) ;
if (PM == "PM")
{
integer Diff = 12 ;
WriteLine("Diff");WriteLine(Diff) ;
var HH_i = HH.ToInteger() ;
entier H = (HH_i + Diff) ;
WriteLine("HHi + Diff est = H)");WriteLine(H) ;
string HHMM = H #" :";
WriteLine("H_+ : ");WriteLine(HHMM) ;
chaîne HM = HHMM # MM ;
WriteLine("HH_+12+MM");WriteLine(HM) ;
dom.GetObject("W_LDU").State(HM) ;
}
autre
{
WriteLine("Données_LDU");WriteLine(données) ;
dom.GetObject("W_LDU").State(données) ;
}
Pays - code du pays
Le code pays est également édité en anglais et converti ici en code international. D'autres pays peuvent être ajoutés selon ce modèle si nécessaire. Le pays actuel résulte automatiquement du choix de la ville par Weatherstack.
Variable à créer :
W_country_code du type chaîne de caractères
Code :
! code_pays
pos = 0 ;
posStart = 'pays" :"' ;
posEnd = '", "région' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string country_code = stdout.Substr(posValueStart, posValueEnd) ;
if (country_code == "Germany")
{
string country_code = "DE" ;
}
if (country_code == "Sweden")
{
string country_code = "SE" ;
}
WriteLine("code_pays");WriteLine(code_pays) ;
dom.GetObject("W_country_code").State(code_pays) ;
Région
La région désigne, par exemple en Allemagne, la "Basse-Saxe" et est également déterminée automatiquement par Weatherstack.
Variable à créer :
W_regiondu type chaîne de caractères
Code :
! Région
pos = 0 ;
posStart = 'région" :"' ;
posEnd = '", "lat' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string region = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("région");WriteLine(région) ;
dom.GetObject("W_region").State(région) ;
Ville
Lorsque la ville est saisie, Weatherstack détermine automatiquement les données de longitude et de latitude correspondantes, tandis que les données géographiques saisies permettent de déterminer la ville.
Variable à créer :
W_city_namedu type chaîne de caractères
Code :
! nom_ville
pos = 0 ;
posStart = 'nom" :"' ;
posEnd = '", "pays' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string city_name = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("nom_ville");WriteLine(nom_ville) ;
dom.GetObject("W_city_name").State(nom_ville) ;
Latitude - géogr. Latitude
Variable à créer :
W_Latdu type chaîne de caractères
Code :
! Lat
pos = 0 ;
posStart = 'query" : "Lat' ;
posEnd = 'et Lon' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string Lat = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("Lat");WriteLine(Lat) ;
dom.GetObject("W_Lat").State(Lat) ;
Longitude - longitude géographique
Variable à créer :
W_Londu type chaîne de caractères
Code :
! Lon
pos = 0 ;
posStart = 'et Lon' ;
posEnd = '", "langue' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string Lon = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("Lon");WriteLine(Lon) ;
dom.GetObject("W_Lon").State(Lon) ;
visibilité - visibility
Variable à créer :
W_visdu type chaîne de caractères
Code :
! Visibilité
pos = 0 ;
posStart = 'visibility":' ;
posEnd = ', "is_day' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string vis_daten = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("données_vis");WriteLine(données_vis) ;
dom.GetObject("W_vis").State(données_vis) ;
Pression atmosphérique et tendance
En plus de la pression atmosphérique mise à disposition, ce script détermine la tendance de la pression atmosphérique en enregistrant une valeur de mesure comme "actuelle" et une valeur précédente comme "ancienne". Les deux sont comparées l'une à l'autre, ce qui donne la tendance.
Variable à créer :
W_pression_air_actdu type chaîne de caractèresW_pression_air_anciennedu type chaîne de caractèresW_Tendance de la pression atmosphériquedu type chaîne de caractères
Code :
! Impression
var W_mb_alt ;
var W_mb_akt ;
pos = 0 ;
posStart = 'pression":' ;
posEnd = ', "precip' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
données = stdout.Substr(posValueStart, posValueEnd);WriteLine(données) ;
real W_mb_akt = daten.ToInteger();WriteLine("W_mb_akt");WriteLine(W_mb_akt) ;
dom.GetObject("W_Air_akt").State(W_mb_akt) ;
W_mb_alt = dom.GetObject("W_pression_atmosphérique").Value();WriteLine(W_mb_alt) ;
if (W_mb_akt > W_mb_alt)
{
dom.GetObject("W_pression_air_ancienne").State(W_mb_akt) ;
dom.GetObject("W_TendancePressionAir").State("S") ;
}
if (W_mb_akt < W_mb_alt)
{
dom.GetObject("W_pression_air_ancienne").State(W_mb_akt) ;
dom.GetObject("W_TendancePressionAir").State("F") ;
}
if (W_mb_akt == W_mb_alt)
{
dom.GetObject("W_pression_air_ancienne").State(W_mb_akt) ;
dom.GetObject("W_TendancePressionAir").State("N") ;
}
Chill température
Le refroidissement éolien dépend de la vitesse du vent et de la température. Dans les sports nautiques, l'effet du refroidissement par évaporation dû aux embruns vient encore s'ajouter (mais il n'est pas pris en compte ici). Le chill désigne la température perçue qui, dans un environnement très froid, peut atteindre une fois et demie la température négative par rapport à la température réelle et entraîner des gelures rapides.
Variable à créer :
W_chilldu type chaîne de caractères
Code :
! Chill
pos = 0 ;
posStart = 'feelslike":' ;
posEnd = ', "uv_index' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string app_temp_data = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("app_temp_données");WriteLine(app_temp_données) ;
dom.GetObject("W_chill").State(app_temp_data) ;
Recommandation de protection contre les UV et la lumière
L'exposition aux UV déterminée sur la base de l'indice UV résulte en une recommandation d'application de mesures de photoprotection, si nécessaire.
Variable à créer :
W_UVdu type chaîne de caractèresW_LSFdu type chaîne de caractères
Code :
! UV
pos = 0 ;
posStart = 'uv_index":' ;
posEnd = ', "visibility' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var uv_data = stdout.Substr(posValueStart, posValueEnd) ;
dom.GetObject("W_UV").State(uv_daten) ;
données = uv_data.Substr(0, (word_position -2)) ;
nombre réel = données.ToInteger() ;
WriteLine("UV nombre");WriteLine(nombre) ;
string LSF = "" ;
if (nombre = "3") && (nombre = "6") && (nombre = "8") && (nombre = "10") {LSF = "DOIT" ;}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF) ;
Vitesse du vent
Variable à créer :
W_WdSpddu type nombre
Code :
! Vitesse du vent
pos = 0 ;
posStart = 'wind_speed":' ;
posEnd = ', "wind_degree' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var wind_spd_daten = stdout.Substr(posValueStart, posValueEnd) ;
réel x = wind_spd_daten.ToFloat() ;
dom.GetObject("W_WdSpd").State(x) ;
Vitesse du vent - Conversions
Comme il existe différentes mesures de la vitesse du vent selon les régions, les pays et les applications, voici la conversion de m/s en km/h, nœuds et Beaufort.
Variable à créer :
W_Wind_kmhdu type nombreW_Wind_knhdu type nombre- W_Wind_Bft de type nombre
Code :
réel W_Wind_kmh = (wind_spd_daten.ToFloat() * 3.6);WriteLine("W_Wind_kmh");WriteLine(W_Wind_kmh) ;
dom.GetObject("W_Wind_kmh").State(W_Wind_kmh) ;
réel W_Wind_knh = (W_Wind_kmh / 1.852);WriteLine("W_Wind_knh");WriteLine(W_Wind_knh) ;
dom.GetObject("W_Wind_knh").State(W_Wind_knh) ;
if (x < 0.30)
{
dom.GetObject("W_Wind_Bft").State(0) ;
}
if ((0.29 < x) && (x < 1.51))
{
dom.GetObject("W_Wind_Bft").State(1) ;
}
if ((1.59 < x) && ( x < 3.31))
{
dom.GetObject("W_Wind_Bft").State(2) ;
}
if ((3.39 < x) && ( x < 5.41))
{
dom.GetObject("W_Wind_Bft").State(3) ;
}
if ((5.49 < x) && ( x < 7.91))
{
dom.GetObject("W_Wind_Bft").State(4) ;
}
if ((7.99 < x) && (x < 10.71))
{
dom.GetObject("W_Wind_Bft").State(5) ;
}
if ((10.79 < x) && (x < 13.81))
{
dom.GetObject("W_Wind_Bft").State(6) ;
}
if ((12.89 < x) && (x < 17.11))
{
dom.GetObject("W_Wind_Bft").State(7) ;
}
if ((17.19 < x) && (x < 20.71))
{
dom.GetObject("W_Wind_Bft").State(8) ;
}
if ((20.79 < x) && (x < 24.41))
{
dom.GetObject("W_Wind_Bft").State(9) ;
}
if ((24.49 < x) && (x < 28.41))
{
dom.GetObject("W_Wind_Bft").State(10) ;
}
if ((28.49 < x) && (x < 32.61))
{
dom.GetObject("W_Wind_Bft").State(11) ;
}
if (x > 32.6)
{
dom.GetObject("W_Wind_Bft").State(12) ;
}
Vitesse du vent - risque de gelures
Les personnes qui se déplacent dans des zones très froides reçoivent avec ce script un avertissement si, en raison de la vitesse du vent et de la température extérieure ressentie, il existe un risque de gelures, à moins qu'elles n'utilisent des vêtements de protection appropriés.
Le calcul part du principe qu'une exposition cutanée de 30 minutes ou moins entraîne une baisse de la température de la peau à -4,8 °C, ce qui provoque des gelures chez 5% des personnes.
Variable à créer :
- W_Danger_du_vent de type booléen
Code :
if (((app_temp_data == -27.2) && (8 > W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh W_Wind_kmh <60.1))
{
dom.GetObject("W_Wind_Gefahr").State(true) ;
}
autre
{
dom.GetObject("W_Wind_Gefahr").State(false) ;
}
Direction du vent (géographique)
Variable à créer :
W_wind_dirdu type chaîne de caractères
Code :
! Direction du vent géographique
pos = 0 ;
posStart = 'wind_dir" :"' ;
posEnd = '", "pression' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string wind_dir_daten = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("W_wind_dir");WriteLine(wind_dir_daten) ;
dom.GetObject("W_wind_dir").State(wind_dir_daten) ;
Direction du vent (numérique)
Variable à créer :
W_Wind_rchtgdu type chaîne de caractères
Code :
! Direction du vent numérique
pos = 0 ;
posStart = 'wind_degree":' ;
posEnd = ', "wind_dir' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string W_wind_rchtg = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("W_wind_rchtg");WriteLine(W_wind_rchtg) ;
dom.GetObject("W_wind_rchtg").State(W_wind_rchtg) ;
Couverture nuageuse
La nébulosité est également rédigée en anglais par Weatherstack, c'est pourquoi la traduction en français est effectuée ici.
Variable à créer :
W_descriptiondu type chaîne de caractères
Code :
! Nuage Description
pos = 0 ;
posStart = 'weather_descriptions" :["' ;
posEnd = '"], "wind_speed' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string clouds_description = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("clouds_description_EN");WriteLine(clouds_description) ;
if (clouds_description == "Nuageux")
{
string clouds_description_FR = "Nuageux" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Light rain")
{
string clouds_description_FR = "Légère pluie" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Douche de pluie légère")
{
string clouds_description_FR = "Légères averses" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Light drizzle")
{
string clouds_description_FR = "Bruine" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Mis")
{
string clouds_description_FR = "Brume" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Pluies de neige légère")
{
string clouds_description_FR = "Légères averses de neige
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Sunny")
{
string clouds_description_FR = "Clair" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Overcast")
{
string clouds_description_FR = "Couvert" ;
WriteLine("clouds_description");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Partly cloudy")
{
string clouds_description_FR = "Partiellement nuageux" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Clear")
{
string clouds_description_FR = "Clair" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Fog")
{
string clouds_description_FR = "Brouillard" ;
WriteLine("clouds_description_FR");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Patchy rain possible")
{
string clouds_description_FR = "Légère pluie possible" ;
WriteLine("clouds_description");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
if (clouds_description == "Pluie modérée")
{
string clouds_description_FR = "Précipitations modérées
WriteLine("clouds_description");WriteLine(clouds_description_FR) ;
dom.GetObject("W_description").State(clouds_description_FR) ;
}
Couverture nuageuse
Variable à créer :
W_cloudsdu type chaîne de caractères
Code :
! Couverture nuageuse
pos = 0 ;
posStart = 'cloudcover":' ;
posEnd = ', "feelslike' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string clouds_daten = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("données_clouds");WriteLine(données_clouds) ;
dom.GetObject("W_clouds").State(données_clouds) ;
Prévision de pluie
Variable à créer :
W_Précipitationsdu type chaîne de caractères
Code :
! Prévision de pluie
var x ;
pos = 0 ;
posStart = 'precip":' ;
posEnd = ', "humidity' ;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string precip = stdout.Substr(posValueStart, posValueEnd) ;
WriteLine("Précipitations");WriteLine(precip) ;
dom.GetObject("W_précipitations").State(precip) ;
Elévation - Azimut
Le script a été écrit par phare radio et l'a envoyé au Forum Homematic à la page 10 du fil de discussion en lien.
Deux variables système doivent être créées :
sonne_elevationdu type Nombresonne_azimutdu type Nombre
Pourquoi quatre minutes ? Parce que la Terre effectue son cercle de 360° autour du soleil une fois en 24 heures. 360° / 24h = 15° en une heure, ce qui correspond à 60 minutes / 15° = 4 minutes.
Le script doit être utilisé indépendamment des scripts précédents ou du programme correspondant, si l'intervalle de mise à jour est différent de 4 minutes.
Programme :

Variables à créer :
sonne_azimutdu type nombresonne_elevationdu type nombre
Code :
! Obtenir la latitudereal phi = system.Latitude() ;
phi = 0.017453292 * phi ;
! Conversion en radians
! calculer sin_phi et cos_phi avec la série de taylortemp réel = phi * phi ;
sin_phi réel =phi * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)) ;
! augmentation du sinus
cos_phi réel = (temp *temp *0.0416667) + 1.0 - (temp * 0.5) ;
! Augmentation du cosinus
! Calcul du temps solaire, tous les temps sont en minutesentier temps_min = system.Date("%M").ToInteger() + 60system.Date("%H").ToInteger() ; entier début_min = system.SunriseTime("%M").ToInteger() + 60system.SunriseTime("%H").ToInteger() ;
entier fin_du_jour = system.SunsetTime("%M").ToInteger() + 60* system.SunsetTime("%H").ToInteger() ;
integer heure solaire = heure_min + 720 - 0.5 *(début_min_journée + fin_min_journée) ;
if (heure solaire > 1440) {heure solaire = heure solaire -1440;}
if (heure solaire 720) {heure solaire =heure solaire - 720 ; après-midi = true ; }
else {temps solaire =720 -temps solaire;}! Calcul de sin_tau et cos_tautau réel = 0.00436332313 * temps solaire ; ! 15/60 * pi /180 * temps solaire [0 < tau < pi ] if (tau < 1.570796327) {temp = tau * tau ; real sin_tau =tau * ((temp * temp * 0.0083334) +1.0 - (temp *0.1666667)) ; tau= 1.570796327 - tau ; temp = tau * tau ; cos_tau réel =tau * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));} else {real tau1 =3.141592654 - tau ; temp = tau1 * tau1 ; real sin_tau =tau1 * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)) ; tau = tau - 1.570796327 ; temp = tau * tau ; cos_tau réel = (tau) (-1.0) ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));}
! Calcul du deltaentier nombre de jours = system.Date("%j").ToInteger() ; nombre de jours = nombre de jours +10 ; if (nombre de jours > 365) {nombre de jours = nombre de jours - 365;}
if (nombre de jours 91) && (nombre de jours 183) && (nombre de jours 274) && (nombre de jours < 366)) {nombre de jours = 365 - nombre de jours ; jour réel = 0.0172142 *nombre de jours ; temp = jour * jour ; delta réel = (-0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));}! calcul sin_delta, cos_deltatemp = delta * delta ; sin_delta réel =delta * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)) ; !ajustement du sinus cos_delta réel = (temp *temp *0.0416667) + 1.0 - (temp * 0.5) ;
! Augmentation du cosinus
! Calcul de tan_delta avec linéarisation de tan par morceauxbooléen vsigne = true ; if (delta=0.2618) {tan_delta = (1.1822*delta) - 0.0416;}
if (vsigne == false) {tan_delta = (-1.0) * tan_delta;}! Calcul de sin_elevation et tan_azimutsin_elevation réel = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau) ;
temp = sin_elevation * sin_elevation ;
réelle élévation_du_soleil = sin_elevation * (1.0 + (0.1666667 * temp) + (0.075 * temp * temp)) ;
sonne_elevation = 57.29577951 * sonne_elevation ;
réel dénominateur = (sin_phi*cos_tau) - (cos_phi * tan_delta) ;
if (dénominateur < 0.0) {boolean plus180 = true;} real tan_azimut = sin_tau / dénominateur ;
! Calcul de sonne_azimut avec linéarisation de l'arctan par morceauxboolean signe = true ; if (tan_azimut =0.2679)&&(tan_azimut = 0.5774)&&(tan_azimut = 1.0)&&(tan_azimut = 1.3032)&&(tan_azimut = 1.7321)&&(tan_azimut = 2.4142)&&(tan_azimut = 2.9459)&&(tan_azimut = 3.7321)&&(tan_azimut = 5.0)&&(tan_azimut = 7.0)&&(tan_azimut = 12.0)&&(tan_azimut = 20.0)&&(tan_azimut = 50.0) {sonne_azimut = (0.000099983* tan_azimut) + 1.54579974;}
if (sonne_azimut> 1.5707963278) {sonne_azimut = 1.5707963278;}
if (signe == false) {sonne_azimut = (-1.0) * sonne_azimut;}
sonne_azimut = 57.29577951 * sonne_azimut ;
if (plus180 == true) {sonne_azimut = sonne_azimut + 180.0;}! Correction en fonction de l'heure du jour et enregistrement des valeurs dans les variables systèmeif (après-midi == false)
{soleil_azimut = 180.0 - soleil_azimut ; heure solaire = 720 - heure solaire;}
autre
{soleil_azimut = soleil_azimut + 180.0;temps solaire = 720 + temps solaire;}
sonne_azimut = 0.1 ((sonne_azimut10.0) .ToInteger()) ;
sonne_elevation = 0.1 ((sonne_elevation10.0) .ToInteger()) ;
dom.GetObject("sonne_elevation").State(sonne_elevation) ;
dom.GetObject("sonne_azimut").State(sonne_azimut) ;