Salam kepada semua pecinta otomatisasi rumah. Saya memutuskan untuk berbagi pengalaman menggunakan perangkat nirkabel Xiaomi dengan antarmuka ZigBee. Sejujurnya, saya menentang penggunaan perangkat nirkabel apa pun dalam otomatisasi apa pun, mulai dari sistem kontrol proses serius pada objek besar hingga otomatisasi kecil seperti alarm kebakaran atau rumah pintar, tapi ... Solusi Xiaomi disuap dengan murah, aksesibilitas, desain luar biasa, dan banyak ulasan positif dari pengguna, saya memutuskan untuk mencoba.
Posting ini harus diambil sebagai instruksi langkah demi langkah untuk mengintegrasikan perangkat ZigBee ke dalam infrastruktur rumah pintar. Dijelaskan di sini tidak berarti aksioma dan Anda dapat menemukan banyak cara lain untuk menghubungkan perangkat ZigBee. Jika Anda masih melewatkan deskripsi terperinci, Anda bisa mendapatkan kesan kompleksitas atau kemudahan menggabungkan perangkat dari berbagai produsen ke dalam satu platform lokal menggunakan contoh ZigBee dan ioBroker (lebih lanjut tentang itu nanti). Pada artikel ini saya akan memberi tahu Anda cara menghubungkan perangkat ke rumah pintar, menampilkan informasi dari mereka di tablet atau hanya di browser dan mengirim pesan melalui telegram tentang perubahan status perangkat. Jika saya menarik bagi Anda, maka saya meminta kucing.
Menurut produsen Xiaomi, pengguna harus menggunakan aplikasi asli dengan koneksi cloud dan gateway Wi-Fi untuk perangkat ZigBee. Namun, metode untuk mengaktifkan mode pengembang dalam aplikasi untuk mendapatkan token kontrol telah lama dikenal. Jadi, di dalam jaringan lokal, Anda dapat berkomunikasi dengan gateway, yang memungkinkan Anda melakukan driver
mihome , yang merupakan bagian dari ioBroker.
ioBroker adalah platform terbuka untuk IoT, termasuk untuk membangun sistem rumah pintar. Apa itu ioBroker dapat ditemukan di
artikel sebelumnya.
Sekarang rumah pintar saya adalah "berputar" pada board ARM-Cubietruck dengan beberapa "body kit" dalam bentuk hard drive 80GB, baterai isi ulang 5000mAh, master USB 1-kawat, konverter USB-RS485 untuk perangkat polling menggunakan protokol modbus. Armbian OS diinstal pada hard disk dengan transfer partisi root, hanya bootloader yang tersisa pada kartu memori microSD.
Saya mulai berkenalan dengan perangkat nirkabel Xiaomi dengan membeli sensor suhu dan kelembaban. Pada saat itu, satu-satunya kemungkinan integrasi mereka adalah driver
mihome , yang disebutkan di atas.
Pengemudi mihome
Menambahkan driver ke sistem sangat sederhana, Anda perlu mengklik tombol "+" di daftar driver yang tersedia dan amati proses instalasi.

Saya tidak akan menjelaskan instalasi dan konfigurasi awal aplikasi Android asli Mi Home, Anda dapat melihatnya di halaman
github driver atau di Internet. Jadi, mode pengembang diaktifkan, token diterima, kami mengkonfigurasi adaptor mihome, simpan dan jalankan jika belum dimulai.

Gerbang Xiaomi dan perangkat yang tersambung dalam aplikasi Mi Home akan muncul di pohon objek.

Selanjutnya, Anda dapat mengkonfigurasi objek yang baru dibuat. Misalnya menyimpan sejarah sensor suhu dan kelembaban. Saya menggunakan driver SQL untuk data historis yang dikonfigurasi pada database SQLite.

