Sommario
Aggiornato – Gennaio 20, 2023
Registrare i dati meteorologici con SmartHome e visualizzarli sul cellulare o sul tablet tramite AIO Creator non è in genere una necessità, ma è una cosa piacevole da avere.
Il servizio meteo online weatherstack.com offre fino a 250 interrogazioni al mese - gratuitamente e in misura limitata. Se volete davvero dati meteo aggiornati, dovreste scegliere il pacchetto standard. 50.000 query consentono intervalli di un minuto.
Gli altri pacchetti disponibili si differenziano principalmente per il numero di richieste e per le previsioni meteo di 7 o 14 giorni.
I seguenti dati sono inclusi in tutti i pacchetti:
- Longitudine e latitudine geografica
- Posizione
- Regione
- Paese
- Fuso orario
- Ora e data locale
- Offset UTC
- Ora attuale di raccolta dei dati
- Temperatura dell'aria
- Descrizione del tempo
- Velocità del vento
- Direzione del vento numerica / geografica
- Pressione dell'aria
- Precipitazioni
- Umidità
- Densità delle nuvole
- Temperatura di raffreddamento
- Indice UV
- Vista
La registrazione, indipendentemente dal pacchetto, richiede le informazioni e i dettagli di pagamento abituali. L'abbonamento annuale, rispetto a quello mensile, è scontato con 20%.
Una volta completata con successo questa procedura, si riceve un cosiddetto codice API (Application Programming Interface), che viene copiato nell'url della query. La risposta è un output XML contenente le categorie di dati e i valori di cui sopra. I dati vengono estratti con appositi script e memorizzati in variabili. Queste possono essere utilizzate per la visualizzazione in AIO Creator.
Una descrizione dettagliata di tutti i parametri possibili nell'output XML, nonché delle opzioni di interrogazione opzionali incluse nei pacchetti più costosi, con vari esempi di codice, Qui visualizzabile.
programma
Il programma è piuttosto esteso a causa della grande quantità di dati. Le singole sezioni sono quindi elencate in sequenza. Tutti i frammenti di codice possono essere combinati in un unico programma.
Oltre ai dati sopra menzionati, il programma calcola altri dati e li rende disponibili per la visualizzazione:
- Elevazione e azimut del sole
- Raccomandazione sul fattore di protezione dalla luce

