Temperature monitoring in the server room and overheating notifications in Telegram

Если в вашей серверной установлено чувствительное к перепадам температуры оборудование, а охлаждающие помещение кондиционеры иногда “шалят” и сами выключаются, то нелишним было бы знать чуть заранее о превышении порога нормальных температур до того момента, как оборудование начнет задыхаться и сбоить. Это подарит вам небольшой интервал времени, необходимый для того, чтобы физически добраться до места и “все починить”.

Также хочу отметить, что данная статья рассчитана на тех, что любит делать свои системы из “грязи и палок” и гордо отказывается купить автомат для автоматического управления системой кондиционирования.

Что понадобится

1. Микросхема ESP8266 Witty Cloud

Занятная маленькая и дешевая (2-3 доллара) микросхема, которая умеет цепляться к сети Wi-Fi и передавать данные. Расписывать все плюсы и минусы ну буду – нам достаточно того, что она сможет считать сигнал со своего цифрового входа и передать его GET запросом по Wi-Fi туда, куда нам надо.

В собранном состоянии. Две части собраны в бутерброд.

Для прошивки микросхемы используется дополнительная плата, которая нужна лишь, для того, чтобы залить на микросхему скетч. После этого данный бутерброд разъединяется и отправляется работать.

В разобранном состоянии.
Правая часть понадобится уже при следующей прошивке платы.

Кстати, на таких микросхемах народ вовсю мастерит “умные дома”, сигнализации и прочую автоматику. А мы будем делать некий аналог, но под узкий круг задач. Для того, чтобы микросхема заработала так, как нам надо – мы ее чуть позже прошьем, а теперь посмотрим на вторую часть нашей схемы.

2. Модуль датчика температуры и влажности DHT-11

Данный датчик хоть и несколько “тормознутый”, но для наших целей вполне пойдет. Опять же имеет несомненный плюс – дешевизнe. Его цена колеблется от 80 центов, до одного доллара. Но в то же время добрые китайцы могут отдать и бесплатно в нагрузку к чему-то еще, так как у них этого добра хватает.

Медленный не особо точный, но дешевый цифровой датчик
температуры и влажности DHT-11

Модуль датчика уже распаян на плате вместе с подтягивающим резистором, что в итоге позволило сократить количество “ног” с четырех до трех и подключать данный модуль напрямую к ESP8266.

3). Соединительные провода

Нужно три провода “мама-мама” из такой пачки. Или придумайте что-то свое. Но припаивать датчик к плате намертво не рекомендую, так как для прошивки микросхему придется снова собирать в “бутерброд”. Да и если захочется прицепить к плате еще один датчик или сделать что-то другое – опять морока с пайкой. Мне, например, паять лень.

4. Блок питания 5В с разъемом micro-USB

Сила тока в данном случае не особо важна – подойдет самый слабый блок питания, даже менее, чем 1 Ампер.

5. Хостинг с поддержкой языка PHP (можно и MySQL) и свой телеграм бот.

Хостинг нужен, чтобы принимать данные от ESP8266, так как после того, как микросхема будет включена и файл прошивки считается – далее она в бесконечном цикле будет присылать данные о температуре и влажности, которые она будет считывать с датчика. Что такое хостинг читайте здесь. Поддержка MySQL на хостинге не обязательна в нашем случае, но если она будет, то все данные можно будет записывать еще и в базу данных.

Телеграм бот понадобится для отправки уведомлений о перегреве. Т.е. если температура в серверной поднимется выше какого-то установленного нами значения – будем высылать уведомления в телеграм, что удобно и оперативно. Как создать своего телеграм бота и получить API ключ – смотрите здесь. Думаю описано достаточно внятно.

Подготовка среды Arduino для работы с ESP8266 и DHT11

Прошивку для платы мы будем писать в среде Arduino, для чего ее надо для начала скачать. Ссылка на официальный сайт. Действия из данного раздела надо проделать всего 1 раз, поэтому просто крепитесь и продолжайте.

Качаем либо инсталлер либо портативную версию в виде зип архива и после установки или распаковки запускаем среду разработки Arduino.

У меня портативная версия, поэтому я просто запускаю arduino.exe

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

После того, как запустите менеджер библиотек,
придется немного подождать, пока он обновит данные

В поле поиска пишете “DHT11” и в списке доступных библиотек ищете “DHT sensor library”. Учитывая, что у меня библиотека уже установлена, то я могу ее только обновить, вы же выбираете “Установка”.

