Hoppa till innehåll

Väderdata SmartHome

Lästid 9 minuter

Uppdaterad – 20 januari 2023

Att samla in väderdata med SmartHome och visualisera det via AIO Creator på din mobiltelefon eller surfplatta är vanligtvis inte en nödvändighet, men det är trevligt att ha.

Vädertjänsten online weatherstack.com erbjuder upp till 250 frågor per månad – begränsat kostnadsfritt. Om du verkligen vill ha uppdaterad väderdata bör du välja standardpaketet. 50 000 frågor tillåter minutintervaller.

De paket som fortfarande finns tillgängliga skiljer sig främst i antal förfrågningar och en väderprognos på 7 eller 14 dagar.

Följande data ingår i alla paket:

  • Geografisk longitud och latitud
  • Plats
  • område
  • land
  • Tidszon
  • Lokal tid och datum
  • UTC-offset
  • Aktuell tidpunkt för datainsamling
  • Lufttemperatur
  • Väderbeskrivning
  • vindhastighet
  • Vindriktning numerisk/geografisk
  • Lufttryck
  • Mängd regn
  • Fuktighet
  • Molndensitet
  • Kyltemperatur
  • UV-index
  • se

Registrering, oavsett paket, kräver de vanliga uppgifterna och betalningsuppgifterna. En årsprenumeration, i motsats till månadsvis, är rabatterad till 20%.

Efter att ha genomfört denna procedur kommer du att få en så kallad API-kod (Application Programming Interface), som du kopierar in i sökadressen. Svaret är en XML-utgång som innehåller ovanstående datakategorier och värden. Data extraheras med hjälp av lämpliga skript och lagras i variabler. Dessa kan sedan användas för visualisering i AIO Creator.

En detaljerad beskrivning av alla parametrar som är möjliga i XML-utgången, såväl som de valfria frågealternativen som ingår i de dyrare paketen, inklusive olika kodexempel, här synlig.

programmera

Programmet är ganska omfattande på grund av den stora mängden data. Därför listas de enskilda avsnitten sekventiellt här. Alla kodsnuttar kan i slutändan kombineras till ett enda program.

Utöver ovan nämnda data beräknas ytterligare data i programmet och görs tillgängliga för visualisering:

  • Solhöjd och azimut
  • Rekommendation av solskyddsfaktor
Program – W_Data – väderdatafråga

Programhuvud