Intestazione del programma
L'intestazione contiene solo l'URL, che deve essere completato dalla chiave API, qui indicata come xxx, e dalla posizione (in testo semplice o, separata da una virgola, come longitudine e latitudine, etichettata come yyy):
var url = "http://api.weatherstack.com/current?access_key=xxx&query=yyy";
Conversione del formato orario da US a DE
Poiché nella tariffa libera e standard non è possibile selezionare la lingua di visualizzazione e quindi è disponibile solo il formato orario AM/PM, questo viene convertito nel formato 24 ore.
Variabile da creare:
W_LDU
del tipo stringa
Codice:
! Conversione AM/PM - Salvataggio in W_LDU
var posValueStart;
var posValueEnd;
var posStart;
var posEnd; stringa standard; stringa stdout;
system.Exec("wget -q -O - ''#url#''", &stdout, &stderr);
WriteLine(stdout);
stringa wetter_xml = stdout;
stringa word = "tempo_di_osservazione":"";
intero word_length = word.Length();
intero word_position = wetter_xml.Find(word);
string data = wetter_xml.Substr((word_position + word_laenge), 5);
intero word_position = data.Find(word);
data = data.Substr(0, (word_position -2));
stringa word = "tempo_di_osservazione":"";
intero word_length = word.Length();
intero word_position = wetter_xml.Find(word);
stringa PM = wetter_xml.Substr((word_position + word_laenge +6), 2);
intero word_position = PM.Find(word);
PM = PM.Substr(0, (word_position -2));
WriteLine("AM/PM");WriteLine(PM);
stringa word = "tempo_di_osservazione":"";
intero word_length = word.Length();
intero word_position = wetter_xml.Find(word);
stringa HH = wetter_xml.Substr((word_position + word_laenge) + 1, 1);
intero word_position = HH.Find(word);
HH = HH.Substr(0, (word_position -2));
WriteLine("HH");WriteLine(HH);
stringa word = "tempo_di_osservazione":"";
intero word_length = word.Length();
intero word_position = wetter_xml.Find(word);
stringa MM = wetter_xml.Substr((word_position + word_laenge) +3, 2);
intero word_position = MM.Find(word);
MM = MM.Substr(0, (word_position -2));
WriteLine("MM");WriteLine(MM);
se (PM == "PM")
{
intero Diff = 12;
WriteLine("Diff");WriteLine(Diff);
var HH_i = HH.ToInteger();
intero H = (HH_i + Diff);
WriteLine("HHi + Diff è = H)");WriteLine(H);
stringa HHMM = H #":";
WriteLine("H_+ : ");WriteLine(HHMM);
stringa HM = HHMM # MM;
WriteLine("HH_+12+MM");WriteLine(HM);
dom.GetObject("W_LDU").State(HM);
}
altro
{
WriteLine("LDU_daten");WriteLine(daten);
dom.GetObject("W_LDU").State(data);
}
Paese - Codice paese
Il codice del Paese viene emesso anche in inglese e convertito nel codice internazionale. Se necessario, è possibile aggiungere altri Paesi secondo questo schema. Il Paese corrente viene determinato automaticamente dalla città selezionata da Weatherstack.
Variabile da creare:
Codice_paese
del tipo stringa
Codice:
! Codice_paese
posizione = 0;
posStart = 'paese':"";
posEnd = '", "regione";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string country_code = stdout.Substr(posValueStart, posValueEnd);
se (codice_paese == "Germania")
{
stringa codice_paese = "DE";
}
se (codice_paese == "Svezia")
{
stringa codice_paese = "SE";
}
WriteLine("codice_paese");WriteLine(codice_paese);
dom.GetObject("W_country_code").State(country_code);
Regione
La regione indica, ad esempio, la "Bassa Sassonia" in Germania ed è determinata automaticamente da Weatherstack.
Variabile da creare:
W_regione
del tipo stringa
Codice:
! regione
posizione = 0;
posStart = "regione":"";
posEnd = '", "lat";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa regione = stdout.Substr(posValueStart, posValueEnd);
WriteLine("regione");WriteLine(regione);
dom.GetObject("W_region").State(region);
Città
Quando si inserisce la città, Weatherstack determina automaticamente i dati di longitudine e latitudine corrispondenti, mentre la città viene determinata dai dati geografici inseriti.
Variabile da creare:
Nome_città
del tipo stringa
Codice:
! Nome della città
posizione = 0;
posStart = 'nome':"";
posEnd = '", "country";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string city_name = stdout.Substr(posValueStart, posValueEnd);
WriteLine("nome_città");WriteLine(nome_città);
dom.GetObject("W_city_name").State(city_name);
Latitudine - geogr. Latitudine
Variabile da creare:
W_Lat
del tipo stringa
Codice:
! Lat
posizione = 0;
posStart = 'query': 'Lat';
posEnd = 'e Lon';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa Lat = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Lat");WriteLine(Lat);
dom.GetObject("W_Lat").State(Lat);
Longitudine - longitudine
Variabile da creare:
W_Lon
del tipo stringa
Codice:
! Lon
posizione = 0;
posStart = 'e Lon';
posEnd = '", "language";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa Lon = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Lon");WriteLine(Lon);
dom.GetObject("W_Lon").State(Lon);
Vista - visibilità
Variabile da creare:
W_vis
del tipo stringa
Codice:
! Visibilità
posizione = 0;
posStart = 'visibilità':";
posEnd = ', 'is_day';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa vis_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("vis_data");WriteLine(vis_data);
dom.GetObject("W_vis").State(vis_data);
Pressione e tendenza dell'aria
Oltre alla pressione dell'aria fornita, in questo script viene determinato il trend della pressione dell'aria salvando un valore misurato come "attuale" e un valore precedente come "vecchio". Entrambi vengono confrontati tra loro, ottenendo così il trend.
Variabile da creare:
W_pressione_aria_act
del tipo stringaW_pressione_aria_vecchia
del tipo stringaW_Tendenza della pressione dell'aria
del tipo stringa
Codice:
! Stampa
var W_mb_alt;
var W_mb_akt;
posizione = 0;
posStart = 'pressione':";
posEnd = ', "precip";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
data = stdout.Substr(posValueStart, posValueEnd);WriteLine(data);
real W_mb_akt = daten.ToInteger();WriteLine("W_mb_akt");WriteLine(W_mb_akt);
dom.GetObject("W_air_pressure_act").State(W_mb_act);
W_mb_alt = dom.GetObject("W_Luftdruck_alt").Value();WriteLine(W_mb_alt);
se (W_mb_akt > W_mb_alt)
{
dom.GetObject("W_air_pressure_old").State(W_mb_akt);
dom.GetObject("W_Air pressure trend").State("S");
}
se (W_mb_akt < W_mb_alt)
{
dom.GetObject("W_air_pressure_old").State(W_mb_akt);
dom.GetObject("W_Air pressure trend").State("F");
}
se (W_mb_akt == W_mb_alt)
{
dom.GetObject("W_air_pressure_old").State(W_mb_akt);
dom.GetObject("W_Air pressure trend").State("N");
}
Temperatura di raffreddamento
Il wind chill dipende dalla velocità del vento e dalla temperatura. Negli sport acquatici, anche l'effetto del raffreddamento per evaporazione dovuto agli spruzzi è un fattore aggiuntivo (che non viene preso in considerazione in questa sede). Il chill si riferisce alla temperatura percepita, che in ambienti molto freddi può essere fino a una volta e mezza la temperatura negativa rispetto a quella reale e può portare a un rapido congelamento.
Variabile da creare:
W_chill
del tipo stringa
Codice:
! Freddo
posizione = 0;
posStart = 'feelslike':';
posEnd = ', 'uv_index';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa app_temp_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("app_temp_data");WriteLine(app_temp_data);
dom.GetObject("W_chill").State(app_temp_daten);
Raccomandazioni per la protezione dai raggi UV e dalla luce
L'esposizione ai raggi UV determinata sulla base dell'indice UV determina una raccomandazione per l'eventuale utilizzo di misure di protezione dalla luce.
Variabile da creare:
W_UV
del tipo stringaW_LSF
del tipo stringa
Codice:
! UV
posizione = 0;
posStart = 'uv_index':';
posEnd = ', "visibilità";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var uv_daten = stdout.Substr(posValueStart, posValueEnd);
dom.GetObject("W_UV").State(uv_daten);
data = uv_data.Substr(0, (word_position -2));
numero reale = data.ToInteger();
WriteLine("Numero UV");WriteLine(numero);
stringa LSF = "";
if (numero = "3") && (numero = "6") && (numero = "8") && (numero = "10") {LSF = "DEVE" ;}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF);
Velocità del vento
Variabile da creare:
W_WdSpd
del tipo retribuzione
Codice:
! Velocità del vento
posizione = 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);
real x = wind_spd_daten.ToFloat();
dom.GetObject("W_WdSpd").State(x);
Velocità del vento - Conversioni
Poiché le misure della velocità del vento sono diverse a seconda delle regioni, dei Paesi e delle applicazioni, ecco la conversione da m/s a km/h, nodi e Beaufort.
Variabile da creare:
W_Wind_kmh
del tipo retribuzioneW_Wind_knh
del tipo retribuzione- W_Wind_Bft di tipo retribuzione
Codice:
real 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);
reale 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);
se (x < 0,30)
{
dom.GetObject("W_Wind_Bft").State(0);
}
se ((0,29 < x) && (x < 1,51))
{
dom.GetObject("W_Wind_Bft").State(1);
}
se ((1,59 < x) && ( x < 3,31))
{
dom.GetObject("W_Wind_Bft").State(2);
}
se ((3,39 < x) && ( x < 5,41))
{
dom.GetObject("W_Wind_Bft").State(3);
}
se ((5,49 < x) && ( x < 7,91))
{
dom.GetObject("W_Wind_Bft").State(4);
}
se ((7,99 < x) && (x < 10,71))
{
dom.GetObject("W_Wind_Bft").State(5);
}
se ((10,79 < x) && (x < 13,81))
{
dom.GetObject("W_Wind_Bft").State(6);
}
se ((12,89 < x) && (x < 17,11))
{
dom.GetObject("W_Wind_Bft").State(7);
}
se ((17,19 < x) && (x < 20,71))
{
dom.GetObject("W_Wind_Bft").State(8);
}
se ((20,79 < x) && (x < 24,41))
{
dom.GetObject("W_Wind_Bft").State(9);
}
se ((24,49 < x) && (x < 28,41))
{
dom.GetObject("W_Wind_Bft").State(10);
}
se ((28,49 < x) && (x < 32,61))
{
dom.GetObject("W_Wind_Bft").State(11);
}
se (x > 32,6)
{
dom.GetObject("W_Wind_Bft").State(12);
}
Velocità del vento - rischio di congelamento
Chi viaggia in zone molto fredde riceverà un avviso con questa scrittura se c'è il rischio di congelamento a causa della velocità del vento e della temperatura esterna percepita, a meno che non si utilizzino indumenti protettivi adeguati.
Il calcolo si basa sul presupposto che si può ipotizzare un abbassamento della temperatura della pelle a -4,8 °C per un'esposizione cutanea di 30 minuti o meno, il che significa che l'assideramento si verifica nel 5% delle persone.
Variabile da creare:
- W_Wind_danger del tipo booleano
Codice:
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_Danger").State(true);
}
altro
{
dom.GetObject("W_Wind_Danger").State(false);
}
Direzione del vento (geografica)
Variabile da creare:
W_wind_dir
del tipo stringa
Codice:
! Direzione geografica del vento
posizione = 0;
posStart = 'wind_dir':"';
posEnd = '", "pressione";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa wind_dir_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_dir");WriteLine(wind_dir_data);
dom.GetObject("W_wind_dir").State(wind_dir_daten);
Direzione del vento (numerica)
Variabile da creare:
W_Wind_rchtg
del tipo stringa
Codice:
! Direzione del vento numerica
posizione = 0;
posStart = 'wind_degree':';
posEnd = ', "wind_dir";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa W_wind_rchtg = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_rchtg");WriteLine(W_wind_rchtg);
dom.GetObject("W_wind_rchtg").State(W_wind_rchtg);
Copertura nuvolosa
La copertura nuvolosa è scritta anche in inglese da Weatherstack, per cui qui viene fornita la traduzione in tedesco.
Variabile da creare:
W_descrizione
del tipo stringa
Codice:
! Descrizione della copertura nuvolosa
posizione = 0;
posStart = 'weather_descriptions':["';
posEnd = '"], "wind_speed";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa clouds_description = stdout.Substr(posValueStart, posValueEnd);
WriteLine("clouds_description_EN");WriteLine(clouds_description);
if (clouds_description == "Nuvoloso")
{
stringa clouds_description_DE = "Nuvoloso";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Pioggia leggera")
{
string clouds_description_EN = "Pioggia leggera";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Pioggia leggera")
{
string clouds_description_EN = "Leggeri rovesci di pioggia";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Leggera pioggerellina")
{
stringa clouds_description_DE = "Drizzle";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Mis")
{
stringa clouds_description_DE = "foschia";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Leggeri rovesci di neve")
{
string clouds_description_EN = "Leggeri rovesci di neve";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Sunny")
{
stringa clouds_description_DE = "Allegro";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Overcast")
{
stringa clouds_description_DE = "nuvoloso";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Parzialmente nuvoloso")
{
string clouds_description_DE = "Parzialmente nuvoloso";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Clear")
{
stringa clouds_description_DE = "Clear";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Fog")
{
stringa clouds_description_DE = "Nebbia";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Possibile pioggia a chiazze")
{
string clouds_description_EN = "Possibile pioggia leggera";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Pioggia moderata")
{
string clouds_description_DE = "Precipitazioni moderate";
WriteLine("clouds_description");WriteLine(clouds_description_EN);
dom.GetObject("W_description").State(clouds_description_DE);
}
Copertura nuvolosa
Variabile da creare:
W_clouds
del tipo stringa
Codice:
! Copertura nuvolosa
posizione = 0;
posStart = 'cloudcover':';
posEnd = ', "feelslike";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa clouds_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("clouds_data");WriteLine(clouds_data);
dom.GetObject("W_clouds").State(clouds_data);
Previsioni di pioggia
Variabile da creare:
W_Precipitazione
del tipo stringa
Codice:
! Previsioni di pioggia
var x;
posizione = 0;
posStart = 'precip":';
posEnd = ', "umidità";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
stringa precip = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Precipitazioni");WriteLine(precip);
dom.GetObject("W_Precipitation").State(precip);
Elevazione - Azimut
La sceneggiatura è stata scritta da radiofaro e presentato al Forum Omematico a pagina 10 del thread collegato.
È necessario creare due variabili di sistema:
elevazione del solen
del tipo Numerosole_azimutale
del tipo Numero
Perché 4 minuti? Perché la Terra compie un giro di 360° intorno al Sole una volta ogni 24 ore. 360° / 24h = 15° all'ora, corrispondenti a 60 minuti / 15° = 4 minuti.
Lo script deve essere utilizzato indipendentemente dagli script precedenti o dal programma associato se l'intervallo di aggiornamento è diverso da 4 minuti.
Programma:

Variabili da creare:
sole_azimutale
del tipo retribuzioneelevazione_sole
del tipo retribuzione
Codice:
! Ottenere la latitudinereale phi = system.Latitude();
phi = 0,017453292 * phi;
! Conversione in radianti
calcolare sin_phi e cos_phi con la serie di Taylorreale temp = phi * phi;
reale sin_phi =phi * ((temp * temp * 0,0083334) +1,0 - (temp * 0,1666667));
approssimazione sinusoidale
reale cos_phi = (temp *temp *0,0416667) + 1,0 - (temp * 0,5);
! approssimazione del coseno
! Calcolo dell'ora solare, tutti i tempi in minutiintero time_min = system.Date("%M").ToInteger() + 60system.Date("%H").ToInteger(); intero tagesbeginn_min = system.SunriseTime("%M").ToInteger() + 60system.SunriseTime("%H").ToInteger();
intero tagesende_min = system.SunsetTime("%M").ToInteger() + 60* system.SunsetTime("%H").ToInteger();
intero sonnenzeit =time_min + 720 - 0,5 *(tagesbeginn_min +tagesende_min);
if (suntime > 1440) {suntime = suntime -1440;}
if (suntime 720) {suntime =suntime - 720; afternoon = true; }
else {sonnenzeit =720 -sonnenzeit;}
! Calcolo di sin_tau e cos_taureale tau = 0,00436332313 * tempo solare; ! 15/60 * pi greco /180 * tempo solare [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; real cos_tau =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; real cos_tau = (tau) (-1.0) ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));}
! Calcolo deltaintero tageszahl = system.Date("%j").ToInteger(); tageszahl = tageszahl +10; if (tageszahl > 365) {tageszahl = tageszahl - 365;}
if (tageszahl 91) && (tageszahl 183) && (numero di giorni 274) && (tageszahl < 366)) {tageszahl = 365 - tageszahl; real tag = 0,0172142 *tageszahl; temp = tag * tag; real delta = (-0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));}calcolo sin_delta, cos_delta
temp = delta * delta; real sin_delta =delta * ((temp * temp * 0,0083334) +1,0 - (temp * 0,1666667)); !sine-approximation real cos_delta = (temp *temp *0,0416667) + 1,0 - (temp * 0,5);
! approssimazione del coseno
! Calcolo di tan_delta con linearizzazione a tratti del tanbooleano vsign = true; if (delta=0.2618) {tan_delta = (1.1822*delta) - 0.0416;}
if (vsign == false) {tan_delta = (-1.0) * tan_delta;}
! Calcolo di sin_elevazione e tan_azimutreale sin_elevazione = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
temp = sin_elevazione * sin_elevazione;
reale elevazione_sole = sin_elevazione * (1,0 + (0,1666667 * temp) + (0,075 * temp * temp));
sun_elevation = 57.29577951 * sun_elevation;
denominatore reale = (sin_phi*cos_tau) - (cos_phi * tan_delta);
if (denominatore < 0,0) {boolean plus180 = true;} real tan_azimut = sin_tau / denominatore;
! Calcolo di sun_azimut con linearizzazione a tratti dell'arctanbooleano sign = true; if (tan_azimut =0.2679)&&(tan_azimut = 0,5774)&&(tan_azimut = 1.0)&&(tan_azimuth = 1.3032)&&(tan_azimuth = 1,7321)&&(tan_azimut = 2,4142)&&(tan_azimut = 2,9459)&&(tan_azimuth = 3,7321)&&(tan_azimuth = 5,0)&&(tan_azimuth = 7,0)&&(tan_azimuth = 12,0)&&(tan_azimuth = 20.0)&&(tan_azimuth = 50,0) {sonne_azimuth = (0,000099983* tan_azimuth) + 1,54579974;}
se (sun_azimuth> 1.5707963278) {sun_azimuth = 1.5707963278;}
if (sign == false) {sun_azimuth = (-1.0) * sun_azimuth;}
sun_azimuth = 57.29577951 * sun_azimuth;
if (plus180 == true) {sonne_azimut = sonne_azimut + 180.0;}
! Salvare la correzione dell'ora del giorno e i valori nelle variabili di sistemase (afternoon == false)
{sonne_azimut = 180,0 - sonne_azimut; sonnenzeit = 720 - sonnenzeit;}
altro
{sun_azimuth = sun_azimuth + 180.0;sun_time = 720 + sun_time;}
sun_azimuth = 0,1 ((sun_azimut10.0) .ToInteger());
elevazione_sole = 0,1 ((elevazione_sole10.0) .ToInteger());
dom.GetObject("sonne_elevation").State(sonne_elevation);
dom.GetObject("sonne_azimut").State(sonne_azimut);