Inhoudsopgawe
Opgedateer – 20 Januarie 2023
Om weerdata met SmartHome in te samel en dit op jou selfoon of tablet via AIO Creator te visualiseer, is gewoonlik nie 'n noodsaaklikheid nie, maar dit is lekker om te hê.
Die aanlyn weerdiens weatherstack.com bied tot 250 navrae per maand – gratis vir 'n beperkte tydperk. Diegene wat werklik opgedateerde weerdata wil hê, moet die standaardpakket kies. 50 000 navrae maak voorsiening vir minuut-vir-minuut-intervalle.
Die ander beskikbare pakkette verskil hoofsaaklik in die aantal versoeke en 'n weervoorspelling van 7 of 14 dae.
Die volgende data is ingesluit in alle pakkette:
- Geografiese lengtegraad en breedtegraad
- Ligging
- streek
- land
- Tydsone
- Plaaslike tyd en datum
- UTC-verskuiwing
- Huidige tyd van data-insameling
- Lugtemperatuur
- Weerbeskrywing
- Windspoed
- Windrigting numeries / geografies
- Lugdruk
- Reënval
- Humiditeit
- Wolkdigtheid
- Koue temperatuur
- UV-indeks
- Bekyk
Registrasie, ongeag die pakket, vereis die gewone inligting en betalingsbesonderhede. 'n Jaarlikse intekening, anders as 'n maandelikse een, word teen 20% afslag gegee.
Nadat hierdie proses suksesvol voltooi is, ontvang jy 'n sogenaamde API (Application Programming Interface) kode, wat jy in die navraag-URL kopieer. Die antwoord is 'n XML-uitvoer wat die bogenoemde datakategorieë en waardes bevat. Die data word onttrek met behulp van geskikte skrifte en in veranderlikes gestoor. Hierdie kan dan gebruik word vir visualisering in die AIO Creator.
'n Gedetailleerde beskrywing van alle moontlike parameters in die XML-uitvoer, sowel as die opsionele navraagopsies wat in die duurder pakkette ingesluit is, insluitend verskeie kodevoorbeelde, hier sigbaar.
program
Die program is nogal uitgebreid as gevolg van die groot hoeveelheid data. Daarom word die individuele afdelings hier opeenvolgend gelys. Alle kodebrokkies kan uiteindelik in 'n enkele program gekombineer word.
Benewens bogenoemde data, word bykomende data in die program bereken en vir visualisering voorsien:
- Sonhoogte en asimut
- Aanbeveling vir sonbeskermingsfaktor

