Термодатчик для Zabbix

от автора

в

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

Сборка устройства не составляет труда. Сетевой модуль надевается на основную плату «бутербродом», термодатчик припаивается к его пинам или через контактные штырьки. Подключение датчика: красный +5 В, чёрный — земля, жёлтый — данные; между +5V и Data припаиваем подтягивающий резистор 4,7 кОм.

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

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

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

Код

#include <microDS18B20.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // random MAC
byte ip[] = { 192, 168, 29, 5 };                      //ip
byte subnet[] = { 255, 255, 252, 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();
  }
}

После заливки кода в контроллер и подключения ethernet-кабеля проверяем из консоли:

$ zabbix_get -s 192.168.29.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 bla-blah
ZBX_NOTSUPPORTED

В админке заббикса создаём новый хост с выбранным IP, в нём — два ключа(Элемента данных), Numeric (unsigned) agent.ping и Numeric (float) env.temp, наслаждаемся работой. Графики, триггеры — всё как обычно.

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

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Аватар пользователя yuliaadmin

Об авторе


Поиск по сайту


Полезные ссылки

Ссылки, которые я считаю полезными и хочу поделиться.