Доброго дня коллеги , решил осветить момент с дешёвым сбором данных температуры в Zabbix .
Необходимые компоненты:
1. Основа системы — Arduino UNO R3(можно и нано)
2. Модуль локальной сети (ethernet-shield W5100)
3. И, собственно, цифровой датчик температуры на базе DS18B20
Собрать все не составит труда , ниже указал схему сборки:
После сборки аппаратной части переходим к программной части.
Устройство будет работать в сети как заббикс-агент, протокол обмена с заббикс-сервером описан в документации.
Запустим Arduino IDE(если его у вас нет скачать и установить можно с оф.сайта)
Для работы компонентов необходима библиотека microDS18B20.h
1. На верхней панели Скетч -> Подключить библиотеку -> Управление Библиотеками
2. в Верхнее поле пишем "microDS18B20.h"
3. Нажимаем установить .
Ниже указал код
#include <microDS18B20.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // random MAC
byte ip[] = { 192, 168, 1, 5 }; //ip
byte subnet[] = { 255, 255, 255, 0 };
String readString = String(64);
MicroDS18B20 <A4> ds;
EthernetServer server(10050);
// Zabbix port
// Zabbix protocol description:
// https://www.zabbix.com/documentation/1.8/protocols
// https://www.zabbix.com/documentation/1.8/protocols/agent
void setup() {
delay(500); // start the Ethernet connection: Ethernet.begin(mac, ip, subnet); server.begin();
}
void loop() {
byte l;
float celsius;
readString = "";
l = 0;
if (EthernetClient client = server.available())
{
while (client.connected()) {
if (client.available()) {
if (l < 63) {
char c = client.read();
readString.concat(c);
l = readString.length();
}
if ((l > 5) & (l == (byte)readString[5] + 13))
// end of query from zabbix server
{ String request = readString.substring(13);
if (request.endsWith("\n")) {
request.remove(request.length() - 1);
}
if (request.equals("agent.ping")) {
client.print("ZBXD\x01");
// reply header
byte replyBytes [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '1'};
//4 bytes - length, 4 - reserved, 1 - data
client.write(replyBytes, 9);
}
else
if (request.equals("env.temp")) {
ds.requestTemp();
delay(1000);
ds.readTemp();
celsius = ds.getTemp();
client.print("ZBXD\x01");
// reply header
byte replyBytes [] = {(byte) String(celsius).length(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//4 bytes - length, 4 - reserved
client.write(replyBytes, 8);
client.print(celsius);
}
else { client.print("ZBXD\x01");
// reply header
byte replyBytes [] = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
//4 bytes - length, 4 - reserved
client.write(replyBytes, 8);
client.print("ZBX_NOTSUPPORTED");
}
break;
}
}
}
delay(10);
client.stop();
}
}
Укажем нашу Ардуино
После проверим наш код на ошибки, нажмем на галочку сверху слева
если есть ошибки, Ide их покажет , перепроверьте код в ide с кодом в статье.
если ошибок нет нажимаем на кнопку (Загрузить на плату)
После заливки кода в контроллер и подключения ethernet-кабеля проверяем из консоли:
$ zabbix_get -s 192.168.1.5 -k agent.ping
1
$ zabbix_get -s 192.168.29.5 -k env.temp
23.12
$ zabbix_get -s 192.168.29.5 -k blp-btyh
ZBX_NOTSUPPORTED
В Админке заббикса создаём новый хост с выбранным IP,
в нём — два ключа(Элемента данных),
Numeric (unsigned) agent.ping и
Numeric (float) env.temp,
наслаждаемся работой.
Графики, триггеры — всё как обычно.
Питание устройства — через родной USB.
Корпус — по желанию: подходящая пластиковая коробочка, термоусадка, синяя изолента.