Установите библиотеку DHT sensor library для того,
чтобы можно было считывать данные с датчика DHT11
Установите библиотеку IoTtweet
для работы с микросхемой ESP8266

В поле поиска пишете “ESP8266” или “IoTtweet” и в списке доступных библиотек ищете “IoTtweet” и выбираете “Установка”.

После того, как обе библиотеки установлены, нужно проделать еще одно действие – нужно научить среду Ардуино “понимать” данный вид плат на ESP8266.

Переходим в настройки среды Ардуино

И в поле “Дополнительные ссылки для Менеджера плат” указываем путь:

http://arduino.esp8266.com/stable/package_esp8266com_index.json
После указания данного параметра нажимаем кнопку ОК.

Далее нужно зайти в пункт меню “Инструменты” – “Плата” – “Менеджер плат“:

И ищем и устанавливаем поддержку плат “ESP8266“:

У меня плата уже установлена, а вот у вас появится кнопочка “Установить”

И вот только теперь можно начинать писать прошивку для платы. Чтобы убедиться, что мы все сделали верно, идем в пункт меню и переключаемся на нужную плату “Инструменты” – “Плата” – “Generic ESP8266 Module“:

Все готово к прошивке, давайте начнем.

Скетч Arduino для отправки данных датчика температур

После того, как вы настроили среду Ардуино на работу с нужной нам платой, можно начинать прошивку. Для этого подключаем плату шнуром micro-USB к нижней части “бутерброда” и подключаем к компьютеру.

Для прошивки используйте нижний разъем.

Если плата подключена правильно, то в меню “Инструменты” – “Порт” какой-то из портов будет активен. В моем случае это COM5 – у вас скорее всего будет что-то другое.

Копируем программу в окно среды разработки Arduino, исправляем параметры на свои, а именно:

  • const char* ssid = “НАЗВАНИЕВАШЕЙ_WI-FIСЕТИ“;
  • const char* password = “ПАРОЛЬВАШЕЙ_WI-FIСЕТИ“;
  • String host_temp = “ИМЯИЛИ_IPВАШЕГО_ДОМЕНА“;

И только после этого заливаем программу в плату.

// подключение библиотек
#include <ESP8266WiFi.h>
#include "DHT.h"

// параметры сети Wi-Fi ==================
const char* ssid      = "НАЗВАНИЕ_ВАШЕЙ_WI-FI_СЕТИ";
const char* password  = "ПАРОЛЬ_ВАШЕЙ_WI-FI_СЕТИ";

// номер пина, к которому подключен сигнальный провод датчика температуры DHT11
int temp_pin = 5;
DHT dht(temp_pin, DHT11);

// адрес домена или айпи адрес, куда будут отправляться данные о температуре - например example.com или 123.124.240.11
String host_temp = "ИМЯ_ИЛИ_IP_ВАШЕГО_ДОМЕНА";

// алрес скрипта PHP на сервере, который будет принимать данные, в данном случае скрипт map.php лежит в корневом каталоге сайта
String get_request_temp = "/map.php?temp=";

// номер пина встроенного светодиода, ним микросхема будет моргать в определенных условиях, которые мы пропишем 
int pin = 2;  






// данный метод запускается один раз при включении микросхемы
void setup() {

  // инициализируем порт мигалки светодиодом
  pinMode(pin, OUTPUT);
  // --------------------------  

  // иницируем датчик температуры и влажности
  dht.begin();
  // ========================================
      
  // пытаемся подключиться к сети Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  // ========================================

   // в цикле будем пытаться подключиться к Wi-Fi, пока не подключимся
   while (WiFi.status() != WL_CONNECTED) {
  
                    // -------------------
                    // будем моргать светодиодом - "один длинный - два коротких"
                    // т.е. если микросхема после заливки прошивки и включения мигает таким образом, то она еще подключается к сети Wi-Fi
                    digitalWrite(pin, HIGH);  
                    delay(2000);
                    digitalWrite(pin, LOW);
                    delay(500);
                    digitalWrite(pin, HIGH);
                    delay(100);
                    digitalWrite(pin, LOW);
                    delay(100);
                    // --------------------- 
  
    }
    // ==============================
    
}








