Vai al contenuto

Dati meteorologici SmartHome

Momento della lettura 9 minuti

Aggiornato – Gennaio 20, 2023

Wetterdaten mit SmartHome erfassen und via AIO Creator auf dem Handy oder Tablet zu visualisieren ist zwar i.d.R. keine Notwendigkeit, aber ein nice to have.

Der Online Wetterdienst weatherstack.com bietet hierfür – begrenzt kostenfrei – bis zu 250 Abfragen monatlich an. Wer wirklich aktuelle Wetterdaten haben möchte, sollte das Standard-Paket wählen. 50.000 Abfragen ermöglichen Minuten-Intervalle.

Die weiter verfügbaren Pakete unterscheiden sich primär in der Anzahl der Anfragen und einer Wetter-Vorhersage von 7, bzw 14 Tagen.

Folgende Daten sind in allen Paketen beinhaltet:

  • Geografische Länge und Breite
  • Ort
  • Region
  • Land
  • Zeitzone
  • Lokalzeit und Datum
  • UTC Offset
  • Aktuelle Zeit der Datenerhebung
  • Lufttemperatur
  • Wetterbeschreibung
  • Windgeschwindigkeit
  • Windrichtung numerisch / geografisch
  • Pressione dell'aria
  • Regenmenge
  • Umidità
  • Bewölkungsdichte
  • Chill Temperatur
  • UV Index
  • Sicht

Die Registrierung, gleich mit welchem Paket, erfordert die üblichen Angaben und Zahlungsdaten. Ein jährliches Abonnement, im Gegensatz zum monatlichen, ist mit 20% rabattiert.

Nach erfolgreichem Abschluss dieses Prozedere erhält man einen sog. API Code (Application Programming Interface), den man in die Abfrage-Url kopiert. Die Antwort ist eine XML-Ausgabe, die die o.g. Datenkategorien und Werte beinhaltet. Die Daten werden über geeignete Skripte extrahiert und in Variablen gespeichert. Diese können dann im AIO Creator zur Visualisierung herangezogen werden.

Eine ausführliche Beschreibung aller in der XML-Ausgabe möglicher Parameter, sowie die in den höherpreisigen Paketen enthaltenen optionalen Abfrage-Möglichkeiten sind, inklusive diverser Code-Beispiele, Qui einsehbar.

programma

Das Programm ist auf Grund der Vielzahl der Daten recht umfangreich. Daher werden hier die einzelnen Abschnitte sequenziell aufgeführt. Alle Code-Schnipsel können letztlich in einem einzigen Programm zusammengefasst werden.

Neben den o.g. Daten werden im Programm zusätzliche Daten errechnet und zur Visualisierung bereitgestellt:

  • Sonnen Elevation und Azimut
  • Lichtschutz-Faktor Empfehlung
Programm – W_Daten – Wetterdaten-Abfrage

Programm Header

Der Header beinhaltet lediglich die URL, die um den API-Key, hier mit xxx dargestellt, sowie den Ort (im Klartext oder, jeweils mit Komma getrennt, als Längen- und Breitenangabe, mit yyy gekennzeichnet, zu ergänzen ist:

var url = "http://api.weatherstack.com/current?access_key=xxx&query=yyy";

Umrechnung US in DE Zeitformat

Da in dem freien und Standard-Tarif keine Auswahl der Anzeige-Sprache, damit auch nur das AM / PM Zeitformat verfügbar ist, wird hier in das 24-Stunden konvertiert.

Anzulegende Variable:

  • W_LDU vom Typ string

Code:

! AM/PM Umrechnung – Speichern 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);
string wetter_xml = stdout;

string word = 'observation_time":"';
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string daten = wetter_xml.Substr((word_position + word_laenge), 5);
integer word_position = daten.Find(word);
daten = daten.Substr(0, (word_position -2));

string word = 'observation_time":"';
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string PM = wetter_xml.Substr((word_position + word_laenge +6), 2);
integer word_position = PM.Find(word);
PM = PM.Substr(0, (word_position -2));
WriteLine("AM/PM");WriteLine(PM);

string word = '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);

string word = 'observation_time":"';
integer word_laenge = word.Length();
integer word_position = wetter_xml.Find(word);
string MM = wetter_xml.Substr((word_position + word_laenge) +3, 2);
integer word_position = MM.Find(word);
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();
integer H = (HH_i + Diff);
WriteLine("HHi + Diff ist = H)");WriteLine(H);
string HHMM = H #":";
WriteLine("H_+ : ");WriteLine(HHMM);
string 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(daten);
}


