Slaan oor na inhoud

Weerdata SmartHome

Leestyd 9 minute

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
Program – W_Data – Weerdata-navraag

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_LDU van 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_streek van 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_naam van 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_Breedtegraad van 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_Lon van 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_vis van 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_aktief van tipe string
  • W_lugdruk_oud van tipe string
  • W_Lugdrukneiging van 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_chill van 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_UV van tipe string
  • W_LSF van 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_WdSpd van 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/h van tipe nommer
  • W_Wind_knh van 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_dir van 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_rchtg van 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_beskrywing van 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_wolke van 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_Neerslag van 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_hoogte van tipe Nommer
  • son_asimut van 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:

Program – Hoogte-/Azimutbepaling

Veranderlikes wat geskep moet word:

  • son_asimut van tipe nommer
  • son_hoogte van 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-reeks
werklike 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 minute
heelgetal 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_tau
reë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 delta
heelgetal 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_delta
temp = 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 tan
boolean 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_asimut
ware 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 arctan
boolean 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 stelselveranderlikes
as (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);

Maak 'n opvolg-bydrae

Jou e-posadres sal nie gepubliseer word nie. Verpligte velde word met * aangedui