Pemantauan suhu anggaran: Arduino + Zabbix

Organisasi kami telah menggunakan server Zabbix untuk memantau kesehatan server dan workstation. Karena kekhasan proses teknis, peralatan "tersebar" di beberapa ruangan dan didistribusikan di seluruh perusahaan. Secara alami, bersama dengan parameter utama komputer (berfungsi / tidak berfungsi), saya ingin mengontrol iklim mikro di server. Pada saat yang sama, seperti biasa, kemungkinannya sangat terbatas, dan “merobohkan” dana yang signifikan untuk sistem pemantauan suhu yang kompleks (saya juga menyertakan papan kontrol dengan sensor suhu untuk rak-mount APC UPS) adalah tugas yang terpisah.

Semuanya sederhana di server utama: satu papan seperti itu dipasang (dibeli sejak lama oleh pendahulunya bersama dengan peralatan utama), sensor APC dipasang, agen dipasang di Zabbix, semuanya bekerja melalui SNMP. Membosankan :) Tidak ada pemantauan perangkat keras jarak jauh, artinya juga - lihat di atas. Oleh karena itu, diputuskan untuk menjadi pintar, menghemat anggaran dan pada saat yang sama memompa keterampilan baru dengan membangun solusi "sederhana" yang sederhana, murah, yang cocok dengan infrastruktur pemantauan Zabbix yang ada.

Komponen yang diperlukan:


Total biaya komponen adalah $ 10 dengan pengiriman.

Merakit perangkat tidak sulit. Modul jaringan diletakkan di papan utama dengan "sandwich", sensor suhu disolder ke pin-nya. Koneksi sensor: merah +5 V, hitam - tanah, kuning - data; Antara + 5V dan Data, solder resistor pull-up 4,7 kΩ.

Pin data dipilih dengan mempertimbangkan pin yang digunakan oleh modul jaringan (D10 - SS; D11 - MOSI; D12 - MISO; D13 - SCK; D2 - IRQ).

Rake: dalam prototipe perangkat saya mengalami konflik - data suhu dikeluarkan secara acak, "dua hingga tiga". Alasannya adalah karena saya menghubungkan sensor suhu ke pin 2, yang, seperti yang kemudian saya temukan di Internet, digunakan oleh modul jaringan untuk menghasilkan interupsi ketika sebuah paket tiba. Ulang pada tanggal 4 - itu bekerja seperti jam.

Setelah merakit perangkat keras, pergi ke perangkat lunak.

Perangkat akan bekerja di jaringan dan berpura-pura menjadi agen zabbix, untuk ini diperlukan MAC dan alamat IP. Kami memutuskan bagaimana lebih mudah - sulit untuk menjahit selama pemrograman, menghasilkan MAC dari alamat sensor suhu dan menerima IP melalui DHCP, dll. Saya mengambil jalan yang paling sederhana dan meng-hardcode kedua parameter.

Protokol komunikasi dengan server zabbix dijelaskan dalam dokumentasi . Perangkat kami akan merespons dua perintah - agent.ping dan env.temp (ada ruang untuk kreativitas lebih lanjut, Anda dapat mengikat salah satu modul ekspansi yang tersedia untuk arduino - setidaknya sensor kelembaban, setidaknya penerangan - apa pun yang diinginkan hati Anda). Ini akan bersumpah pada semua perintah lain dengan jawaban standar, dapat dimengerti oleh server zabbix.

Bagi mereka yang memulai dari awal (seperti saya) - pemrograman Arduino dilakukan dengan menggunakan Arduino IDE , instalasi dan konfigurasi yang dasar. Komponen memerlukan perpustakaan UIPEthernet dan OneWire, yang diinstal dan terhubung ke proyek melalui menu Sketsa - Sambungkan perpustakaan - Kelola perpustakaan ...
Jika Anda memiliki komponen lain (misalnya, modul jaringan tidak pada enc28j60, tetapi pada chip lain) - Anda akan memerlukan perpustakaan lain!

Kode untuk bekerja dengan modul jaringan dan dengan sensor suhu adalah khas, dari Internet, dengan beberapa asumsi dan penyederhanaan.

Setelah mengisi kode ke dalam pengontrol dan menghubungkan kabel ethernet, kami memeriksa dari konsol:

$ zabbix_get -s 192.168.4.5 -k agent.ping 1 $ zabbix_get -s 192.168.4.5 -k env.temp 23.12 $ zabbix_get -s 192.168.4.5 -k bla-blah ZBX_NOTSUPPORTED 

Rake: versi kompilasi dari zabbix_get untuk Windows yang diletakkan di zabbix.com sudah usang dan menggunakan protokol yang berbeda (dengan header ZBXD \ x01 dalam permintaan server). Versi Linux terbaru dan protokolnya sesuai dengan kode yang diberikan.

Semuanya berfungsi sebagaimana mestinya. Di panel admin zabbix, buat host baru dengan IP yang dipilih, dua kunci di dalamnya, Numeric (unsigned) agent.ping dan Numeric (float) env.temp, nikmati pekerjaannya. Bagan, pemicu - semuanya seperti biasa.

Perangkat ini diaktifkan melalui USB aslinya. Kasing - opsional: kotak plastik yang sesuai, susut panas, pita listrik biru.

Resolusi sensor sekitar 0,06 (lebih tepatnya, 1/16) ° C, akurasi - ketika terbenam di salju yang mencair, itu menunjukkan 0,19 ° C (mungkin itu akan turun lebih rendah, tetapi ada sedikit salju dan meleleh dengan cepat). Saya pikir untuk perangkat bernilai $ 10 dan tujuan yang dijelaskan - lebih dari cukup.

Sketsa
 #include <OneWire.h> #include <UIPEthernet.h> byte mac[] = { 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 }; // random MAC byte ip[] = { 192, 168, 4, 5 }; // IP address in local network String readString = String(20); byte addr[8]; OneWire ds(4); // DS18B20 at pin 4 EthernetServer server(10050); // Zabbix port void setup() { Ethernet.begin(mac, ip); server.begin(); ds.search(addr); } void loop() { byte data[2]; float celsius; readString = ""; if (EthernetClient client = server.available()) { while (client.connected()) { if (client.available()) { char c = client.read(); if (c == '\n') // end of query from zabbix server { client.print("ZBXD\x01"); // response header if (readString == "agent.ping") { byte responseBytes [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '1'}; client.write(responseBytes, 9); } else if (readString == "env.temp") { ds.reset(); ds.select(addr); ds.write(0x44); // start conversion with regular (non-parasite!) power delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); // read Scratchpad data[0] = ds.read(); data[1] = ds.read(); int16_t raw = (data[1] << 8) | data[0]; celsius = (float)raw / 16.0; byte responseBytes [] = {(byte) String(celsius).length(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; client.write(responseBytes, 8); client.print(celsius); } else { byte responseBytes [] = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; client.write(responseBytes, 8); client.print("ZBX_NOTSUPPORTED"); } break; } else if (readString.length() < 20) { readString = readString + c; } } } delay(10); client.stop(); } } 

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


All Articles