Land – Länder-Code

Auch der Länder-Code wird in Englisch ausgegeben und hier in den internationalen Code konvertiert. Weitere Länder können bei Bedarf nach diesem Muster zugefügt werden. Das aktuelle Land ergibt sich aus der Wahl der Stadt seitens Weatherstack automatisch.

Anzulegende Variable:

W_country_code vom Typ string

Code:

! Country_code

posizione = 0;
posStart = 'country":"';
posEnd = '","region';
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("country_code");WriteLine(country_code);
dom.GetObject("W_country_code").State(country_code);


Region

Die Region bezeichnet, z.B. in Deutschland „Niedersachsen“ und wird von Weatherstack ebenfalls automatisch ermittelt.

Anzulegende Variable:

  • W_region vom Typ string

Code:

! regione

posizione = 0;
posStart = 'region":"';
posEnd = '","lat';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string region = stdout.Substr(posValueStart, posValueEnd);
WriteLine("region");WriteLine(region);
dom.GetObject("W_region").State(region);


Stadt

Bei Eingabe der Stadt ermittelt Weatherstack automatisch die zugehörigen Länge- und Breitenangaben, während aus den eingegebenen Geo-Daten die Stadt ermittelt wird.

Anzulegende Variable:

  • W_city_name vom Typ string

Code:

! Nome della città

posizione = 0;
posStart = 'name":"';
posEnd = '","country';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string city_name = stdout.Substr(posValueStart, posValueEnd);
WriteLine("city_name");WriteLine(city_name);
dom.GetObject("W_city_name").State(city_name);


Latitude – geogr-. Breite

Anzulegende Variable:

  • W_Lat vom Typ string

Code:

! Lat

posizione = 0;
posStart = 'query":"Lat';
posEnd = 'and 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 – geogr. Länge

Anzulegende Variable:

  • W_Lon vom Typ string

Code:

! Lon

posizione = 0;
posStart = 'and Lon';
posEnd = '","language';
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);


Sicht – visibility

Anzulegende Variable:

  • W_vis vom Typ string

Code:

! Visibility

posizione = 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("vis_Daten");WriteLine(vis_daten);
dom.GetObject("W_vis").State(vis_daten);


Luftdruck und Tendenz

Zusätzlich zum zur Verfügung gestellten Luftdruck wird in diesem Skript die Luftdruck-Tendenz ermittelt, indem ein Messwert als „aktuell“, ein vorangehender als „alt“ gespeichert wird. Beide werden mit einander verglichen, woraus sich die Tendenz ergibt.

Anzulegende Variable:

  • W_Luftdruck_akt vom Typ string
  • W_Luftdruck_alt vom Typ string
  • W_Luftdrucktrend vom Typ string

Code:

! Druck

var W_mb_alt;
var W_mb_akt;
posizione = 0;
posStart = 'pressure":';
posEnd = ',"precip';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
daten = stdout.Substr(posValueStart, posValueEnd);WriteLine(daten);
real W_mb_akt = daten.ToInteger();WriteLine("W_mb_akt");WriteLine(W_mb_akt);
dom.GetObject("W_Luftdruck_akt").State(W_mb_akt);
W_mb_alt = dom.GetObject("W_Luftdruck_alt").Value();WriteLine(W_mb_alt);

if (W_mb_akt > W_mb_alt)
{
dom.GetObject("W_Luftdruck_alt").State(W_mb_akt);
dom.GetObject("W_Luftdrucktrend").State("S");
}

if (W_mb_akt < W_mb_alt)
{
dom.GetObject("W_Luftdruck_alt").State(W_mb_akt);
dom.GetObject("W_Luftdrucktrend").State("F");
}

if (W_mb_akt == W_mb_alt)
{
dom.GetObject("W_Luftdruck_alt").State(W_mb_akt);
dom.GetObject("W_Luftdrucktrend").State("N");
}


Chill Temperatur

Der Wind-Chill ist abhängig von der Windgeschwindigkeit und der Temperatur. Im Wassersport kommt noch der Effekt der Verdunstungskälte durch Gischt verstärkend hinzu (der hier aber keine Berücksichtigung findet). Chill bezeichnet die empfundene Temperatur, die in sehr kalter Umgebung bis zur eineinhalbfachen negativen Temperatur im Vergleich zur tatsächlichen reichen und zu schnell auftretenden Erfrierungen führen kann.

Anzulegende Variable:

  • W_chill vom Typ string

Code:

! Chill

