Kami menghubungkan setiap (hampir) pelacak GPS (menggunakan Sinotrack ST-901 sebagai contoh) ke rumah pintar HomeAssistant

Pendahuluan


Entah bagaimana pelacak GPS Cina ST-901 jatuh ke tangan saya. Perangkat ini dirancang terutama untuk digunakan dalam teknologi mobil dan sepeda motor, memiliki modul 2G gsm untuk komunikasi dengan dunia luar, wadah anti air yang disegel, baterai kecil built-in yang memungkinkan Anda untuk bekerja sekitar 2-3 hari tanpa daya eksternal ketika mengirimkan sinyal setiap 3 menit, serta kabel pengapian sinyal, yang memungkinkan Anda untuk memperingatkan tentang awal mesin. Anda dapat mengelola pelacak ini melalui perintah SMS ke nomor pelacak, dan berkomunikasi dan menerima pemberitahuan baik melalui SMS maupun dengan menghubungkannya ke cloud melalui GPRS. Setelah bermain dengannya sebentar, saya melemparkannya ke dalam laci sampai HomeAssistant muncul di rumah. Ada ide untuk menghubungkannya ke rumah pintar.

Tugasnya


Untuk menghubungkan pelacak ke HomeAssistant, Anda perlu menyelesaikan dua masalah: dapatkan koordinat dari pelacak dan menulisnya ke HomeAssistant. Jika untuk tugas kedua ada beberapa kemungkinan solusi sekaligus (misalnya, gpslogger atau owntracks_http ), maka solusi untuk tugas pertama dalam kasus saya dipersulit oleh kenyataan bahwa dalam pengaturan pelacak untuk mentransfer koordinat Anda hanya dapat menentukan alamat IP, bukan nama domain. Karena saya tidak memiliki alamat statis di rumah, muncul ide untuk menggunakan perantara. Saya perhatikan bahwa dengan cara ini, Anda dapat menghubungkan hampir semua pelacak GPS (dan tidak hanya dipertimbangkan dalam artikel saya), yang kompatibel dengan sumber daya perantara . Semua orang yang tertarik dengan apa yang terjadi, selamat datang di kucing.


Ide


Seperti yang saya katakan di atas, pelacak ini dapat dihubungkan ke banyak layanan cloud. Beberapa dari mereka dengan batasan tertentu memungkinkan Anda untuk menggunakan layanan ini secara gratis. Beberapa layanan memiliki API lengkap untuk berinteraksi dengan mereka, tetapi saya belum menemukan yang seperti itu di antara yang gratis. Tetapi hampir semua layanan menyediakan layanan "berbagi" lokasi pelacak melalui tautan permanen. Setelah melalui beberapa layanan ini dan mencari-cari kode sumber dari halaman bersama, saya menemukan apa yang saya cari di layanan livegpstracks : permintaan koordinat. Dengan demikian, skema umum pekerjaan adalah sebagai berikut: pelacak terhubung ke layanan livegpstracks dan mentransmisikan koordinatnya, HomeAssistant secara berkala membuat permintaan http ke layanan dan menerima koordinat tercatat terakhir, yang ditulis ke HomeAssistant oleh permintaan http lain. Berikut adalah tautan ke daftar semua pelacak yang kompatibel dengan layanan.

Implementasi


1. Mendapatkan koordinat berdasarkan permintaan

Kami mendaftar di layanan livegpstracks dan menghubungkan pelacak kami (situs ini memiliki petunjuk rinci untuk berbagai model). Setelah itu, melalui bilah alat di situs, buat tautan pribadi untuk pelacakan. Tautan memiliki bentuk:

https://livegpstracks.com/dv_USERID.html 

di mana USERID adalah ID digital bola Anda.

Itu saja. Anda dapat mengakses layanan melalui permintaan. Agar tidak menyiksa Anda untuk waktu yang lama, saya hanya akan memberikan format permintaan:

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

Di sini USER adalah pengguna yang Anda daftarkan di layanan livegpstracks, USERID adalah ID digital yang ditetapkan untuk tautan bersama, TIMENOWMS adalah waktu saat ini dalam milidetik (waktu unix).

Jawaban tipikal adalah:

 [{"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":""}] 

Catatan: Saya secara signifikan mengurangi output, dan juga mengubah kode parameter, id, lat, lng.

Metode untuk mendapatkan koordinat dalam python terlihat seperti ini:

 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"] 

Saya pikir Anda tidak perlu menjelaskan apa pun dalam kode ini: kami mendapatkan waktu saat ini, membuat permintaan dapatkan, mendapatkan tanggapan json, menguraikannya dan mendapatkan garis lintang, bujur, kecepatan, arah gerakan dan waktu server menerima koordinat terakhir.

2. Rekam koordinat

Untuk merekam, saya menggunakan modul GPSLogger untuk HomeAssistant, karena berfungsi melalui permintaan http dan memungkinkan Anda untuk menggunakan kata sandi terpisah, berbeda dari kata sandi untuk seluruh HA. Dokumentasi ( gpslogger ) menunjukkan bahwa permintaan memiliki format berikut:

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

Di sini HAADRESS adalah alamat ip atau nama server dengan HA, HAPORT adalah port server, LAT adalah garis lintang, LON adalah garis bujur, DEV adalah nama perangkat untuk ditampilkan dalam HA, ACC adalah keakuratan menentukan koordinat (untuk beberapa alasan itu tidak berfungsi dalam HA, itu memberikan kesalahan, saya tidak menggunakannya), SPD - kecepatan, DIR - arah gerakan, PASS - kata sandi untuk transmisi koordinat

Metode untuk menulis koordinat dalam python terlihat seperti ini:

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

Saya pikir di sini juga komentar tidak berguna.

3. Modul

Kode lengkap modul untuk menerima dan merekam koordinat diberikan di bawah ini.

Kode modul
 #!/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 


Untuk menghubungkan modul ini, kode harus disalin ke direktori "config_folder_homeassistant / custom_components / sensor / car_location.py", dan juga tambahkan baris berikut ke konfigurasi:

 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 

Berikut adalah semua variabel dari bagian "Mendapatkan Koordinasi dengan Permintaan".

Modul ini telah bekerja di HA selama lebih dari sebulan tanpa kegagalan atau masalah lain.

Sekian, terima kasih atas perhatiannya.

UPD:
HomeAssistant memperbarui komponen GPSLogger, sehubungan dengan versi mod dan pengaturan yang baru:

pengaturan baru
 device_tracker: - platform: gpslogger sensor: - platform: car_location name: car_sensor user: USER myid: USERID haddr: YOUR_HA_ADDRESS_WEBHOOK 

YOUR_HA_ADDRESS_WEBHOOK - alamat weblog GPSLogger, Anda bisa mendapatkannya di bagian Pengaturan - Integrasi - GPSLogger.


kode modul baru
 #!/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 memperbarui logika kerja dari versi 0.88, sehubungan dengan versi mod: sensor yang baru

UPD3:
Versi integrasi baru. Proyek dipindahkan ke GitHub . Versi saat ini ada di sana.

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


All Articles