Rubriken innehåller endast URL:en, som måste kompletteras med API-nyckeln, som här visas med xxx, och platsen (i vanlig text eller, separerade med kommatecken, som longitud och latitud, markerad med yyy:

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

Konvertering US till DE tidsformat

Eftersom det inte finns något val av visningsspråk i gratis- och standardtaxan, så endast AM/PM-tidsformatet är tillgängligt, konverteras det till 24-timmars här.

Variabel som ska skapas:

  • W_LDU av typ sträng

Koda:

! AM/PM-konvertering – spara i W_LDU

var posValueStart;
var posValueEnd;
var postStart;
var posEnd; sträng stderr; sträng stdout;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
WriteLine(stdout);
sträng väder_xml = stdout;

strängord = 'observation_time':"';
heltal word_längd = word.Length();
heltal word_position = väder_xml.Find(ord);
strängdata = väder_xml.Substr((ord_position + ord_längd), 5);
heltal word_position = data.Find(ord);
data = data.Substr(0, (ord_position -2));

strängord = 'observation_time':"';
heltal word_längd = word.Length();
heltal word_position = väder_xml.Find(ord);
sträng PM = väder_xml.Substr((ord_position + ord_längd +6), 2);
heltal word_position = PM.Find(ord);
PM = PM.Substr(0, (ord_position -2));
WriteLine("AM/PM");WriteLine(PM);

strängord = 'observation_time':"';
heltal word_längd = word.Length();
heltal word_position = väder_xml.Find(ord);
sträng HH = väder_xml.Substr((ord_position + ord_längd) + 1, 1);
heltal word_position = HH.Find(ord);
HH = HH.Substr(0, (ord_position -2));
WriteLine("HH");WriteLine(HH);

strängord = 'observation_time':"';
heltal word_längd = word.Length();
heltal word_position = väder_xml.Find(ord);
sträng MM = väder_xml.Substr((ord_position + ord_längd) +3, 2);
heltal word_position = MM.Find(ord);
MM = MM.Substr(0, (ord_position -2));
WriteLine("MM");WriteLine(MM);

if (PM == "PM")
{
heltalsdiff = 12;
WriteLine("Diff");WriteLine(Diff);
var HH_i = HH.ToInteger();
heltal H = (HH_i + Diff);
WriteLine("HHi + Diff är = H)");WriteLine(H);
sträng HHMM = H #":";
WriteLine("H_+ : ");WriteLine(TTMM);
sträng HM = HHMM # MM;
WriteLine("HH_+12+MM");WriteLine(HM);
dom.GetObject("W_LDU").State(HM);
}
annan
{
WriteLine("LDU_data");WriteLine(data);
dom.GetObject("W_LDU").State(data);
}


Land – Landskod

Landskoden matas även ut på engelska och omvandlas här till den internationella koden. Ytterligare länder kan läggas till enligt detta mönster vid behov. Det aktuella landet bestäms automatiskt av Weatherstack när du väljer stad.

Variabel som ska skapas:

W_landskod av typ sträng

Koda:

! Landskod

pos = 0;
postStart = 'land':"';
posEnd = '","region";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng country_code = stdout.Substr(posValueStart, posValueEnd);

if (landskod == "Tyskland")
{
string country_code = "DE";
}
if (landskod == "Sverige")
{
string country_code = "SE";
}

WriteLine("country_code");WriteLine(country_code);
dom.GetObject("W_country_code").State(country_code);


område

Regionen, till exempel i Tyskland, kallas "Niedersachsen" och bestäms också automatiskt av Weatherstack.

Variabel som ska skapas:

  • W_region av typ sträng

Koda:

! område

pos = 0;
postStart = 'region':"';
posEnd = '","lat';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
strängregion = stdout.Substr(posValueStart, posValueEnd);
WriteLine("region");WriteLine(region);
dom.GetObject("W_region").State(region);


Stad

När du går in i staden bestämmer Weatherstack automatiskt associerad longitud och latitud, medan staden bestäms utifrån inmatade geodata.

Variabel som ska skapas:

  • W_city_name av typ sträng

Koda:

! Stadsnamn

pos = 0;
postStart = 'namn':"';
posEnd = '","land";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng stadsnamn = stdout.Substr(posValueStart, posValueEnd);
WriteLine("stadsnamn");WriteLine(stadsnamn);
dom.GetObject("W_city_name").State(stadsnamn);


Latitud – geografisk. Bredd

Variabel som ska skapas:

  • W_Lat av typ sträng

Koda:

! Lat

pos = 0;
posStart = 'query':"Lat";
posEnd = 'och Lon';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng Lat = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Lat");WriteLine(Lat);
dom.GetObject("W_Lat").State(Lat);


Longitud – geogr. längd

Variabel som ska skapas:

  • W_Lon av typ sträng

Koda:

! Lon

pos = 0;
postStart = 'och Lon';
posEnd = '","språk';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng Lon = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Lon");WriteLine(Lon);
dom.GetObject("W_Lon").State(Lon);


Synlighet – synlighet

Variabel som ska skapas:

  • W_vis av typ sträng

Koda:

! Synlighet

pos = 0;
postStart = 'synlighet':';
posEnd = ',"is_day';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng vis_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("vis_data");WriteLine(vis_data);
dom.GetObject("W_vis").State(vis_data);


Lufttryck och trend

Utöver det tillhandahållna lufttrycket bestämmer detta skript lufttryckstendensen genom att spara ett uppmätt värde som "nuvarande" och ett tidigare som "gammalt". Båda jämförs med varandra, vilket resulterar i trenden.

Variabel som ska skapas:

  • W_lufttryck_akt av typ sträng
  • W_lufttryck_gammal av typ sträng
  • W_Barometriskt trycktrend av typ sträng

Koda:

! Tryck

var W_mb_old;
var W_mb_akt;
pos = 0;
postStart = 'tryck':';
posEnd = ',"precip';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
data = stdout.Substr(posValueStart, posValueEnd);WriteLine(data);
real 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_Luftdruck_alt").Value();WriteLine(W_mb_alt);

if (W_mb_akt > W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Lufttryckstrend").State("S");
}

if (W_mb_akt < W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Lufttryckstrend").State("F");
}

if (W_mb_akt == W_mb_old)
{
dom.GetObject("W_Luftdruck_old").State(W_mb_akt);
dom.GetObject("W_Lufttryckstrend").State("N");
}


Kyltemperatur

Vindkylan beror på vindhastigheten och temperaturen. Inom vattensporter ökar också effekten av evaporativ kylning på grund av spray (men detta tas inte med i beräkningen här). Chill avser den upplevda temperaturen, som i en mycket kall miljö kan vara upp till en och en halv gånger negativ temperatur jämfört med den faktiska temperaturen och kan leda till snabba köldskador.

Variabel som ska skapas:

  • W_chill av typ sträng

Koda:

! Kyla

pos = 0;
postStart = 'felslike':';
posEnd = ',"uv_index';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng app_temp_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("app_temp_data");WriteLine(app_temp_data);
dom.GetObject("W_chill").State(app_temp_data);


UV- och ljusskyddsrekommendation

Den UV-exponering som bestäms utifrån UV-index resulterar i en rekommendation för användning av ljusskyddsåtgärder vid behov.

Variabel som ska skapas:

  • W_UV av typ sträng
  • W_LSF av typ sträng

Koda:

! UV

pos = 0;
posStart = 'uv_index":';
posEnd = ',"synlighet';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
var uv_data = stdout.Substr(posValueStart, posValueEnd);
dom.GetObject("W_UV").State(uv_data);
data = uv_data.Substr(0, (ord_position -2));
reellt tal = data.ToInteger();
WriteLine("UV-nummer");WriteLine(nummer);

sträng LSF = "";
if (nummer <3) {LSF = "onödigt" ;} elseif ((nummer >= "3") && (nummer <= "5")) {LSF = "rekommenderas" ;} elseif ((nummer >= "6) ") && (nummer <= "7")) {LSF = "required" ;} elseif ((nummer >= "8") && (nummer <= "9")) {LSF = "required" ;} elseif ( nummer >= "10") {LSF = "MÅSTE" ;}
dom.GetObject("W_LSF").State(LSF);WriteLine("LSF");WriteLine(LSF);


vindhastighet

Variabel som ska skapas:

  • W_WdSpd av typ antal

Koda:

! vindhastighet

pos = 0;
posStart = 'vind_hastighet":';
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_data.ToFloat();
dom.GetObject("W_WdSpd").State(x);


Vindhastighetsomvandlingar

Eftersom det finns olika föredragna vindhastighetsmätningar i olika regioner, länder och applikationer, är här omvandlingen från m/s till km/h, knop och Beaufort.

Variabel som ska skapas:

  • W_Wind_kmh av typ antal
  • W_Wind_knh av typ antal
  • W_Wind_Bft av typen antal

Koda:

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

om (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);
}
om (x > 32,6)
{
dom.GetObject(“W_Wind_Bft”).State(12);
}