// главный цикл приложения, который запускается снова и снова по кругу
// именно здесь и описывается, что же будет происходить во время работы микросхемы
void loop() {

      digitalWrite(pin, LOW);

      // создаем экземплар класса WiFiClient, с которым будем дальше работать
      WiFiClient client;
      
      // делаем задержку 2 секунды, чтобы медленный датчик DHT11 успел "растормозиться"
      delay(2000);
                
      //Считываем влажность с датчика (раз уж ее можно считать, то считаем ))
      float h = dht.readHumidity();
                
      // Считываем температуру
      float t = dht.readTemperature();
                
      // Проверка удачно прошло ли считывание
      if (isnan(h) || isnan(t)) {

                  // если считывание с датчика прошло неуспешно, то передаем строку "data_error" и возвращаемся к началу циклв
                  if(client.connect(host_temp, 80)) {

                        // формируем строку для передачи ее нашему серверу
                        // в данном случае строка получится такаая: http://host_temp/map.php?temp=data_error
                        client.println( "GET " + get_request_temp + "data_error" + " HTTP/1.1\r\nHost: " + host_temp + "\r\n\r\n");

                        // -------------------
                        // двойная моргалка  "короткий - длинный - короткий" - понимаем, что данные с датчика не получены
                        //digitalWrite(pin, LOW);
                        delay(100);
                        digitalWrite(pin, HIGH);
                        delay(500);
                        digitalWrite(pin, LOW);
                        delay(100);
                        // --------------------- 
                  }
                  
                  // возвращаемся к началу цикла 
                  return;
                  
      } else {

                  // если считывание с датчика успешно, то передаем температуру и влажность нашему скрипту на сервере
                  if(client.connect(host_temp, 80)) {

                        // формируем строку для передачи ее нашему серверу
                        // в данном случае строка получится такаая: http://host_temp/map.php?temp=hum26.00temp27.80
                        // где цифры после hum и temp - это реальные значения влажности и температуры соответственно
                        client.println( "GET " + get_request_temp + "hum" + String(h) + "temp" + String(t) + " HTTP/1.1\r\nHost: " + host_temp + "\r\n\r\n");

                        // -------------------
                        // двойная моргалка  "длинный - короткий - короткий" - понимаем, что данные с датчика получены и успешно переданы
                        //digitalWrite(pin, LOW);
                        delay(500);
                        digitalWrite(pin, HIGH);
                        delay(100);
                        digitalWrite(pin, LOW);
                        delay(100);
                        // --------------------- 
                  }
                  
                }
                
            // =============================================
            // программа заканчивается и мы снова переходим к началу цикла
            // и так до бесконечности, пока включена плата
            // =============================================
            
}

Используем для этого кнопку “Загрузка”. Если в коде нет ошибок, то после компиляции прошивка зальется на вашу плату ESP8266.

Любуемся процессом загрузки….

При появлении такого сообщения понимаем, что процесс прошивки завершен и плата перезагрузилась и вошла в рабочий режим.

Т.е. плата уже работает, шлет запросы через нашу Wi-Fi сеть на сервер – осталось только подключить датчик. Без подключения датчика все приходящие данные ожидаемо будут такими:

05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error
05.06.2020 19:55 = data_error

Подключение датчика к плате

Самая простая часть проекта – ткнуть три провода в датчик и плату. Мне лень было отрывать четвертый провод в шине, поэтому на фото он будет присутствовать неподключенным. Итак присоединяемся к датчику.

  • Зеленый – земля
  • Желтый – питание 5 В
  • Красный – выход цифрового сигнала

Далее провода затыкаем в плату.

Все в сборе, подключено, работает и шлет данные.

05.06.2020 20:13 -> hum61.00temp24.60
05.06.2020 20:13 -> hum61.00temp24.60
05.06.2020 20:13 -> hum61.00temp24.70
05.06.2020 20:13 -> hum61.00temp24.60

А где смотреть эти данные?

Ранее в этой статье оговаривалось, что данные от датчика передаются скрипту PHP на нашем сервере (настройки которого указаны в прошивке платы). Пришло время создать это скрипт и написать в нем несколько строк кода.

В корне вашего домена на хостинге создаете файл “map.php” и пишете в него следующее:

<?php


