Obsah
Údaje GPS sa počas cestovania neustále menia. Cieľom je použiť program SmartHome v systéme HomeMatic alebo RaspberryMatic na zaznamenávanie týchto údajov a v prípade potreby aktualizovať ďalšie parametre, ktoré od nich závisia.
Mohli by ste samozrejme neustále určovať polohu, a tak vždy načítať údaje o počasí vo vzťahu k polohe, ale to by generovalo zbytočnú online prevádzku a zaťaženie procesora. Preto systém kontroluje len zmenu polohy a údaje o počasí určuje vo vzťahu k aktuálnej polohe len vtedy, keď sa rozpozná zmena polohy, a podľa toho údaje aktualizuje.
Úprava údajov GPS na porovnanie
Keďže súradnice GPS vždy kolíšu na posledných dvoch čísliciach hodnôt zemepisnej dĺžky a šírky v dôsledku zámernej nepresnosti poskytovateľov služieb GPS, aj keď zostávate na rovnakom mieste bez zmeny, na porovnanie sa berú do úvahy len štyri desatinné miesta. Zmena polohy sa preto rozpozná len vtedy, ak sa zmení aspoň štvrté desatinné miesto.
Doplnok k skriptom (GPS_Data)
Nasledujúce riadky skriptu sú pridané do tu diskutovaný scenár GPS_Data pridané. Riadky začínajúce výkričníkom predstavujú komentáre. Príkazy WriteLine sa používajú len na kontrolu výstupu a možno ich vymazať.
Musia sa vytvoriť nové premenné typu DRAWING CHAIN:
- W_Lat_short_act (Uloženie aktuálnej zemepisnej šírky skrátenej na štyri desatinné miesta)
- W_Lon_short_act (Uloženie aktuálnej zemepisnej dĺžky skrátenej na štyri desatinné miesta)
- W_Lat_short_old (Uloženie - starej - zemepisnej šírky skrátenej na štyri desatinné miesta)
- W_Lon_short_old (Uloženie starej zemepisnej dĺžky skrátenej na štyri desatinné miesta)
Skript
! Uložiť geodáta skrátené na 4 desatinné miesta (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);
! Porovnanie súčasnej a starej polohy
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);
ak ((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);
! Zostavte URL s aktuálnymi údajmi GPS - AppID "... xxx ..." musí byť vyplnené vašim vlastným ID
var url = "https://api.openweathermap.org/geo/1.0/reverse?lat="#Latitude#"&lon="#Longitude#"&limit=5&appid=[xxxxxxxxxxxxxxxxxxxxxxxxxxxxx]";
WriteLine("nová adresa URL pre nové geodáta");WriteLine(url);
! Odoslanie požiadavky na adresu 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);
! Extrakcia údajov
! Názov_mesta
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("názov_mesta");WriteLine(názov_mesta);
dom.GetObject("W_city_name").State(city_name);
! Kód krajiny
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);
! Región
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);
}
! Vetva ELSE môže byť vynechaná a používa sa len na overenie, či bol skript spustený až do konca, ak sa miesto nezmenilo
inak
{
WriteLine("Údaje sa rovnajú");
}