Vindhastighet – risk för frostskador

Den som reser i mycket kalla zoner kommer att få en varning med detta skript om det finns risk för frostskador på grund av vindhastighet och upplevd utomhustemperatur om lämpliga skyddskläder inte används.

Beräkningen förutsätter att med hudexponering i 30 minuter eller mindre kan hudtemperaturen förväntas sjunka till -4,8 °C och att köldskador uppstår hos människor vid 5%.

Variabel som ska skapas:

  • W_Wind_Danger typ booleskt

Koda:

if ((app_temp_data == -27.2) && (8 > W_Wind_kmh <10.1)) || ((app_temp_data == -22.9) && (12 > W_Wind_kmh <15.1)) || ((app_temp_data == -24.2) && ( 18 > W_wind_kmh <20.1)) || ((app_temp_data == -25.2) && (23 > W_wind_kmh <25.1)) || -26.8) && (32 > W_Wind_kmh <35.1)) || ((app_temp_data == -27.4) && (37 > W_Wind_kmh <40.1)) || > W_Wind_kmh <50.1)) || && (57 > W_Wind_kmh <60.1)))
{
dom.GetObject("W_Wind_Danger").State(true);
}
annan
{
dom.GetObject("W_Wind_Danger").State(false);
}


Vindriktning (geografisk)

