Smart home in container (ioBroker + Zigbee in Docker)

Entri


Untuk beberapa waktu saya menggunakan beberapa relay Sonoff standar yang mengontrol cahaya melalui Google Home Mini. Tetapi pada akhirnya saya menginginkan lebih. Fungsionalitas standar tidak cukup, saya memutuskan untuk secara bertahap membuat sistem sesuatu yang lebih fleksibel. Saya memilih ioBroker.

Pada awalnya, seperti biasa, saya melihat, memilih, memeriksa bagian-bagian fungsionalitas. Ketika, secara terpisah, kebutuhan pokok bekerja, ia mulai mengumpulkan. Dan, tentu saja, saya mengalami masalah.

Kesulitan utama:

  • Apa tepatnya yang harus dipilih? Bagaimanapun, ada banyak cara untuk mengimplementasikan rencana kami. Dan bahkan dalam solusi yang dipilih ada banyak pilihan ...
  • Tidak ada petunjuk siap pakai tentang cara menyatukan set solusi yang tepat yang saya pilih dan tepatnya dalam konfigurasi saya.

Apa yang saya pilih, mengapa, kesulitan apa yang saya temui dan bagaimana menyelesaikannya, dan itu akan dibahas.

Ke depan, saya akan menjelaskan bagaimana ioBroker diluncurkan di docker pada laptop lama dan melemparkan Zigbee ke dalamnya untuk berinteraksi dengan sensor Xiaomi secara langsung, tanpa gateway. Saya tidak memberikan instruksi standar, hanya "benjolan" saya.

Karena belum produktif, sangat mungkin untuk mengubah sesuatu. Jadi saya akan berterima kasih atas saran dan koreksi :)

Wishlist dan kereta pikiran saya


Ada gulungan Sonoff (berakhir di eWeLink), semacam kabel ekstensi (Tuya SmartLife), gerbang Xiaomi dengan beberapa sensor (Mi Home), kolom Google Home Mini.

eWeLink dan SmartLife biasanya mengambil di Google Home, mendengarkan perintah suara seperti "Nyalakan lampu di atas meja." Mi Home tidak dimulai (ada beberapa perangkat Xiaomi yang didukung di Google Home).

Saya menempatkan ioBroker, mengambil Xiaomi Gateway, pada prinsipnya, semuanya bekerja. Semuanya indah, saya memeriksa skrip, mereka ditulis (saya memilih Node-Red), saya memutuskan untuk melakukan semuanya pada ini.

Namun, saya bukan admin profesional, saya bisa memikirkan cara menyiapkannya, tetapi saya tidak tahu seluk-beluk seperti apa perpustakaan dan komponen yang dimasukkan (dan saya tidak ingin mempelajari lebih dalam). Oleh karena itu, agak mengganggu saya bahwa ioBroker membutuhkan nodejs, beberapa npm yang saya tidak punya bisnis dengan sebelumnya. Ada kesulitan dengan versi (seperti yum standar dari repositori, terlalu lama menempatkan nodejs, dll.).

Baik i.e. Saya memulai semuanya, tetapi rasa takut tetap ada di hati saya bahwa meskipun itu bekerja, saya tidak mengerti caranya. Dan jika, misalnya, ada sesuatu yang rusak selama peningkatan, saya tidak akan tahu bagaimana cara memperbaikinya. Tapi selain ioBroker, saya juga ingin menumpuk sistem lain di laptop.

Saya akan memberikan, misalnya, pembaruan tentang sesuatu yang tampaknya berfungsi. Dan setelah beberapa waktu ternyata bekerja buruk. Kami harus memutar kembali cadangan sebulan yang lalu. Selain itu, cadangan tidak hanya dari sistem ini, tetapi semua yang lain, karena saya tidak mengerti sampai akhir dari mana sistem file yang dapat dieksekusi, di mana file konfigurasi, di mana data itu sendiri ...

Itu sangat mengganggu saya, jadi saya memutuskan untuk menggunakan Docker. Kode dalam wadah. Data secara terpisah, direktori dipasang pada host. Mudah dicadangkan.

Apakah ada versi baru? Ya, bahkan di mesin virtual lain, mudah untuk memeriksa bagaimana versi baru wadah dengan data dari direktori ini akan berfungsi. Sistem yang berbeda tidak saling mengganggu. Mudah untuk memutar kembali binari dari beberapa sistem kembali. Sekali lagi, mudah untuk mentransfer ke hal lain (ioBroker dalam wadah berfungsi baik pada Synology dan pada papan tunggal). Cantik!

Akan ada lebih banyak persyaratan (untuk menyediakan melalui Internet, tetapi tidak tersedia untuk keamanan), mereka akan mempengaruhi lebih lanjut ketika memilih konfigurasi.

Instalasi


OS host tidak kritis, saya mengunduh CentOS (dari memori lama saya ingat bahwa untuk semua tugas jaringan itu bekerja cukup stabil dan tanpa bug). Versi saat ini adalah Cent OS 8.

