Бюджетный термометр для серверной

Добрый день! Очередной термометр своими руками, но теперь для «серверных» помещений, просто, дёшево и эффективно.
Появилась необходимость следить за работой кондиционера в «серверной», так как однажды он нас подвёл, выключился и продолжительное время серверы работали в помещении при температуре 35-40 градусов. Было принято решение такой ситуации более не допускать и каким-то образом следить за температурой в помещении.

Поиск на «али» и «ибее» удивил ценой на подобные устройства, от 10$ за штуку. Так же было совершенно неясно какое программное обеспечение было у этих устройств и как его сопрягать с существующими системами.

В интернетах по запросу «ds18b20 к компьютеру» была найдена полезная информация, подключение возможно с использованием USB-UART адаптера. «То, что надо, дайте два!»

Итак, приступим. Краткое техническое задание:
1) Измерять температуру.
2) Дёшево.
3) Надёжно.
4) Это должно работать как под Windows, так и под *nix.

Что нам нужно:
1) Адаптер USB-UART.
2) Датчик DS18B20.
3) Резистор 4,7 кОм.

В зависимости от варианта исполнения так же понадобится:
4) Корпус.
5) Термоусадка.
6) Коннектор DuPont.

Аппаратная часть.

Идём на али/ибей, заказываем несколько разных самых дешевых адаптеров USB-UART и датчики температуры DS18B20 на проводе. Ждём месяц и бегом на почту за посылками.
Приехали адаптеры на чипах PL2303, CH340 и CP2102. После подключения датчика к адаптеру выяснилось, что для работы годятся только те адаптеры которые собраны на чипе CP2102.
Хочу отметить что флюс на адаптере не смыт, USB порт держится на только на линиях питания и данных, и корпус порта к плате не припаян. Порт пришлось укрепить дополнительно пропаяв все площадки.

Схема для сборки:

Подключение датчика к адаптеру не составит особого труда, а адаптера к компьютеру – тем более.
В результате имеем два варианта исполнения устройства, в корпусе и без.
Вариант в корпусе, получился интереснее, но и дороже потому что штучно корпусы найти не удалось, пришлось брать 10 штук. Как и предполагалось, корпус пришлось «доработать напильником», а точнее выкусить бокорезами выступающие пазы крепления в середине корпуса с внутренней стороны. После этого плата переходника поместилась в корпус с небольшим усилием.

Фото сборки с корпусом





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

Фото сборки без корпуса


Программная часть.

Предположу, что в любой серверной «живёт» хотя бы одна из перечисленных ниже операционных систем, именно для них и опишу программные решения. Для получения температуры будем использовать программное обеспечение DigiTemp написанное для ОС Linux и успешно портированное под Windows. Программа позволяет считывать параметры с устройств по шине 1-Wire.
Идея проста, после того как данные получены с устройства, проверяем температуру на соответствие заданному промежутку и если температура «ушла» за пределы оповещаем каким – либо доступным способом.

Windows.
Для ОС Windows необходимо подключить «термометр» к порту, установить драйверы на адаптер и скачать архив dtreg17.zip. Распаковываем архив, запускаем файл run_me.cmd.

Содержимое файла
  @echo off   for /f %%a in ('digitemp.exe -a -q') do set "temperature=%%a"  @rem Если температура больше 25°  if %temperature% GTR 25 (   	echo Temperature is %temperature%!  	@rem Оповещаем всеми доступными способами.  	@rem pause  	)    @rem Если температура меньше 18°  if %temperature% LSS 18 (  	echo Temperature is %temperature%!  	@rem Оповещаем всеми доступными способами.  	@rem pause  	)  

Linux.
Обновляем пакеты, ставим DigiTemp, создаём файл конфигурации, опрашиваем, оповещаем.

