Когда мы в очередной раз узнали об отказе кондиционера в серверной по гневным сообщениям от встроенного мониторинга серверов, было принято волевое решение научить Zabbix мониторить температуру в серверной. Чтобы при повторении подобной ситуации принять меры до того, как серверная превратится в баню.



Реализация довольно проста: термодатчик опрашивается контроллером через шину 1wire, сам контроллер подключается к любому доступному серверу по USB и опрашивается командой head -n1 /dev/cuaU, которая прописывется в конфиге zabbix агента следующим образом:

UserParameter=usbtemp,head -n1 /dev/cuaU0

Выбор датчика с цифровым интерфейсом обусловлен тем, что это хороший задел на будущее чтобы добавить на шину еще десяток датчиков, если потребуется мониторить температуру каждой стойки отдельно, напрмер. Сам контроллер подключен по USB и чтобы не изобретать свои драйвера прикидывается обычным CDC serial emulator, то есть обычным виртуальным COM портом, и можно конечно же было использовать и HID class, так как он идеологически лучше подходит со всеми своими структурированными HID-report’ами для опроса всяческих датчиков. Но решил все же пока обойтись CDC для наглядности и простоты реализации.

Итак, все что потребуется для реализации это: непосредственно термодатчик DS18B20, микроконтроллер имеющий аппаратный USB модуль на борту, пара резисторов, конденсаторов и USB шнурок. В качестве микроконтроллера реализующего мост 1wire-USB, использован МК PIC16F1454, вообще же читатель может использовать любой другой МК на собственный вкус (подключив пару библиотек — 1wire, USB-CDC), либо подключить внешний UART-USB мост типа CP2102. Не очень люблю подобные костыли поэтому предпочел решение на одной микросхеме — взял самый дешевый контроллер с USB, на момент создания устройства это был PIC16F1454.



В проекте не использовалось готовых USB стеков от Microchip или сторонних, вместо них использован самописный стек, разработанный ранее для другого проекта. Однако вдаваться в особенности реализации своей библиотеки USB я в данной статье не буду. Так как работа с шиной USB выходит за рамки этой статьи и заслуживает отдельной, либо даже цикла статей. За который я возможно возьмусь в скором будущем, если, конечно читателю эта тема будет интересна.
Схема очень простая, поэтому плата была сразу разведена в sprint layout, тем не менее привожу чертеж схемы.



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

Правильно собранное устройство начинает работать сразу после подачи питания и наладки не требует. Устройство драйверов не требует так как используется стандартный класс CDC, под Windows 10 и FreeBSD определяется сразу, под Windows 7 потребуется указать inf файл (см. архив к статье), явно указывающий на драйвер usbser.sys. Под другими ОС устройство не тестировалось. При подключении должно определиться как /dev/cuaUx, под FreeBSD, где x — логический номер устройства. Выполнив команду #head -n1 /dev/cuaU0 вы можете проверить, что датчик корректно опрашивается и отображается текущая температура.



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



Если все работает правильно можно продолжить. Далее создаем новый параметр (item) где в качестве key прописываем наш UserParameter, указанный в конфиге агента.



Ну и после этого остается только создать новый график из этого параметра. И добавить триггер например на 28-30 градусов.

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

