Сен 072014
 

В давние времена, мониторинг температуры в серверной был делом не дешевым, а главное не тривиальным.

Мне приходилось иметь дело с устройством NetPing, которое по сети, по протоколу SNMP, позволяло считывать данные о температуре и в зависимости от ее значение выполнять заданные действия. Устройство периодически зависало само, потому нужно было мониторить и его, по необходимости дергая питание вручную. Но иного выхода не было – даже эта простая железка в те времена стоила не малых денег, которых в бюджетном учреждении не было.

Сейчас ситуация изменилась и стало доступное огромное количество устройств с различными датчиками, шинами, “не скучными корпусами” по вполне доступной цене.

Но я расскажу, каким образом была решена задача по мониторингу температуры мною.

Были приобретены Arduino Nano, датчик температуры и влажности DHT22 и резистор на 4-6 кОм. Общая стоимость деталей составила 280 рублей.

Сборка заключается в подключении датчика к ардуино по такой схеме:

schema

В реальности получилось так. Вид сверху

2014_09_06__21_52_54

Вид снизу с подложенной термоусадкой для изоляции

2014_09_06__21_59_32

Ее один кусочек разрезанной по вдоль термоусадки натягиваем на ногу датчика

2014_09_06__21_59_17

А теперь все это  помещаем в термоусадочку побольше

2014_09_06__20_58_33 2014_09_06__20_59_20

Прошиваем ардуино. Скетч:

#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.

Все файлы можно скачать тут.

 

 Опубликовано в 14:49