В давние времена, мониторинг температуры в серверной был делом не дешевым, а главное не тривиальным.
Мне приходилось иметь дело с устройством NetPing, которое по сети, по протоколу SNMP, позволяло считывать данные о температуре и в зависимости от ее значение выполнять заданные действия. Устройство периодически зависало само, потому нужно было мониторить и его, по необходимости дергая питание вручную. Но иного выхода не было – даже эта простая железка в те времена стоила не малых денег, которых в бюджетном учреждении не было.
Сейчас ситуация изменилась и стало доступное огромное количество устройств с различными датчиками, шинами, “не скучными корпусами” по вполне доступной цене.
Но я расскажу, каким образом была решена задача по мониторингу температуры мною.
Были приобретены Arduino Nano, датчик температуры и влажности DHT22 и резистор на 4-6 кОм. Общая стоимость деталей составила 280 рублей.
Сборка заключается в подключении датчика к ардуино по такой схеме:
В реальности получилось так. Вид сверху
Вид снизу с подложенной термоусадкой для изоляции
Ее один кусочек разрезанной по вдоль термоусадки натягиваем на ногу датчика
А теперь все это помещаем в термоусадочку побольше
Прошиваем ардуино. Скетч:
#include "DHT.h" int dhtPin = 2; // PIN датчика температуры и влажности DHT dht; String inputString = ""; // Строка формирующаяся из данных с последовательного порта boolean stringComplete = false; // Триггер готовности строки для парсинга //Инициализация void setup() { Serial.begin(9600); inputString.reserve(100); dht.setup(dhtPin); } //Обработчки прерываний последовательного порта void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); if (inChar == '\n') { stringComplete = true; } else { inputString += inChar; } } } //Парсинг сообщени с последовательного порта void serialInputParsing(String inputString) { if (inputString == "humidity") { Serial.println(dht.getHumidity()); } if (inputString == "temperature") { Serial.println(dht.getTemperature()); } } //Основной цикл void loop() { if (stringComplete) { serialInputParsing(inputString); inputString = ""; stringComplete = false; } delay(10); }
Теперь перейдем к Zabbix-у. Импортируем шаблон. Добавим пользовательские элементы данных для zabbix агента:
echo "UserParameter=servmeteo.temperature[*],/scripts/servmeteo.sh temperature" >> /etc/zabbix/zabbix_agentd.d/servmeteo.conf echo "UserParameter=servmeteo.humidity[*],/scripts/servmeteo.sh humidity" >> /etc/zabbix/zabbix_agentd.d/servmeteo.conf
Увеличим таймаут чтения данных на сервере(/etc/zabbix/zabbix_server.conf) и клиенте(/etc/zabbix/zabbix_agentd.conf):
Timeout=20
Создадим скрипт чтения данных с Ардуино. /scripts/servmeteo.sh
#!/bin/sh usbPort="/dev/ttyUSB4" stty -F $usbPort 9600 raw 9600 -echo -cstopb sleep 2 && test -e $usbPort && echo "$1" | dd of=$usbPort 1>/dev/null 2>/dev/null & head -n 1 $usbPort
Добавляем права на исполнение:
chmod +x /scripts/servmeteo.sh
Добавляем права для работы с последовательным портом zabbix-agent-у:
adduser zabbix dialout
Добавляем в zabbix-е шаблон к хосту, к которому подключен датчик и рестартуем zabbix-agent.
Все файлы можно скачать тут.