Оглавление
Обновлено – 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
- Давление воздуха
- Regenmenge
- Влажность
- 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, здесь einsehbar.
программа
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 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
вар posValueStart;
вар posValueEnd;
вар посСтарт;
вар posEnd; строка stderr; строка стандартного вывода;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
WriteLine(стандартный вывод);
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);
}
еще
{
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
поз = 0;
posStart = 'country":"';
posEnd = '","region';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
строка 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:
! область
поз = 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:
! Название_города
поз = 0;
posStart = 'name":"';
posEnd = '","country';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
строка 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
поз = 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
поз = 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
поз = 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 stringW_Luftdruck_alt
vom Typ stringW_Luftdrucktrend
vom Typ string
Code:
! Druck
var W_mb_alt;
var W_mb_akt;
поз = 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
поз = 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 stringW_LSF
vom Typ string
Code:
! UV
поз = 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
поз = 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 zahlW_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);
}
еще
{
dom.GetObject("W_Wind_Gefahr").State(false);
}
Windrichtung (geografisch)
Anzulegende Variable:
W_wind_dir
vom Typ string
Code:
! Windrichtung geografisch
поз = 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
поз = 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
поз = 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
поз = 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;
поз = 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 Числоsonne_azimut
vom Typ Число
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:
Anzulegende Variablen:
sonne_azimut
vom typ zahlsonne_elevation
vom Typ zahl
Code:
! Breitengrad holenreal phi = system.Latitude();
phi = 0.017453292 * phi;
! Umwandlung in Bogenmass
! sin_phi und cos_phi mit taylorreihe berechnenreal 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 Minuteninteger 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_taureal 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 deltainteger 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 tanboolean 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_azimutreal 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 arctanboolean 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 speichernif (nachmittag == false)
{sonne_azimut = 180.0 - sonne_azimut; sonnenzeit = 720 - sonnenzeit;}
еще
{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);