Aller au contenu

Données météo SmartHome

Temps de lecture 9 minutes

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
Programme - W_Daten - Demande de données météorologiques

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_LDU du 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_region du 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_name du 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_Lat du 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_Lon du 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_vis du 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_act du type chaîne de caractères
  • W_pression_air_ancienne du type chaîne de caractères
  • W_Tendance de la pression atmosphérique du 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_chill du 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_UV du type chaîne de caractères
  • W_LSF du 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_WdSpd du 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_kmh du type nombre
  • W_Wind_knh du 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_dir du 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_rchtg du 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_description du 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_clouds du 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écipitations du 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_elevation du type Nombre
  • sonne_azimut du 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 :

Programme - Détermination de l'élévation / de l'azimut

Variables à créer :

  • sonne_azimut du type nombre
  • sonne_elevation du type nombre

Code :

! Obtenir la latitude
real phi = system.Latitude() ;
phi = 0.017453292 * phi ;


! Conversion en radians
! calculer sin_phi et cos_phi avec la série de taylor
temp 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 minutes
entier 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_tau
tau 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 delta
entier 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_delta
temp = 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 morceaux
boolé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_azimut
sin_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 morceaux
boolean 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ème
if (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) ;

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

fr_FRFrench