Selamat siang, Khabrovit sayang! Beberapa tahun yang lalu, saya membeli iklan zWave yang berwarna-warni dan memasang sensor jendela berdasarkan protokol ini. USB zWave-Stick terhubung ke server rumah, yang memainkan peran sebagai pengontrol, modul Java kecil ditulis yang menerima data dari pengontrol ini, dan sebuah aplikasi kecil untuk Android ditulis yang dengan indah menampilkan status semua sensor. Baterai dimasukkan, sensor terdaftar pada controller, semuanya berfungsi. Tetapi setelah beberapa bulan ada kekecewaan yang mengerikan. Pertama, sensor zWave ini bekerja berdasarkan prinsip "kirim pesan dan tertidur tanpa menunggu konfirmasi." Dalam kasus saya, ini mengarah pada fakta bahwa sinyal dari sensor terjauh dari controller tidak mencapai controller. Bahkan pemasangan repeater zWave tambahan tidak membantu. Kedua, mereka menghabiskan baterai begitu cepat sehingga setelah sekitar enam bulan semua sensor berhenti bekerja. Alasannya adalah bahwa mereka bangun setiap jam untuk memberi tahu pengontrol tentang kondisi mereka. Nonaktifkan atau ubah opsi ini tidak berfungsi, karena perangkat lunak standar tidak mengizinkannya. Setelah dua tahun tersiksa oleh teknologi yang mentah, tidak dapat diandalkan, dan tidak ramah ini, saya memutuskan bahwa saya sudah cukup. Tapi alih-alih menyimpan semuanya dan membuangnya, saya mendapat ide untuk meninggalkan kasing, tetapi mengubah elektronik di dalamnya. Pilihannya jatuh pada transceiver RFM69 yang cukup sederhana (433 MHz), atas dasar itu dimungkinkan untuk membuat papan untuk sensor dan pengontrol yang terhubung melalui USB ke server. Sistem baru telah beroperasi selama 5 bulan, keandalan mendekati 100% (tetapi masih ada beberapa kegagalan), baterai belum berpikir untuk menjadi kosong. Artinya, sudah terlihat bahwa semua kekurangan sistem lama berdasarkan zWave telah dihilangkan, dan saya ingin berbagi rincian teknis dari artikel saya ini, lihat gambar.