Variabel som ska skapas:

  • W_wind_dir av typ sträng

Koda:

! Vindriktning geografiskt

pos = 0;
posStart = 'wind_dir':"';
posEnd = '","tryck";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng wind_dir_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_dir");WriteLine(wind_dir_daten);
dom.GetObject("W_wind_dir").State(wind_dir_daten);


Vindriktning (numerisk)

Variabel som ska skapas:

  • W_Wind_rchtg av typ sträng

Koda:

! Vindriktning numeriskt

pos = 0;
posStart = 'vindgrad':';
posEnd = ',"wind_dir';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng W_wind_rchtg = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_wind_rchtg");WriteLine(W_wind_rchtg);
dom.GetObject("W_wind_rchtg").State(W_wind_rchtg);


Molntäcke

Molntäcket är också skrivet på engelska av Weatherstack, varför översättningen till tyska görs här.

Variabel som ska skapas:

  • W_description av typ sträng

Koda:

! Molnskyddsbeskrivning

pos = 0;
posStart = 'weather_descriptions':["';
posEnd = '"],"vindhastighet";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng clouds_description = stdout.Substr(posValueStart, posValueEnd);
WriteLine("clouds_description_EN");WriteLine(clouds_description);

if (clouds_description == "molnigt")
{
string clouds_description_DE = "Molnigt";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Lätt regn")
{
string clouds_description_DE = "Lätt regn";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Lätt regnskur")
{
string clouds_description_DE = "Lätta regnskurar";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Lätt duggregn")
{
string clouds_description_DE = "Duggregn";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Mis")
{
string clouds_description_DE = "Dis";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Lätta snöskurar")
{
string clouds_description_DE = "Lätta snöskurar";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Soligt")
{
string clouds_description_DE = "Heiter";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "mulet")
{
string clouds_description_DE = "Mulet";
WriteLine("clouds_description");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Delvis molnigt")
{
string clouds_description_DE = "Delvis molnigt";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Rensa")
{
string clouds_description_DE = "Rensa";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Dimma")
{
string clouds_description_DE = "Dimma";
WriteLine("clouds_description_DE");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "Möjligt med fläckvis regn")
{
string clouds_description_DE = "Lätt regn möjligt";
WriteLine("clouds_description");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}
if (clouds_description == "måttligt regn")
{
string clouds_description_DE = "Måttlig nederbörd";
WriteLine("clouds_description");WriteLine(clouds_description_DE);
dom.GetObject("W_description").State(clouds_description_DE);
}


Molntäcke

Variabel som ska skapas:

  • W_moln av typ sträng

Koda:

! Molntäcke

pos = 0;
posStart = 'molntäcke':';
posEnd = ',"felslike";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
sträng clouds_data = stdout.Substr(posValueStart, posValueEnd);
WriteLine("moln_data");WriteLine(moln_data);
dom.GetObject("W_moln").State(moln_data);


Prognostisera regn

Variabel som ska skapas:

  • W_Nerbörd av typ sträng

Koda:

! Prognostisera regn

varx;
pos = 0;
postStart = 'precip':';
posEnd = ',"fuktighet";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string precip = stdout.Substr(posValueStart, posValueEnd);
WriteLine("Nerbörd");WriteLine(nederbörd);
dom.GetObject("W_Precipitation").State(precip);


Höjd – Azimut

Manuset skrevs av radiofyr skriven och den Hemmatiskt forum hämtad från sidan 10 i den länkade tråden.

Två systemvariabler måste skapas:

  • sun_elevation n av typ Antal
  • sun_azimuth av typ Antal

Varför bara 4 minuter? Eftersom jorden avslutar sin 360° cirkel runt solen en gång på 24 timmar. 360° / 24h = 15° per timme, motsvarande 60 minuter / 15° = 4 minuter.

Skriptet bör användas oberoende av ovanstående skript eller tillhörande program, förutsatt att uppdateringsintervallet skiljer sig från 4 minuter.

Programmera:

Program – höjd-/azimutbestämning

Variabler som ska skapas:

  • sun_azimuth av typ antal
  • sun_elevation av typ antal

Koda:

! Få latitud
real phi = system.Latitude();
phi = 0,017453292 * phi;


! Omvandling till radianer
! Beräkna sin_phi och cos_phi med Taylor-serier
verklig temp = phi * phi;
real sin_phi =phi * ((temp * temp * 0,0083334) +1,0 - (temp * 0,1666667));


! sinus approximation
real cos_phi = (temp *temp *0,0416667) + 1,0 - (temp * 0,5);


! cosinus approximation
! Beräkning av soltid, alla tider i minuter
heltal time_min = system.Date("%M").ToInteger() + 60system.Date("%H").ToInteger(); heltal start av dag_min = system.SunriseTime("%M").ToInteger() + 60system.SunriseTime("%H").ToInteger();
heltal slutet av dag_min = system.SunsetTime("%M").ToInteger() + 60* system.SunsetTime("%H").ToInteger();
heltals soltid = tid_min + 720 - 0,5 *(start av dag_min + slutet av dag_min);
if (soltid > 1440) {soltid = soltid -1440;}
if (soltid < 1) {soltid = 1440 + soltid;} boolesk eftermiddag =falskt; if (soltid > 720) {soltid =soltid - 720; eftermiddag = sant; }
annars {soltid =720 -soltid;}


! Beräkning sin_tau och cos_tau
verklig tau = 0,00436332313 * soltid; ! 15/60 * pi /180 * soltid [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));} annars {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));}

! Beräkningsdelta
heltals dagnummer = system.Date("%j").ToInteger(); dagnummer = dagnummer +10; if (daynumber > 365) {daynumber = daynumber - 365;}
if (dagnummer < 92) {verklig dag = 0,0172142 * dagnummer; temp = dag * dag; verkligt delta = (-0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));} if ((dagnummer >91) && (dagnummer < 184)) {dagnummer = 183 - dag antal; verklig dag = 0,0172142 *dagnummer; temp = dag * dag; verkligt delta = (0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));} if ((dagnummer >183) && (dagnummer < 275)) {dagnummer = dagnummer - 183 ; verklig dag = 0,0172142 *dagnummer; temp = dag * dag; verkligt delta = (0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));} if ((dagnummer >274) && (dagnummer < 366)) {dagnummer = 365 - dagnummer ; verklig dag = 0,0172142 *dagnummer; temp = dag * dag; verkligt delta = (-0,410152) *((temp *temp *0,041666) + 1,0 - (temp * 0,5));}

! beräkning sin_delta, cos_delta
temp = delta * delta; real sin_delta =delta * ((temp * temp * 0,0083334) +1,0 - (temp * 0,1666667)); !sinus approximation real cos_delta = (temp *temp *0,0416667) + 1,0 - (temp * 0,5);

! cosinus approximation
! Beräkning av tan_delta med styckvis linjärisering av tan
booleskt vtecken = sant; if (delta < 0,0) {vsign = false; delta = (-1,0) *delta;} reell tan_delta = 1,0233 * delta; if (delta >=0,2618) {tan_delta = (1,1822*delta) - 0,0416;}
if (vtecken == falskt) {tan_delta = (-1.0) * tan_delta;}


! Beräkning sin_elevation och tan_azimuth
real sin_elevation = (sin_phi * sin_delta) +( cos_phi * cos_delta * cos_tau);
temp = sin_elevation * sin_elevation;
real sun_elevation = sin_elevation * (1,0 + (0,1666667 * temp) + (0,075 * temp * temp));
sun_elevation = 57,29577951 * sun_elevation;
reell nämnare = (sin_phi*cos_tau) - (cos_phi * tan_delta);
if (nämnare < 0,0) {boolean plus180 = sant;} real tan_azimuth = sin_tau / nämnare;


! Beräkning av sun_azimuth med styckvis linjärisering av arctan
booleskt tecken = sant; if (tan_azimuth < 0,0) { tecken = falskt; tan_azimuth = (-1,0)*tan_azimuth;} verklig sol_azimuth = 0,97723 * tan_azimuth; if ((tan_azimuth >=0,2679)&&(tan_azimuth < 0,5774)) {sun_azimuth = (0,84588* tan_azimuth) + 0,035189;} if ((tan_azimuth >= 0,5774)&&(tan_azimuth)&&(tan_azimuth. azimut) + 0.1659;} if ((tan_azimuth >= 1.0)&&(tan_azimuth < 1.3032)) {sun_azimuth = (0.43173* tan_azimuth) + 0.3537;} if ((tan_azimuth >= 1.3032) & azimuth (1.3032) (tan_azimuth)& 1.3032) (3032) ( 0,3052* tan_azimuth) + 0,51856;} if ((tan_azimuth >= 1,7321)&&(tan_azimuth < 2,4142)) {sun_azimuth = (0,123* tan_azimuth) + 0,88115; 3,7321)) {sun_azimuth = (0,083312* tan_azimuth) + 0,9981;} if ((tan_azimuth >= 3,7321)&&(tan_azimuth < 5,0)) {sun_azimuth = (0,050792* tan_azimuth) (tan_azimuth) (tan_azimuth) (tan_azimuth) (tan_azimuth) (tan_azimuth) (tan_azimuth) (tan_azimuth). azimut <7,0)) {sun_azimuth = (0,02775* tan_azimuth) + 1,23465;} if ((tan_azimuth >= 7,0 )&&(tan_azimuth <12,0)) {sun_azimuth = (0,01175117*) 2.0 )&&(tan_azimuth <20.0)) {sun_azimuth = (0.004147854* tan_azimuth) + 1.437881;} if ((tan_azimuth >= 20.0)&&(tan_azimuth <50.0)) {sun_azimuth <50.0)) {sun_azimuth 639;} if (tan_azimuth >= 50,0) {sun_azimuth = (0,000099983* tan_azimuth) + 1,54579974;}
if (sun_azimuth > 1,5707963278) {sun_azimuth = 1,5707963278;}
om (tecken == falskt) {sun_azimuth = (-1.0) * sun_azimuth;}
sun_azimuth = 57,29577951 * sun_azimuth;
om (plus180 == sant) {sun_azimuth = sun_azimuth + 180.0;}


! Daglig korrigering och spara värden till systemvariabler
om (eftermiddag == falskt)
{sun_azimuth = 180,0 - sun_azimuth; soltid = 720 - soltid;}
annan
{sun_azimuth = sun_azimuth + 180,0;soltid = 720 + soltid;}
sun_azimuth = 0,1 ((sun_azimuth10.0) .ToInteger());
solhöjd = 0,1 ((solhöjd10.0) .ToInteger());
dom.GetObject("sonne_elevation").State(sonne_elevation);
dom.GetObject("sun_azimuth").State(sun_azimuth);

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

sv_SESvenska