Wir verbinden jeden (fast) GPS-Tracker (am Beispiel des Sinotrack ST-901) mit dem HomeAssistant Smart Home

Einführung


Irgendwie fiel mir der chinesische GPS-Tracker ST-901 in die Hände. Das Gerät ist hauptsächlich für den Einsatz in der Auto- und Motorradtechnik konzipiert, verfügt über ein gsm 2G-Modul für die Kommunikation mit der Außenwelt, ein versiegeltes wasserdichtes Gehäuse und eine kleine eingebaute Batterie, mit der Sie etwa 2-3 Tage ohne externe Stromversorgung arbeiten können, wenn Sie alle 3 Minuten ein Signal senden. sowie ein Signalzündkabel, mit dem Sie vor dem Starten des Motors warnen können. Sie können diesen Tracker über SMS-Befehle an die Trackernummer verwalten und Benachrichtigungen sowohl per SMS als auch durch Verbindung mit der Cloud über GPRS kommunizieren und empfangen. Nachdem ich eine Weile mit ihm gespielt hatte, warf ich ihn in eine Schublade, bis HomeAssistant zu Hause erschien. Es gab eine Idee, es mit einem Smart Home zu verbinden.

Die Aufgaben


Um den Tracker mit HomeAssistant zu verbinden, müssen Sie zwei Probleme lösen: Die Koordinaten vom Tracker abrufen und in HomeAssistant schreiben. Wenn es für die zweite Aufgabe mehrere mögliche Lösungen gleichzeitig gibt (z. B. gpslogger oder owntracks_http ), wurde die Lösung für die erste Aufgabe in meinem Fall dadurch erschwert, dass Sie in den Tracker-Einstellungen für die Übertragung von Koordinaten nur eine IP-Adresse und keinen Domänennamen angeben können. Da ich zu Hause keine statische Adresse habe, entstand die Idee, einen Vermittler zu verwenden. Ich stelle fest, dass Sie auf diese Weise fast jeden GPS-Tracker (und nicht nur in meinem Artikel berücksichtigt) anschließen können, der mit den Ressourcen eines Vermittlers kompatibel ist . Jeder, der sich für das interessiert, was daraus entstanden ist, ist herzlich willkommen bei cat.


Idee


Wie oben erwähnt, kann dieser Tracker mit vielen Cloud-Diensten verbunden werden. Bei einigen von ihnen mit bestimmten Einschränkungen können Sie die Dienste kostenlos nutzen. Einige Dienste verfügen über vollwertige APIs für die Interaktion mit ihnen, aber ich habe solche unter den kostenlosen nicht gefunden. Fast alle Dienste bieten jedoch den Dienst, den Standort des Trackers über eine permanente Verbindung zu "teilen". Nachdem ich einige dieser Dienste durchgesehen und im Quellcode der freigegebenen Seiten herumgestöbert hatte , fand ich im livegpstracks- Dienst, wonach ich suchte: eine Anfrage nach Koordinaten. Das allgemeine Arbeitsschema lautet daher wie folgt: Der Tracker stellt eine Verbindung zum Livegpstracks-Dienst her und überträgt seine Koordinaten. HomeAssistant sendet regelmäßig eine http-Anforderung an den Dienst und empfängt die zuletzt aufgezeichneten Koordinaten, die von einer anderen http-Anforderung an den HomeAssistant geschrieben werden. Hier ist ein Link zu einer Liste aller mit dem Dienst kompatiblen Tracker.

Implementierung


1. Beschaffung von Koordinaten auf Anfrage

Wir registrieren uns beim Livegpstracks- Service und schließen unseren Tracker an (auf der Website finden Sie detaillierte Anweisungen für verschiedene Modelle). Erstellen Sie anschließend über die Symbolleiste auf der Website einen privaten Link für die Nachverfolgung. Der Link hat die Form:

https://livegpstracks.com/dv_USERID.html 

Dabei ist USERID die digitale ID Ihrer Bälle.

Das ist alles. Sie können über Anfragen auf den Dienst zugreifen. Um Sie nicht lange zu quälen, gebe ich nur das Anforderungsformat an:

 https://livegpstracks.com/viewer_coos_s.php?username=USER&ctp=one&code=USERID&tgst=site&tgsv=12&tkv11=TIMENOWMS 

Hier ist USER der Benutzer, unter dem Sie sich im livegpstracks-Dienst registriert haben. USERID ist die digitale ID, die dem freigegebenen Link zugewiesen ist. TIMENOWMS ist die aktuelle Zeit in Millisekunden (Unix-Zeit).

Eine typische Antwort lautet:

 [{"code":"xxx","id":"xxx","lat":"44","lng":"48","speed":"0","azimuth":"0","d":"2018-06-19","t":"09:35:17","altitude":"0","battery":"0","gpsaccuracy":""}] 

Hinweis: Ich habe die Ausgabe erheblich reduziert und auch den Parametercode, id, lat, lng geändert.

