Vsebina
Podatki GPS se med potovanjem nenehno spreminjajo. Cilj je uporabiti program SmartHome v sistemu HomeMatic ali RaspberryMatic za beleženje teh podatkov in po potrebi posodobiti druge parametre, ki so od njih odvisni.
Seveda bi lahko stalno določali lokacijo in tako vedno pridobivali vremenske podatke glede na lokacijo, vendar bi to povzročilo nepotreben spletni promet in obremenitev procesorja. Zato sistem preverja le spremembo položaja in določi vremenske podatke glede na trenutno lokacijo šele, ko je prepoznana sprememba lokacije, ter ustrezno posodobi podatke.
Prilagoditev podatkov GPS za primerjavo
Ker koordinate GPS zaradi namerne nenatančnosti ponudnikov storitev GPS vedno nihajo do zadnjih dveh številk vrednosti zemljepisne dolžine in širine, se za primerjavo upoštevajo le štiri decimalna mesta, tudi če ostajate na isti lokaciji nespremenjeni. Sprememba lokacije je zato prepoznana le, če se spremeni vsaj četrto decimalno mesto.
Dodatek k skriptom (GPS_podatki)
Naslednje vrstice skripte so dodane v tukaj obravnavani scenarij GPS_podatki dodano. Vrstice, ki se začenjajo z izklicnikom, predstavljajo komentarje. Stavki WriteLine se uporabljajo samo za nadzor izpisa in jih je mogoče izbrisati.
Ustvariti je treba nove spremenljivke vrste DRAWING CHAIN:
- W_Lat_short_act (za shranjevanje trenutne zemljepisne širine, skrajšane na štiri decimalna mesta)
- W_Lon_short_act (za shranjevanje trenutne geografske dolžine, skrajšane na štiri decimalna mesta)
- W_Lat_short_old (Za shranjevanje stare geografske širine, skrajšane na štiri decimalna mesta)
- W_Lon_short_old (Za shranjevanje stare geografske dolžine, skrajšane na štiri decimalna mesta)
Scenarij
! Shranite geopodatke, skrajšane na 4 decimalna mesta (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);
! Primerjava trenutne in stare lokacije
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);
če ((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);
! Sestavite URL s trenutnimi podatki GPS - AppID "... xxx ..." mora biti izpolnjen z vašim ID
var url = "https://api.openweathermap.org/geo/1.0/reverse?lat="#Latitude#"&lon="#Longitude#"&limit=5&appid=[xxxxxxxxxxxxxxxxxxxxxxxxx]";
WriteLine("nov URL za nove geopodatke");WriteLine(url);
! Pošiljanje zahteve URL
var posValueStart;
var posValueEnd;
var pos;
var data;
var posStart;
var posEnd; string stderr; string stdout;
system.Exec("wget -q -O - '"#url#"'", &stdout, &stderr);
WriteLine(stdout);
! Pridobivanje podatkov
! Ime_mesta
pos = 0;
posStart = 'ime':"';
posEnd = '", "local_names";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string city_name = stdout.Substr(posValueStart, posValueEnd);
WriteLine("ime_mesta");WriteLine(ime_mesta);
dom.GetObject("W_city_name").State(city_name);
! Koda države
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);
! Regija
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_regija");WriteLine(W_regija);
dom.GetObject("W_region").State(W_region);
}
! Vejo ELSE lahko izpustite in se uporablja samo za preverjanje, ali je bila skripta izvedena do konca, če se lokacija ni spremenila
drugače
{
WriteLine("Podatki so enaki");
}