Siapa yang peduli, tolong, di bawah kucing.
Sepertinya saya bahwa zWave dalam kasus saya ternyata tidak beroperasi karena dua alasan: rumah memiliki dua lantai dengan lantai beton bertulang dan area yang luas (yaitu, pemindahan beberapa sensor dari pengontrol secara signifikan). Nah, kelemahan dalam perangkat lunak berpemilik, yang tidak memungkinkan untuk menonaktifkan sensor berkala, yang menyebabkan baterai cepat habis. Ketika menjadi jelas bahwa saya tidak dalam perjalanan dengan zWave, saya mulai mencari opsi lain yang bisa dimasukkan ke rumah sensor yang sama.
Prototipe sensor pertama saya didasarkan pada ESP8266. Kontroler - berdasarkan pembayaran saya yang sudah saya
tulis di Habré . Sistem itu bahkan berfungsi sebagai prototipe, tetapi saya harus meninggalkannya karena dua alasan. Alasan pertama adalah sama - di rumah ada sudut dengan tingkat sinyal WiFi yang sangat rendah, yang menyebabkan waktu aktivasi ESP8266 yang sangat lama pada saat bangun dan, sebagai akibatnya, keluarnya baterai yang kuat. Meskipun saya akui bahwa saya tidak tahu cara memasak ESP8266 ini (artikel
seperti ini mengkonfirmasi tesis ini). Tapi alasan kedua lebih serius. Karena saya memutuskan untuk meninggalkan tidak hanya casing, tetapi juga kompartemen baterai, saya terbatas pada baterai CR123A, yaitu 3,0 volt. Artinya, harga dan kompleksitas sensor meningkat karena meningkatnya konverter DC / DC. Meskipun
ada artikel bagus tentang topik ini di Habré. Tetapi, bagaimanapun juga, kedua alasan ini telah melebihi dan saya menolak ESP8266.
Prototipe kedua ditransfer. Saya membuat prototipe sensor dan pengontrol USB, saya menambahkan modul server sehingga dia mengerti pengontrol ini selain zWave-Stick. Ada ide untuk secara bertahap menarik kabel dan sensor setelah sensor untuk mengubah zWave-board ke yang kabel. Namun pada akhirnya, ia tidak memetik tembok dan prototipe ini juga dibuang.
Kemudian ia memutuskan untuk melihat ke arah modul radio pada 433 dan 868 MHz dan memesan beberapa modul untuk percobaan:
RFM69HCW ,
A110LR09A dan
MRF89XAM8A . Dalam hal ukuran modul, harga, dan juga karena ketersediaan perpustakaan dan
contoh-contoh yang baik, saya memilih RFM69HCW, yang membentuk dasar sistem.
Sistem ini hanya memiliki empat komponen:
- sensor nirkabel (433 MHz, baterai CR123A 3.0V),
- pengontrol jaringan (433 MHz, ditenagai melalui USB dari server)
- server (yang sudah saya tulis di Habré dalam artikel ini ) dan modul program server
- klien seluler (aplikasi Android)
Di bawah ini saya akan menjelaskan setiap modul secara terperinci, dan pada akhirnya saya akan memberikan statistik operasi sistem selama beberapa bulan terakhir operasi.
Sensor
Sensor menggunakan
modul radio
RFM69HCW . Ini memiliki rentang tegangan operasi yang luas (1.8V-2.4V 17dBm, 2.4V-3.6V 20dBm) dan dikendalikan melalui SPI. Artinya, Anda membutuhkan mikrokontroler. Beberapa waktu lalu saya berkenalan dengan seri STM32L dan memesan STM32L051 untuk percobaan. Itu menyuap saya sebagai arus kecil dalam mode tidur (0,27 μA), dan tegangan operasi, hampir identik dengan tegangan modul radio (1,65V-3,6V). Ditambah harga murah.
Ternyata skema berikut:

