Obsah
Údaje GPS se při cestování neustále mění. Cílem je použít SmartHome na HomeMaticu nebo RaspberryMaticu k zaznamenávání těchto dat a v případě potřeby aktualizovat další parametry, které na nich závisí.
Mohli byste samozřejmě průběžně určovat polohu, a tak vždy načítat údaje o počasí ve vztahu k dané poloze, ale to by generovalo zbytečný online provoz a zatížení procesoru. Proto systém kontroluje pouze změnu polohy a údaje o počasí ve vztahu k aktuální poloze určuje pouze tehdy, když je změna polohy rozpoznána, a podle toho údaje aktualizuje.
Úprava údajů GPS pro srovnání
Vzhledem k tomu, že souřadnice GPS vždy kolísají na posledních dvou číslicích hodnot zeměpisné délky a šířky v důsledku záměrné nepřesnosti poskytovatelů služeb GPS, i když zůstáváte na stejném místě beze změny, berou se pro porovnání v úvahu pouze čtyři desetinná místa. Změna polohy je tedy rozpoznána pouze tehdy, pokud se změní alespoň čtvrté desetinné místo.
Doplněk skriptu (GPS_Data)
Následující řádky skriptu jsou přidány do zde diskutovaný scénář GPS_Data přidáno. Řádky začínající vykřičníkem představují komentáře. Příkazy WriteLine slouží pouze k řízení výstupu a lze je smazat.
Je třeba vytvořit nové proměnné typu DRAWING CHAIN:
- W_Lat_short_act (Pro uložení aktuální zeměpisné šířky zkrácené na čtyři desetinná místa)
- W_Lon_short_act (Uložení aktuální zeměpisné délky zkrácené na čtyři desetinná místa)
- W_Lat_short_old (Pro uložení - staré - zeměpisné šířky zkrácené na čtyři desetinná místa)
- W_Lon_short_old (Pro uložení - staré - zeměpisné délky zkrácené na čtyři desetinná místa)
Skript
! Uložit geodata zkrácená na 4 desetinná místa (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);
! Srovnání současné a staré 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);
if ((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);
! Sestavte URL s aktuálními údaji GPS - AppID "... xxx ..." musí být vyplněno vaším vlastním ID.
var url = "https://api.openweathermap.org/geo/1.0/reverse?lat="#Latitude#"&lon="#Longitude#"&limit=5&appid=[xxxxxxxxxxxxxxxxxxxxxxxxxxx]";
WriteLine("nová adresa URL pro nová geodata");WriteLine(url);
! Odeslání požadavku 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);
! Extrakce dat
! Název_města
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("jméno_města");WriteLine(jméno_města);
dom.GetObject("W_city_name").State(city_name);
! Kód země
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);
! Region
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);
}
! Větev ELSE lze vynechat a slouží pouze k ověření, zda byl skript spuštěn až do konce, pokud se umístění nezměnilo.
jinak
{
WriteLine("Data se rovnají");
}