Pāriet uz saturu

SmartHome – GPS-Daten Änderungen

Lasīšanas laiks 2 Minuten

Auf Reisen finden laufend Änderungen der GPS-Daten statt. Diese zu erfassen und ggf. andere davon abhängige Parameter zu aktualisieren, soll hier mittels SmartHome auf HomeMatic oder RaspberryMatic realisiert werden.

Man könnte natürlich laufend den Standort ermitteln und so die Wetterdaten stets auf den Ort bezogen abrufen, doch würde dies unnötigen Online-Traffic und Prozessor-Last erzeugen. Deshalb wird lediglich auf Positions-Änderung geprüft und erst bei erkanntem Ortswechsel die Wetterdaten auf den nunmehr aktuellen Standort bezogen ermittelt und die Daten entsprechend aktualisiert.

Anpassung der GPS-Daten zum Vergleich

Da sich GPS-Koordinaten auf Grund der gewollten Ungenauigkeit der GPS-Dienstleister stets auf den letzten zwei Stellen der Längen- und Breiten-Angaben schwanken, selbst wenn man unverändert am selben Ort verweilt, werden zum Vergleich nur vier Nachkomma-Stellen berücksichtigt. Ein Ortswechsel wird also erst dann erkannt, wenn sich mindestens die vierte Nachkomma-Stelle ändert.

Skript Ergänzung (GPS_Data)

Folgende Skript-Zeilen werden dem hier besprochenen Skript GPS_Data angefügt. Zeilen beginnend mit einem Ausrufezeichen stellen Kommentare dar. WriteLine-Anweisungen dienen lediglich der Ausgabe-Kontrolle und können gelöscht werden.

Als neue Variablen vom Typ ZEICHENKETTE müssen angelegt werden:

  • W_Lat_short_akt (Zur Speicherung der auf vier Nachkomma-Stellen gekürzten – aktuellen – geogr. Breite)
  • W_Lon_short_akt (Zur Speicherung der auf vier Nachkomma-Stellen gekürzten – aktuellen – geogr. Länge)
  • W_Lat_short_alt (Zur Speicherung der auf vier Nachkomma-Stellen gekürzten – alten – geogr. Breite)
  • W_Lon_short_alt (Zur Speicherung der auf vier Nachkomma-Stellen gekürzten – alten – geogr. Länge)

Skript

! Geo-Daten auf 4 Nachkommastellen (ToString(4)) gekürzt speichern

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

! Vergleich Standort akt und alt

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

! Zusammensetzen der URL mit den akt. GPS-Daten – die AppID „.. xxx ..“ muss mit der eigenen ID befüllt werden

var url = „https://api.openweathermap.org/geo/1.0/reverse?lat=“#Latitude#“&lon=“#Longitude#“&limit=5&appid=[xxxxxxxxxxxxxxxxxxxxxxxxx]“;
WriteLine(„neue URL für neue Geo-Daten“);WriteLine(url);

! Senden der URL-Anfrage

var posValueStart;
var posValueEnd;
var pos;
var daten;
var posStart;
var posEnd; string stderr; string stdout;
system.Exec(„wget -q -O – ‚“#url#“‚“, &stdout, &stderr);
WriteLine(stdout);

! Extrahieren der Daten

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

! Country Code

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

}

! Der ELSE-Zweig kann entfallen und dient nur zur Verifikation, dass das Skript bis zum Ende durchlaufen wurde, wenn sich der Standort nicht geändert hat

else
{
WriteLine(„Daten gleich“);
}

Atbildēt

Jūsu e-pasta adrese netiks publicēta. Obligātie lauki ir atzīmēti kā *

lvLatvian