Agkz.ru - игровой новостной портал
Бюджетный термометр для серверной

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

  • Цена: $2~3
  • Добрый день! Очередной термометр своими руками, но теперь для «серверных» помещений, просто, дёшево и эффективно.

    Появилась необходимость следить за работой кондиционера в «серверной», так как однажды он нас подвёл, выключился и продолжительное время серверы работали в помещении при температуре 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 °С)."

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

    На этом всё, спасибо за внимание!

    ЗЫ. На звание лучший кодер не претендую, все скрипты писались на ходу.