Penyimpanan sejarah variabel dikonfigurasikan di jendela objek sistem: dalam hierarki objek, Anda perlu membuka variabel itu sendiri dan menekan tombol dengan kunci inggris di sebelah kanan. Pada tab "Pengaturan", saya memiliki penyimpanan sejarah yang diaktifkan oleh sensor - hanya perubahan pada variabel.
Pengaturan lain:
- interval minimum 10 detik - jika variabel akan berubah lebih sering, maka entri dalam basis data akan diabaikan
- mencatat nilai setiap 300 detik (5 menit) - jika variabel tidak berubah selama lebih dari 5 menit, nilai saat ini masih ditulis ke database
- tipe nilai - angka
- umur simpan - 1 tahun

Menambahkan perangkat baru terjadi melalui aplikasi asli. Yaitu Anda perlu memasangkan perangkat baru dengan gateway sesuai dengan instruksi yang terlampir dan setelah itu akan secara otomatis muncul dalam daftar objek ioBroker.
Pengemudi zigbee
Sangat tidak nyaman bagi saya untuk menggunakan aplikasi Xiaomi asli, terutama karena saya harus membeli gateway dengan plug Cina, yang dalam kasus saya, kecuali untuk berkomunikasi dengan perangkat, tidak berguna untuk apa pun. Ya, itu dapat digunakan sebagai lampu malam, atau menggunakan sensor cahaya dalam beberapa skenario. Di Internet, Anda dapat menemukan instruksi tentang cara "memberi makan" daftar putar ke gateway untuk memainkan stasiun radionya sendiri, tetapi tidak ada satu pun yang bermasalah dengan saya. Plus, pikiran bahwa data saya bocor di suatu tempat, sedang diproses dan disimpan di suatu tempat menghantui.
Salah satu pengguna aktif platform ioBroker yang ditemukan di Internet perpustakaan
zigbee-shepherd di node.js, di mana ada disebutkan menghubungkan perangkat Xiaomi. Driver untuk ioBroker ditulis atas dasar itu, dan penulis driver ini tidak terbatas hanya pada perangkat Xiaomi, daftar perangkat yang didukung terus diperbarui dan tersedia di halaman
github proyek.
Seharusnya menggunakan perangkat siap pakai murah berdasarkan chip
CC25xx TI sebagai koordinator jaringan. Anda dapat membeli modul ZigBee yang sudah jadi dengan koneksi USB dan antena internal, serta model yang lebih mahal dan lebih serius: dengan antena eksternal, amplifier, dan koneksi melalui UART.
Untuk bekerja dengan driver, Anda hanya perlu mengganti firmware. Dengan demikian, ternyata driver ini tidak membutuhkan gateway yang mahal, jaringan Wi-Fi tidak diperlukan. "Titik masuk" adalah koordinator - perangkat yang didasarkan pada chip SS25xx dengan firmware khusus. Melalui koordinator, ada komunikasi langsung perangkat zigbee dan sistem Smart Home, serta pengikatan perangkat baru.
Sebagai koordinator, saya menggunakan motherboard yang sudah jadi berdasarkan chip CC2530 dengan antena eksternal, yang saya sambungkan ke server melalui UART.
Untuk firmware perangkat, debugger SmartRF04EB khusus telah dibeli, port microUSB yang saya sambungkan ke komputer, dan modul ZigBee terhubung menggunakan kabel untuk debugging sesuai dengan skema:
SS2530 | Papan SmartRF04EB |
---|
P22 | DC |
P21 | DD |
Pertama | RESET |
GND | GND |
Vcc | 3.3V |

Pada halaman
github proyek, unduh firmware (file tersebut disebut CC2530ZNP-Pro-Secure_LinkKeyJoin.hex untuk perangkat ini) dan program firmware (flash-programmer), setelah itu driver yang diperlukan ditambahkan ke sistem.
Ketika Anda menghubungkan papan debugger ke port USB komputer, program akan segera menampilkan perangkat yang terhubung. Anda hanya perlu menentukan jalur ke file firmware dan klik tombol "Lakukan Tindakan"

Port modul ZigBee P03 (Rx) dan P02 (Tx) terhubung di UART4 (di OS seperti ttyS4) papan cubietruck, bertenaga 3V3, GND mengambil pin tetangga. Untuk pengoperasian yang stabil, Anda masih perlu menarik port P20, P4, P5 dari koordinator ke ground. Seperti yang saya tulis di atas, saya menggunakan OS Armbian, port UART diaktifkan sangat sederhana, menggunakan perintah
armbian-config di bagian
System -
Hardware , Anda perlu mengaktifkan port yang diinginkan dan me-reboot sistem.

