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 центов, до одного доллара. Но в то же время добрые китайцы могут отдать и бесплатно в нагрузку к чему-то еще, так как у них этого добра хватает.
Модуль датчика уже распаян на плате вместе с подтягивающим резистором, что в итоге позволило сократить количество “ног” с четырех до трех и подключать данный модуль напрямую к ESP8266.
3). Соединительные провода
Нужно три провода “мама-мама” из такой пачки. Или придумайте что-то свое. Но припаивать датчик к плате намертво не рекомендую, так как для прошивки микросхему придется снова собирать в “бутерброд”. Да и если захочется прицепить к плате еще один датчик или сделать что-то другое – опять морока с пайкой. Мне, например, паять лень.
4. Блок питания 5В с разъемом micro-USB
Сила тока в данном случае не особо важна – подойдет самый слабый блок питания, даже менее, чем 1 Ампер.
5. Хостинг с поддержкой языка PHP (можно и MySQL) и свой телеграм бот.
Хостинг нужен, чтобы принимать данные от ESP8266, так как после того, как микросхема будет включена и файл прошивки считается – далее она в бесконечном цикле будет присылать данные о температуре и влажности, которые она будет считывать с датчика. Что такое хостинг читайте здесь. Поддержка MySQL на хостинге не обязательна в нашем случае, но если она будет, то все данные можно будет записывать еще и в базу данных.
Телеграм бот понадобится для отправки уведомлений о перегреве. Т.е. если температура в серверной поднимется выше какого-то установленного нами значения – будем высылать уведомления в телеграм, что удобно и оперативно. Как создать своего телеграм бота и получить API ключ – смотрите здесь. Думаю описано достаточно внятно.
Подготовка среды Arduino для работы с ESP8266 и DHT11
Прошивку для платы мы будем писать в среде Arduino, для чего ее надо для начала скачать. Ссылка на официальный сайт. Действия из данного раздела надо проделать всего 1 раз, поэтому просто крепитесь и продолжайте.
Качаем либо инсталлер либо портативную версию в виде зип архива и после установки или распаковки запускаем среду разработки Arduino.
Сразу после старта необходимо подключить к среде программирования две библиотеки, которые будут необходимы для работы устройства.
В поле поиска пишете “DHT11” и в списке доступных библиотек ищете “DHT sensor library”. Учитывая, что у меня библиотека уже установлена, то я могу ее только обновить, вы же выбираете “Установка”.
В поле поиска пишете “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 с телеграмм ботом , в чём дело?