Обновление, установка, настройка
# apt-get update  # apt-get upgrade  # apt-get install digitemp  # ls -l /dev/ttyUSB*  crw-rw---- 1 root dialout 188, 0 Aug  1 08:13 /dev/ttyUSB0    # digitemp_DS9097 -w -s /dev/ttyUSB0  DigiTemp v3.7.1 Copyright 1996-2015 by Brian C. Lane  GNU General Public License v2.0 - http://www.digitemp.com  Turning off all DS2409 Couplers  .  Devices on the Main LAN  28FF5C5D71160584 : DS18B20 Temperature Sensor    # digitemp_DS9097 -i -s /dev/ttyUSB0  # cp .digitemprc /etc/digitemp.conf    # digitemp_DS9097 -t 0 -q -o "%.1C" -c /etc/digitemp.conf  29.1

FreeBSD.
Обновляем пакеты, ставим DigiTemp, создаём файл конфигурации, дополнительно настраиваем права доступа, опрашиваем, оповещаем.

Обновление, установка, настройка
# pkg update    # pkg search digitemp  digitemp-3.6.0                 Dallas Semiconductor 1-wire device reading console application    # pkg install digitemp    # ls -l /dev/cua*  crw-rw----  1 uucp  dialer  0x70  1 авг 09:50 /dev/cuaU0  crw-rw----  1 uucp  dialer  0x71  1 авг 09:56 /dev/cuaU0.init  crw-rw----  1 uucp  dialer  0x72  1 авг 09:56 /dev/cuaU0.lock    # digitemp_DS9097 -w -s /dev/cuaU0  DigiTemp v3.6.0 Copyright 1996-2007 by Brian C. Lane  GNU Public License v2.0 - http://www.digitemp.com  Turning off all DS2409 Couplers  .  Devices on the Main LAN  28FFA69161160323 : DS18B20 Temperature Sensor    # digitemp_DS9097 -i -s /dev/cuaU0  # cp .digitemprc /usr/local/etc/digitemp.conf  # digitemp_DS9097 -t 0 -q -o "%.1C" -c /usr/local/etc/digitemp.conf  20.4    Внимание!  Если скрипт будет запускаться не от пользователя root, то необходимо добавить этого пользователя в группу "dialer" для получения доступа к /dev/cua*.  Например, скрипт выполняется от пользователя www:  # pw usermod www -G dialer  

Как это работает у нас?!
Сервер на ОС FreeBSD по крону каждые 10 минут опрашивает датчик запуская php-скрипт temperature.php и если температура отклонилась от заданного в скрипте диапазона, то отправляется письмо на указанные в скрипте адреса.

temperature.php
#!/usr/local/bin/php

<?php    $text='Температура воздуха в серверной:  ';  $addtext=' °C.  Актуальная температура доступна по ссылке  http://server-ip/temp.php';    $temp = exec('/usr/local/bin/digitemp_DS9097 -t 0 -q -o "%.1C" -c /usr/local/etc/digitemp.conf');  if ($temp > 25 || $temp < 16) {      mail("user1@ server.local ", "GISMETEO. server.local", "$text$temp$addtext");      mail("user2@ server.local ", "GISMETEO. server.local", "$text$temp$addtext");      }  ?>

Так же есть скрипт temp.php который лежит в корне веб-сервера для «онлайн мониторинга», обновляется так же, раз в 10 минут.

temp.php
php header('refresh: 600'); ?>  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">  <?php  $temp = exec('/usr/local/bin/digitemp_DS9097 -t 0 -q -o "%.1C" -c /usr/local/etc/digitemp.conf');  $today = date("Y-m-d H:i:s");  echo "<html><head><style>body {background-color: #A9A9A9;</style></head><body><h2>Температура воздуха в серверной:  ";  if ($temp < 16) echo "<font color="blue">$temp °C</font>";  else if ($temp > 25) echo "<font color="red">$temp °C</font>";  else echo "<font color="green">$temp °C</font>";  echo "</h2><h4>$today</h4></body></html>";  echo "Российские СН 512-78 (п.3) предъявляют следующие требования к микроклимату: температура воздуха в помещениях 20 °C ± 2 °С (не более 25 °С)."

Работает эта система уже около года, за всё время ложных срабатываний не наблюдалось.
На этом всё, спасибо за внимание!
ЗЫ. На звание лучший кодер не претендую, все скрипты писались на ходу.

Планирую купить 0 Добавить в избранное +1 +1

(c) 2017 Источник материала

Пролистать наверх