Eintrag
Für meine Hausautomation verwende ich HomeAssistant seit langer Zeit. Sobald ein Freund mich gefragt hat, sagt er, warum kann HomeAssistant nur die aktuelle Position des Trackers auf der Karte anzeigen, aber es ist nicht möglich, die gesamte Route anzuzeigen? Seitdem hat mich diese Idee gefangen genommen. Und als mir klar wurde, dass ich diese Funktion jetzt wirklich haben möchte. Jeder, der sich für das interessiert, was dabei herauskam, willkommen bei der Katze…
Intelligenz
Um die Route anzuzeigen, müssen Sie eine Reihe von Punkten mit Koordinaten haben. Der erste Schritt bestand also darin, herauszufinden, wo der HomeAssistant die erforderlichen Daten speichert (wenn überhaupt) und wie Sie sie dort herausholen können. Eine kurze Untersuchung der Primärquelle führte sofort zur Lösung: Sie benötigen das mitgelieferte Rekordermodul, um den Status der gewünschten Sensoren in der Datenbank zu verschiedenen Zeitpunkten aufzuzeichnen, sowie das Verlaufsmodul, mit dem Sie auf schöne Weise Daten aus der Datenbank abrufen können. Das Verlaufsmodul verfügt über eine gut dokumentierte
REST-API . Was du brauchst!
Als nächstes müssen Sie die empfangenen Daten irgendwie auf der Karte anzeigen. Es gibt viele verschiedene Dienste, mit denen Sie den Verlauf von Bewegungen anzeigen können. Ich habe es wahrscheinlich weit entfernt von allen versucht, aber ich werde mir ein paar Worte über die erlauben, die ich überprüft habe:
A. A. Yandex und Google. Eigentlich gibt es für meine Bedürfnisse alles und noch mehr, aber aufgrund der kostenpflichtigen Dienste und der starken Einschränkungen der kostenlosen Versionen passten sie nicht sofort zu mir. Yandex erlaubt beispielsweise die kostenlose Nutzung nur für offene Projekte (dh jeder sollte in der Lage sein, Ihre Ressource jederzeit zu öffnen und ihre Funktionen zu nutzen), ganz zu schweigen von anderen Einschränkungen bei der Anzahl der Anforderungen. Nur die Faulen haben nicht über Änderungen in den Richtlinien von Google in Bezug auf API geschrieben. Im Moment, so wie ich es verstehe, wird jede Anfrage nach Karten-API oder Wegbeschreibung-API bezahlt, je mehr Anfragen - desto billiger. Jeder Benutzer mit einer mit seinem Konto verbundenen Bankkarte erhält jedoch ein kostenloses Limit von 200 USD pro Monat. Alles oben wird sofort von Ihrer Karte bezahlt. Das Verknüpfen einer Karte mit einem Konto ist nicht unser Weg.
Richtig, wenn ich irgendwo einen Fehler bei Google und / oder Yandex gemacht habe.
B. B. Eine Reihe von
OpenRouteService- und OpenRouteService-Karten. Im Prinzip unterscheiden sich die Funktionen nicht wesentlich von Google oder Yandex (auf jeden Fall habe ich es nicht bemerkt). Völlig kostenlos (es gibt Einschränkungen hinsichtlich der Anzahl der Anfragen pro Tag und pro Minute. Wenn diese überschritten werden, wird empfohlen, sich an den Support zu wenden. Es gibt überhaupt keine Beschreibung der bezahlten Tarife.) Die Verwendung der OpenRouteService-Kartenressource erwies sich jedoch als unpraktisch (langes Laden der Anwendung und das nervige breite Menü auf der linken Seite, das standardmäßig geöffnet und von der API nicht deaktiviert wird, außerdem wird der Dienst auf Mobilgeräten nicht korrekt geöffnet). Fairerweise können OpenRouteService-Maps auf Ihrem Server abgelegt werden, und es ist durchaus möglich, dass Sie dort alles für sich selbst konfigurieren können.
B. B. Mapbbcode Ich bin auf eine interessante Implementierung von Karten in einem einfachen Format gestoßen. Im Prinzip ist das Projekt absolut für meine Aufgabe geeignet. Aus diesem Artikel habe ich jedoch etwas über
Leaflet erfahren und mich entschlossen, mich an die Quelle zu wenden. Am Ende blieb er stehen ...
G. G. Faltblatt. Sehr gute Open-Source-JS-Bibliothek für Karten, leicht zu erlernen und gut dokumentiert. Von den Chips: Ermöglicht die Verwendung von Kacheln aus vielen Diensten (Openstreetmaps, Yandex, Google, Mapbox, Microsoft usw. usw.). Zusätzlich habe ich das
leaflet.polylineDecorator- Plugin verwendet, um die Bewegungsrichtung auf der Karte anzugeben.
Es ist erwähnenswert, dass die letzten beiden betrachteten Ressourcen keine „Routen“ unterstützen, dh sie wissen nicht, wie Punkte entlang bestehender Straßen und / oder Bürgersteige verbunden werden sollen, sondern verbinden die Punkte einfach mit einer geraden Linie. Für mich persönlich ist dies kein Problem, sondern ein bewusster Schritt. Wenn Sie eine Navigation auf den Straßen benötigen, müssen Sie in Richtung bezahlter Google-, Yandex- oder kostenloser Openrouteservice schauen.
Implementierung
Die Anforderung an das Verlaufsmodul über die REST-API ist recht einfach (im Folgenden wird der Code in der HomeAssistant-Sprache, d. H. Python, ausgeführt) und ermöglicht es Ihnen, die Antwort in Form von leicht verständlichem JSON zu erhalten:
response = requests.get(self._haddr + '/api/history/period/' + dayBegin + '?filter_entity_id=' + self._myid, headers={'Authorization': 'Bearer ' + self._token, 'content-type': 'application/json'}) data = response.json()[0]
Hier ist self._haddr die Adresse Ihres HA, die in den Frontend-Einstellungen angegeben ist. self._myid ist die Geräte-ID von device_tracker, dessen Route wir erstellen werden. dayBegin ist der Beginn des Zeitraums für die Anzeige der Route. Ich habe standardmäßig den Beginn des aktuellen Tages ausgewählt. self._token ist ein langlebiges Token für den Zugriff auf die API, das über die HomeAssistant-Oberfläche abgerufen werden kann.
Wenn das Objekt, dessen Verlauf wir auf der Karte anzeigen möchten, lange Zeit stationär ist oder sich extrem langsam bewegt, erhalten wir eine Reihe von Punkten, die nahe beieinander liegen und die Karte verstopfen. Um die Situation zu korrigieren, lassen Sie das resultierende Koordinatenarray durch den Filter: Wenn der Abstand zwischen dem vorherigen und dem nächsten Punkt weniger als 100 Meter beträgt, zeigen Sie den Punkt nicht auf der Karte an. Um die Abstände zwischen zwei benachbarten Punkten zu berechnen, verwenden wir eine vereinfachte Formel mit einer
gleichwinkligen Näherung . Die Annäherung gilt, wenn der Abstand zwischen benachbarten Punkten mehrere km nicht überschreitet:
def getDistance(self, latA, lonA, latB, lonB): dst = 0 latRadA = math.radians(latA) lonRadA = math.radians(lonA) latRadB = math.radians(latB) lonRadB = math.radians(lonB) x = latRadB - latRadA y = (lonRadB-lonRadA)*math.cos((latRadB+latRadA)*0.5) dst = 6371*math.sqrt(x*x+y*y) return dst
Hier ist dst die Entfernung in km.
Beschreiben Sie die Faltblatt-API hier nicht. Dafür - auf der
offiziellen Website . Das Modul funktioniert wie folgt: Alle n Sekunden (ich habe es auf 300 eingestellt) wird eine Anfrage an die heutige Geschichte des für mich interessanten Objekts gestellt. Das resultierende Koordinatenarray wird durch den Abstandsfilter geführt, wodurch die Anzahl der Punkte verringert wird. Außerdem werden in dem Ordner mit der HomeAssistant-Konfiguration im Ordner www zwei Dateien gebildet: index.html und route.html. Die Datei route.html enthält die gesamte Logik zum Erstellen einer Karte. Und die Datei index.html ist ein Life-Hack, um das Zwischenspeichern von Seiten zu verhindern. Standardmäßig speichert HomeAssistant alles zwischen, was möglich ist, und nur das Zurücksetzen des Caches hat dazu beigetragen, die Daten auf der Karte zu aktualisieren, was natürlich nicht akzeptabel ist. In der Datei index.html wird der Inhalt von route.html aufgerufen, jedoch mit einem dynamisch generierten Zufallsparameter, mit dem Sie immer die aktuelle Version von route.html vom Server anfordern können:
src = 'route.html?datetime=' + (new Date()).getTime() + Math.floor(Math.random() * 1000000)
Ein bisschen über Sicherheit
HomeAssistant ist so konzipiert, dass alle Dateien im WWW-Verzeichnis öffentlich sind, dh jede Datei im WWW-Verzeichnis kann in jedem Browser ohne Autorisierung geöffnet werden, wenn der direkte Link bekannt ist. Bei meinem Modul lautet dieser Link wie folgt:
your_address_homeassistant / local / route / index.html . Wenn dies für Sie nicht kritisch ist, können Sie diesen Abschnitt überspringen. Ich ging etwas weiter und schraubte die Autorisierung mit Routen auf die Seite. Dafür habe ich nginx (Sie können einen anderen Webserver mit Reverse-Proxy-Unterstützung auswählen) als Proxyserver verwendet. Auf der HomeAssistant-Website finden Sie offizielle
Anweisungen zum Einrichten dieser Konfiguration. Nach dem Einrichten des Proxy- und Überprüfungsvorgangs müssen Sie den erforderlichen Seiten in der Nginx-Konfiguration eine Berechtigung hinzufügen:
location /local/route/route.html { proxy_pass http://localhost:8123/local/route/route.html; proxy_set_header Host $host; proxy_redirect http:// https://; proxy_http_version 1.1; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; auth_basic "Unauthorized"; auth_basic_user_file /etc/nginx/.htpasswd; }
Erstellen Sie dann die Datei "/etc/nginx/.htpasswd" und führen Sie die folgenden Befehle in der Konsole aus:
sh -c "echo -n 'admin:' >> /etc/nginx/.htpasswd" sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"
admin - durch das gewünschte Login ersetzen.
Starten Sie danach nginx neu und überprüfen Sie: Wenn Sie versuchen, eine Seite mit einer Route zu öffnen, sollte der Browser einen Benutzernamen und ein Kennwort anfordern. Ich stelle fest, dass dies eine separate Autorisierung ist, die nichts mit der Autorisierung von HomeAssistant selbst zu tun hat.
Fazit
Vielleicht alles, was über dieses Modul gesagt werden kann.
Wer interessiert ist,
hier ist ein Link zum Modul. Platzieren Sie die Datei entlang des Pfads: config_folder_homeassistant / custom_components / route / sensor.py. Vergessen Sie nicht die Rechte.
Wenn es nicht vorhanden ist, erstellen Sie den Ordner config_folder_homeassistant / www und geben Sie ihm die entsprechenden Rechte.
Schreiben Sie in die Konfigurationsdatei configuration.yaml die folgenden Zeilen:
sensor: - platform: route name: route entityid: your_device_tracker_entity_id haddr: your_address_homeassistant token: your_long_life_token
Hier ist your_device_tracker_entity_id die ID Ihres Geräts device_tracker, your_address_homeassistant die externe Adresse Ihres HomeAssistant, your_long_life_token das Zugriffstoken, das zuvor im HomeAssistant-Frontend zur Verwendung der REST-API empfangen wurde.
Starten Sie danach HomeAssistant neu und genießen Sie. Die Karte wird über einen direkten Link verfügbar sein:
your_address_homeassistant / local / route / index.html . Wenn Sie möchten, können Sie es mit panel_iframe oder über die Liebeskarte „iframe“ zum HA-Menü oder zu einem beliebigen HA-Fenster hinzufügen.
Das ist alles, danke für Ihre Aufmerksamkeit.
UPD:Link zu GitHub hinzugefügt. Einige Orte geändert (aus der Konfiguration haddr entfernt, automatisch config_dir abrufen, die Möglichkeit hinzugefügt, meine Zeitzone festzulegen)
Und wie sieht das alles aus? Achtung, blauer!