Kakak sedang menonton ... dirinya sendiri atau peta dengan sejarah gerakan di HomeAssistant

Entri


Untuk otomatisasi rumah saya, saya telah menggunakan HomeAssistant untuk waktu yang lama. Begitu seorang teman bertanya kepada saya, mereka berkata, mengapa HomeAssistant memiliki kemampuan untuk menunjukkan hanya posisi pelacak saat ini di peta, tetapi tidak mungkin untuk menampilkan seluruh rute? Sejak itu, ide ini telah menangkap saya. Dan begitu saya menyadari bahwa saya benar-benar ingin memiliki fungsi ini sekarang. Semua orang yang tertarik dengan apa yang terjadi, selamat datang di kucing…

Kecerdasan


Sebenarnya, untuk menampilkan rute, Anda harus memiliki satu set titik dengan koordinat, jadi langkah pertama adalah mencari tahu di mana HomeAssistant menyimpan data yang diperlukan (jika ada) dan bagaimana cara mengeluarkannya dari sana. Sebuah studi singkat tentang sumber utama segera mengarah ke solusi: Anda memerlukan modul perekam yang disertakan untuk merekam status sensor yang diperlukan dalam database di berbagai titik waktu, serta modul sejarah, yang memungkinkan Anda untuk mendapatkan data dari database dengan cara yang indah. Modul history memiliki API REST yang terdokumentasi dengan baik. Apa yang kamu butuhkan!

Selanjutnya, Anda harus entah bagaimana menampilkan data yang diterima di peta. Ada banyak layanan berbeda yang memungkinkan Anda menampilkan riwayat pergerakan. Saya mungkin mencoba jauh dari mereka semua, tetapi saya akan membiarkan diri saya beberapa kata tentang yang saya periksa:
A. yandex dan google. Sebenarnya untuk kebutuhan saya ada segalanya dan bahkan lebih, tetapi karena layanan berbayar dan pembatasan kuat dari versi gratis, mereka tidak cocok untuk saya segera. Yandex, misalnya, memungkinkan penggunaan gratis hanya untuk proyek terbuka (yaitu, siapa pun harus dapat membuka sumber daya Anda kapan saja dan memanfaatkan kemampuannya), belum lagi pembatasan lain pada jumlah permintaan. Hanya pemalas yang tidak menulis tentang perubahan kebijakan Google terkait api. Saat ini, seperti yang saya mengerti, setiap permintaan untuk memetakan api atau arah api dibayar, semakin banyak permintaan - semakin murah. Namun, setiap pengguna dengan kartu bank yang terhubung ke akunnya diberikan batas gratis $ 200 per bulan. Segala sesuatu di atas segera dibayarkan dari kartu Anda. Menautkan kartu ke akun bukanlah cara kami.

Benar jika saya membuat kesalahan di suatu tempat tentang google dan / atau yandex.

B. Sekelompok peta OpenRouteService dan OpenRouteService. Pada prinsipnya, kemampuannya tidak jauh berbeda dengan google atau yandex (dalam hal apa pun, saya tidak memperhatikan). Benar-benar gratis (ada batasan jumlah permintaan per hari dan per menit, jika terlampaui, disarankan untuk menghubungi dukungan ... tidak ada uraian tentang tarif yang dibayar sama sekali). Namun, penggunaan sumber daya peta OpenRouteService ternyata tidak nyaman (pemuatan aplikasi yang lama dan menu lebar yang mengganggu di sebelah kiri, yang terbuka secara default dan tidak dinonaktifkan oleh API, apalagi, layanan tidak terbuka dengan benar dari perangkat seluler). Dalam keadilan, peta OpenRouteService dapat diletakkan di server Anda dan sangat mungkin bahwa di sana Anda dapat mengkonfigurasi semuanya untuk Anda sendiri.

B. Kodebb Saya menemukan implementasi kartu yang menarik dalam format sederhana. Pada prinsipnya, proyek ini sangat cocok untuk tugas saya, namun, dari artikel ini saya belajar tentang Leaflet dan memutuskan untuk beralih ke sumbernya. Pada akhirnya, dia berhenti di situ ...

G. Leaflet. Pustaka js open-source yang sangat bagus untuk peta, mudah dipelajari dan didokumentasikan dengan baik. Dari chip: memungkinkan Anda menggunakan ubin dari banyak layanan (openstreetmaps, yandex, google, mapbox, microsoft, dll., Dll.). Selain itu, saya menggunakan plugin leaflet.polylineDecorator untuk menunjukkan arah gerakan di peta.

Perlu disebutkan bahwa dua sumber daya terakhir yang dipertimbangkan tidak mendukung "rute", yaitu, mereka tidak tahu bagaimana menghubungkan titik di sepanjang jalan dan / atau trotoar yang ada, tetapi hanya menghubungkan titik-titik dengan garis lurus. Bagi saya pribadi, ini bukan masalah, tetapi langkah sadar. Jika Anda membutuhkan navigasi di jalan, maka Anda perlu melihat ke arah google dibayar, yandex atau layanan openroutes gratis.

Implementasi


Permintaan ke modul histori melalui REST-API cukup sederhana (selanjutnya kode akan menggunakan bahasa HomeAssistant, yaitu python) dan memungkinkan Anda untuk mendapatkan jawaban dalam bentuk JSON sederhana untuk memahami:

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] 