Die Methode zum Abrufen von Koordinaten in Python sieht folgendermaßen aus:

 def getInfoFrom(self): timenow = int(datetime.now().strftime("%s")) * 1000 response = requests.get('https://livegpstracks.com/viewer_coos_s.php', params={'username': self._user, 'ctp': 'one', 'code': self._myid, 'tgst': 'site', 'tgsv': 12, 'tkv11': timenow}) data = response.json() self._lat = data[0]["lat"] self._lon = data[0]["lng"] self._speed = data[0]["speed"] self._direction = data[0]["azimuth"] self._last_time_rcv = data[0]["d"] + ' ' + data[0]["t"] 

Ich denke, dass Sie in diesem Code nichts erklären müssen: Wir erhalten die aktuelle Uhrzeit, stellen eine Abrufanfrage, erhalten eine Antwort von json, analysieren sie und ermitteln den Breitengrad, den Längengrad, die Geschwindigkeit, die Bewegungsrichtung und die Zeit, zu der der Server die Koordinaten zuletzt erhalten hat.

2. Aufzeichnung der Koordinaten

Für die Aufzeichnung habe ich das GPSLogger-Modul für HomeAssistant verwendet, da es über eine http-Anforderung funktioniert und Sie ein separates Kennwort verwenden können, das sich vom Kennwort für die gesamte HA unterscheidet. Die Dokumentation ( gpslogger ) zeigt, dass die Anfrage das folgende Format hat:

 https://HAADRESS:HAPORT/api/gpslogger?latitude=LAT&longitude=LON&device=DEV&accuracy=ACC&speed=SPD&direction=DIR&api_password=PASS 

Hier ist HAADRESS die IP-Adresse oder der Servername mit HA, HAPORT ist der Server-Port, LAT ist der Breitengrad, LON ist der Längengrad, DEV ist der Name des Geräts, das in HA angezeigt werden soll, ACC ist die Genauigkeit der Koordinatenbestimmung (aus irgendeinem Grund funktioniert es in HA nicht, es gibt einen Fehler, I. nicht verwendet), SPD - Geschwindigkeit, DIR - Bewegungsrichtung, PASS - Passwort für die Übertragung von Koordinaten

Die Methode zum Schreiben von Koordinaten in Python sieht folgendermaßen aus:

 def putInfoTo(self): if self._lat != '' and self._lon != '': req_str = self._haddr+'/api/gpslogger' response = requests.get(req_str, params={'latitude': self._lat, 'longitude': self._lon, 'accuracy': 30, 'speed': self._speed, 'direction': self._direction, 'device': self._name, ' api_password': self._pwd}) self._last_time_upd = time.strftime("%Y.%m.%d %H:%M") 

Ich denke auch hier sind Kommentare überflüssig.

3. Modul

Der vollständige Code des Moduls zum Empfangen und Aufzeichnen von Koordinaten ist unten angegeben.

Modulcode
 #!/usr/local/bin/python3 # coding: utf-8 import time import requests import json import logging from datetime import datetime from datetime import timedelta import voluptuous as vol import homeassistant.helpers.config_validation as cv from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import (CONF_NAME) from homeassistant.helpers.entity import Entity _LOGGER = logging.getLogger(__name__) CONF_USER = 'user' CONF_ID = 'myid' CONF_PWD = 'pwd' CONF_SITE = 'haddr' ATTR_LAT = '' ATTR_LON = '' ATTR_SPEED = '' DEFAULT_NAME = 'GPS_Sensor' SCAN_INTERVAL = timedelta(seconds=120) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_USER): cv.string, vol.Required(CONF_ID): cv.string, vol.Required(CONF_PWD): cv.string, vol.Required(CONF_SITE): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) def setup_platform(hass, config, add_devices, discovery_info=None): user = config.get(CONF_USER) name = config.get(CONF_NAME) pwd = config.get(CONF_PWD) myid = config.get(CONF_ID) haddr = config.get(CONF_SITE) add_devices([CarGPS(name, user, myid, haddr, pwd)]) class CarGPS(Entity): def __init__(self, name, user, myid, haddr, pwd): self._name = name self._user = user self._myid = myid self._haddr = haddr self._pwd = pwd self._lat = '' self._lon = '' self._speed = '0' self._direction = '0' self._last_time_rcv = '' self._last_time_upd = '' def getInfoFrom(self): try: today = int(datetime.now().strftime("%s")) * 1000 response = requests.get('https://livegpstracks.com/viewer_coos_s.php', params={'username': self._user, 'ctp': 'one', 'code': self._myid, 'tgst': 'site', 'tgsv': 12, 'tkv11': today}) data = response.json() self._lat = data[0]["lat"] self._lon = data[0]["lng"] self._speed = data[0]["speed"] self._direction = data[0]["azimuth"] self._last_time_rcv = data[0]["d"] + ' ' + data[0]["t"] except: _LOGGER.error('coudnt get parameters') def putInfoTo(self): if self._lat != '' and self._lon != '': try: req_str = self._haddr+'/api/gpslogger' response = requests.get(req_str, params={'latitude': self._lat, 'longitude': self._lon, 'accuracy': 30, 'speed': self._speed, 'direction': self._direction, 'device': self._name, ' api_password': self._pwd}) _LOGGER.info(response) self._last_time_upd = time.strftime("%Y.%m.%d %H:%M") except: _LOGGER.error('coudnt put parameters') #for HASS @property def name(self): return self._name @property def state(self): return self._last_time_upd def update(self): self.getInfoFrom() self.putInfoTo() @property def device_state_attributes(self): attr = {} attr[ATTR_LAT] = self._lat attr[ATTR_LON] = self._lon attr[ATTR_SPEED] = self._speed return attr 