Driver zigbee ditambahkan dari panel admin dengan satu klik.

Dalam kasus saya, koordinator terhubung ke port
/ dev / ttyS4 (seperti yang saya tulis di atas), kami tentukan dalam pengaturan.

Pengaturan lain dapat dibiarkan secara default. Setelah peluncuran driver yang pertama, Anda perlu memasangkan (menambahkan) perangkat. Instruksi lengkap tentang
github , memasangkan melalui driver ini sedikit lebih rumit daripada melalui aplikasi asli, tapi saya tidak punya masalah.
Jadi, misalnya, tambahkan tombol Xiaomi (seri Mijia), untuk ini kita tekan tombol hijau di pengaturan driver dan, mengikuti instruksi, pertama tahan tombol pasangan di belakang dengan klip kertas sampai LED mulai berkedip, kemudian klik tombol ini sekali setiap 2 detik, lihat kemajuan pemasangan.

Apartemen saya tidak besar, dengan semua perangkat koneksi stabil, bahkan dengan sensor pintu terbuka di pendaratan (dinding beton bertulang adalah 100 mm dan 5 m dalam garis lurus). Permasalahan dimulai ketika saya memutuskan untuk menambahkan sensor suhu dan kelembaban ke udara jalan, yang saya pasang di dinding luar rumah dari sisi loggia terisolasi. Sinyal sensor lemah, yang juga ada di jalan, tidak mencapai kabinet otomasi. Masalahnya dapat dipecahkan secara sederhana - Anda perlu menambahkan router ke jaringan ZigBee dan menempatkannya lebih dekat ke sensor. Beberapa perangkat nirkabel, misalnya, soket Xiaomi, dapat berfungsi sebagai router, tetapi saya tidak memiliki perangkat tersebut. Saya tidak ingin membeli outlet mahal atau lampu terkontrol hanya untuk "meneruskan" data dari sensor di jalan. Ternyata, untuk perangkat terminal yang sama berdasarkan chip SS25xx ada firmware khusus yang memungkinkan mereka untuk digunakan sebagai router dalam sistem. Sebagai hasilnya, saya menambahkan router berbasis pada chip CC2531 dengan koneksi USB. Saya tidak akan memikirkan proses firmware, skema dan file firmware itu sendiri dapat ditemukan di halaman
github proyek.
Karena, pada kenyataannya, komunikasi dengan modul melalui port USB tidak terjadi, saya untuk sementara menyambungkannya ke pengisian dengan port USB dan menghubungkannya ke outlet di dapur. Dalam waktu dekat saya berencana untuk menempatkannya di bangunan normal di atas loggia dan dengan daya normal dari UPS rumah.

Proses menambahkan router ke sistem ini sederhana: tekan tombol pairing pada driver dan pada router yang diaktifkan tekan tombol S2 beberapa kali hingga perangkat terhubung.

Mari kita tambahkan contoh sensor suhu / kelembaban, yang saya temukan di luar loggia dan yang seharusnya bekerja melalui router.
Anda cukup membuat pasangan melalui driver dan sensor harus terhubung melalui router, jika lebih dekat. Tetapi Anda dapat menentukan secara paksa bahwa pemasangan melalui router tertentu, untuk ini, dalam daftar perangkat pada ikon router, klik tombol pemasangan hijau.

Pastikan sensor terhubung dengan benar - lihat peta jaringan.

Peta menunjukkan garis pasangan perangkat yang menunjukkan kualitas sinyal antara segmen jaringan. Seperti yang saya tulis di atas, saya memiliki odnushka kecil 35 sq.m., jadi petanya cukup sederhana. Dengan izin dari pengguna lain, saya akan menerbitkan opsi yang memungkinkan dengan kartu yang lebih besar.



