نقوم بتوصيل أي جهاز تعقب GPS (تقريبًا) (باستخدام Sinotrack ST-901 كمثال) بالمنزل الذكي HomeAssistant

مقدمة


بطريقة ما سقط جهاز تعقب GPS الصيني ST-901 في يدي. تم تصميم الجهاز بشكل أساسي للاستخدام في تكنولوجيا السيارات والدراجات النارية ، ويحتوي على وحدة gsm 2G للتواصل مع العالم الخارجي ، وحافظة مقاومة للماء مختومة ، وبطارية صغيرة مدمجة تسمح لك بالعمل لمدة 2-3 أيام بدون طاقة خارجية عند إرسال إشارة كل 3 دقائق ، بالإضافة إلى سلك إشعال الإشارة ، والذي يسمح لك بالتحذير من بدء تشغيل المحرك. يمكنك إدارة هذا المتتبع عبر أوامر SMS لرقم المتتبع ، والتواصل وتلقي الإخطارات عن طريق الرسائل القصيرة وتوصيله بالسحابة عبر GPRS. بعد اللعب معه لفترة من الوقت ، رميته في درج حتى ظهر HomeAssistant في المنزل. كانت هناك فكرة لربطه بمنزل ذكي.

المهام


لتوصيل المتتبع بـ HomeAssistant ، تحتاج إلى حل مشكلتين: الحصول على الإحداثيات من المتتبع وكتابتها في HomeAssistant. إذا كانت هناك عدة حلول ممكنة للمهمة الثانية في وقت واحد (على سبيل المثال ، gpslogger أو owntracks_http ) ، فإن حل المهمة الأولى في حالتي كان معقدًا لأنه في إعدادات المتتبع لنقل الإحداثيات ، يمكنك تحديد عنوان IP فقط ، وليس اسم المجال. نظرًا لعدم امتلاك عنوان ثابت في المنزل ، نشأت فكرة استخدام وسيط. ألاحظ أنه بهذه الطريقة ، يمكنك توصيل أي جهاز تعقب GPS تقريبًا (وليس فقط في مقالتي) ، متوافق مع موارد الوسيط . كل من يهتم بما جاء به ، مرحبًا بك في القط.


فكرة


كما قلت أعلاه ، يمكن توصيل هذا المتتبع بالعديد من الخدمات السحابية. يتيح لك بعضها مع بعض القيود استخدام الخدمات مجانًا. تحتوي بعض الخدمات على واجهات برمجة تطبيقات كاملة للتفاعل معها ، لكني لم أجد مثل هذه التطبيقات المجانية. ولكن جميع الخدمات تقريبًا توفر خدمة "مشاركة" موقع المتتبع عبر رابط دائم. بعد مراجعة العديد من هذه الخدمات والتفتيش في شفرة المصدر للصفحات المشتركة ، وجدت ما كنت أبحث عنه في خدمة livegpstracks : طلب إحداثيات. وبالتالي ، فإن المخطط العام للعمل على النحو التالي: يتصل المتعقب بخدمة livegpstracks وينقل إحداثياتها ، ويقوم HomeAssistant بشكل دوري بطلب http إلى الخدمة ويتلقى آخر الإحداثيات المسجلة ، والتي تتم كتابتها إلى HomeAssistant بواسطة طلب http آخر. هنا رابط لقائمة بجميع المتتبعات المتوافقة مع الخدمة.

التنفيذ


1. الحصول على إحداثيات حسب الطلب

نحن نسجل في خدمة livegpstracks ونقوم بتوصيل جهاز التتبع الخاص بنا (يحتوي الموقع على تعليمات تفصيلية لمختلف الموديلات). بعد ذلك ، من خلال شريط الأدوات على الموقع ، قم بإنشاء ارتباط خاص للتتبع. يحتوي الرابط على الشكل:

https://livegpstracks.com/dv_USERID.html 

حيث USERID هو المعرف الرقمي لكراتك.

هذا كل شيء. يمكنك الوصول إلى الخدمة من خلال الطلبات. لكي لا تعذبك لفترة طويلة ، سأقدم فقط تنسيق الطلب:

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

هنا USER هو المستخدم الذي قمت بتسجيله في خدمة livegpstracks ، USERID هو المعرف الرقمي الذي تم تعيينه للارتباط المشترك ، TIMENOWMS هو الوقت الحالي بالمللي ثانية (وقت unix).

الإجابة النموذجية هي:

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

ملاحظة: قمت بتقليل الناتج بشكل كبير ، وقمت أيضًا بتغيير رمز المعلمات ، id ، lat ، lng.

تبدو طريقة الحصول على الإحداثيات في الثعبان كما يلي:

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

أعتقد أنك لست بحاجة إلى شرح أي شيء في هذا الرمز: نحصل على الوقت الحالي ، ونطلب الحصول على ، ونستجيب json ، ونحلله ونحصل على خط العرض وخط الطول والسرعة واتجاه الحركة والوقت الذي استلم فيه الخادم الإحداثيات.

2. سجل الإحداثيات

للتسجيل ، استخدمت وحدة GPSLogger لـ HomeAssistant ، لأنها تعمل من خلال طلب http وتسمح لك باستخدام كلمة مرور منفصلة ، تختلف عن كلمة المرور لـ HA بالكامل. توضح الوثائق ( gpslogger ) أن الطلب به التنسيق التالي:

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

هنا HAADRESS هو عنوان IP أو اسم الخادم مع HA ، HAPORT هو منفذ الخادم ، LAT هو خط العرض ، LON هو خط الطول ، DEV هو اسم الجهاز الذي سيتم عرضه في HA ، ACC هي دقة تحديد الإحداثيات (لسبب ما لا يعمل في HA ، فإنه يعطي خطأ ، I لم تستخدمه) ، SPD - السرعة ، DIR - اتجاه الحركة ، PASS - كلمة المرور لإرسال الإحداثيات

تبدو طريقة كتابة الإحداثيات في python كما يلي:

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

أعتقد هنا أيضا أن التعليقات غير ضرورية.

3. الوحدة

فيما يلي الكود الكامل للوحدة لاستقبال الإحداثيات وتسجيلها.

كود الوحدة
 #!/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 


لتوصيل هذه الوحدة ، يجب نسخ الرمز إلى دليل "config_folder_homeassistant / custom_components / sensor / car_location.py" ، وإضافة الأسطر التالية إلى التكوين:

 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 

إليك جميع المتغيرات من قسم "الحصول على الإحداثيات حسب الطلب".

تعمل هذه الوحدة في HA منذ أكثر من شهر دون أي فشل أو مشاكل أخرى.

هذا كل شيء ، شكرا لاهتمامكم.

تحديث:
قام HomeAssistant بتحديث مكون GPSLogger ، والذي تم بموجبه إصدار جديد من التعديل والإعدادات:

إعدادات جديدة
 device_tracker: - platform: gpslogger sensor: - platform: car_location name: car_sensor user: USER myid: USERID haddr: YOUR_HA_ADDRESS_WEBHOOK 

YOUR_HA_ADDRESS_WEBHOOK - عنوان مدونة الويب لـ GPSLogger ، يمكنك الحصول عليه في قسم الإعدادات - عمليات التكامل - قسم GPSLogger.


كود الوحدة الجديد
 #!/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 بتحديث منطق العمل من الإصدار 0.88 ، فيما يتعلق بالإصدار الجديد من mod: sensor

UPD3:
نسخة جديدة من التكامل. انتقل المشروع إلى جيثب . الإصدار الحالي هناك.

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


All Articles