Ugrás a tartalomra

SmartHome - GPS adatok változása

Tartalomjegyzék

Olvasási idő 2 percek

A GPS-adatok utazás közben folyamatosan változnak. A cél itt az, hogy a SmartHome-ot a HomeMatic vagy a RaspberryMatic rendszeren használjuk ezen adatok rögzítésére, és szükség esetén az ettől függő egyéb paraméterek frissítésére.

Természetesen folyamatosan meghatározhatná a helyet, és így mindig a helyhez képest kérhetné le az időjárási adatokat, de ez felesleges online forgalmat és processzorterhelést generálna. Ezért a rendszer csak a helyváltoztatást ellenőrzi, és csak akkor határozza meg az időjárási adatokat az aktuális helyhez viszonyítva, amikor a helyváltoztatást felismeri, és ennek megfelelően frissíti az adatokat.

A GPS-adatok kiigazítása az összehasonlításhoz

Mivel a GPS-koordináták a GPS-szolgáltatók szándékos pontatlansága miatt a hosszúsági és szélességi értékek utolsó két számjegyében mindig ingadoznak, még ha változatlanul ugyanazon a helyen tartózkodik is, az összehasonlításhoz csak négy tizedesjegyet vesznek figyelembe. A helyváltoztatás tehát csak akkor ismerhető fel, ha legalább a negyedik tizedesjegy változik.

Szkript-kiegészítés (GPS_Data)

A következő szkript sorok kerülnek hozzá a itt megvitatott forgatókönyv GPS_Data hozzáadva. A felkiáltójellel kezdődő sorok megjegyzéseket jelentenek. A WriteLine utasítások csak a kimenet vezérlésére szolgálnak, és törölhetők.

Új DRAWING CHAIN típusú változókat kell létrehozni:

  • W_Lat_short_act (Az aktuális szélességi fok négy tizedesjegyre lefaragva történő tárolása)
  • W_Lon_short_act (Az aktuális földrajzi hosszúság négy tizedesjegyre lefaragva történő mentése)
  • W_Lat_short_old (A - régi - földrajzi szélesség tárolása négy tizedesjegyre lecsupaszítva)
  • W_Lon_short_old (A - régi - földrajzi hosszúság tárolása négy tizedesjegyre rövidítve)

Forgatókönyv

! A geoadatokat 4 tizedesjegyre lefaragva menti (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);

! A jelenlegi és a régi helyszín összehasonlítása

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

! Állítsa össze az URL-t az aktuális GPS-adatokkal - az AppID "... xxx ..." az Ön saját azonosítójával kell kitölteni.

var url = "https://api.openweathermap.org/geo/1.0/reverse?lat="#Latitude#"&lon="#Longitude#"&limit=5&appid=[xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx]";
WriteLine("új URL az új geoadatokhoz");WriteLine(url);

! Az URL kérés elküldése

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

! Az adatok kinyerése

! Városnév

pos = 0;
posStart = 'name':"';
posEnd = '", "local_names';
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string városnév = stdout.Substr(posValueStart, posValueEnd);
WriteLine("városnév");WriteLine(városnév);
dom.GetObject("W_city_name").State(city_name);

! Országkód

pos = 0;
posStart = "ország":"";
posEnd = '", "state";
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string country_code = stdout.Substr(posValueStart, posValueEnd);
WriteLine("ország_kód");WriteLine(ország_kód);
dom.GetObject("W_country_code").State(country_code);

! Régió

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

}

! Az ELSE ág elhagyható, és csak annak ellenőrzésére szolgál, hogy a szkript végigfutott-e, ha a hely nem változott.

else
{
WriteLine("Az adatok megegyeznek");
}

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

hu_HUHungarian