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.

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

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

чтобы можно было считывать данные с датчика DHT11

для работы с микросхемой 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, который уже в свою очередь был включен в сеть. И красивая поролоновая коробочка скрыла все провода)

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


Не работает скрипт php с телеграмм ботом , в чём дело?