В давние времена, мониторинг температуры в серверной был делом не дешевым, а главное не тривиальным.
Мне приходилось иметь дело с устройством 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.
Все файлы можно скачать тут.





