Energi, panas, dan air bagian tiga: buka radio

Entri


Dalam proses memilih solusi untuk rumah pintar, saya mencoba untuk mem-bypass solusi kotak yang memerlukan komunikasi dengan cloud eksternal atau memiliki aplikasi sendiri, terutama solusi tanpa kemampuan untuk terhubung langsung ke perangkat. Semua metrik yang tersedia dikurangi menjadi satu antarmuka - zabbix, di mana sistem peringatan pemangku kepentingan diatur. Kenop kontrol diterapkan di antarmuka web yang berada di lokasi lokal.

Artikel sebelumnya:


bagian satu (suhu 1wire, ups, meter air ...)
bagian dua (netping, gidrolock, sensor tekanan ...)

Tugas yang diselesaikan dalam artikel ini


  • Perlindungan kebocoran air yang fleksibel dan dapat diukur dengan peringatan zabbix
  • Perangkat lain di 433mhz: bel, pintu terbuka, dll.
  • Kami mendorong 1wire di MQTT

Sistem perlindungan kebocoran


Persyaratan Sistem:


  • banyak sensor yang tersebar di sekitar rumah (dalam kasus saya - 6 buah di lokasi yang berbeda)
  • tidak ada kabel di sensor
  • shutdown cepat setelah deteksi kebocoran
  • semua informasi status saat ini di zabbix. Ada peringatan

Komposisi Sistem


  • Raspberry PI
  • RTL2832U USB tuner
  • Sensor Kebocoran 433mhz
  • Netping + gidrolock crane (lihat artikel sebelumnya) untuk mematikan bagasi

Tentang besi


Dalam artikel sebelumnya, saya menjelaskan solusi mematikan pasokan air menggunakan netping. Saya punya satu sensor kabel untuk solusi ini. Ini nyaman jika semua titik di mana kebocoran dapat terjadi berada di sekitar tempat yang sama. Dalam kasus saya, netping dipasang langsung di pintu masuk jalan raya dan mengontrol derek gidrolock elektro-mekanis di tempat yang sama (lihat artikel sebelumnya). Hamburan netping + gidrolock + sensor kabel di semua titik itu mahal dan rumit. Selain itu, saya tidak lagi memiliki kesempatan untuk menarik kabel baru di sekitar rumah. Mengisi soket dan menghirup derek listrik adalah solusi biasa-biasa saja. Solusi yang diharapkan - kami menggunakan tumpang tindih jalan raya umum berdasarkan sinyal dari sensor radio yang tersebar di seluruh lokasi.
Dari apa yang ditemukan di Internet - sekelompok sensor radio yang berbeda dari sistem yang siap pakai. Beberapa dapat dibeli secara terpisah, saya tidak membeli controller untuk sensor, agar tidak menghasilkan elemen tambahan di sirkuit.

Bagaimana saya bisa menangkap 433 MHz? Ternyata - TV tuner pada chipset tertentu. Dan sekarang dia layak satu sen (saya mengambil Avito untuk 300r) seperti ini:

gambar

Saya memesan antena terpisah untuk itu pada 12dbi, karena yang sekarang tidak mencakup seluruh rumah.

Karena saya mencoba untuk meminimalkan komponen kontrol sirkuit, ada keinginan untuk mengencangkan tuner ke router rumah saya dengan Openwrt, yang sampai sekarang adalah inti dari solusi rumah pintar untuk 1wire, modbus, sensor wifi / protokol, tetapi, sayangnya, saya menghabiskan beberapa sumber dayanya ( ruang pada built-in flash drive untuk perangkat lunak yang diperlukan berakhir, prosesor memuat sesuatu - sudah akan ada masalah dengan jaringan, dan kami masih memiliki 4k untuk terlihat online :), + sudah terlalu banyak hal yang tergantung pada USB, yang mempengaruhi stabilitas pengumpulan data). Diputuskan untuk secara bertahap mentransfer fungsionalitas rumah pintar ke perangkat eksternal - rarpberry pi (salah satu versi pertama ada di tangan).

Tentang perangkat lunak


Setelah bermain dengan TV tuner sdr-tajam pada komputer desktop dengan windows (setelah mencoba menangkap radio orang lain dan negosiasi pesawat), saya mulai melihat apakah sensor sendiri melihat "peluit". Ya, ia melihat dengan sempurna:

gambar

Pengaturan raspberry


Saya memilih raspbian asli. Saya menulis gambar terakhir pada USB flash drive di bawah mac / linux:

sudo dd if=2019-07-10-raspbian-buster-lite.img of=/dev/disk2 bs=1048576 conv=sync 

Boot, konfigurasikan jaringan dan ssh.