Taruh itu. Saya membuat pengaturan dasar seperti hostname, fail2ban (hanya kebiasaan, meskipun host hanya di LAN). Pasang Docker. Saya tidak akan memikirkan hal ini. Instruksi contoh .

Saatnya untuk meluncurkan ioBroker. Tetapi jaringan mana yang harus dipilih? Tuan rumah atau Macvlan?

Pertama, Macvlan ingin setiap wadah mendapatkan alamat IP-nya dari router. Tapi kemudian dia memutuskan untuk meninggalkan usaha ini:

  • Dengan Host, tentu saja, Anda perlu secara eksplisit menunjukkan port mana yang akan diteruskan, pastikan port tersebut tidak bersinggungan dengan kontainer lain. Tapi
  • iptables harus dikonfigurasi di dalam setiap wadah. Termasuk setelah setiap restart dengan parameter lain, upgrade / penggantian. Dan dalam mode Host, ini adalah satu titik manajemen keamanan.
  • Saya masih berencana untuk membuatnya tidak hanya dari WiFi di rumah. Dan dalam hal ini, lebih mudah untuk membuat satu host dapat diakses dari luar (dan a la port-mapping di atasnya) daripada mengkonfigurasinya untuk beberapa host.

Saat ini memeriksa ZeroTier One. Dipasang hanya di host. Mengakses alamat IP host ini (bukan lokal, tetapi dikeluarkan oleh ZeroTier) dan port 8082 dari ponsel melalui GPRS ketika klien ZeroTier berjalan, dengan sempurna membuka antarmuka vis.

Sangat standar

docker run -d --name ioBroker -p 8081:8081 -p 8082:8082 -v /opt/iobroker/:/opt/iobroker/ --device=/dev/ttyACM0 --env-file /opt/ioBroker_env.list --restart=always buanet/iobroker:latest 

Ups Ada yang salah.

docker logs ioBroker menunjukkan bahwa pada langkah terakhir tidak ada koneksi ke sumber daya eksternal. Saya tidak bisa mendapatkan nama pisau cukur.

docker exec -it ioBroker bash menunjukkan bahwa ping over IP baik-baik saja dari itu, tetapi tidak dengan nama.

Google, saya menemukan banyak tautan tentang bagaimana buruh pelabuhan secara salah mengganti server DNS, aturan /etc/docker/daemon.json, saya mengerti dnsmasq - tidak ada yang membantu.

Suatu pemikiran merayap masuk, tiba-tiba sesuatu diblokir di tingkat jaringan. Tapi tidak ada telnet atau ikal di wadah, saya tidak bisa memeriksa. Instalasi juga tidak mudah - instal yum tidak berfungsi. Anda tentu saja dapat secara manual menentukan host yang diperlukan di / etc / hosts, tetapi ini terlalu memakan waktu, saya akan lebih baik memeriksa versi lain.

Sebagai contoh, saya dengan bodohnya menghentikan firewalld pada host dengan harapan semuanya akan terbuka. Tapi tidak.

Saya ingat bahwa ketersediaan port masih dapat diperiksa dengan wget. Dan dia ada di wadah! Dan tidak dapat mengunduh apa pun bahkan dengan IP. Bahkan antarmuka web dari router rumah tidak dapat terhubung. Nah, itu berarti masalahnya jelas bukan di DNS, tetapi di iptables.

Akibatnya, semuanya berfungsi setelah menambahkan antarmuka buruh pelabuhan ke zona tepercaya:

 sudo firewall-cmd --permanent --zone=trusted --change-interface=docker0 sudo firewall-cmd --reload 

Itu bahkan menarik, apakah saya mengabaikan instruksi?

Atau saya tidak akan mengambil CentOS 8, tetapi sesuatu yang lain, tidak akan ada masalah (di OS lain itu tidak firewall secara default)?

Atau begitu jelas bagi semua orang bahwa mereka tidak menulis dalam instruksi, saya sudah bodoh untuk waktu yang lama sendirian?

Zigbee


Jadi, ioBroker saya ada di dalam wadah, dan hanya memiliki beberapa port yang diterbitkan. Sekarang ini adalah admin 8081 dan vis 8082, maka mqtt 1883 akan ditambahkan dan, mungkin, sesuatu untuk mendukung Tuya (saya melihat driver seperti itu, tetapi belum mengetahuinya).

Sayangnya, untuk berinteraksi dengan perangkat Xiaomi melalui gateway-nya, multicast diperlukan, dan dengan ini dalam konfigurasi kompleksitas ini. Karena itu, saya memutuskan untuk melempar wadah USB stick. Juga operasi normal.

Di baris perintah, Anda telah melihat --device=/dev/ttyACM0 untuk ini. Perangkat dalam wadah muncul. Di ioBroker, saya mengaktifkan driver standar "Zigbee untuk Xiaomi dan perangkat lain", tetapi tidak berhasil.