Комментарии (49)


  1. NickyScout
    04.02.2019 15:37
    +1

    Мы, в свое время, решили такую задачу чисто софтовым методом — измеряли температуру внутри корпуса нескольких серверов, усредняли, и ставили триггер на превышение. По моему, стандартные счетчики температуры у системы выводились в Windows, дальше все было элементарно.
    Позднее решение дополнили бэкапным независимым датчиком с GSM модемом (обычная самая дешевая «сигналка» для дачи с датчиком температуры). На случай, если в момент отказа кондея что-то случится с сетью/системой мониторинга, или просто будет ночь.


  1. NAI
    04.02.2019 15:44

    А не проще(дешевле) использовать что-нибудь типа SNR-ERD 3s (или аналоги)? Можно данные забирать\отправлять сразу по SNMP, 3-5 датчиков температуры. DI\DO в наличии.


    1. easyJet Автор
      07.02.2019 07:15

      Возможно проще, но вот что дешевле сильно сомневаюсь — контроллер 0.5-1$, обвязка стоит копейки, usb порт можно выкинуть и впать кабель в плату, сама плата, даже если заказывать, выйдет не дороже 2-3$.


  1. sintech
    04.02.2019 15:54

    У меня была идея разместить спереди и сзади стойки по 5-6 датчиков DS18B20, благо шина это позволяет. И стоить на основе данных тепловые карты распределения температуры воздуха. Т.к. как правило одной цифры для всей серверной может быть не достаточно.
    Но реализовать так и не довелось.


    1. apple01
      04.02.2019 16:09

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


  1. Satyricon
    04.02.2019 16:12

    Ой как сложно. Несколько диодов и резистор в com порт. Опрашивать библиотекой digitemp. Несколько лет такая фигня уже работает.


    1. sim2q
      04.02.2019 19:36
      +1



      Соглашусь! Делал на днях наспех по этой схеме, что бы быстренько предъявить УК график температуры батареи. Данные снимаю через digitemp, картинки collectd+rrd. COM порт на материнке.


      1. Alyoshka1976
        04.02.2019 22:52
        +1

        Добавлю, что можно использовать USB-UART преобразователь, например, на CP210x — в этом случае дополнительно нужен только резистор 4.7… 10 кОм

        image

        Прекрасно работает через digitemp — баловался с мониторингом температуры и фотоконтролем за котами через Telegram-бота


        1. sim2q
          04.02.2019 23:49

          Сильно упрощает. Пока навесом паял все эти диоды и стабилитроны (в наличии только 3V3 — пришлось комбинировать), наделал ошибок. Но USB-UART просто не было под рукой


          1. Alyoshka1976
            05.02.2019 00:07

            Для DS18S20 к тому же можно попытаться паразитное питание использовать — на двух проводах датчик прицепить. Но IMHO не слишком надежный вариант, поэтому я не даже и не пробовал.


        1. sim31r
          05.02.2019 11:59

          И GND тут нормально подключен, что повышает помехоустойчивость и живучесть при статических разрядах…


    1. apple01
      05.02.2019 00:33

      Интересно, можно ли пробросить порт в виртуальную машину vmware и опрашивать из нее?


      1. Satyricon
        05.02.2019 00:39

        Можно


        1. avlag
          05.02.2019 07:55

          А потом машина переедет на соседний хост и будет тщетно искать свой USB-датчик.
          Не стоит привязывать датчик температуры к серверу. SNMP сильно лучше будет.


          1. Satyricon
            05.02.2019 08:19

            Как это отменяет мой ответ на вопрос и причём тут usb?)


            1. avlag
              05.02.2019 08:38

              Ответ — да, не отменяет. Но решение о пробросе физических портов сервера внутрь, до виртуалки, не имеет права на жизнь в продуктивной среде. Я ак считаю ;)
              USB? Так в этой ветке комментов идет уже обсуждение датчиков на COM-портах и USB :)


              1. Satyricon
                05.02.2019 08:42

                Иногда лучше иметь мониторинг из говна и палок, чем не иметь никакого.


                1. avlag
                  05.02.2019 08:56

                  Кто бы спорил. Просто если есть серверная, то цена вопроса готового SNMP датчика, по сравнению с ценой вопроса решения из говна и палок, будет не сильно отличаться.


          1. easyJet Автор
            07.02.2019 06:59

            На момент разработки небыло нужных контроллеров, но я уже думал о реализации через SNMP, на базе — PIC32+ethernet PHY, например.


      1. easyJet Автор
        07.02.2019 06:51

        Да, вполне. Проверял на virtualbox, в этом случае энумерация USB устройства проходит в два этапа — хостовой осью и соответственно гостевой.


    1. easyJet Автор
      07.02.2019 07:21

      Можно и так, кстати у нас так сделан опрос уличного датчика, для выдачи титра с температурой. Просто когда возникла потребность в устройстве, я как раз заканчивал разбирать USB спецификации, это надо было для другого проекта, ну и подумал почему бы не сделать сразу на USB без ардуин, cp210x и прочих мам, пап, кредитов.


  1. pnetmon
    04.02.2019 17:11

    Сервер где стоит устройство должен работать. Zabbix должен работать. Канал связи тоже может внезапно упасть (например если используется провод у оператора связи может не быть резервного питания оборудования в этом здании).
    А ведь могло быть независимое от электропитания и работоспособности сервера устройство как пишут в первом сообщении.


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


  1. Keremet_2030
    04.02.2019 18:18

    Как раз в данный момент занимаюсь проектом для мониторинга\управления бензиновым генератором. Необходимо измерять уровень топлива, наличие напряжения на входе\выходе, температуру, управлять нагрузкой. Остановился на Arduino mega + Ethernet shield, библиотекой Agentuino, логированием на SD карту, и всё это с Web мордой. Если интересно, постараюсь запилить статью на эту тему.


    1. Satyricon
      04.02.2019 18:41

      Ethershield умеет неплохо так зависать


      1. semen-pro
        04.02.2019 19:50

        так у него же ресет отдельно выведен


    1. Vanellope
      04.02.2019 19:11

      Пилите статью, интересно сравнить с промышленными решениями по цене и эффективности.
      В создании двух подобных систем принимала участие, от 50 до 250 тысяч только за железо выходило.


    1. easyJet Автор
      07.02.2019 07:08

      Да, писал выше в ответе на другой комментарий, что есть в планах перевод на SNMP этого дела, но на PIC32+Realtek 100mb или любой другой PHY, ардуины как-то не очень. Кстати, если ether shield на ENC28J60, то подтверждаю — зависают через рандомный промежуток времени, возможно это только в первых ревизиях, но мне хватило с ними проблем чтобы не иметь никакого желания больше использовать их в принципе, да и самих ревизий было 6 или 7, что говорит само за себя. И еще потребление под 200мА.


    1. star76
      07.02.2019 07:08

      Я отказался в своих проектах на ардуино от Ethernet shield, дорого, когда устройств много, и ненадежно работает. Использую modbus на скорости 9600. Если команды на исполнительные и устройства и датчики идут с частотой от единиц минут, то все норм тянет. На шине у меня уже 10 slave устройств. Чем модбас хорош, серверную часть можно поменять на любой ПЛК по мере развития. Например мегу я со временем заменил на малину, скрипты переписал на питоне.
      Диагностику slave устройств также легко проводить. Подключил к ПК через переходник USB-RS485 и вперед.


  1. denis-19
    04.02.2019 18:39

    Вот немного похоже реализовывал, работает до сих пор прекрасно.
    habr.com/ru/post/417327


  1. FSA
    04.02.2019 18:46

    У меня одно время за окном висел китайский термометр, который был подключен к ближайшему окну через USB удлинитель. Сам термометр — просто USB брелок с проводом и датчиком. Опрос производился небольшой программкой. Первый сервер работал на FreeBSD, потом был сервер на Linux. Везде работало. При поставленной задаче всё упрощается, потому что просто втыкаем брелок в любой сервер и вытягиваем провод с датчиком в удобное для измерения месте.
    Подключение к Zabbix? Ну если из командной строки можно получить данные на экране, то высылать эти данные в Zabbix, думаю, не составит труда. У меня эти данные через HTTP улетали на сервер в интернете по задаче в cron.


  1. xztau
    04.02.2019 19:34

    Если не секрет, какой бюджет был? Или это за свои делалось?


    1. FSA
      04.02.2019 22:35

      Судя по всему дороже, чем USB свисток готовый. По крайней мере три контроллера на алиэкспресе стоят как один свисток.


  1. wmgeek
    04.02.2019 21:55

    И что мы будем делать, когда температура все же начала расти? У нас же должны быть два кондиционера как минимум и блок ротации. Мониторить желательно не просто температуру в серверной, а дельту на входе и выходе кондиционера. Если с кондеем что то не так — по дельте мы узнаем о неисправности самого кондиционера раньше. И самое главное — у нас должна быть возможность включить резервный, заведомо исправный кондей. А для этого рабочий и резервный нужно переключать время от времени, например, каждые 24 часа. И мониторить, мониторить, мониторить каждый кондей, а не только температуру.


    1. avlag
      05.02.2019 07:57

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


    1. Satyricon
      05.02.2019 08:31

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


      1. Dioxin
        05.02.2019 09:53

        А на деле мы имеем один бытовой кондиционер, который зависает от скачков напряжения.
        Стабилизатор? Копеечная штука.
        Крупнейшая нефтяная компания, между прочим
        Ух совок блин.


        1. Satyricon
          05.02.2019 11:33

          За свой счёт, пожалуйста.


      1. dklm
        05.02.2019 11:12

        я бы рекомендовал вам рассмотреть вариант установки рекуператора в пару к кондеционеру.


      1. khanid
        06.02.2019 10:48

        полная остановка всех серверов от перегрева

        Помимо факта остановки следует помнить, что это и на продолжительности жизни железа может сказаться.


    1. Dioxin
      05.02.2019 08:48

      Пожалуй самое грамотное решение при условии что есть второй кондей.
      А то иногда и первого нету.


    1. khanid
      06.02.2019 10:48

      Ну выводить во внешний контроль блок управления кондиционерами я бы не рискнул по причине безопасности. А вот наличие автономного переключателя — и не роскошь. При привышении температуры просто в работу вводится вторая система охлаждения (у меня переключением занимается kg316t с некоторым обвесом).


  1. dklm
    05.02.2019 11:15

    Я честно говоря не понимаю зачем изобретать велосипед, в серверах присутствует все необходимое(самосбор это не сервер) можно мониторить температуру встроенными системами мониторинга…


    1. fessmage
      05.02.2019 11:35

      Да, если в большинстве установленных серверов есть BMC, то как правило с него можно снимать показания всех датчиков сервера через SNMP, где есть не только температура воздуха но и температура выхлопа сервера.
      А общие показания температуры воздуха самой серверной полезны в том случае если таких серверов не подавляющее большинство, да плюс с вручную управляемыми кондеями.


  1. fessmage
    05.02.2019 11:28

    Я делал мониторинг температуры в серверной с использованием плат NMC2 AP9631, вставляемых в качестве платы расширения в ИБП фирмы APC. В каждой стойке был как минимум один ИБП, показания которого в любом случае также хотелось мониторить, на предмет режима работы, температуры батарей, входного и выходного напряжения, оставшегося заряда. Эта плата позволяет подключить и управлять ИБП через сеть, собирать показания через SNMP. А также с ней в комплекте идет выносной температурный датчик с магнитным креплением, на проводе около 2 метров. Разместив эти датчики в удобных местах на каждой стойке, примерно в 1,7 метра над полом, получил картинку температуры воздуха возле каждой стойки, причем по сути как дополнительный бонус. Очень удобно.


  1. fessmage
    05.02.2019 11:29

    del


  1. alexhott
    05.02.2019 11:29

    Тоже сначала рукоблудничал с Ардуино типо такого habr.com/ru/post/394909, но мне тогда обхаяли это решение.
    Да и на самом деле после того как одно такое изделие сдохло сделали получение данных с термодатчика блэйда через SNMP


  1. iddqda
    05.02.2019 11:39

    к вашему контроллеру наверно можно приделать другие полезные датчики,
    влажность можно измерять, протечку или даже проникновение
    а для температуры немного оверкил как по мне. Но прикольно да

    А у меня в серверной почти в каждой стойке top-of-rack switch есть с датчиками температуры
    которые вполне нативно мониторятся тем же заббиксом


  1. PR200SD
    05.02.2019 11:52

    После того как повысилась температура, желательно начинать действовать сразу, включать кондиционер или вентиляцию или что у Вас еще припасено, независимо есть канал связи или нет, графики это для общей картины на объекте или последующего анализа. Один из вариантов решения подобных задач описывал в статье, там и графики и архивы habr.com/ru/post/424791, с нужным количеством каналов можно реализовать всю необходимую автоматику. Сейчас на той же плате добавил работу с датчиками ds18b20, можно подключить на шину до 16 шт, пока тестирую на 8 разведенных по дому витой парой, общая длина метров 40, значения можно архивировать, выводить на WEB страницу, читать через Modbus TCP, а если использовать с программируемым реле то можно реализовать управляющие алгоритмы. В автономной работе без программируемого устройства можно еще добавить датчик влажности, еще все значения можно отправлять по mqtt, есть несколько роликов с примерами youtube.com/channel/UCj4HeZMvSH5H3d_t6iDlQOQ


  1. sim31r
    05.02.2019 11:53

    либо подключить внешний UART-USB мост типа CP2102. Не очень люблю подобные костыли

    Ну понятно в этом своя схемотехническая красота, минимализм.
    Но мост это специализированное аппаратное решение, заточенное на работу с USB, а в микроконтроллере может быть минимальная обвязка самая. Есть ли там защита от статики? На схеме для согласования с USB портом всего 2 резистора на 33 Ома. В промышленных решениях и гальваническую развязку добавляют, и сложные цепи согласования, это не костыль, а необходимость, вот пример, и схема.