У нас в организации развёрнут сервер Zabbix для мониторинга работоспособности серверов и АРМов. Из-за особенностей техпроцесса оборудование «размазано» по нескольким помещениям и разнесено по территории предприятия. Естественно, вместе с основными параметрами компьютеров (работает/не работает) хочется контролировать и микроклимат в серверных. При этом, как обычно, возможности весьма ограничены, и «выбить» значительные средства на сложные системы мониторинга температуры (к ним я отношу и платы управления с термодатчиками для стоечных ИБП APC) — это отдельный квест.

В основной серверной всё просто — установлена одна такая плата (закуплена давным-давно предшественником вместе с основным оборудованием), воткнут APC-шный термодатчик, заведён агент в Заббиксе, всё работает по SNMP. Скучно :) На мониторинг удалённой аппаратной оборудования нет, средств тоже — см. выше. Поэтому было решено проявить смекалку, сэкономить бюджет и заодно прокачать новый навык путём конструирования простого и дешёвого «наколенного» решения, вписывающегося, тем не менее, в существующую инфраструктуру мониторинга Zabbix.

Необходимые компоненты:


Общая стоимость компонентов — $10 с доставкой.

Сборка устройства не составляет труда. Сетевой модуль надевается на основную плату «бутербродом», термодатчик припаивается к его пинам. Подключение датчика: красный +5 В, чёрный — земля, жёлтый — данные; между +5V и Data припаиваем подтягивающий резистор 4,7 кОм.

Пин для данных выбирается с учётом пинов, используемых сетевым модулем (D10 – SS; D11 – MOSI; D12 – MISO; D13 – SCK; D2 – IRQ).

Грабли: в прототипе устройства столкнулся с конфликтом — данные о температуре выдавались случайным образом, «через два на третий». Причиной оказалось то, что я прицепил термодатчик на пин 2, который, как потом нашёл на просторах интернета, используется сетевым модулем для генерации прерывания при поступлении пакета. Переставил на 4-й — заработало как часы.

После сборки аппаратной части переходим к программной.

Устройство будет работать в сети и притворяться заббикс-агентом, для этого ему нужен MAC и IP-адрес. Решаем, как удобнее — жёстко зашить при программировании, генерировать MAC из адреса температурного датчика и получать IP по DHCP, и т.д. Я пошёл по простейшему пути и захардкодил оба параметра.

Протокол обмена с заббикс-сервером описан в документации. Наше устройство будет откликаться на две команды — agent.ping и env.temp (здесь оставлен простор для дальнейшего творчества, можно привязать любой из модулей расширения, доступных для ардуино — хоть датчик влажности, хоть освещённости — да что душе угодно). На все остальные команды оно будет ругаться отвечать стандартным ответом, понятным заббикс-серверу.

Для тех, кто начинает с нуля (как я) — программирование Arduino выполняется с помощью Arduino IDE, установка и настройка которой элементарны. Для работы компонентов необходимы библиотеки UIPEthernet и OneWire, которые устанавливаются и подключаются к проекту через меню Скетч — Подключить библиотеку — Управлять библиотеками…
Если у вас будут другие компоненты (например, сетевой модуль не на enc28j60, а на другом чипе) — понадобятся и другие библиотеки!

Код работы с сетевым модулем и с датчиком температуры — типовой, из интернета, с некоторыми допущениями и упрощениями.

После заливки кода в контроллер и подключения ethernet-кабеля проверяем из консоли:

$ zabbix_get -s 192.168.4.5 -k agent.ping
1
$ zabbix_get -s 192.168.4.5 -k env.temp
23.12
$ zabbix_get -s 192.168.4.5 -k bla-blah
ZBX_NOTSUPPORTED

Грабли: выложенная на zabbix.com скомпилированная версия zabbix_get для Windows устарела и использует другой протокол (с заголовком ZBXD\x01 в запросе сервера). Линуксовая версия актуальна и протокол соответствует приведенному коду.