Tegangan suplai baik mikrokontroler dan modul radio sedemikian rupa sehingga mereka dapat langsung didukung dari elemen CR123A. STM32L051 memiliki sumber tegangan referensi internal yang terhubung ke saluran 17 dari ADC, serta nilai kalibrasi dari sumber ini, yang memungkinkan Anda untuk mengukur nilai arus dari tegangan suplai VDD. Modul radio terhubung ke daya melalui perangkat bidang Q1, yang memungkinkan Anda untuk mengontrol daya dari mikrokontroler.
Mode tidur diimplementasikan dengan mentransfer mikrokontroler ke "Siaga". Dalam mode ini, STM32L051 memiliki inti yang dinonaktifkan, hampir semua periferal dan regulator tegangan internal, yang memastikan konsumsi pada tingkat 0,29 μA (ketika jam waktu nyata dinonaktifkan). Tetapi dalam mode ini ada fitur - mikrokontroler hanya terbangun di sepanjang tepi sinyal yang naik pada pin WKUP (A0). Karena sakelar magnet digunakan, yang hidup / mati (tertutup atau terbuka), Anda memerlukan blok kecil yang menghasilkan pulsa berdurasi pendek baik saat menutup maupun saat membuka kontak magnetik. Denyut ini diumpankan ke input A0 dari mikrokontroler dan membangunkannya. Konverter semacam itu diterapkan pada IC3 chip OR-eksklusif dari seri 74AUP hemat energi (74AUP1G86), yang beroperasi pada kisaran tegangan 0,8V-3,6V dan mengkonsumsi 0,2 μA. Dengan demikian, total konsumsi dalam mode tidur harus sekitar 0,5 μA, yang dikonfirmasi oleh pengukuran pada sensor yang dirakit sepenuhnya.
Ketika mikrokontroler bangun, pertama-tama mengukur tegangan suplai dan, jika kurang dari 1,8 volt, maka itu bukan takdir - pemancar tidak dapat dimulai dan mikrokontroler jatuh tertidur kembali.
Jika tegangan baterai lebih besar dari 1,8 volt, maka mikrokontroler menyala dan menginisialisasi modul radio, mentransfer status ke pengontrol jaringan dan menunggu konfirmasi. Paket data mencakup nomor (acara) paket 32-bit yang unik, tegangan baterai, suhu, status kontak magnetik, byte kontrol (CRC7). Jika konfirmasi berhasil, mikrokontroler tertidur kembali. Jika tidak, maka kirim status lagi, tetapi maksimal 10 kali. Saya menetapkan batas ini sehingga sensor tidak mencoba menunggu tanpa batas waktu untuk respons dalam situasi di mana pengontrol jaringan dimatikan. Nomor peristiwa unik yang terakhir ditransmisikan disimpan dalam EEPROM internal mikrokontroler.
Selama transfer data, mikrokontroler berkedip LED (di mana tanpa itu). LED dihidupkan menggunakan PWM, di mana siklus kerjanya tergantung pada nilai tegangan saat ini, yang memungkinkan Anda untuk memiliki kecerahan yang hampir sama di hampir seluruh rentang tegangan operasi.
Papan dirancang di EagleCAD, desain papan
tersedia di sini . Papan dua sisi: mikrokontroler dan harness-nya terletak di sisi atas menghadap bingkai jendela, dan modul radio dan LED berada di sisi bawah menghadap ruangan. Saya memesan di Cina, menyolder sendiri dalam oven dapur konvensional (lapisan atas) dan pengering rambut (lapisan bawah).

Modul radio membutuhkan antena. Ini hanya sepotong kawat dengan panjang 164 mm.
Setelah instalasi, masing-masing sensor harus diprogram, untuk itu disediakan konektor SWD. Saya meninggalkan kontak yang tersisa di papan untuk kemungkinan percobaan di masa depan.
Firmware ditulis dalam C ++, bagian dari kode ini dilakukan dalam kelas dasar yang cukup universal yang merangkum panggilan ke perpustakaan ST HAL. Kode sumber
ada di sini . Untuk pengembangan, System Workbench untuk STM32 digunakan. Ukuran file firmware biner terakhir adalah 22 kB.
Dan ini sensornya:

Tergantung pada posisi sensor, untuk beberapa sensor saya meninggalkan antena di luar (dengan latar belakang bingkai putih, namun, itu tidak terlihat), dan untuk beberapa sensor saya membengkokkan kawat ke dalam bingkai dan benar-benar memasukkannya ke dalam case.
Demi kepentingan, saya menghitung biaya komponen untuk satu sensor (dengan harga katalog Mouser, harga dan harga total dalam euro)
Barang | Deskripsi | Nilai | Nomor MOUSER | Jumlah | Biaya |
IC3 | Eksklusif ATAU | 1G86 | 771-74AUP1G86GW-G | 1 | 0,254 |
IC1 | Mikrokontroler | STM32L051 | 511-STM32L051K6T6 | 1 | 2.14 |
SV1 | Konektor | Swd | 68602-406HLF | 1 | 0,157 |
LED1 | LED 3 mm | 3mm | 630-HLMP-K155 | 1 | 0,351 |
Q1 | P-MOSFET | BSH205 | 771-BSH205G2R | 1 | 0,276 |
S1 | Kontak magnetik | ORD211-0810 | 876-ORD211-0810 | 1 | 0,625 |
IC2 | Modul radio RFM69HCW | RFM69HCW | 474-COM-13910 | 1 | 5.36 |
C1, C2, C3, C6 | Kapasitor SMD | 0.1 uF | 80-C0805C104J5RAC | 4 | 0,1 |
C5 | Kapasitor SMD | 0.4nF | C0805C471K8HACTU | 1 | 0,021 |
C4 | Kapasitor SMD (tantalum) | 47 uF | 581-TAJR225K016RNJ | 1 | 0,334 |
R1 | SMD resistor | 10 rb | 660-RK73H2ATTDD1002F | 1 | 0,01 |
R10 | SMD resistor | 330 | 660-RK73H2ATTDD3300F | 1 | 0,01 |
R3, R4, R6, R7, R8, R11 | SMD resistor | 47 rb | 660-RK73H2ATTDD4702F | 6 | 0,06 |
R5 | SMD resistor | 56 | 660-RK73H2ATTD56R0F | 1 | 0,013 |
R9 | SMD resistor | 56 jt | 603-RC0805JR-0756ML | 1 | 0,037 |
| | | | | 9,748 |
Omong-omong, ternyata persis tiga kali lebih murah daripada sensor zWave asli. Meskipun ini hanya biaya suku cadang tidak termasuk kasing. Tapi, menurut saya, di retail zWave sensor harganya mahal.
Pengontrol jaringan
Untuk pengontrol, modul radio yang sama dan mikrokontroler yang sama digunakan untuk sensor. Ini memungkinkan penggunaan kembali sebagian besar kode firmware. Untuk pengontrol, saya memilih faktor bentuk papan ini untuk menggunakan kasing siap pakai dari Raspberry Pi. Dibandingkan dengan sensor, konektor antena eksternal dan loop USB berdasarkan isolator FT232RL dan SI-8621 ditambahkan. Tentu saja, sebagai gantinya, seseorang dapat mengambil beberapa STM32 dengan USB di papan. Tetapi kemudian, pertama-tama, perlu untuk memisahkan kode firmware dan, kedua, untuk melakukan implementasi perangkat lunak dari USB itu sendiri. Opsi dengan FT232RL eksternal, meskipun lebih mahal, lebih andal dan lebih cepat untuk diterapkan. Hasilnya adalah
skema berikut :

Dan dalam bentuk rakitan ternyata seperti ini:


Mikrokontroler tidak tidur di sini, modul radio berfungsi untuk penerimaan, tetapi setelah berhasil menerima paket dari salah satu sensor, modul beralih ke mode transmisi dan mengirimkan pemberitahuan. Selain itu, setiap paket yang berhasil diterima dikirim melalui USB ke server. Format paket adalah serangkaian nilai yang dipisahkan oleh simbol ";":
GW; 3; 12; -57; 0; 146; 30; 18
dimana:
- posisi pertama adalah label paket (selalu "GW")
- posisi kedua - tipe data (status sensor atau kode kesalahan)
- posisi ketiga - nomor sensor
- posisi keempat - kualitas sinyal di sisi pengontrol jaringan (RFM69HCW menjaga kualitas sinyal selama penerimaan dan memungkinkan Anda untuk menginterogasinya ketika penerimaan selesai)
- posisi kelima - keadaan jendela (0 terbuka, 1 tertutup)
- posisi keenam - nomor unik dari paket (acara) dari sensor. Nomor ini memungkinkan Anda untuk mengontrol di sisi server apakah semua peristiwa diterima oleh server atau satu atau lebih peristiwa hilang.
- posisi ketujuh - tegangan baterai saat ini (30 sesuai dengan 3.0V)
- Posisi kedelapan yang terakhir adalah suhu dari sensor internal mikrokontroler. Saya belum menemukan cara menggunakannya
Kode sumber untuk firmware berada
di tempat yang sama dengan sensor . Mereka memiliki file utama umum dan perpustakaan umum kelas dasar. Opsi firmware (sensor atau pengontrol) dipilih menggunakan directive define dalam file main.cpp.
Biaya pengontrol jaringan lebih tinggi karena sirkuit USB, antena, dan konektor tambahan. Tetapi aditif ini dapat diabaikan, karena hanya ada satu pengontrol. Tetapi bahkan dengan suplemen ini, ternyata juga tiga kali lebih murah daripada zWave-Stick, yang sebelumnya ada di tempatnya.
Modul server
Pengontrol jaringan terhubung ke server yang menjalankan CentOS 7. Server menjalankan program yang ditulis dalam Java. Dan dalam strukturnya, dan dalam implementasi, dan dalam tugas-tugas, program ini cukup sederhana:
- Menggunakan pustaka RxTx yang sangat lama dan tampaknya tidak lagi didukung, port USB yang ditentukan dalam konfigurasi dipantau (dalam kasus saya / dev / ttyUSB0). Saat ini, ini adalah bagian yang paling tidak optimal dari seluruh sistem, karena perpustakaan memuat prosesor server.
- Jika data diterima dari port USB, mereka direkam dalam file log dan disimpan dalam kelas status sensor. Ketika Anda me-restart server, statusnya hilang. Untuk mengembalikannya, Anda harus berkeliling rumah dan membuka dan menutup semua jendela secara manual. Ini mungkin kelemahan terbesar dari sistem saya, tetapi saya cukup sadar menolak untuk secara berkala mengumpulkan sensor demi menghemat baterai mereka.
- Aplikasi ini juga merupakan server TCP / IP kecil dan mendengarkan pada port TCP / IP yang ditentukan dalam konfigurasi. Pada port ini, ia dapat menerima koneksi dari klien seluler.
- Jika klien seluler terhubung ke server, ia mengirim status saat ini dari semua sensor. Menggunakan pesan heartbit berkala, server juga memonitor aktivitas koneksi.
- Server dan klien seluler bertukar pesan dalam format XML. Pesan-pesan ini diimplementasikan dalam bentuk perpustakaan Java kecil, yang dibagikan baik di sisi server dan di sisi aplikasi mobile Android.
- Meskipun ini tidak masuk akal, demi kepentingan, saya menambahkan fungsi otorisasi klien seluler melalui IMEI, serta enkripsi pesan AES antara server dan klien menggunakan kunci yang dijahit ke dalam kode sumber (paket javax.crypto Java). Tapi ini murni untuk percobaan, karena port TCP / IP modul server ini hanya dapat diakses dari jaringan internal dan tidak terlihat dari luar. Meskipun, jika saya ingin membuka port ini ke dunia besar, sekarang tidak akan begitu menakutkan untuk melakukannya.
Siapa peduli, kode sumber modul server ada di
sini .
Klien seluler (aplikasi Android)
Anda tidak akan menulis banyak di sini, meskipun aplikasi ini adalah hasil akhir dari seluruh proyek. Ini adalah aplikasi Java standar dan sangat sederhana dengan tiga tab: keadaan jendela lantai pertama, keadaan lantai dua, dan telemetri kecil server (lihat
kode sumber di sini ):

Grafik didasarkan pada satu set file SVG, yang ditumpuk di atas satu sama lain tergantung pada keadaan sensor. Tekan lama didukung di area masing-masing jendela, yang menurutnya petunjuk ditampilkan dengan waktu kapan jendela ini dibuka:

Pada prinsipnya, tidak ada yang mencegah Anda menambahkan ikon baterai ke tooltip ini, tetapi tangan Anda belum mencapainya.
Pengalaman operasi
"Setiap bersin" direkam dalam file log di sisi server. Analisis file-file ini selama 5 bulan terakhir memungkinkan kita untuk memahami sedikit lebih detail bagaimana perasaan sistem ini.
Analisisnya sangat sederhana - cukup letakkan di folder file log di server.
Berapa banyak kesalahan dalam pengiriman data di saluran radio? Lebih dari 5 bulan, 8 kesalahan dicatat ketika pesan diterima dalam ukuran yang salah dan 25 kesalahan dalam CRC yang salah. Dalam kedua kasus, Anda tidak dapat langsung mengatakan sensor mana yang bermasalah, karena paket data dalam kasus ini benar-benar rusak. Karena pengontrol jaringan tidak mengkonfirmasi penerimaan data dalam semua kasus ini, sensor harus mengirim data dengan cara baru, yang dalam kebanyakan kasus memperbaiki kesalahan ini.
Dan di sini adalah tabel ringkasan tentang pengoperasian sensor selama 5 bulan.
Lantai | Sensor | Jumlah Peristiwa | Dari yang tersesat Peristiwa | Tegangan Baterai | Median Kekuasaan Sinyal |
1 | 10 | 105 | 0 | 3.1 | -66 |
1 | 11 | 52 | 0 | 3.3 | -70 |
1 | 12 | 122 | 0 | 3.3 | -61 |
1 | 13 | 89 | 0 | 3.3 | -74 |
1 | 14 | 2573 | 0 | 3.3 | -68 |
1 | 15 | 261 | 0 | 3.3 | -60 |
1 | 16 | 543 | 2 | 3.3 | -70 |
1 | 17 | 156 | 2 | 3.3 | -74 |
1 | 18 | 177 | 2 | 3.2 | -68 |
1 | 19 | 384 | 3 | 3.3 | -56 |
2 | 3 | 368 | 2 | 3.3 | -62 |
2 | 4 | 86 | 0 | 3.3 | -71 |
2 | 5 | 521 | 2 | 3.3 | -59 |
2 | 6 | 115 | 0 | 3.3 | -62 |
2 | 7 | 316 | 2 | 3.3 | -63 |
2 | 8 | 419 | 1 | 3.3 | -60 |
2 | 9 | 89 | 0 | 3.3 | -68 |
Sensor No. 10 membeku sekali. Ini tampaknya menyebabkan penurunan signifikan dalam tegangan baterai. Alasan pembekuan itu belum jelas. Menggantung lagi, Anda harus mencari tahu.
Sensor No. 14 dipasang di pintu depan, itulah sebabnya ia memiliki sejumlah besar tanggapan. Tetapi sejumlah besar perjalanan belum mempengaruhi tegangan baterai.
Peristiwa yang hilang adalah ketika sensor mencoba mengirim keadaan, tetapi server tidak mengonfirmasinya. Semua kejadian yang hilang disebabkan oleh fakta bahwa saya mematikan server selama sekitar setengah hari untuk pembersihan.
Kolom Median Kekuatan Sinyal Median menunjukkan nilai RSSI median (dalam dBm), di mana setiap nilai individu diperoleh setelah setiap paket diterima. Sensor dengan sinyal terbaik (No. 19, -56 dBm) terletak pada jarak 2 meter dalam visibilitas langsung dari pengontrol jaringan, tetapi antena dalam sensor ini dilipat dengan bingkai di dalam kasing. Pengontrol jaringan itu sendiri terletak di lantai dasar. Namun, sinyal dari sensor lantai dua sangat bagus. Hal ini disebabkan oleh fakta bahwa pada semua sensor lantai dua antena dilepaskan dari rumah sensor.
Alih-alih kata penutup
Di satu sisi, saya senang bahwa saya sendiri, sebagai hobi, ternyata dari awal untuk merancang, merakit dan menjalankan sistem tingkat ini. Dan bahkan lebih senang bahwa itu bekerja lebih baik daripada sistem "berpemilik" yang didasarkan pada teknologi hype zWave. Ada juga ruang untuk mengembangkan dan meningkatkan sistem ini. Saya hanya digerogoti oleh keraguan kecil. Yaitu, bahwa seseorang tanpa pendidikan listrik khusus mengumpulkan sesuatu di lututnya yang bekerja lebih andal daripada produk bermerek yang dikenal di kalangan sempit merek IOT. Mungkin, kemajuan berubah di suatu tempat ke arah yang salah.