Um dieses Modul zu verbinden, muss der Code in das Verzeichnis "config_folder_homeassistant / custom_components / sensor / car_location.py" kopiert werden und der Konfiguration die folgenden Zeilen hinzufügen:

 device_tracker: - platform: gpslogger password: !secret gpslogger_password sensor: - platform: car_location name: car_sensor user: USER myid: USERID haddr: YOUR_HA_ADDRESS pwd: !secret gpslogger_password 

Hier finden Sie alle Variablen aus dem Abschnitt "Koordinaten auf Anfrage abrufen".

Dieses Modul arbeitet seit mehr als einem Monat in HA ohne Fehler oder andere Probleme.

Das ist alles, danke für Ihre Aufmerksamkeit.

UPD:
HomeAssistant hat die GPSLogger-Komponente aktualisiert, in Verbindung mit der eine neue Version des Mods und der Einstellungen:

neue Einstellungen
 device_tracker: - platform: gpslogger sensor: - platform: car_location name: car_sensor user: USER myid: USERID haddr: YOUR_HA_ADDRESS_WEBHOOK 

YOUR_HA_ADDRESS_WEBHOOK - Weblog-Adresse von GPSLogger finden Sie im Abschnitt Einstellungen - Integrationen - GPSLogger.


neuer Modulcode
 #!/usr/local/bin/python3 # coding: utf-8 import time import requests import json import logging from datetime import datetime from datetime import timedelta import voluptuous as vol import homeassistant.helpers.config_validation as cv from homeassistant.components.sensor import PLATFORM_SCHEMA from homeassistant.const import (CONF_NAME) from homeassistant.helpers.entity import Entity _LOGGER = logging.getLogger(__name__) CONF_USER = 'user' CONF_ID = 'myid' CONF_SITE = 'haddr' CONF_NAME = 'name' ATTR_LAT = '' ATTR_LON = '' ATTR_SPEED = '' ATTR_DATE = '' DEFAULT_NAME = 'GPS_Sensor' SCAN_INTERVAL = timedelta(seconds=120) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_USER): cv.string, vol.Required(CONF_ID): cv.string, vol.Required(CONF_SITE): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) def setup_platform(hass, config, add_devices, discovery_info=None): user = config.get(CONF_USER) name = config.get(CONF_NAME) myid = config.get(CONF_ID) haddr = config.get(CONF_SITE) add_devices([CarGPS(name, user, myid, haddr)]) class CarGPS(Entity): def __init__(self, name, user, myid, haddr): self._name = name self._user = user self._myid = myid self._haddr = haddr self._lat = '' self._lon = '' self._speed = '0' self._direction = '0' self._last_time_rcv = '' self._last_time_upd = '' def getInfoFrom(self): try: today = int(datetime.now().strftime("%s")) * 1000 response = requests.get('https://livegpstracks.com/viewer_coos_s.php', params={'username': self._user, 'ctp': 'one', 'code': self._myid, 'tgst': 'site', 'tgsv': 12, 'tkv11': today}) data = response.json() self._lat = str(data[0]["lat"]) self._lon = str(data[0]["lng"]) self._speed = str(data[0]["speed"]) self._direction = str(data[0]["azimuth"]) self._last_time_rcv = data[0]["d"] + ' ' + data[0]["t"] except: _LOGGER.error('coudnt get parameters') def putInfoTo(self): if self._lat != '' and self._lon != '': try: header = {'Content-Type': 'application/x-www-form-urlencoded'} body = 'latitude=' + self._lat + '&longitude=' + self._lon + '&device=' + self._name + '&accuracy=30&battery=100&speed=' + self._speed + '&direction=' + self._direction + '&altitude=0&provider=0&activity=0' response = requests.post(self._haddr, headers=header, data=body) self._last_time_upd = time.strftime("%Y.%m.%d %H:%M") except: _LOGGER.error('coudnt put parameters') #for HASS @property def name(self): return self._name @property def state(self): return self._last_time_upd def update(self): self.getInfoFrom() self.putInfoTo() @property def device_state_attributes(self): attr = {} attr[ATTR_LAT] = self._lat attr[ATTR_LON] = self._lon attr[ATTR_SPEED] = self._speed attr[ATTR_DATE] = self._last_time_rcv return attr 



UPD2:
HomeAssistant hat die Arbeitslogik von Version 0.88 aktualisiert, in Verbindung mit der die neue Version des mod: sensor

UPD3:
Neue Version der Integration. Das Projekt wurde auf GitHub verschoben . Die aktuelle Version ist da.

Source: https://habr.com/ru/post/de414509/


All Articles