posizione = 0;
posStart = 'feelslike":';
posEnd = ',"uv_index';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string app_temp_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("app_temp_Daten");WriteLine(app_temp_daten);
dom.GetObject("W_chill").State(app_temp_daten);


UV und Lichtschutz-Empfehlung

Die auf Basis des UV-Indexes ermittelte UV-Belastung resultiert in einer Empfehlung einer ggf. notwendigen Anwendung von Lichtschutzmaßnahmen.

Anzulegende Variable:

  • W_UV vom Typ string
  • W_LSF vom Typ string

Code:

! UV

posizione = 0;
posStart = 'uv_index":';
posEnd = ',"visibility';
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);
daten = uv_daten.Substr(0, (word_position -2));
real zahl = daten.ToInteger();
WriteLine("UV zahl");WriteLine(zahl);

string LSF = "";
if (zahl <3) {LSF = "unnötig" ;} elseif ((zahl >= "3") && (zahl <= "5")) {LSF = "empfohlen" ;} elseif ((zahl >= "6") && (zahl <= "7")) {LSF = "erforderlich" ;} elseif ((zahl >= "8") && (zahl <= "9")) {LSF = "unbedingt" ;} elseif (zahl >= "10") {LSF = "MUSS" ;}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF);


Windgeschwindigkeit

Anzulegende Variable:

  • W_WdSpd vom Typ zahl

Code:

! Windgeschwindigkeit

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);


Windgeschwindigkeit – Umrechnungen

Da es in unterschiedlichen Regionen , Ländern und Awendungsfällen verschiedene bevorzugte Windgeschwindigkeits-Maße gibt, hier die Umrechnung von m/s in km/h, Knoten und Beaufort.

Anzulegende Variable:

  • W_Wind_kmh vom Typ zahl
  • W_Wind_knh vom Typ zahl
  • W_Wind_Bft vom Typ zahl

Code:

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);


real 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);
}

Windgeschwindigkeit – Gefahr von Erfrierungen

Wer in sehr kalten Zonen unterwegs ist, erhält mit diesem Script eine Warnung, falls auf Grund von Windgeschwindigkeit und gefühlter Außentemperatur das Risiko von Erfrierungserscheungen gibt, sofern keine entsprechende Schutzkleidung genutzt wird.

Es wird bei der Berechnung davon ausgegangen, dass bei einer Haut-Exposition von 30 Minuten oder weniger von einem Absinken der Hauttemperatur auf -4,8 °C auszugehen ist und damit bei 5% der Menschen Erfrierungen auftreten.

Anzulegende Variable:

  • W_Wind_Gefahr vom Typ boolean

Code:

if (((app_temp_daten == -27.2) && (8 > W_Wind_kmh <10.1)) || ((app_temp_daten == -22.9) && (12 > W_Wind_kmh <15.1)) || ((app_temp_daten == -24.2) && (18 > W_Wind_kmh <20.1)) || ((app_temp_daten == -25.2) && (23 > W_Wind_kmh <25.1)) || ((app_temp_daten == -26.0) && (28 > W_Wind_kmh <30.1)) || ((app_temp_daten == -26.8) && (32 > W_Wind_kmh <35.1)) || ((app_temp_daten == -27.4) && (37 > W_Wind_kmh <40.1)) || ((app_temp_daten == -28.0) && (42 > W_Wind_kmh <45.1)) || ((app_temp_daten == -28.6) && (47 > W_Wind_kmh <50.1)) || ((app_temp_daten == -22.2) && (53 > W_Wind_kmh <55.1)) || ((app_temp_daten == -22.6) && (57 > W_Wind_kmh <60.1)))
{
dom.GetObject("W_Wind_Gefahr").State(true);
}
altro
{
dom.GetObject("W_Wind_Gefahr").State(false);
}


Windrichtung (geografisch)

Anzulegende Variable:

  • W_wind_dir vom Typ string

Code:

! Windrichtung geografisch

posizione = 0;
posStart = 'wind_dir":"';
posEnd = '","pressure';
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);


Windrichtung (numerisch)

Anzulegende Variable:

  • W_Wind_rchtg vom Typ string

Code:

! Windrichtung numerisch

posizione = 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);


Bewölkung

Die Bewölkung wird seitens Weatherstack ebenfalls in Englisch verfasst, weshalb hier die Übersetzung ins Deutsche vorgenommen wird.

Anzulegende Variable:

  • W_description vom Typ string

Code:

! Bewölkung Beschreibung

