Vai al contenuto

Dati meteorologici SmartHome

Momento della lettura 9 minuti

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
Programma - W_Data - Interrogazione dei dati meteo

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 stringa
  • W_pressione_aria_vecchia del tipo stringa
  • W_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 stringa
  • W_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 retribuzione
  • W_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 Numero
  • sole_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:

Programma - Determinazione dell'elevazione e dell'azimut

Variabili da creare:

  • sole_azimutale del tipo retribuzione
  • elevazione_sole del tipo retribuzione

Codice:

! Ottenere la latitudine
reale phi = system.Latitude();
phi = 0,017453292 * phi;


! Conversione in radianti
calcolare sin_phi e cos_phi con la serie di Taylor
reale 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 minuti
intero 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_tau
reale 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 delta
intero 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 tan
booleano 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_azimut
reale 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'arctan
booleano 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 sistema
se (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);

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

it_ITItalian