Fungsionalitas beberapa perangkat Xiaomi melalui adaptor ini bahkan sedikit lebih banyak daripada melalui aplikasi asli dan driver mihome. Di masa depan saya ingin sedikit memperluas jaringan dan mencoba perangkat baru, khususnya, smart drive untuk gorden dan sensor kubus.
Pengemudi Material
Kami mendapat data, aktuator diikat, apa yang harus dilakukan dengan mereka? Pertama, mari kita tampilkan dalam antarmuka yang indah. Saya memiliki proyek besar dalam driver VIS, yang ada dalam beberapa versi untuk izin yang berbeda, tetapi ada cukup bahan untuk artikel terpisah. Mungkin dia akan menjadi yang berikutnya.
Untuk tampilan data yang sederhana dan cepat serta kontrol berbagai perangkat, saya menggunakan driver material. Instalasi seperti biasa dalam beberapa klik. Ubin antarmuka menampilkan data berdasarkan pengaturan kategori, yang ditambahkan di jendela admin antarmuka dengan nama yang sama. Daftar kategori hanya dibatasi oleh imajinasi, saya menggunakan skema "fungsi-kamar", dan pengelompokan terjadi sesuai dengan mereka. Menambahkan semua kamar (dapur, koridor, kamar, balkon, dll.) Dan fungsi (pencahayaan, sensor, sistem, dll.).

Sekarang, di jendela pengaturan objek sistem, perlu untuk variabel yang akan ditampilkan di layar untuk menunjukkan ruang, fungsi dan menetapkan peran (untuk tampilan yang tepat). Contohnya adalah sensor suhu dan kelembaban dinding dalam ruangan Xiaomi, yang terhubung melalui Bluetooth.

Berdasarkan pengaturan ini, ubin akan menampilkan data di layar, ikon akan mengencangkan, dan untuk objek kontrol tipe tertentu akan tersedia.
Contoh 1. Output dari semua informasi dalam satu kategori - fungsi. Pencahayaan di seluruh apartemen.
Contoh 2. Keluaran dari semua informasi tentang ruangan - Kamar Mandi.
Contoh 3. Level tegangan dan pelepasan baterai semua perangkat nirkabel Xiaomi.

Pengemudi ini berfungsi untuk saya untuk mengendalikan sistem secara lokal dari ponsel, tablet stasioner di dinding. Terkadang saya terhubung melalui VPN. Untuk mengontrol dan melihat status dari jarak jauh, untuk menerima notifikasi, saya menggunakan driver telegram.
Sopir telegram
Saya tidak akan menjelaskan pemasangannya, cukup tinjau pengaturannya. Saya menggunakan mode operasi melalui pemungutan suara berkala (300 ms secara default) dan koneksi melalui server proxy. Untuk mendapatkan token, Anda perlu "berbicara" dengan pembuat bot, BotFather. Prosesnya sederhana - temukan pencarian untuk bot ini, berikan perintah untuk membuat yang baru, tentukan nama unik dan kunci Anda, tunjukkan dalam pengaturan driver dan, untuk keamanan, pastikan untuk menentukan kata sandi "ucapan". Bot Anda akan menanyakannya saat berkomunikasi dengan pengguna baru.

Sekarang Anda perlu mengkonfigurasi kasus komunikasi melalui bot. Anda dapat menggunakan driver perintah teks2 atau JavaScript untuk melakukan ini. Kebetulan secara historis saya menggunakan JavaScript baik dalam bentuk teks dan blok Blockly. Menginstal driver JS seharusnya tidak menyebabkan kesulitan, konfigurasi dalam hal ini tidak diperlukan. Setelah instalasi dan peluncuran, Anda perlu mengaktifkan tampilan menu untuk membuat dan mengedit skrip.
Contoh 1. Lansiran.
Pertama, mari kita coba mengirim pemberitahuan tentang pembukaan, misalnya, pintu depan. Saya memiliki saklar sensor nirkabel buluh Xiaomi di pintu depan. Saya memantau bagaimana istri saya berjalan dengan picik ketika saya sedang bekerja. Buat skrip baru di grup umum.

Tentukan apa yang akan "menggambar" di blockly dan menyebutnya "telegram_bot".

