Inhaltsverzeichnis
Aktualisiert – Januar 29, 2024
Wer GPS-Daten mittels SmartHome ermitteln möchte, um z.B. die lokalen Wetterdaten abzufragen, kann dies mit einem Teltonika Router RUTX50 ohne zusätzliche Hard- oder Software mit Homematic / RaspberryMatic realisieren.
Grundlagen
Die Teltonika-Router RUTX.. ermöglichen das Senden und Empfangen von SMS über die aktivierte SIM-Karte. Ebenso das Senden von Positionsdaten als Antwort auf eine SMS mit dem Inhalt „Passwort gps„.
Per HTTP-Request kann Einblick in die SMS Eingangsliste und SMS Inhalte genommen werden. Aus der, auf den SMS-Request per SMS hin, empfangenen SMS lassen sich die aktuellen Längen- und Breiten-Angaben auslesen.
Diese können nun via Script innerhalb der SmarttHome-Automation mittels HomeMatic oder RaspberryMatic weiter verarbeiten. So lassen sich auf Reisen die stetig wechselnden Geo-Daten für eine laufend auf den aktuellen Standort bezogene, aktualisierte Wetterabfrage, z.B. über den kostenfreien Service von openweathermap.org nutzen.
Setup – Teltonika Router
Services – Mobile Utilities – SMS Gateway
- Mobile Post/Get Settings – Enabled
- Username: Anmeldename
- Password: AnmeldePasswort
Services – Input/Output – Post/Get
- I/O Post/Get Settings – Enabled
- Username: Anmeldename
- Password: AnmeldePasswort
Setup – RaspberryMatic
CUx-Daemon installieren
Der CUx-Daemon ist ein AddOn, das virtuelle Geräte innerhalb HomeMatic / RaspberryMatic zur Verfügung stellt, die u.a. als weniger belastender Ersatz für System-Aufrufe genutzt werden können, hier z.B. zwecks SMS-Versand über einen HTTP-Request an den Router.
Die Installation des AddOn erfolgt über Einstellungen – Zusatzsoftware, dort im untersten Bereich kann die AddOn-Datei mittels Klick auf den Button Datei auswählen
im entsprechenden Download-Ordner des Rechners gewählt und mit Klick auf den Button Installieren
auf die Zentraöe geladen und installiert werden.
CUx-Daemon – Gerät erstellen
Der Aufruf des CUx-Daemon erfolgt über System mittels Klick auf den Button CUx-Daemon
.
Klick oben rechts auf den Button Geräte
öffnet die Oberfläche. Oben links, unter CUxD Gerätetyp, wird aus der Liste unten System
ausgewählt.
Als Funktion wird die Funktion Exec
gewählt, im Feld Name eine entsprechende Bezeichnung, z.B. GPS, eingegeben und anschließend mit Klick auf den Button Gerät auf der CCU erzeugen
, das Gerät gespeichert.
Daraufhin erscheint das angelegte Gerät mit seiner ID in dem rechten Fenster, z.B. CUX2801001 und kann über dies ID in Scripten angesprochen werden.
Skripte
SMS zur GPS-Datenausgabe senden
Die in eckigen Klammern gesetzten Angaben sind durch eigene Daten zu ersetzen:
string url=“‚http://[IP des Routers]/cgi-bin/sms_send?username=[BenutzerName]&password=[Passwort]&number=[InternationaleRufnummer]&text=[Passwort gps]'“;
dom.GetObject(„CUxD.CUX2801001:1.CMD_EXEC“).State(„wget -q -O – „#url);
Zu beachten ist, dass der String in doppelte („) UND einfache (‚) Anführungsstriche gesetzt ist!
Dieses Skript wird in dem zu erstellenden Programm GPS_Loc_Update
aufgerufen und das folgende Skript, das seinerseits das Programm GPS_Data aufruft, um 30 Sekunden versetzt, um den Empfang der SMS mit den PÜS-Daten abzuwarten:
var programObj = dom.GetObject(„GPS_Data“);
programObj.ProgramExecute();
Programm GPS_Loc_Update
kann einmal täglich oder in kürzeren Intervallen, je nach Erfordernis, per Zeitsteuerung ausgeführt werden.
SMS Liste ausgeben
Zwecks Auslesen der GPS-Daten wird per HTTP-Request der Router zur Ausgabe der SMS-Liste aufgefordert.
Dieses Skript benötigt zwei Variablen vom Typ ZEICHENKETTE, die unter Einstellungen – Systemvariablen unten mit Klick auf den Button Neu angelegt werden müssen:
- W_Lat (zur Speicherung der geograrfischen Breite)
- W_Lon (zur Speicherung der geograrfischen Länge)
Der Inhalt des Skripts (Zeilen mit führendem Ausrufezeichen sind Kommentare; WriteLine-Anweisungen dienen lediglich der Ausgabe-Kontrolle und können gelöscht werden.)):
var url = „http://[IP des Routers]/cgi-bin/sms_list?username=[BenutzerName]&password=[Passwort]“;
! Deklaration der Variablen
var posValueStart;
var posValueEnd;
var pos;
var daten;
var posStart;
var posEnd; string stderr; string stdout;
! WGET-Kommando zur Übermittlung des HTTP-Request-Strings an den Router
system.Exec(„wget -q -O – ‚“#url#“‚“, &stdout, &stderr);
! Ausgabe des Abfrage-Ergebnisses zur Kontrolle
WriteLine(stdout);
! Index: 1
! Date: Fri Jan 26 11:01:02 2024
! Sender: +49xxxxxxxxxxxxx
! Text: Fix time: 2024-01-26, 11:01:01 Latitude: 54.834682 Longitude: 12.040196 http://maps.google.com/?
! q=54.834682,12.040196&om=1speed:0
! Status: read
! GPS Daten auslesen
pos = 0;
! Position des Beginns des gesuchten Wertes
posStart = ‚Latitude: ‚;
! Position des Endes des gesuchten Wertes
posEnd = ‚ Longitude: ‚;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
! die gesuchte Zeichenkette lautet:
string Latitude = stdout.Substr(posValueStart, posValueEnd);
! Umwandlung des Strings (Zeichenkette) in eine Fließkomma-Zahl
var lat = Latitude.ToFloat();
! Ausgabe der geografischen Länge zur Kontrolle
WriteLine(„Latitude“);WriteLine(Latitude);
! Speichern der geografischen Länge in die Variable W_Lat
dom.GetObject(‚W_Lat‘).State(lat);
pos = 0;
posStart = ‚Longitude: ‚;
posEnd = ‚ http‘;
posValueStart = stdout.Find(posStart) + posStart.Length();
posValueEnd = stdout.Find(posEnd)-posValueStart;
string Longitude = stdout.Substr(posValueStart, posValueEnd);
var lon = Longitude.ToFloat();
WriteLine(„Longitude“);WriteLine(lon);
dom.GetObject(‚W_Lon‘).State(lon);
Das Programm enthält keine Bedingung zur Ausführung, da es über das vorstehende Programm, bzw. Skript initiiert wird.
Jetzt können die geografischen Angaben zur Abfrage der Wetterdaten für diesen Ort genutzt werden. Hierzu wird ein weiteres, periodisch per Zeitsteuerung gestartetes Programm angelegt, das mittels Skript die beiden Werte in den HTTP-Request-String des o.g. Wetterdienstes einfügt und somit jeweils die sich ändernden Örtlichkeiten in der Abfrage berücksichtigt.
Programm W_Daten_OWM
Zusammensetzen der URL
! Laden der in GPS_Data befüllten Variablen W_Lat und W_Lon und Zuordnen zu den Variablen url_1 und url_2
var url_1 = dom.GetObject(„W_Lat“).Value();
WriteLine(„Lat=“);WriteLine(url_1);
var url_2 = dom.GetObject(„W_Lon“).Value();
WriteLine(„Lon=“);WriteLine(url_2);
! Zusammensetzen der URL unter Verwendung der Variablen-Inhalte aus url_1 und url_2
! [xxxxxxxxxxxxxxxxxxxxxxxxx] repräsentiert den – nach Registrierung – erhaltenen API-Key des Wetterdienstes
var url = „https://api.openweathermap.org/data/2.5/weather?lat=“#url_1#“&lon=“#url_2#“&appid=[xxxxxxxxxxxxxxxxxxxxxxxxx]&units=metric“;
! Ausgabe des kompletten Strings zur Kontrolle
WriteLine(url);
Es folgt die selbe Prozedur der Deklaration der Variablen, des WGET-Kommandos, der Ausgabe des Abfrage-Ergebnisses zur Kontrolle und das Auslesen der jeweils gewünschten Wetterdaten (s. Dokumentation) nach dem bzgl. GPS-Daten gegebenen Vorgehen.