Berikutnya - pakai paket raspberry rtl-sdr, rtl_433:

 sudo apt-get install cmake build-essential python-pip libusb-1.0-0-dev libusb-1.0 python-numpy git git clone https://github.com/merbanan/rtl_433.git cd rtl_433/ mkdir build cd build cmake .. make make install 

rtl_433 memiliki protokol bawaan yang mendekripsi data dari berbagai perangkat yang beroperasi dalam kisaran 433mhz.

Kami mulai rtl_433


 rtl_433 -f 433.9e6 

Kami menurunkan sensor ke dalam air dan mendapatkan yang berharga:

 time : 2019-09-17 15:04:39 model : Smoke detector GS 558 id : 16919 unit : 1 learn : 0 Raw Code : c842e1 

Detektor asap? Ok, mari kita nyanyikan lagu "Smoke on the water" pada peringatan dari sensor-sensor ini ... :)
Tapi serius - kami memiliki id masing-masing sensor, yang menurutnya di masa depan kita akan memahami di mana tepatnya kita memiliki kebocoran (dan kita akan mematikan dalam hal apapun).

Tentang sensor kebocoran


gambargambargambar

Setelah mengatur bagian perangkat lunak, saya perhatikan bahwa sensor dengan aliexpress (foto kiri) mengirim sinyal tunggal ketika air masuk ke kontak. Ditambah satu sinyal jika air berhenti menutup kontak. Ini sama sekali tidak cocok untuk saya (perilaku yang diharapkan: terus-menerus mengirim sinyal alarm ketika sensor merasakan air, karena satu sinyal mungkin hilang). Perilaku serupa diamati jika Anda menutup kontak dengan kawat. Tapi yang aneh - alarm terjadi setiap 2-3 detik, jika Anda menutup kontak dengan tangan (kulit). Di sini saya masih memiliki dua asumsi: baik orang Cina mengacaukan pengukuran resistansi, atau sensor memiliki beberapa mode operasi lain di mana mereka berperilaku entah bagaimana berbeda (misalnya, dipasangkan dengan pengontrol), atau ada frekuensi lain (sampai saya menemukan )

Ngomong-ngomong, tulis di komentar, mungkin seseorang bekerja dengan sensor ini, dapatkah mereka "diajari" untuk mengirim sinyal tentang kebocoran terus-menerus?

Saya mengesampingkan sensor ini, di gudang ada lagi dari rubetek (foto kanan) dan membeli di Leroy: GAL SHW-1005 (foto tengah).

Perilaku sensor rubetek tampak benar-benar tidak dapat diprediksi (reaksi tak terduga "melihat air / tidak melihat").

Tetapi sensor dari Leroy bergerak menunjukkan apa yang saya butuhkan: ada air - saya mengirim spam ke udara, tidak ada air - saya diam. Satu-satunya minus adalah jari-jari aksi lebih kecil dari sensor lainnya. Tetapi masalahnya diselesaikan dengan membeli antena yang lebih sensitif untuk penerima.

MQTT


Bagaimana cara mengirim output rtl_433 ke zabbix? Beri makan agen? Kirim ke zabbix_sender, menganalisis prosesnya? Mungkin melalui syslog?

Di sini Anda perlu mengingat bahwa zabbix saya ada di suatu tempat di awan. Dan tentu saja tidak perlu menghalangi air dengan bantuan pemicunya. Lantai rumah akan banjir sampai dia membuat keputusan (jika tersedia).

Berita baiknya adalah rtl_433 dapat mengirim informasi tentang MQTT. Di luar kotak. Pada saat yang sama, data dikirim ke broker dalam format json.

Jadi, Anda perlu:

  • Tempatkan broker mosquitto lokal (lakukan di raspberry).
  • Gabungkan info ke broker dengan topik yang diinginkan, sehingga nantinya bisa diuraikan.
  • Sambungkan ke broker secara lokal di raspberry dan kirim perintah ke netping
  • Terhubung ke broker dari tempat redirection ke zabbix akan berlangsung (server zabbix dalam kasus saya juga merupakan klien MQTT)

Instalasi-pengaturan mosquitto MQTT:


 apt-get install mosquitto mosquitto-clients systemctl enable mosquitto systemctl start mosquitto 

Kami mengirim informasi ke broker yang menunjukkan id perangkat:


 rtl_433 -f 433.88e6 -F mqtt://127.0.0.1,events=/433/[id] 

Di klien mqtt kita akan mendapatkan sesuatu seperti berikut:

 mosquitto_sub -h 127.0.0.1 -t '#' (   ) /433/16919 {"time":"2019-09-18 11:55:29","model":"Smoke detector GS 558","id":16919,"unit":1,"learn":0,"code":"c842e1"} 

Script untuk terhubung ke broker dan mengirim perintah ke netping