Google menyarankan agar untuk mengakses port serial Anda perlu menambahkan pengguna ke grup dialout. Saya masuk ke dalam wadah, tambahkan iobroker ke grup ini - itu tidak membantu.

Saya melihat petunjuk bahwa Anda perlu menginstal paket serialport melalui npm.

Saya tidak bisa, tidak punya hak. Google lebih jauh.

Bluefox sendiri memberi tahu seseorang bahwa direktori ini harus dilakukan dari direktori /opt/iobroker/node_modules/iobroker.javascript/ - Saya tidak punya satu, dan saya masih tidak punya hak instalasi (yah, yaitu instalasi dimulai, lalu crash).

Akhirnya, saya sadar bahwa saya perlu secara eksplisit menentukan dalam baris perintah di mana direktori harus diletakkan.

 npm install -g serialport --production --save --prefix "/opt/iobroker" 

Sudah diinstal, tetapi tidak membantu.

Saya mulai curiga bahwa Anda masih harus berurusan dengan hak akses. Memeriksa (dari dalam wadah, tentu saja):

 test -w /dev/ttyACM0 && echo success || echo failure 

Sukses Yaitu Tetap saja, buruh pelabuhan melempar perangkat dengan benar.

 sudo -H -u iobroker test -w /dev/ttyACM0 && echo success || echo failure 

Gufi! Kegagalan

bash di dalam wadah berjalan di bawah root, Tapi dari pengguna iobroker tidak ada akses ke port. Meskipun telah menambahkannya ke grup dialout.

ls -l /dev/ttyACM0 memberi

 crw-rw----. 1 root 18 166, 0 Nov 3 18:14 /dev/ttyACM0 

Ha! Apa yang 18 bukan nama grup?

Semuanya benar pada host utama: crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0 crw-rw----. 1 root dialout 166, 0 Nov 3 15:15 /dev/ttyACM0

Ternyata pada host utama di / etc / group dialout:x:18 , dan di dialout:x:20 container dialout:x:20

Meskipun saya menambahkan pengguna ke grup dengan nama itu, tidak masuk akal, jumlahnya tidak sama. Jadi saya membuat grup lain dengan pengidentifikasi 18, dan sudah menambahkan pengguna ke dalamnya:

 groupadd -g 18 serial usermod -a -G serial iobroker 

Saya memulai kembali semuanya untuk kepastian yang lebih besar. Dan ini pertikaian saya berakhir :)

Dengan tenang dia melepaskan ikatan semua sensor dari gerbang Xiaomi, mengikatnya ke ioBroker.

Saya melihatnya sebagai objek di ioBroker itu sendiri:



Bacaan Vis dibaca:



Ketika kontak pada sensor kebocoran ditutup, data diterima. Dan gambar berubah:



Dan di Node-Red, sinyalnya datang. Karenanya, meskipun email atau sesuatu lainnya sedang dikirim, file suara atau MP3 dikirim ke kolom GH Mini:



Ngomong-ngomong, ketika melihat benda-benda, sebuah kejutan menunggu saya:



Saya memutar Xiaomi Cube ke sisi lain. Perubahan terbaru ditampilkan dalam warna hijau.
Flip90 telah berubah - ini bisa dimengerti. Sinyal ini ditangkap untuk kontrol. Tapi, ternyata, masih ada flip90_from dan flip90_to - dengan sisi mana dia berbalik.

Ternyata, secara teori, Anda bisa mendapatkan lebih banyak sinyal kontrol dari kubus. Misalnya, jika Anda menggambar panah pada wajah (seolah-olah dalam lingkaran), Anda dapat melacak tidak hanya "putar 90", tetapi juga ke arah mana (dari diri sendiri atau diri Anda sendiri, kiri atau kanan).

Untuk flip180 juga berfungsi. Dan untuk gerakan lain ada informasi tambahan yang serupa (Sisi atas pada flip 180 °, Sisi atas pada slide, Sisi atas pada keran)

Bukannya itu sangat dibutuhkan. Tetapi di Mi Home standar tidak ada informasi tentang wajah. Tampaknya dengan koneksi sebelumnya melalui Xiaomi Gateway, saya juga tidak melihatnya, saya tidak tahu bahwa setiap wajah memiliki nomor. Sebelumnya, saya hanya tahu tentang tindakan tambahan jatuh (jatuh bebas), yang, tetapi mereka diusir dari Mi Home (tampaknya, mereka menjatuhkannya terlalu sering).

Terakhir


Yang saya butuhkan adalah bekerja. Maka Anda dapat membawa keindahan, menulis skrip, menghubungkan Tuya, meluncurkan wadah dengan Blynk untuk proyek lain ...

Dan, mungkin, untuk mengulang sesuatu berdasarkan komentar Anda :)

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


All Articles