Turinys
Keliaujant GPS duomenys nuolat kinta. Tikslas - naudojant "SmartHome" sistemoje "HomeMatic" arba "RaspberryMatic" įrašyti šiuos duomenis ir, jei reikia, atnaujinti kitus nuo jų priklausančius parametrus.
Žinoma, galėtumėte nuolat nustatyti vietą ir taip visada gauti orų duomenis, susijusius su ta vieta, tačiau tai sukeltų nereikalingą interneto srautą ir procesoriaus apkrovą. Todėl sistema tikrina, ar nepasikeitė padėtis, ir tik tada, kai atpažįstamas vietos pasikeitimas, nustato orų duomenis, susijusius su esama vieta, ir atitinkamai atnaujina duomenis.
GPS duomenų koregavimas palyginimui
Kadangi GPS koordinatės dėl GPS paslaugų teikėjų sąmoningo netikslumo visada svyruoja iki paskutinių dviejų geografinės ilgumos ir platumos reikšmių skaitmenų, net jei išliekate toje pačioje vietoje, lyginant atsižvelgiama tik į keturis skaitmenis po kablelio. Todėl buvimo vietos pasikeitimas atpažįstamas tik tuo atveju, jei pasikeičia bent ketvirtas skaičius po kablelio.
Scenarijaus priedas (GPS_Duomenys)
Šios scenarijaus eilutės pridedamos prie čia aptartas scenarijus GPS_Duomenys pridėta. Eilutės, prasidedančios šauktuku, reiškia pastabas. WriteLine teiginiai naudojami tik išvesties valdymui ir gali būti ištrinti.
Turi būti sukurti nauji DRAWING CHAIN tipo kintamieji:
- W_Lat_short_act (Dabartinei platumai, sutrumpintai iki keturių skaitmenų po kablelio, įrašyti)
- W_Lon_short_act (Norėdami išsaugoti dabartinę geografinę ilgumą, sutrumpintą iki keturių skaitmenų po kablelio)
- W_Lat_short_old (Norėdami išsaugoti senąją geografinę platumą, sutrumpintą iki keturių skaitmenų po kablelio)
- W_Lon_short_old (Norėdami išsaugoti senąją geografinę ilgumą, sutrumpintą iki keturių skaitmenų po kablelio)
Skriptas
! Įrašyti geoduomenis, sutrumpintus iki 4 ženklų po kablelio (ToString(4))
var lat_short_akt = lat.ToString(4);
WriteLine("lat_short_akt");WriteLine(lat_short_akt);
dom.GetObject('W_Lat_short_akt').State(lat_short_akt);
var lon_short_akt = lon.ToString(4);
WriteLine("lon_short");WriteLine(lon_short_akt);
dom.GetObject('W_Lon_short_akt').State(lon_short_akt);
! Dabartinės ir senosios vietos palyginimas
var W_lat_short_alt = dom.GetObject("W_Lat_short_alt").Value();WriteLine(W_lat_short_alt);
var W_lon_short_alt = dom.GetObject("W_Lon_short_alt").Value();WriteLine(W_lon_short_alt);
jei ((lat_short_akt W_lat_short_alt) && (lon_short_akt W_lon_short_alt))
{
dom.GetObject("W_Lat_short_alt").State(lat_short_akt);
dom.GetObject("W_Lon_short_alt").State(lon_short_akt);
! Surinkite URL adresą su dabartiniais GPS duomenimis - AppID "... xxx ..." turi būti užpildytas jūsų ID
var url = "https://api.openweathermap.org/geo/1.0/reverse?lat="#Latitude#"&lon="#Longitude#"&limit=5&appid=[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]";
WriteLine("naujas naujų geoduomenų URL");WriteLine(url);
! URL užklausos siuntimas
var posValueStart;
var posValueEnd;
var pos;
var duomenys;
var posStart;
var posEnd; string stderr; string stdout;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
WriteLine(stdout);
! Duomenų išgavimas
! City_name
pos = 0;
posStart = 'name':"';
posEnd = '", "local_names";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string city_name = stdout.Substr(posValueStart, posValueEnd);
WriteLine("city_name");WriteLine(city_name);
dom.GetObject("W_city_name").State(city_name);
! Šalies kodas
pos = 0;
posStart = "country":"';
posEnd = '", "state";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string country_code = stdout.Substr(posValueStart, posValueEnd);
WriteLine("country_code");WriteLine(country_code);
dom.GetObject("W_country_code").State(country_code);
! Regionas
pos = 0;
posStart = 'state":"';
posEnd = '"}]]";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string W_region = stdout.Substr(posValueStart, posValueEnd);
WriteLine("W_region");WriteLine(W_region);
dom.GetObject("W_region").State(W_region);
}
! Šakos ELSE galima nepateikti, ji naudojama tik norint patikrinti, ar scenarijus buvo paleistas iki galo, jei vieta nepasikeitė.
kitaip
{
WriteLine("Duomenys lygūs");
}