Saya membuat sketsa klien skrip MQTT sederhana yang memungkinkan Anda menjalankan skrip yang terkait dengan topik saat topik yang ditentukan dalam konfigurasi muncul. Dengan demikian, ketika sensor tertentu dipicu dan informasi tentang itu muncul di Udara (misalnya, / 433/16919), Anda dapat melakukan beberapa tindakan (dalam hal netping, kirim ikal permintaan untuk menutup crane, lihat artikel sebelumnya). Tautan ke skrip ada di akhir artikel.

Pengalihan di zabbix


Saya menggunakan solusi mqtt-zabbix yang sudah jadi. Pada levelnya, kami memahami item yang akan dikirim nilainya (berdasarkan id).

Di keys.cfg, tentukan:

 /433/16919,mqtt.ventilation.waterleak::hostname 

di mana nama host adalah nama host dengan jenis gelandangan item di Zabbix.

Penting !!! Nama host dalam pengaturan harus sesuai dengan nama yang akan dikirim dalam skrip, jenis item (elemen data) harus sesuai untuk data yang dikirim (misalnya, untuk json - teks), jika tidak, Anda akan menemukan kesalahan bentuk:

 2019-09-18 14:29:48,749 Got response from Zabbix: {u'info': u'processed: 0; failed: 1; total: 1; seconds spent: 0.000055', u'response': u'success'} 

Selain itu, sulit untuk mencapai lebih banyak debug (dan mengapa gagal) dari zabbix.

Kami mengkonfigurasi /etc/mqtt-zabbix/mqtt-zabbix.cfg (tentukan broker ip mqtt dan alamat server zabbix).

Apa lagi yang terhubung ke 433?


Ya semuanya! :)

Sensor Stasiun Cuaca


Sementara mengutak-atik sensor kebocoran nirkabel, saya tidak sengaja menangkap sinyal dari sensor eksternal dari stasiun cuaca. Itu terlihat seperti ini:

 time : 2019-09-19 10:48:54 Protocol : 56 model : TFA pool temperature sensor Id : 182 Channel : 3 Temperature: 19.3 C Modulation: ASK Freq : 433.9 MHz RSSI : -0.1 dB SNR : 35.0 dB Noise : -35.2 dB time : 2019-09-20 10:57:29 Protocol : 12 brand : OS model : THN132N House Code: 4 Channel : 3 Battery : OK Celsius : 20.00 C Modulation: ASK Freq : 432.9 MHz RSSI : -0.2 dB SNR : 31.5 dB Noise : -31.7 dB 

Dengan demikian, bonusnya adalah kemampuan untuk memonitor suhu titik-titik di udara dengan tampilan di zabbix. Hanya di beberapa kamar saya tidak bisa meregangkan kabel.

Bel


Banyak panggilan radio bekerja dalam rentang frekuensi yang sama ~ 433mhz. Dengan demikian, kita dapat mencegat penekanan tombol panggil (bahkan tidak perlu memiliki panggilan itu sendiri, cukup tombolnya saja). Mengapa Misalnya, untuk mengkonfigurasi pemberitahuan tambahan melalui SMS / ke telegram / apa pun atau menampilkan gambar dari kamera pada monitor.

Saya membeli telepon: Evology QA-688-E RU.

Agar tombol rtl_433 melihat tombol panggilan, Anda perlu mengaktifkan protokol "test", misalnya dengan menjalankan dengan opsi "G" atau menentukan protokol tambahan tertentu, pada saat yang sama kami akan menambahkan output informasi tentang protokol dan frekuensi:

 rtl_433 -f 433.9e6 -G -M protocol -M level -F mqtt://127.0.0.1,events=/433/[id] & 

Dapatkan di MQTT:

 {"time":"2019-09-30 10:57:00","protocol":72,"model":"RF-tech","id":0,"battery":"LOW","temperature_C":0,"button":0,"mod":"ASK","freq":433.84822,"rssi":-3.5981,"snr":33.77488,"noise":-37.373} 

Di sini Anda dapat melihat id = 0. Pada saat yang sama, saya memiliki beberapa perangkat yang diidentifikasi sebagai RF-tech. Semuanya memiliki id sama dengan 0. Sebagai hasilnya, semua perangkat di zabbix ditampilkan sebagai satu item. Dimungkinkan untuk membedakan dengan tepat perangkat mana yang berfungsi, hanya berdasarkan frekuensi.

Kami menarik frekuensi menjadi item yang terpisah: mqtt.outside.doorbell.freq dengan JSON preprocessing di $ .freq (zabbix dapat melakukan ini dari versi ke-4).