Di grup "Acara", kami mengambil unit reaksi untuk mengubah variabel dan menyeretnya ke bidang kerja.

Selanjutnya, pilih ID objek yang kita berlangganan, masukkan pemeriksaan objek melalui "jika" - "jika tidak" ke true / false. Hasilnya harus seperti berikut ini.

Oke, sekarang kami berlari, kami membuka pintu - kami menutup pintu dan kami melihat pesan di telegram.
Contoh 2. Kontrol pencahayaan melalui menu.
Contohnya lebih rumit, mari kita buat kontrol pencahayaan menggunakan tombol menu di telegram. Di sini Anda harus berkeliaran sedikit, mis. saat membuat skrip, Anda harus memilih JS. Tugasnya kira-kira sebagai berikut: membuat tombol dalam bentuk menu dengan status perlengkapan ditampilkan langsung dalam teks tanda tangan tombol. Masih mencoba memastikan bahwa ketika Anda menekan tombol, status pencahayaan terbalik dan status segera diperbarui dalam teks tombol dengan tampilan / hilangnya bola lampu. Plus, jika menu sudah berjalan dan menyalakan / mematikan lampu secara manual dengan tombol, perlu bahwa menu juga diperbarui dengan status perlengkapan.
Kode berisi komentar dan relatif tidak rumit:
| // ID |
| const LIGHT1 = ' ', CH_LIGHT1 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_main1'; |
| const LIGHT2 = ' ', CH_LIGHT2 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_main2'; |
| const LIGHT3 = ' ', CH_LIGHT3 = 'mqtt.0.PLC55_Lighting.lighting.MainRoom_sec'; |
| const LIGHT4 = ' ', CH_LIGHT4 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_main'; |
| const LIGHT5 = ' 1', CH_LIGHT5 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_sec_top'; |
| const LIGHT6 = ' 2', CH_LIGHT6 = 'mqtt.0.PLC55_Lighting.lighting.Kitchen_sec_bottom'; |
| const LIGHT7 = ' ', CH_LIGHT7 = 'mqtt.0.PLC55_Lighting.lighting.BathRoom_main'; |
| const LIGHT8 = ' ', CH_LIGHT8 = 'mqtt.0.PLC55_Lighting.lighting.Hall_main'; |
| const LIGHT9 = ' ', CH_LIGHT9 = 'mqtt.0.PLC55_Lighting.lighting.Balcon_main'; |
| |
| // |
| function sendLightMenu(message_text) { |
| // |
| var l1 = getState(CH_LIGHT1).val ? '๐ก' : ''; |
| var l2 = getState(CH_LIGHT2).val ? '๐ก' : ''; |
| var l3 = getState(CH_LIGHT3).val ? '๐ก' : ''; |
| var l4 = getState(CH_LIGHT4).val ? '๐ก' : ''; |
| var l5 = getState(CH_LIGHT5).val ? '๐ก' : ''; |
| var l6 = getState(CH_LIGHT6).val ? '๐ก' : ''; |
| var l7 = getState(CH_LIGHT7).val ? '๐ก' : ''; |
| var l8 = getState(CH_LIGHT8).val ? '๐ก' : ''; |
| var l9 = getState(CH_LIGHT9).val ? '๐ก' : ''; |
| // |
| sendTo('telegram.0', { |
| text: message_text, |
| reply_markup: { |
| keyboard: [ |
| [LIGHT1+l1, LIGHT2+l2, LIGHT3+l3], |
| [LIGHT4+l4, LIGHT5+l5, LIGHT6+l6], |
| [LIGHT7+l7, LIGHT8+l8, LIGHT9+l9] |
| ], |
| resize_keyboard: true, |
| one_time_keyboard: true |
| } |
| }); |
| } |
| // |
| function changeLight(room, channel) { |
| // |
| var alive = getState("mqtt.0.info.connection").val; |
| if (alive.includes("PLC55_Lighting")) { |
| if (getState(channel).val) { |
| setState(channel, false, false, function () { |
| sendLightMenu(room+' '); |
| }); |
| } else { |
| setState(channel, true, false, function () { |
| sendLightMenu(room+' '); |
| }); |
| } |
| } else { |
| sendLightMenu(' OFFLINE'); |
| } |
| } |
| // request , |
| on({id: "telegram.0.communicate.request", ack: false, change: 'any'}, function (obj) { |
| var msg = obj.state.val; |
| var command = obj.state.val.substring(obj.state.val.indexOf(']')+1); |
| var user = obj.state.val.substring(obj.state.val.indexOf('[')+1,obj.state.val.indexOf(']')); |
| var chat_id = getState("telegram.0.communicate.requestChatId").val; |
| var message_id = getState("telegram.0.communicate.requestMessageId").val; |
| var handled = false; |
| // |
| if (command == '/start' || command == '/menu' || command == '' || command == '') { |
| sendLightMenu(""); |
| handled = true; |
| } |
| //######################## Lighting menu and commands ################ |
| if (command == LIGHT1 || command == LIGHT1+'๐ก') { |
| changeLight(LIGHT1, CH_LIGHT1); |
| handled = true; |
| } |
| if (command == LIGHT2 || command == LIGHT2+'๐ก') { |
| changeLight(LIGHT2, CH_LIGHT2); |
| handled = true; |
| } |
| if (command == LIGHT3 || command == LIGHT3+'๐ก') { |
| changeLight(LIGHT3, CH_LIGHT3); |
| handled = true; |
| } |
| if (command == LIGHT4 || command == LIGHT4+'๐ก') { |
| changeLight(LIGHT4, CH_LIHT4); |
| handled = true; |
| } |
| if (command == LIGHT5 || command == LIGHT5+'๐ก') { |
| changeLight(LIGHT5, CH_LIGHT5); |
| handled = true; |
| } |
| if (command == LIGHT6 || command == LIGHT6+'๐ก') { |
| changeLight(LIGHT6, CH_LIGHT6); |
| handled = true; |
| } |
| if (command == LIGHT7 || command == LIGHT7+'๐ก') { |
| changeLight(LIGHT7, CH_LIGHT7); |
| handled = true; |
| } |
| if (command == LIGHT8 || command == LIGHT8+'๐ก') { |
| changeLight(LIGHT8, CH_LIGHT8); |
| handled = true; |
| } |
| if (command == LIGHT9 || command == LIGHT9+'๐ก') { |
| changeLight(LIGHT9, CH_LIGHT9); |
| handled = true; |
| } |
| // , text2command |
| if (!handled) { |
| sendTo('text2command.0', { |
| text: command.replace(/\//g, '#').replace(/_/g, ' '), |
| id: chat_id, |
| user: user |
| }, function (response) { |
| if (response && response.response) { |
| sendTo('telegram.0', {user: user, text: response.response}); |
| } |
| }); |
| } |
| }); |
| // , |
| on({id: /^mqtt\.0\.PLC55_Lighting\.lighting\..*$/, ack: true, change: 'ne'}, function (obj) { |
| sendLightMenu(" "); |
| }); |
| // |
| sendLightMenu(""); |
Hasilnya harus seperti ini:

Kesimpulan
Artikel itu ternyata panjang, tapi saya harap ini berguna, dan mungkin akan membuat hidup lebih mudah bagi beberapa pengguna atau mendorong seseorang untuk membuat rumah pintar mereka sendiri.
Saat ini, sistem rumah pintar berbasis ioBroker saya telah berputar selama 4 tahun dan saya cukup senang dengannya. Selain ZigBee, beberapa pengendali buatan sendiri melalui MQTT dan HTTP juga terhubung dengannya untuk mengendalikan pencahayaan, ventilasi dan sistem lainnya, jaringan sensor suhu pada bus 1-kawat, perangkat pemantauan catu daya pada protokol RS485 bus dan modbus RTU, dan banyak lagi.
Dalam celengan solusi untuk rumah pintar, saya telah mengumpulkan banyak ide, meskipun, mungkin, mereka harus dianggap lebih sebagai celengan masalah untuk rumah pintar (mereka yang mengerti topik tentang apa yang saya maksud). Tinggalkan keinginan Anda di komentar untuk membantu saya memutuskan topik artikel selanjutnya.