Найти тему

Мониторинг Температыры Серверной с помощью ардуино и Zabbix

Доброго дня коллеги , решил осветить момент с дешёвым сбором данных температуры в Zabbix .

Необходимые компоненты:

1. Основа системы — Arduino UNO R3(можно и нано)

2. Модуль локальной сети (ethernet-shield W5100)

3. И, собственно, цифровой датчик температуры на базе DS18B20

Собрать все не составит труда , ниже указал схему сборки:

Соединяем две платы , устанавливая на UNO ,Ethernet Sheld
Соединяем две платы , устанавливая на UNO ,Ethernet Sheld

Подключаем датчик к Ethernet Shild(изначально у меня на датчике были цветные провода)
Подключаем датчик к Ethernet Shild(изначально у меня на датчике были цветные провода)

поставим резистор на 4.7кОм между красным и желтым проводом.
поставим резистор на 4.7кОм между красным и желтым проводом.

После сборки аппаратной части переходим к программной части.

Устройство будет работать в сети как заббикс-агент, протокол обмена с заббикс-сервером описан в документации.

Запустим Arduino IDE(если его у вас нет скачать и установить можно с оф.сайта)

Для работы компонентов необходима библиотека microDS18B20.h

-4

1. На верхней панели Скетч -> Подключить библиотеку -> Управление Библиотеками

-5

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();

}

}

Укажем нашу Ардуино

-6

После проверим наш код на ошибки, нажмем на галочку сверху слева

-7

если есть ошибки, Ide их покажет , перепроверьте код в ide с кодом в статье.

если ошибок нет нажимаем на кнопку (Загрузить на плату)

-8

После заливки кода в контроллер и подключения 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.

Корпус — по желанию: подходящая пластиковая коробочка, термоусадка, синяя изолента.