Pada item ini, buat pemicu dengan ekspresi:

 {HOME_PI:mqtt.outside.doorbell.freq.last()}>433.8 and {HOME_PI:mqtt.outside.doorbell.freq.last()}<433.81 and {HOME_PI:mqtt.outside.doorbell.freq.nodata(30)}=0 

Yaitu jika tiba-tiba suatu nilai muncul di item umum mqtt.outside.doorbell.freq (nodata) dan frekuensi berada dalam kisaran yang ditentukan antara 433.8 dan 433.81, kita dapat menyimpulkan bahwa mereka memanggil kami (dan misalnya, untuk menggandakan panggilan ke SMS).

Sensor Pintu / Jendela


Saya memiliki sensor penetrasi dari rubetek. Mengirim yang berikut:

 {"time":"2019-09-30 14:11:28","protocol":86,"model":"Smoke detector GS 558","id":12262,"unit":16,"learn":0,"code":"e5fcd0","mod":"ASK","freq":433.85021,"rssi":-3.99241,"snr":33.38058,"noise":-37.373}  : {"time":"2019-09-30 14:11:28","protocol":68,"model":"Kerui Security","id":46074,"cmd":7,"state":"close","mod":"ASK","freq":433.85021,"rssi":-3.99241,"snr":33.38058,"noise":-37.373}  : {"time":"2019-09-30 14:11:21","protocol":68,"model":"Kerui Security","id":46074,"cmd":14,"state":"open","mod":"ASK","freq":433.85005,"rssi":-11.0148,"snr":25.1088,"noise":-36.1236} 

Segera setelah sensor radio terakhir ditambahkan ke zabbix, saya ingin mengulang semuanya di MQTT. Pembuatan katalog yang mudah, Anda dapat menentukan topik-ah dan penempatan serta jenis perangkat. Anda mendapatkan siaran umum semua acara.

1wire ke MQTT


Saya ingin semuanya berada di MQTT, setidaknya untuk jenis implementasi yang sama. Saya ingin mendapatkan "eter" peristiwa umum dan pendekatan umum sebagai reaksi terhadap peristiwa-peristiwa ini. Tentu saja, zabbix memecahkan masalah reaksi, dan saya meninggalkan peringatan di atasnya. Tapi saya ingin membuat manajemen lebih ramah, dekat dengan sistem dan "ether".

Solusi siap pakai untuk menyampaikan status sensor dari jaringan 1wire ke MQTT ada, tetapi tidak cocok untuk saya. Solusi siap pakai pada node baik membawa banyak dependensi di belakang mereka, atau memakan seluruh prosesor raspberry. Beberapa solusi dari 10 teratas dalam pencarian Google ditinggalkan oleh penulis, beberapa hanya didukung oleh sensor suhu. Ada juga kelas gateway yang mengumpulkan informasi melalui antarmuka gpio. Semua ini tidak cocok untukku.

Saya memiliki sistem file pseudo terpasang dengan perangkat 1wire di / mnt / 1wire, di situlah saya ingin mendapatkan semua informasi yang diperlukan. Untuk melakukan ini, cukup membuat satu baris sederhana di bash, mengirimkan data melalui mosquitto_pub untuk masing-masing sensor. Namun, muncul pertanyaan untuk meluncurkan skrip ini (di atas, untuk mendorong ke semacam daemon?), Presentasi data yang normal (mendapatkan json yang sama), menambahkan sensor baru, dll. Semakin jauh pemikiran berkembang, semakin banyak kruk lahir. Ternyata lebih mudah untuk menulis gateway untuk owf lain ke mqtt untuk tugas ini.

Ada file konfigurasi di mana kita perlu memasukkan id sensor dan file-file itu dari fuse.OWFS yang ingin kita publikasikan ke mqtt.

Output di mqtt adalah json berikut:

 /1wire/28.0425260a0000 {"type": "DS18B20", "temperature": "30"} /1wire/28.bf16270a0000 {"type": "DS18B20", "temperature": "7.9375"} /1wire/26.da2f71010000 {"temperature": "25.2812", "IAD": "1", "CA": "0", "VAD": "0.91", "VDD": "4.59", "type": "DS2438"} /1wire/28.48b3010b0000 {"type": "DS18B20", "temperature": "40.5625"} /1wire/1d.6a9306000000 {"type": "DS2423", "counter.B": "9", "counter.A": "9219"} /1wire/28.61cc260a0000 {"type": "DS18B20", "temperature": "12.5"} 

Tambahkan ke autorun, atur interval polling. Masalahnya terpecahkan.

Referensi


github.com/merbanan/rtl_433 - alat untuk mendekode protokol radio
github.com/kylegordon/mqtt-zabbix - MQTT di Zabbix
github.com/unlo/1wire2mqtt - 1wire di MQTT, klien MQTT yang memungkinkan Anda menjalankan skrip saat topik muncul

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


All Articles