// получаем текущую время и дату
// данный метод мы вызовем позже, когда он понадобится
function get_current_date_and_time() {
	
	// определение времени без привязки к текущему времени сервера хостера
	$tz = 'Europe/Kiev';
	$timestamp = time();
	$dt = new DateTime("now", new DateTimeZone($tz));
	$dt->setTimestamp($timestamp);
	$ret_str = $dt->format('d.m.Y H:i');	
	
	return $ret_str;
	
}
// =============================
	
	
// если от датчика приходят данные, то будем писать их в текстовый файл в корне сайта
if(isset($_GET['temp'])) {
		
	// текущая дата и время
	$current_date_and_time = get_current_date_and_time();

	
	// в этот файл мы будем писать данные
	$file = 'temp_log.txt';
	
	// считываем текущие данные из файла
	$current = file_get_contents($file);
	
	// к данным, которые уже в файле были, добавляем новые данные
	$current .= $current_date_and_time.' -> '.$_GET['temp']."\n";

	// закидываем их в файл
	file_put_contents($file, $current);

}
// =============================

?>

Данный файл сохраняем на хостинге, включаем нашу самодельную метеостанцию и ждем несколько секунд. Если мы все сделали правильно, то на хостинге рядом с файлом “map.php” создастся текстовый файл “temp_log.txt” в который при каждой отправке данных платы будет записываться температура и влажность, которые приняты от датчика.

По большей части это уже прикольно, так как какая никакая, но автоматика ) Но мы пойдем дальше. Давайте, при превышении температуры более чем 36 градусов присылать уведомление в телеграм. Для этого трансформируем код срипт “map.php“. Для начала нужно выделить цифровое значение температуры из строки, а потом сравнить текущее значение с пороговым, и если есть превышение – отправить сообщение в телеграм при помощи API ключа бота и нашего личного chat_id.

<?php


// получаем текущую время и дату
// данный метод мы вызовем позже, когда он понадобится
function get_current_date_and_time() {
	
	// определение времени без привязки к текущему времени сервера хостера
	$tz = 'Europe/Kiev';
	$timestamp = time();
	$dt = new DateTime("now", new DateTimeZone($tz));
	$dt->setTimestamp($timestamp);
	$ret_str = $dt->format('d.m.Y H:i');	
	
	return $ret_str;
}
// =============================
	
	
// если от датчика приходят данные, то будем писать их в текстовый файл в корне сайта
if(isset($_GET['temp'])) {
		
	// текущая дата и время
	$current_date_and_time = get_current_date_and_time();

	
	// в этот файл мы будем писать данные
	$file = 'temp_log.txt';
	
	// считываем текущие данные из файла
	$current = file_get_contents($file);
	
	// к данным, которые уже в файле были, добавляем новые данные
	$current .= $current_date_and_time.' -> '.$_GET['temp']."\n";

	// закидываем их в файл
	file_put_contents($file, $current);
	
	// получим числовые значения датчиков
	$data = explode("temp", trim($_GET['t']));
	
	// влажность 
	$hum 	= str_replace("hum","",$data[0]);
	
	// температура
	$temp 	= $data[1]; 
	
	// теперь можем проверить температуру и если она высокая, то прислать сообщение в телеграм
	if($temp > 36) {
				
		// пишем в телеграм
		$text = 'Критичная температура в серверной! - '.$temp.' C';
		$bot_token = '[API_TOKEN_ВАШЕГО_БОТА]';
		$chat_id = '[ВАШ_ЧАТ_АЙДИ]';
		$mess_url = "https://api.telegram.org/bot".$bot_token."/sendMessage?chat_id=".$chat_id."&text=".$text."";
		$res = file_get_contents($mess_url);

	}
}
// =============================

?>

Теперь выключаем кондиционер в серверной и через 3 минуты получаем в свой телеграм уведомления.

На скрине нормальная температура, потому что, как вы понимаете, никто не стал выключать кондиционер в серверной )))

И бежим спасать серверную) На этой оптимистической ноте думаю, можно завершить статью. К слову сказать, схема, представленная здесь, проработала без выключений три месяца и все это время исправно слала температуру.

Для обеспечения бесперебойности был включен Power Bank, который уже в свою очередь был включен в сеть. И красивая поролоновая коробочка скрыла все провода)

Если еще немножко напрячься, то можно получить еще и график изменения температуры в серверной, если данные, которые были собраны, прогнать через любой построитель графиков.

Related Posts

Telegram bot – web hook installation and simple steps

Telegram bot – web hook installation and simple steps

Telegram bot – creation and configuration

Telegram bot – creation and configuration

1 comment

Leave a Reply

Your email address will not be published. Required fields are marked *