posizione = 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 == "Cloudy")
{
string clouds_description_DE = "Bewölkt";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Light rain")
{
string clouds_description_DE = "Leichter Regen";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Light rain shower")
{
string clouds_description_DE = "Leichte Regenschauer";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Light drizzle")
{
string clouds_description_DE = "Nieselregen";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Mis")
{
string clouds_description_DE = "Dunst";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Light snow showers")
{
string clouds_description_DE = "Leichte Schneeschauer";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Sunny")
{
string clouds_description_DE = "Heiter";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Overcast")
{
string clouds_description_DE = "Bedeckt";
WriteLine("clouds_description");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Partly cloudy")
{
string clouds_description_DE = "Teilweise bewölkt";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Clear")
{
string clouds_description_DE = "Klar";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Fog")
{
string clouds_description_DE = "Nebel";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Patchy rain possible")
{
string clouds_description_DE = "Leichter Regen möglich";
WriteLine("clouds_description");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Moderate rain")
{
string clouds_description_DE = "Mäßiger Niederschlag";
WriteLine("clouds_description");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}


Wolkenbedeckung

Anzulegende Variable:

  • W_clouds vom Typ string

Code:

! Wolkenbedeckung

posizione = 0;
posStart = 'cloudcover":';
posEnd = ',"feelslike';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string clouds_daten = stdout.Substr(posValueStart, posValueEnd);
WriteLine("clouds_Daten");WriteLine(clouds_daten);
dom.GetObject("W_clouds").State(clouds_daten);


Vorhersage Regen

Anzulegende Variable:

  • W_Niederschlag vom Typ string

Code:

! Vorhersage Regen

var x;
posizione = 0;
posStart = 'precip":';
posEnd = ',"humidity';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string precip = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Niederschlag");WriteLine(precip);
dom.GetObject("W_Niederschlag").State(precip);


Elevation – Azimut

Das Skript wurde von funkleuchtturm verfasst und dem Homematic Forum auf Seite 10 des verlinkten Threads entnommen.

Es sind zwei Systemvariablen anzulegen:

  • sonne_elevation vom Typ Numero
  • sonne_azimut vom Typ Numero

Warum gerade 4 Minuten? Weil die Erde ihren 360° Kreis um die Sonne einmal in 24 Stunden vollzieht. 360° / 24h = 15° in der Stunde, entsprechend 60 Minuten / 15° = 4 Minuten.

Das Skript sollte unabhängig vorstehender Skripte, bzw. des zugehörigen Programms genutzt werden, sofern das Aktualisierungs-Intervall abweichend von 4 Minuten ist.

Programm:

Programm – Elevation- / Azimut-Bestimmung

Anzulegende Variablen:

  • sonne_azimut vom typ zahl
  • sonne_elevation vom Typ zahl

Code:

! Breitengrad holen
real phi = system.Latitude();
phi = 0.017453292 * phi;


! Umwandlung in Bogenmass
! sin_phi und cos_phi mit taylorreihe berechnen
real temp = phi * phi;
real sin_phi =phi * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));


! sinus-Naeherung
real cos_phi = (temp *temp *0.0416667) + 1.0 - (temp * 0.5);


! cosinus-Naeherung
! Berechnung Sonnenzeit, alle Zeiten in Minuten
integer zeit_min = system.Date("%M").ToInteger() + 60system.Date("%H").ToInteger(); integer tagesbeginn_min = system.SunriseTime("%M").ToInteger() + 60system.SunriseTime("%H").ToInteger();
integer tagesende_min = system.SunsetTime("%M").ToInteger() + 60* system.SunsetTime("%H").ToInteger();
integer sonnenzeit =zeit_min + 720 - 0.5 *(tagesbeginn_min +tagesende_min);
if (sonnenzeit > 1440) {sonnenzeit = sonnenzeit -1440;}
if (sonnenzeit < 1) {sonnenzeit = 1440 + sonnenzeit;} boolean nachmittag =false; if (sonnenzeit > 720) {sonnenzeit =sonnenzeit - 720; nachmittag = true; }
else {sonnenzeit =720 -sonnenzeit;}


! Berechnung sin_tau und cos_tau
real tau = 0.00436332313 * sonnenzeit; ! 15/60 * pi /180 * sonnenzeit [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));}

! Berechnung delta
integer tageszahl = system.Date("%j").ToInteger(); tageszahl = tageszahl +10; if (tageszahl > 365) {tageszahl = tageszahl - 365;}
if (tageszahl < 92) {real tag = 0.0172142 *tageszahl;temp = tag * tag; real delta = (-0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} if ((tageszahl >91) && (tageszahl < 184)) {tageszahl = 183 - tageszahl; real tag = 0.0172142 *tageszahl; temp = tag * tag; real delta = (0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} if ((tageszahl >183) && (tageszahl < 275)) {tageszahl = tageszahl - 183; real tag = 0.0172142 *tageszahl; temp = tag * tag; real delta = (0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} if ((tageszahl >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));}

! berechnung sin_delta, cos_delta
temp = delta * delta; real sin_delta =delta * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)); !sinus-naeherung real cos_delta = (temp *temp *0.0416667) + 1.0 - (temp * 0.5);

! cosinus-Naeherung
! Berechnung tan_delta mit stueckweiser Linearisierung des tan
boolean vvorzeichen = true; if (delta< 0.0) {vvorzeichen = false; delta = (-1.0) *delta;} real tan_delta = 1.0233 * delta; if (delta >=0.2618) {tan_delta = (1.1822*delta) - 0.0416;}
if (vvorzeichen == false) {tan_delta = (-1.0) * tan_delta;}


! Berechnung sin_elevation und tan_azimut
real sin_elevation = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
temp = sin_elevation * sin_elevation;
real sonne_elevation = sin_elevation * (1.0 + (0.1666667 * temp) + (0.075 * temp * temp));
sonne_elevation = 57.29577951 * sonne_elevation;
real nenner = (sin_phi*cos_tau) - (cos_phi * tan_delta);
if (nenner < 0.0) {boolean plus180 = true;} real tan_azimut = sin_tau / nenner;


! Berechnung sonne_azimut mit stueckweiser Linearisierung des arctan
boolean vorzeichen = true; if (tan_azimut < 0.0) {vorzeichen = false; tan_azimut = (-1.0)*tan_azimut;} real sonne_azimut = 0.97723 * tan_azimut; if ((tan_azimut >=0.2679)&&(tan_azimut < 0.5774)) {sonne_azimut = (0.84588* tan_azimut) + 0.035189;} if ((tan_azimut >= 0.5774)&&(tan_azimut < 1.0)) {sonne_azimut = (0.6195* tan_azimut) + 0.1659;} if ((tan_azimut >= 1.0)&&(tan_azimut < 1.3032)) {sonne_azimut = (0.43173* tan_azimut) + 0.3537;} if ((tan_azimut >= 1.3032)&&(tan_azimut < 1.7321)) {sonne_azimut = (0.3052* tan_azimut) + 0.51856;} if ((tan_azimut >= 1.7321)&&(tan_azimut < 2.4142)) {sonne_azimut = (0.1919* tan_azimut) + 0.7148;} if ((tan_azimut >= 2.4142)&&(tan_azimut < 2.9459)) {sonne_azimut = (0.123* tan_azimut) + 0.88115;} if ((tan_azimut >= 2.9459)&&(tan_azimut < 3.7321)) {sonne_azimut = (0.083312* tan_azimut) + 0.9981;} if ((tan_azimut >= 3.7321)&&(tan_azimut < 5.0)) {sonne_azimut = (0.050792* tan_azimut) + 1.1194;} if ((tan_azimut >= 5.0)&&(tan_azimut <7.0)) {sonne_azimut = (0.02775* tan_azimut) + 1.23465;} if ((tan_azimut >= 7.0)&&(tan_azimut <12.0)) {sonne_azimut = (0.01175117* tan_azimut) + 1.346641;} if ((tan_azimut >= 12.0)&&(tan_azimut <20.0)) {sonne_azimut = (0.004147854* tan_azimut) + 1.437881;} if ((tan_azimut >= 20.0)&&(tan_azimut <50.0)) {sonne_azimut = (0.0009987* tan_azimut) + 1.5008639;} if (tan_azimut >= 50.0) {sonne_azimut = (0.000099983* tan_azimut) + 1.54579974;}
if (sonne_azimut> 1.5707963278) {sonne_azimut = 1.5707963278;}
if (vorzeichen == false) {sonne_azimut = (-1.0) * sonne_azimut;}
sonne_azimut = 57.29577951 * sonne_azimut;
if (plus180 == true) {sonne_azimut = sonne_azimut + 180.0;}


! Tageszeitliche Korrektur und Werte auf Systemvariablen speichern
if (nachmittag == false)
{sonne_azimut = 180.0 - sonne_azimut; sonnenzeit = 720 - sonnenzeit;}
altro
{sonne_azimut = sonne_azimut + 180.0;sonnenzeit = 720 + sonnenzeit;}
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);

Lascia un commento

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

it_ITItaliano