Programopskrif
Die opskrif bevat slegs die URL, wat aangevul moet word deur die API-sleutel, hier voorgestel as xxx, en die ligging (in gewone teks of, geskei deur kommas, as lengtegraad en breedtegraad, gemerk met yyy):
var url = "http://api.weatherstack.com/current?access_key=xxx&query=yyy";
Omskakeling van Amerikaanse na DE tydformaat
Aangesien die gratis en standaardtariewe nie 'n keuse van vertoontaal bied nie en dus slegs die AM/PM-tydformaat beskikbaar is, word dit hier na die 24-uur-formaat omgeskakel.
Veranderlike wat geskep moet word:
W_LDUvan tipe string
Kode:
! AM/PM-omskakeling – Stoor in W_LDU
var posWaardeBegin;
var posWaardeEinde;
var posBegin;
var posEnd; string stderr; string stdout;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
SkryfLyn(stdout);
string wetter_xml = stdout;
string woord = 'waarnemingstyd':"';
heelgetal woordlengte = woord.Lengte();
heelgetal woordposisie = weer_xml.Vind(woord);
string data = weather_xml.Substr((woordposisie + woordlengte), 5);
heelgetal woordposisie = data.Vind(woord);
data = data.Substr(0, (woordposisie -2));
string woord = 'waarnemingstyd':"';
heelgetal woordlengte = woord.Lengte();
heelgetal woordposisie = weer_xml.Vind(woord);
string PM = weather_xml.Substr((woordposisie + woordlengte +6), 2);
heelgetal woordposisie = PM.Vind(woord);
PM = PM.Substr(0, (woordposisie -2));
SkryfLyn("VM/NM"); SkryfLyn(NM);
string woord = 'waarnemingstyd':"';
heelgetal woordlengte = woord.Lengte();
heelgetal woordposisie = weer_xml.Vind(woord);
string HH = weather_xml.Substr((woordposisie + woordlengte) + 1, 1);
heelgetal woordposisie = HH.Vind(woord);
HH = HH.Substr(0, (woordposisie -2));
SkryfLyn("HH"); SkryfLyn(HH);
string woord = 'waarnemingstyd':"';
heelgetal woordlengte = woord.Lengte();
heelgetal woordposisie = weer_xml.Vind(woord);
string MM = weather_xml.Substr((woordposisie + woordlengte) +3, 2);
heelgetal woordposisie = MM.Vind(woord);
MM = MM.Substr(0, (woordposisie -2));
SkryfLyn("MM"); SkryfLyn(MM);
as (NM == "NM")
{
heelgetal Verskil = 12;
SkryfLyn("Verskil"); SkryfLyn(Verskil);
var HH_i = HH.ToInteger();
heelgetal H = (HH_i + Verskil);
SkryfLyn("HHi + Verskil is = H)"); SkryfLyn(H);
string HHMM = H #":";
SkryfLyn("H_+ : "); SkryfLyn(HHMM);
string HM = HHMM # MM;
SkryfLyn("HH_+12+MM"); SkryfLyn(HM);
dom.GetObject("W_LDU").State(HM);
}
anders
{
WriteLine("LDU_data");WriteLine(data);
dom.GetObject("W_LDU").State(data);
}
Land – Landkode
Die landkode word ook in Engels vertoon en hier na die internasionale kode omgeskakel. Bykomende lande kan soos nodig bygevoeg word met behulp van hierdie patroon. Die huidige land word outomaties bepaal deur Weatherstack se keuse van stad.
Veranderlike wat geskep moet word:
W_land_kode van tipe string
Kode:
Landkode
pos = 0;
posBegin = 'land':"';
posEnd = '", "streek';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string land_kode = stdout.Substr(posWaardeBegin, posWaardeEinde);
as (landkode == "Duitsland")
{
string land_kode = "DE";
}
as (landkode == "Swede")
{
string land_kode = "SE";
}
SkryfLyn("land_kode"); SkryfLyn(land_kode);
dom.GetObject("W_land_kode").Staat(land_kode);
streek
Die streek word byvoorbeeld in Duitsland “Nedersakse” genoem en word ook outomaties deur Weatherstack bepaal.
Veranderlike wat geskep moet word:
W_streekvan tipe string
Kode:
! Streek
pos = 0;
posBegin = 'streek':"';
posEnd = '","lat';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string streek = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("streek"); SkryfLyn(streek);
dom.GetObject("W_streek").Staat(streek);
Stad
Wanneer jy die stad binnegaan, bepaal Weatherstack outomaties die ooreenstemmende lengte- en breedtegraadinligting, terwyl die stad bepaal word uit die ingevoerde geodata.
Veranderlike wat geskep moet word:
W_stad_naamvan tipe string
Kode:
Stadsnaam
pos = 0;
posBegin = 'naam":"';
posEnd = '","land';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string stad_naam = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("stad_naam"); SkryfLyn(stad_naam);
dom.GetObject("W_stad_naam").Staat(stad_naam);
Breedtegraad – geografiese breedte
Veranderlike wat geskep moet word:
W_Breedtegraadvan tipe string
Kode:
! Lat
pos = 0;
posBegin = 'navraag':'Lat';
posEnd = 'en Lon';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string Lat = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("Lat"); SkryfLyn(Lat);
dom.GetObject("W_Lat").Staat(Lat);
Lengtegraad – geografiese lengte
Veranderlike wat geskep moet word:
W_Lonvan tipe string
Kode:
! Lon
pos = 0;
posBegin = 'en Lon';
posEnd = '", "taal';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string Lon = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("Lengte"); SkryfLyn(Lengte);
dom.GetObject("W_Lon").State(Lon);
Sigbaarheid
Veranderlike wat geskep moet word:
W_visvan tipe string
Kode:
Sigbaarheid
pos = 0;
posStart = 'sigbaarheid':';
posEnd = ',"is_dag';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string vis_data = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("vis_data"); SkryfLyn(vis_data);
dom.GetObject("W_vis").State(vis_data);
Lugdruk en tendens
Benewens die verskafde lugdruk, bepaal hierdie skrip die lugdruktendens deur een gemete waarde as "huidig" en 'n vorige een as "oud" te stoor. Die twee word vergelyk om die tendens te bepaal.
Veranderlike wat geskep moet word:
W_lugdruk_aktiefvan tipe stringW_lugdruk_oudvan tipe stringW_Lugdrukneigingvan tipe string
Kode:
Druk
var W_mb_alt;
var W_mb_akt;
pos = 0;
posBegin = 'druk':';
posEnd = ',"neerslag';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
data = stdout.Substr(posWaardeBegin, posWaardeEinde);SkryfLyn(data);
werklike W_mb_akt = data.ToInteger();WriteLine("W_mb_akt");WriteLine(W_mb_akt);
dom.GetObject("W_Luftdruck_akt").State(W_mb_akt);
W_mb_alt = dom.GetObject("W_Lugdruk_alt").Value();WriteLine(W_mb_alt);
as (W_mb_act > W_mb_alt)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_LugdrukTrend").State("S");
}
as (W_mb_act < W_mb_alt)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_LugdrukTrend").State("F");
}
as (W_mb_act == W_mb_alt)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_LugdrukTrend").State("N");
}
Koue temperatuur
Windkoue hang af van windspoed en temperatuur. In watersport word die effek van verdampingsverkoeling van seesproei ook versterk (egter nie hier oorweeg nie). Koue verwys na die waargenome temperatuur, wat in baie koue omgewings tot een en 'n half keer laer as die werklike temperatuur kan wees en kan lei tot vinnige en ernstige bevriesing.
Veranderlike wat geskep moet word:
W_chillvan tipe string
Kode:
! Ontspan
pos = 0;
posBegin = 'voelsoos':';
posEnd = ',"uv_indeks';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string app_temp_data = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("app_temp_data"); SkryfLyn(app_temp_data);
dom.GetObject("W_chill").State(app_temp_data);
Aanbeveling vir UV- en ligbeskerming
Die UV-blootstelling wat op grond van die UV-indeks bepaal word, lei tot 'n aanbeveling vir die moontlike nodige gebruik van sonbeskermingsmaatreëls.
Veranderlike wat geskep moet word:
W_UVvan tipe stringW_LSFvan tipe string
Kode:
UV
pos = 0;
posBegin = 'uv_indeks':';
posEnd = ',"sigbaarheid';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
var uv_data = stdout.Substr(posWaardeBegin, posWaardeEinde);
dom.GetObject("W_UV").State(uv_data);
data = uv_data.Substr(0, (woordposisie -2));
reële getal = data.ToInteger();
SkryfLyn("UV-nommer"); SkryfLyn(nommer);
string LSF = "";
indien (getal <3) {LSF = "onnodig";} anders indien ((getal >= "3") && (getal <= "5")) {LSF = "aanbeveel";} anders indien ((getal >= "6") && (getal <= "7")) {LSF = "vereis";} anders indien ((getal >= "8") && (getal <= "9")) {LSF = "noodsaaklik";} anders indien (getal >= "10") {LSF = "MOET";}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF);
Windspoed
Veranderlike wat geskep moet word:
W_WdSpdvan tipe nommer
Kode:
Windspoed
pos = 0;
posBegin = 'windspoed':';
posEnd = ',"wind_graad';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
var wind_spd_daten = stdout.Substr(posWaardeBegin, posWaardeEinde);
werklike x = wind_spd_data.ToFloat();
dom.GetObject("W_WdSpd").State(x);
Windspoed – omskakelings
Aangesien daar verskillende voorkeur windspoedmetings in verskillende streke, lande en toepassings is, is hier die omskakeling van m/s na km/h, knope en Beaufort.
Veranderlike wat geskep moet word:
W_Wind_km/hvan tipe nommerW_Wind_knhvan tipe nommer- W_Wind_Bft van tipe nommer
Kode:
werklike W_Wind_kmh = (wind_spd_daten.ToFloat() * 3.6);SkryfLyn("W_Wind_kmh");SkryfLyn(W_Wind_kmh);
dom.GetObject("W_Wind_kmh").State(W_Wind_kmh);
werklike W_Wind_knh = (W_Wind_kmh / 1.852);SkryfLyn("W_Wind_knh");SkryfLyn(W_Wind_knh);
dom.GetObject("W_Wind_knh").State(W_Wind_knh);
as (x < 0.30)
{
dom.GetObject(“W_Wind_Bft”).State(0);
}
as ((0.29 < x) && (x < 1.51))
{
dom.GetObject(“W_Wind_Bft”).State(1);
}
as ((1.59 < x) && (x < 3.31))
{
dom.GetObject(“W_Wind_Bft”).State(2);
}
as ((3.39 < x) && (x < 5.41))
{
dom.GetObject(“W_Wind_Bft”).State(3);
}
as ((5.49 < x) && (x < 7.91))
{
dom.GetObject(“W_Wind_Bft”).State(4);
}
as ((7.99 < x) && (x < 10.71))
{
dom.GetObject(“W_Wind_Bft”).State(5);
}
as ((10.79 < x) && (x < 13.81))
{
dom.GetObject(“W_Wind_Bft”).State(6);
}
as ((12.89 < x) && (x < 17.11))
{
dom.GetObject(“W_Wind_Bft”).State(7);
}
as ((17.19 < x) && (x < 20.71))
{
dom.GetObject(“W_Wind_Bft”).State(8);
}
as ((20.79 < x) && (x < 24.41))
{
dom.GetObject(“W_Wind_Bft”).State(9);
}
as ((24.49 < x) && (x < 28.41))
{
dom.GetObject(“W_Wind_Bft”).State(10);
}
as ((28.49 < x) && (x < 32.61))
{
dom.GetObject(“W_Wind_Bft”).State(11);
}
as (x > 32.6)
{
dom.GetObject(“W_Wind_Bft”).State(12);
}
Windspoed – risiko van bevriesing
Enigiemand wat in baie koue sones reis, sal 'n waarskuwing met hierdie skrif ontvang indien daar 'n risiko van bevriesing is as gevolg van windspoed en waargenome buitetemperatuur indien toepaslike beskermende klere nie gebruik word nie.
Die berekening neem aan dat as die vel vir 30 minute of minder blootgestel word, die veltemperatuur tot -4.8 °C sal daal, wat daartoe lei dat 5% van mense aan bevrorenheid ly.
Veranderlike wat geskep moet word:
- W_Wind_Gevaar van tipe Booleaans
Kode:
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 kmh) &_&0.ind. ((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 == -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_Gevaar").State(waar);
}
anders
{
dom.GetObject("W_Wind_Gefahr").State(vals);
}
Windrigting (geografies)
Veranderlike wat geskep moet word:
W_wind_dirvan tipe string
Kode:
! Windrigting geografies
pos = 0;
posBegin = 'wind_gids':"';
posEnd = '","druk';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string wind_dir_data = stdout.Substr(posWaardeBegin, posWaardeEinde);
WriteLine("W_wind_dir");WriteLine(wind_dir_data);
dom.GetObject("W_wind_dir").State(wind_dir_data);
Windrigting (numeries)
Veranderlike wat geskep moet word:
W_Wind_rchtgvan tipe string
Kode:
Windrigting numeries
pos = 0;
posBegin = 'wind_graad':';
posEnd = ',"wind_dir';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string W_wind_rchtg = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("W_wind_rchtg"); SkryfLyn(W_wind_rchtg);
dom.GetObject("W_wind_rchtg").State(W_wind_rchtg);
Wolkbedekking
Weatherstack bied ook wolkbedekking in Engels, en daarom word die vertaling in Duits hier verskaf.
Veranderlike wat geskep moet word:
W_beskrywingvan tipe string
Kode:
! Beskrywing van wolkbedekking
pos = 0;
posBegin = 'weerbeskrywings':["';
posEnd = '"],"windspoed';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string wolke_beskrywing = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("wolke_beskrywing_EN"); SkryfLyn(wolke_beskrywing);
as (wolke_beskrywing == "Bewolk")
{
string clouds_description_DE = "Bewolk";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (wolke_beskrywing == "Ligte reën")
{
string clouds_description_DE = "Ligte reën";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (clouds_description == "Ligte reënbui")
{
string clouds_description_DE = "Ligte reënbuie";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (clouds_description == "Ligte motreën")
{
string clouds_description_DE = "Motreën";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (wolke_beskrywing == "Mis")
{
string wolke_beskrywing_DE = "Was";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (clouds_description == "Ligte sneeubuie")
{
string clouds_description_DE = "Ligte sneeubuie";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (wolke_beskrywing == "Sonnig")
{
string clouds_description_DE = "Heiter";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (wolke_beskrywing == "Bewolk")
{
string clouds_description_DE = "Bewolk";
SkryfLyn("wolke_beskrywing"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (clouds_description == "Gedeeltelik bewolk")
{
string clouds_description_DE = "Gedeeltelik bewolk";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (wolke_beskrywing == "Duidelik")
{
string wolke_beskrywing_DE = "Duidelik";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (wolke_beskrywing == "Mis")
{
string wolke_beskrywing_DE = "Mis";
SkryfLyn("wolke_beskrywing_DE"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (clouds_description == "Moontlik met kolrige reën")
{
string clouds_description_DE = "Ligte reën moontlik";
SkryfLyn("wolke_beskrywing"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
as (clouds_description == "Matige reën")
{
string clouds_description_DE = "Matige neerslag";
SkryfLyn("wolke_beskrywing"); SkryfLyn(wolke_beskrywing_DE);
dom.GetObject("W_beskrywing").State(wolke_beskrywing_DE);
}
Wolkbedekking
Veranderlike wat geskep moet word:
W_wolkevan tipe string
Kode:
Wolkbedekking
pos = 0;
posBegin = 'wolkbedekking':';
posEnd = ',"voelssoos';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string wolke_data = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("wolke_data"); SkryfLyn(wolke_data);
dom.GetObject("W_wolke").State(wolke_data);
Reënvoorspelling
Veranderlike wat geskep moet word:
W_Neerslagvan tipe string
Kode:
! Voorspelde Reën
var x;
pos = 0;
posBegin = 'neerslag':';
posEnd = ',"humiditeit';
posWaardeBegin = stdout.Vind(posBegin) + posBegin.Lengte();
posWaardeEinde = stdout.Vind(posEinde)-posWaardeBegin;
string neerslag = stdout.Substr(posWaardeBegin, posWaardeEinde);
SkryfLyn("Neerslag"); SkryfLyn(neerslag);
dom.GetObject("W_Neerslag").Staat(neerslag);
Hoogte – Asimut
Die draaiboek is geskryf deur radio-vuurtoring geskryf en die Homematic Forum geneem van bladsy 10 van die gekoppelde draad.
Twee stelselveranderlikes moet geskep word:
son_hoogtevan tipe Nommerson_asimutvan tipe Nommer
Waarom presies 4 minute? Omdat die Aarde sy 360°-wentelbaan om die son een keer elke 24 uur voltooi. 360° / 24h = 15° per uur, wat ooreenstem met 60 minute / 15° = 4 minute.
Die skrip moet onafhanklik van die bogenoemde skrifte of die geassosieerde program gebruik word, mits die opdateringsinterval van 4 minute verskil.
Program:

Veranderlikes wat geskep moet word:
son_asimutvan tipe nommerson_hoogtevan tipe nommer
Kode:
Kry breedtegraad!werklike phi = stelsel.Breedtegraad();
phi = 0.017453292 * phi;
Omskakeling na radiale
Bereken sin_phi en cos_phi met behulp van die Taylor-reekswerklike temperatuur = phi * phi;
real sin_phi =phi * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));
sinusbenadering
reële cos_phi = (temp *temp *0.0416667) + 1.0 - (temp * 0.5);
! kosinusbenadering
Berekening van sontyd, alle tye in minuteheelgetal tyd_min = stelsel.Datum("%M").ToInteger() + 60stelsel.Datum("1TP3DE").TotHeelgetal(); heelgetal dagbegin_min = stelsel.SonsopkomsTyd("%M").TotHeelgetal() + 60stelsel.SonsopkomsTyd("1TP3DE").ToInteger();
heelgetal tagesende_min = stelsel.SunsetTime("%M").ToHeelgetal() + 60* stelsel.SunsetTime("%H").ToGeheelgetal();
heelgetal sontyd = tyd_min + 720 - 0.5 *(dag_begin_min + dag_einde_min);
as (sontyd > 1440) {sontyd = sontyd -1440;}
as (sontyd < 1) {sontyd = 1440 + sontyd;} boolean middag = vals; as (sontyd > 720) {sontyd = sontyd - 720; middag = waar;}
anders {sontyd = 720 -sontyd;}Berekening van sin_tau en cos_taureële tau = 0,00436332313 * sontyd; ! 15/60 * pi /180 * sontyd [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; regte cos_tau =tau * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));} anders {real tau1 =3.141592654 - tau; temp = tau1 * tau1; ware sin_tau =tau1 * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)); tau = tau - 1,570796327; temp = tau * tau; regte cos_tau = (tau) (-1.0) ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667));}
Berekening deltaheelgetal dagnommer = system.Date("%j").ToInteger(); dagnommer = dagnommer +10; if (dagnommer > 365) {dagnommer = dagnommer - 365;}
as (dagnommer < 92) {werklike dag = 0.0172142 *dagnommer; temp = dag * dag; werklike delta = (-0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} as ((dagnommer >91) && (dagnommer < 184)) {dagnommer = 183 - dagnommer; werklike dag = 0.0172142 *dagnommer; temp = dag * dag; werklike delta = (0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} as ((dagnommer >183) && (dagnommer < 275)) {dagnommer = dagnommer - 183; werklike dag = 0.0172142 *dagnommer; temp = dag * dag; werklike delta = (0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));} as ((dagnommer >274) && (dagnommer < 366)) {dagnommer = 365 - dagnommer; werklike dag = 0.0172142 * dagnommer; temp = dag * dag; werklike delta = (-0.410152) *((temp *temp *0.041666) + 1.0 - (temp * 0.5));}berekening sin_delta, cos_deltatemp = delta * delta; reële sin_delta =delta * ((temp * temp * 0.0083334) +1.0 - (temp * 0.1666667)); !sinus benadering reële cos_delta = (temp *temp * 0.0416667) + 1.0 - (temp * 0.5);
! kosinusbenadering
Berekening van tan_delta met stuksgewyse linearisering van die tanboolean vsegin = waar; as (delta< 0.0) {vsegin = vals; delta = (-1.0) *delta;} werklike tan_delta = 1.0233 * delta; as (delta >=0.2618) {tan_delta = (1.1822*delta) - 0.0416;}
if (vsign == vals) {tan_delta = (-1.0) * tan_delta;}Berekening van sin_elevasie en tan_asimutware sin_elevation = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
temp = sin_hoogte * sin_hoogte;
werklike son_hoogte = sin_hoogte * (1.0 + (0.1666667 * temp) + (0.075 * temp * temp));
son_hoogte = 57.29577951 * son_hoogte;
reële noemer = (sin_phi*cos_tau) - (cos_phi * tan_delta);
as (noemer < 0.0) {boolean plus180 = waar;} reële tan_asimut = sin_tau / noemer;
Berekening van son_asimut met stuksgewyse linearisering van die arctanboolean teken = waar; as (tan_asimut < 0.0) {teken = vals; tan_asimut = (-1.0)*tan_asimut;} werklike son_asimut = 0.97723 * tan_asimut; if ((tan_azimuth >=0.2679)&&(tan_azimuth < 0.5774)) {sun_azimuth = (0.84588* tan_azimuth) + 0.035189;} if ((tan_azimuth >= 0.5774)&& {sun_azimuth)un. (0.6195* tan_azimuth) + 0.1659;} if ((tan_azimuth >= 1.0)&&(tan_azimuth < 1.3032)) {sun_azimuth = (0.43173* tan_azimuth) + 0.3537;} if (32_1 azimuth&32_azimuth) < 1,7321)) {son_azimut = (0.3052* tan_azimuth) + 0.51856;} if ((tan_azimuth >= 1.7321)&&(tan_azimuth < 2.4142)) {sun_azimuth = (0.1919* tan_azimuth) + 0.7148;} if 2.4142)&&(tan_azimuth < 2.9459)) {sun_azimuth = (0.123* tan_azimuth) + 0.88115;} if ((tan_azimuth >= 2.9459)&&(tan_azimuth <3.73_azimuth < 3.73_azimuth)) {sun.021) {sun. tan_azimuth) + 0,9981;} if ((tan_azimuth >= 3.7321)&&(tan_azimuth < 5.0)) {son_azimuth = (0.050792* tan_azimuth) + 1.1194;} if ((tan_azimuth >= 5.0)&&(tan_azimuth <7.0)) {sun_0tan_7 = (5.0tan_7) 1.23465;} if ((tan_azimuth >= 7.0)&&(tan_azimuth <12.0)) {sun_azimuth = (0.01175117* tan_azimuth) + 1.346641;} if ((tan_azimuth >= tan_azimuth >= 12.0)&unuth = 12.0)&un (0.004147854* tan_azimuth) + 1.437881;} if ((tan_azimuth >= 20.0)&&(tan_azimuth <50.0)) {sun_azimuth = (0.0009987* tan_azimuth) + 1.5008639;} if (tan_azimuth >= 0.9.0) {s0_azimuth tan_azimuth) + 1,54579974;}
as (son_asimut > 1.5707963278) {son_asimut = 1.5707963278;}
as (teken == vals) {son_asimut = (-1.0) * son_asimut;}
son_asimut = 57.29577951 * son_asimut;
as (plus180 == waar) {son_asimut = son_asimut + 180.0;}Daaglikse regstelling en stoorwaardes na stelselveranderlikesas (middag == vals)
{son_asimut = 180.0 - son_asimut; sontyd = 720 - sontyd;}
anders
{son_asimut = son_asimut + 180.0;sontyd = 720 + sontyd;}
son_asimut = 0.1 ((son_asimut10.0) .ToInteger());
son_hoogte = 0.1 ((son_hoogte10.0) .ToInteger());
dom.GetObject("sonne_elevation").State(sonne_elevation);
dom.GetObject("son_asimut").State(son_asimut);