Всё работает, как и задумано. В админке заббикса создаём новый хост с выбранным IP, в нём — два ключа, Numeric (unsigned) agent.ping и Numeric (float) env.temp, наслаждаемся работой. Графики, триггеры — всё как обычно.

Питание устройства — через родной USB. Корпус — по желанию: подходящая пластиковая коробочка, термоусадка, синяя изолента.

Разрешение датчика — примерно 0.06 (точнее, 1/16) °С, точность — при погружении в таящий снег показал 0.19 °С (может, опустился бы и ниже, но снега было мало и он весь быстро растаял). Считаю, для устройства стоимостью 10 долларов и описанных целей — более чем достаточно.

Скетч
#include <OneWire.h>
#include <UIPEthernet.h>

byte mac[] = { 0xDE, 0x05, 0xB6, 0x27, 0x39, 0x19 }; // random MAC
byte ip[] = { 192, 168, 4, 5 }; // IP address in local network
String readString = String(20); 
byte addr[8];

OneWire ds(4); // DS18B20 at pin 4
EthernetServer server(10050); // Zabbix port

void setup() {
  Ethernet.begin(mac, ip);
  server.begin();
  ds.search(addr);
}

void loop() {
  byte data[2];
  float celsius;

  readString = "";
  if (EthernetClient client = server.available())
  {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if (c == '\n') // end of query from zabbix server 
        {
          client.print("ZBXD\x01"); // response header
          if (readString == "agent.ping") {
            byte responseBytes [] = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, '1'}; 
            client.write(responseBytes, 9);
          } else 
          if (readString == "env.temp") {
            ds.reset();
            ds.select(addr);
            ds.write(0x44);  // start conversion with regular (non-parasite!) power
            delay(1000);  
            ds.reset();
            ds.select(addr);
            ds.write(0xBE);  // read Scratchpad

            data[0] = ds.read();
            data[1] = ds.read();

            int16_t raw = (data[1] << 8) | data[0];
            celsius = (float)raw / 16.0;

            byte responseBytes [] = {(byte) String(celsius).length(), 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
            client.write(responseBytes, 8);
            client.print(celsius);
          }
          else {
            byte responseBytes [] = {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
            client.write(responseBytes, 8);
            client.print("ZBX_NOTSUPPORTED");
          }
          break;
        }
        else if (readString.length() < 20) {
          readString = readString + c;
        }
      }
    }
    delay(10);
    client.stop();
  }
}
Поделиться с друзьями
-->

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


  1. mickvav
    06.07.2017 11:24
    +1

    Ds18b20-х на одну шину можно посадить дофига, так что естественный upgrade — передавать адрес конкретного датчика аргументом.


  1. intermed
    06.07.2017 11:57
    +1

    Делал то же самое только с выгрузкой в google app engine и рисованием графиков в google charts
    Используется 4 датчика
    Работает на удивление стабильно.
    Вдруг кому пригодится, исходники тут https://github.com/vasiasan/AchinskBC


    1. Dr_Ups
      10.07.2017 16:15

      простите, никогда не работал с этим app engine, его там как нужно конфигурировать? этот engine в бесплатном пользовании или надо подписываться на триал у них? спасибо за внимание


  1. dmitryrf
    06.07.2017 12:16
    +1

    Добавлю несколько замечаний про DS18B20. Если не нужна точность в 1/16 (а она редко бывает нужна), то её можно снизить до 1/2, значительно сократив время измерения (почти в 10 раз, с 750 до 94 мс). Также нужно иметь в виду, что при частых измерениях датчик будет саморазогреваться.

    Ещё при внешнем питании можно опрашивать выход, чтобы определить момент завершения преобразования и еще немного сократить время измерения.


  1. aivs
    06.07.2017 12:25
    +1

    А где фотки?


  1. vanrisk
    06.07.2017 12:36

    Если сервера полноценные, то имхо лучше снимать показания с датчика окружающей среды, есть почти во всех серверах. А если есть IPMI, IMM или iLO то можно напрямую zabbix-ом снимать показания, без установки какого либо ПО на сам сервер.


    1. kisaa
      06.07.2017 12:38

      Как раз в этой аппаратной полноценных серверов нет, но вариант хороший.


  1. roofcat
    06.07.2017 12:36
    +2

    как возможный альтернативный вариант (если по условиям допустим wifi) — esp8266 с прошивкой wifi-iot, по цене сравнимо или чуть дешевле.


    1. Mogwaika
      10.07.2017 12:42

      Если не надо работать от батареек (а ESP так же плохо работает от батареек), проще orange pi zero за 9$. Там и ethernet и wifi и много других плюшек.


  1. trublast
    06.07.2017 12:41

    Немножко не в тему, но «экономить бюджет и мониторить температуру» можно используя вместо ИБП APC бюджетные бесперебойники вроде IPPON/Powercom. У них встроенный датчик температуры, в отличие от APC. Естественно, данные можно снимать только по USB/RS232, но если хочется по LAN — на помощь приходят девайсы типа TP-Link MR3020 с Openwrt на борту и установленным nut (в свое время покупались по 700р/шт)
    Конечно мониторится не температура в помещении, а температура ИБП, но пока не работает инвертор (бесперебойник в режиме bypass) — можно ее считать за температуру помещения.


    1. MaxSoft
      07.07.2017 01:31

      как-то не особо экономить, да и не применимо к online ИБП


  1. AcidVenom
    06.07.2017 15:18

    «Микроклимат» и «бюджетное решение» — вещи несовместимые.


  1. clawham
    06.07.2017 17:51

    нука расскажите сколько стоит ваш ардуино нано + езернет шилд? а теперь погуглите сколько стоит любой модуль из линейки ESP8266 и ему не надо ничего! питание да датчик повешал и вуаля — все работает обновляется типа\ет моргает и т.д. ещё и по воздуху прошивки обновлять можно.


    1. kisaa
      07.07.2017 01:35

      Сколько стоит — указано в статье, менее 600 рублей всё вместе. Но:
      1. Я пока не настолько крут в микроконтроллерах (вообще, это мой первый «проект»), и Ардуино — неплохой старт в таком случае
      2. В том помещении (и в окрестностях) беспроводной сети нет, а ставить ее специально для беспроводного мониторинга — не очень похоже на экономию средств.


      1. clawham
        07.07.2017 08:19

        esp 8266 пишется вообще намного проще ем ардуина, работает быстрее чем ардуина и имеет 4 мегабайта флеши для кода/юзерфайлов.
        esp8266 можно программировать в той же вами любимой ардуине, а можно вообще просто скриптовым языком и примеров под ваши задачи — 100500 — главное что все они одинаковые и если вы берете пример от 8266 — 100% что он у вас запустится загрузится и будет работать.

        По поводу кабеля и интернета — ну кагбэ кабель надо было вести, собачки обжимать и стены сверлить и как и любому кабелю ему надо быть во чтото воткнутым. + просто так инет в кабеле не появляется — нужен где-то роутер. вот роутер поменять на вайфайный и таких датчиков можно навешивать 100500. не говоря уже о том что и сама есп легко может быть реальной точкой доступа а логи писаться могут на встроенную 4 мегабайтную флешку. все это делается за час полтора с нуля — у меня было именно так. в обед пришла посылка из китая а вечером дома уже стояло 3 самописца с моим любимым функционалом. стоимость еспшки 2 доллара


        1. Demosfen
          07.07.2017 10:51

          100500 на обычной дешевой точке не получится. 20-30 клиентов и сетка начинает лагать.
          На самом деле здесь ни ардуина ни еспшка не нужны. Сеть все равно человек раскидал, можно было штатно раскидать датчики на шине 1-wire — до 100 метров вообще без проблем (больше не проверял).


          1. clawham
            07.07.2017 12:05

            лично конектил 180 еспшек и прочих ИОТ к dir-300

            лагать по вашему это снижение скорости? иот это один два пакета В МИНУТУ! никаких там проблем нет.

            проблемы есть когда ты по 300 мбит вайфаю качаеш файл с компа подключенного гигабиткой(тоесть реально 150 мегабит имееш и тут к этой же точке начинает прошиваться esp8266 — тоесть не один пакет а цемый мегабайт бинарник передаваться — тогда да — скорость обновления еспшки падает раза в 3 против стенд-алона а скорость скачивания проседает до 20 мегабит. ну тут все логично — сеть работает на скорости самого тормозного учасника.и это естественно еспшка которая аппаратно не более 24 мегабит может. но каждый ли день вы прошиваете еспшку одновременно качая гигабайты через вайфай?


      1. SolarW
        07.07.2017 11:33

        Ну если цель научится работать с микроконтроллерами — то вы все правильно написали.
        А если цель быстро получить результат при минимуме затрат то:
        — для ардуины и изернет-шилда есть Zabbuino, уже очень много умеющий проект активно развиваемый автором (ссылку привёл ниже)
        — если есть WiFi то очень удобно использовать esp8266 (или уже ESP32) с платной версией прошивки от wifi-iot.com (100 RUB).
        https://wifi-iot.com/p/wiki/34/ru/ — про поддержку Zabbix'а.
        Конечно там zabbix sender а не агент но это в некоторых случаях даже удобней (когда к серверу Zabbix'а надо из-за NAT'а обращаться)


        1. clawham
          07.07.2017 12:12

          есп32 глючная недоделанная греющаяся и жрущая хрень… реально я не понимаю зачем оно нужно… даже 8266 сильно избыточна во многих применениях. а тем более в метеостанции. И на 8266 этих метеостанций уже 100500 штук понаписано — вообще реально никаких проблем нет купить отладку под 8266 за 3 уе и припаять 3 проводка — все готово. хексы скачиваются готовые, к точке доступа конектится с телефона и там уже настраивается все… что ещё надо-то?


          1. SolarW
            07.07.2017 13:39

            на 8266 этих метеостанций уже 100500 штук понаписано — вообще реально никаких проблем нет купить отладку под 8266 за 3 уе и припаять 3 проводка — все готово. хексы скачиваются готовые

            Так я об этом и писал.
            Я ни разу не программист в этих ваших ардуинах поэтому когда понадобилось реализовать некое устройство то взял esp8266, понижайку с 5в до 3.3в, три кондера и жменьку резисторов чтобы неиспользуемые выводы подтянуть.
            После этого залил прошивку от WiFi-IoT.com и получил все что хотел.
            С любыми датчиками, приделанным OLED-дисплейчиком и кнопками.


  1. SolarW
    07.07.2017 10:49

    https://github.com/zbx-sadman/zabbuino/wiki/Zabbuino-in-Russian-(for-release-1.2.x) — а чем это не подошло?


    1. kisaa
      07.07.2017 13:47

      Это, судя по описанию, крутая штука, и я на нее натыкался, но мне это показалось некоторым оверкиллом для моей задачи.


      1. SolarW
        07.07.2017 21:48

        Ну не так уж и оверкилл…
        Проект модульный, отключите лишнее, оставьте нужное…
        К тому же вы пишете:

        При этом, как обычно, возможности весьма ограничены, и «выбить» значительные средства на сложные системы мониторинга температуры (к ним я отношу и платы управления с термодатчиками для стоечных ИБП APC) — это отдельный квест.

        А данный проект можно присоединить к APC Smart UPS и снимать с него имеющиеся показания.
        Ну или присоединить PZEM-004(T) стоящий не так уж много денег и мониторить напряжение/потребляемую мощность/силу тока/количество потребленной энергии.
        Плюс там же в wiki почитайте кейсы использования — интересно выглядит модульный индикатор, показывающий количество активных алертов в Заббиксе.
        Автор проекта — большой поклонник Заббикса, активный участник форума отвечающий на многие вопросы новичков.


  1. alk0v
    07.07.2017 15:27

    а с SNMP нет часом готовой библиотеки?


    1. SolarW
      07.07.2017 21:49

      К сожалению пока не попадалось такого решения.