di sini self._haddr adalah alamat HA Anda sama seperti yang ditentukan dalam pengaturan frontend, self._myid adalah id perangkat dari device_tracker, yang rute yang akan kami bangun, dayBegin adalah awal periode untuk menampilkan rute, saya memilih awal hari saat ini secara default, self._token adalah token yang tahan lama untuk mengakses api, yang dapat diperoleh di antarmuka HomeAssistant.

Ketika objek yang sejarahnya ingin kita tampilkan di peta diam untuk waktu yang lama atau bergerak sangat lambat, kita akan mendapatkan banyak titik yang letaknya dekat dan menyumbat peta. Untuk memperbaiki situasi, biarkan array koordinat yang dihasilkan melewati filter: jika jarak antara titik sebelumnya dan berikutnya kurang dari 100 meter, maka jangan tampilkan titik pada peta. Untuk menghitung jarak antara dua titik tetangga, kami menggunakan rumus yang disederhanakan dengan pendekatan ekuuler . Perkiraan ini berlaku ketika jarak antara titik-titik tetangga tidak melebihi beberapa km:

  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 

Di sini dst adalah jarak dalam km.

Jelaskan Leaflet API di sini tidak melihat intinya. Untuk ini - di situs web resmi . Modul ini bekerja sebagai berikut: Setiap n detik (saya telah menetapkannya ke 300) permintaan dibuat untuk sejarah hari ini dari objek yang menarik bagi saya. Array koordinat yang dihasilkan dijalankan melalui filter jarak, mengurangi jumlah titik. Selanjutnya, dalam folder dengan konfigurasi HomeAssistant di folder www, 2 file terbentuk: index.html dan route.html. File route.html berisi semua logika untuk membuat peta. Dan file index.html adalah hack seumur hidup untuk mencegah caching halaman. Secara default, HomeAssistant melakukan cache semua yang mungkin, dan hanya mengatur ulang cache membantu memperbarui data pada kartu, yang, tentu saja, tidak dapat diterima. Dalam file index.html, isi route.html dipanggil, namun dengan parameter acak yang dihasilkan secara dinamis, yang memungkinkan Anda untuk selalu meminta versi route.html saat ini dari server:

 src = 'route.html?datetime=' + (new Date()).getTime() + Math.floor(Math.random() * 1000000) 

Sedikit tentang keamanan


HomeAssistant dirancang agar semua file di dalam direktori www bersifat publik, yaitu file apa pun di dalam direktori www dapat dibuka di browser apa pun tanpa izin apa pun, mengetahui tautan langsung. Dalam hal modul saya, tautan ini adalah ini: your_address_homeassistant / local / route / index.html . Jika ini tidak penting untuk Anda, maka Anda dapat melewati bagian ini. Saya melangkah lebih jauh dan memutar otorisasi ke halaman dengan rute. Untuk ini, saya menggunakan nginx (Anda dapat memilih server web lain dengan dukungan proxy terbalik) sebagai server proxy. Situs web HomeAssistant memiliki instruksi resmi untuk mengatur konfigurasi ini. Setelah mengatur proxy dan memeriksa operasi, Anda perlu menambahkan otorisasi ke halaman yang diperlukan dalam konfigurasi nginx:

 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; } 

Kemudian buat file "/etc/nginx/.htpasswd" dan jalankan perintah berikut di konsol:

 sh -c "echo -n 'admin:' >> /etc/nginx/.htpasswd" sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd" 

admin - ganti dengan login yang diinginkan.

Setelah itu, mulai ulang nginx dan periksa: ketika mencoba membuka halaman dengan rute, browser harus meminta nama pengguna dan kata sandi. Saya perhatikan bahwa ini adalah otorisasi terpisah yang tidak ada hubungannya dengan otorisasi HomeAssistant itu sendiri.

Kesimpulan


Mungkin semua yang bisa dikatakan tentang modul ini.
Yang tertarik, di sini ada tautan ke modul. Tempatkan file di sepanjang jalan: config_folder_homeassistant / custom_components / route / sensor.py, jangan lupa tentang haknya.

Jika tidak ada, buat folder config_folder_homeassistant / www dan berikan hak yang sesuai.

Di file konfigurasi, konfigurasi.yaml, tulis baris berikut:

 sensor: - platform: route name: route entityid: your_device_tracker_entity_id haddr: your_address_homeassistant token: your_long_life_token 

di sini your_device_tracker_entity_id adalah ID dari device_tracker perangkat Anda, your_address_homeassistant adalah alamat eksternal HomeAssistant Anda, your_long_life_token adalah token akses yang sebelumnya diterima di antarmuka HomeAssistant untuk menggunakan API REST.

Setelah itu, restart HomeAssistant dan nikmati. Peta akan tersedia melalui tautan langsung: your_address_homeassistant / local / route / index.html . Jika diinginkan, Anda dapat menambahkannya ke menu HA menggunakan panel_iframe atau ke jendela HA apa saja melalui kartu lovelace “iframe”.
Sekian, terima kasih atas perhatiannya.

UPD:
Menambahkan tautan ke GitHub. Memodifikasi beberapa tempat (dihapus dari konfigurasi haddr, secara otomatis mendapatkan config_dir, menambahkan kemampuan untuk mengatur zona waktu saya)

Dan bagaimana semuanya terlihat? Perhatian, Bluer!
gambar

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


All Articles