Реализация довольно проста: термодатчик опрашивается контроллером через шину 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)
NAI
04.02.2019 15:44А не проще(дешевле) использовать что-нибудь типа SNR-ERD 3s (или аналоги)? Можно данные забирать\отправлять сразу по SNMP, 3-5 датчиков температуры. DI\DO в наличии.
easyJet Автор
07.02.2019 07:15Возможно проще, но вот что дешевле сильно сомневаюсь — контроллер 0.5-1$, обвязка стоит копейки, usb порт можно выкинуть и впать кабель в плату, сама плата, даже если заказывать, выйдет не дороже 2-3$.
sintech
04.02.2019 15:54У меня была идея разместить спереди и сзади стойки по 5-6 датчиков DS18B20, благо шина это позволяет. И стоить на основе данных тепловые карты распределения температуры воздуха. Т.к. как правило одной цифры для всей серверной может быть не достаточно.
Но реализовать так и не довелось.apple01
04.02.2019 16:09Я ставлю в серверной дополнительные вентиляторы чтобы воздух перемешивался и не было застойных зон.
Satyricon
04.02.2019 16:12Ой как сложно. Несколько диодов и резистор в com порт. Опрашивать библиотекой digitemp. Несколько лет такая фигня уже работает.
sim2q
04.02.2019 19:36+1
Соглашусь! Делал на днях наспех по этой схеме, что бы быстренько предъявить УК график температуры батареи. Данные снимаю через digitemp, картинки collectd+rrd. COM порт на материнке.Alyoshka1976
04.02.2019 22:52+1Добавлю, что можно использовать USB-UART преобразователь, например, на CP210x — в этом случае дополнительно нужен только резистор 4.7… 10 кОм
Прекрасно работает через digitemp — баловался с мониторингом температуры и фотоконтролем за котами через Telegram-ботаsim2q
04.02.2019 23:49Сильно упрощает. Пока навесом паял все эти диоды и стабилитроны (в наличии только 3V3 — пришлось комбинировать), наделал ошибок. Но USB-UART просто не было под рукой
Alyoshka1976
05.02.2019 00:07Для DS18S20 к тому же можно попытаться паразитное питание использовать — на двух проводах датчик прицепить. Но IMHO не слишком надежный вариант, поэтому я не даже и не пробовал.
sim31r
05.02.2019 11:59И GND тут нормально подключен, что повышает помехоустойчивость и живучесть при статических разрядах…
apple01
05.02.2019 00:33Интересно, можно ли пробросить порт в виртуальную машину vmware и опрашивать из нее?
Satyricon
05.02.2019 00:39Можно
avlag
05.02.2019 07:55А потом машина переедет на соседний хост и будет тщетно искать свой USB-датчик.
Не стоит привязывать датчик температуры к серверу. SNMP сильно лучше будет.Satyricon
05.02.2019 08:19Как это отменяет мой ответ на вопрос и причём тут usb?)
avlag
05.02.2019 08:38Ответ — да, не отменяет. Но решение о пробросе физических портов сервера внутрь, до виртуалки, не имеет права на жизнь в продуктивной среде. Я ак считаю ;)
USB? Так в этой ветке комментов идет уже обсуждение датчиков на COM-портах и USB :)
easyJet Автор
07.02.2019 06:59На момент разработки небыло нужных контроллеров, но я уже думал о реализации через SNMP, на базе — PIC32+ethernet PHY, например.
easyJet Автор
07.02.2019 06:51Да, вполне. Проверял на virtualbox, в этом случае энумерация USB устройства проходит в два этапа — хостовой осью и соответственно гостевой.
easyJet Автор
07.02.2019 07:21Можно и так, кстати у нас так сделан опрос уличного датчика, для выдачи титра с температурой. Просто когда возникла потребность в устройстве, я как раз заканчивал разбирать USB спецификации, это надо было для другого проекта, ну и подумал почему бы не сделать сразу на USB
без ардуин, cp210x и прочих мам, пап, кредитов.
pnetmon
04.02.2019 17:11Сервер где стоит устройство должен работать. Zabbix должен работать. Канал связи тоже может внезапно упасть (например если используется провод у оператора связи может не быть резервного питания оборудования в этом здании).
А ведь могло быть независимое от электропитания и работоспособности сервера устройство как пишут в первом сообщении.
При внезапной духовке в серверной из-за внезапных отключений кондиционера на скорую руку мониторилась температура чипсета и ежедневно рассылались sms сообщения для тестирования работы всей системы.
Keremet_2030
04.02.2019 18:18Как раз в данный момент занимаюсь проектом для мониторинга\управления бензиновым генератором. Необходимо измерять уровень топлива, наличие напряжения на входе\выходе, температуру, управлять нагрузкой. Остановился на Arduino mega + Ethernet shield, библиотекой Agentuino, логированием на SD карту, и всё это с Web мордой. Если интересно, постараюсь запилить статью на эту тему.
Vanellope
04.02.2019 19:11Пилите статью, интересно сравнить с промышленными решениями по цене и эффективности.
В создании двух подобных систем принимала участие, от 50 до 250 тысяч только за железо выходило.
easyJet Автор
07.02.2019 07:08Да, писал выше в ответе на другой комментарий, что есть в планах перевод на SNMP этого дела, но на PIC32+Realtek 100mb или любой другой PHY, ардуины как-то не очень. Кстати, если ether shield на ENC28J60, то подтверждаю — зависают через рандомный промежуток времени, возможно это только в первых ревизиях, но мне хватило с ними проблем чтобы не иметь никакого желания больше использовать их в принципе, да и самих ревизий было 6 или 7, что говорит само за себя. И еще потребление под 200мА.
star76
07.02.2019 07:08Я отказался в своих проектах на ардуино от Ethernet shield, дорого, когда устройств много, и ненадежно работает. Использую modbus на скорости 9600. Если команды на исполнительные и устройства и датчики идут с частотой от единиц минут, то все норм тянет. На шине у меня уже 10 slave устройств. Чем модбас хорош, серверную часть можно поменять на любой ПЛК по мере развития. Например мегу я со временем заменил на малину, скрипты переписал на питоне.
Диагностику slave устройств также легко проводить. Подключил к ПК через переходник USB-RS485 и вперед.
denis-19
04.02.2019 18:39Вот немного похоже реализовывал, работает до сих пор прекрасно.
habr.com/ru/post/417327
FSA
04.02.2019 18:46У меня одно время за окном висел китайский термометр, который был подключен к ближайшему окну через USB удлинитель. Сам термометр — просто USB брелок с проводом и датчиком. Опрос производился небольшой программкой. Первый сервер работал на FreeBSD, потом был сервер на Linux. Везде работало. При поставленной задаче всё упрощается, потому что просто втыкаем брелок в любой сервер и вытягиваем провод с датчиком в удобное для измерения месте.
Подключение к Zabbix? Ну если из командной строки можно получить данные на экране, то высылать эти данные в Zabbix, думаю, не составит труда. У меня эти данные через HTTP улетали на сервер в интернете по задаче в cron.
wmgeek
04.02.2019 21:55И что мы будем делать, когда температура все же начала расти? У нас же должны быть два кондиционера как минимум и блок ротации. Мониторить желательно не просто температуру в серверной, а дельту на входе и выходе кондиционера. Если с кондеем что то не так — по дельте мы узнаем о неисправности самого кондиционера раньше. И самое главное — у нас должна быть возможность включить резервный, заведомо исправный кондей. А для этого рабочий и резервный нужно переключать время от времени, например, каждые 24 часа. И мониторить, мониторить, мониторить каждый кондей, а не только температуру.
avlag
05.02.2019 07:57Ну и не забыть подключить резервную систему охлаждения от альтернативного источника питания.
Satyricon
05.02.2019 08:31А на деле мы имеем один бытовой кондиционер, который зависает от скачков напряжения. Даже полная остановка всех серверов от перегрева не помогает руководству понять что требуется полная переделка системы охлаждения. Тут и начинается простор для поделок мониторинга. Крупнейшая нефтяная компания, между прочим.
dklm
05.02.2019 11:12я бы рекомендовал вам рассмотреть вариант установки рекуператора в пару к кондеционеру.
khanid
06.02.2019 10:48полная остановка всех серверов от перегрева
Помимо факта остановки следует помнить, что это и на продолжительности жизни железа может сказаться.
Dioxin
05.02.2019 08:48Пожалуй самое грамотное решение при условии что есть второй кондей.
А то иногда и первого нету.
khanid
06.02.2019 10:48Ну выводить во внешний контроль блок управления кондиционерами я бы не рискнул по причине безопасности. А вот наличие автономного переключателя — и не роскошь. При привышении температуры просто в работу вводится вторая система охлаждения (у меня переключением занимается kg316t с некоторым обвесом).
dklm
05.02.2019 11:15Я честно говоря не понимаю зачем изобретать велосипед, в серверах присутствует все необходимое(самосбор это не сервер) можно мониторить температуру встроенными системами мониторинга…
fessmage
05.02.2019 11:35Да, если в большинстве установленных серверов есть BMC, то как правило с него можно снимать показания всех датчиков сервера через SNMP, где есть не только температура воздуха но и температура выхлопа сервера.
А общие показания температуры воздуха самой серверной полезны в том случае если таких серверов не подавляющее большинство, да плюс с вручную управляемыми кондеями.
fessmage
05.02.2019 11:28Я делал мониторинг температуры в серверной с использованием плат NMC2 AP9631, вставляемых в качестве платы расширения в ИБП фирмы APC. В каждой стойке был как минимум один ИБП, показания которого в любом случае также хотелось мониторить, на предмет режима работы, температуры батарей, входного и выходного напряжения, оставшегося заряда. Эта плата позволяет подключить и управлять ИБП через сеть, собирать показания через SNMP. А также с ней в комплекте идет выносной температурный датчик с магнитным креплением, на проводе около 2 метров. Разместив эти датчики в удобных местах на каждой стойке, примерно в 1,7 метра над полом, получил картинку температуры воздуха возле каждой стойки, причем по сути как дополнительный бонус. Очень удобно.
alexhott
05.02.2019 11:29Тоже сначала рукоблудничал с Ардуино типо такого habr.com/ru/post/394909, но мне тогда обхаяли это решение.
Да и на самом деле после того как одно такое изделие сдохло сделали получение данных с термодатчика блэйда через SNMP
iddqda
05.02.2019 11:39к вашему контроллеру наверно можно приделать другие полезные датчики,
влажность можно измерять, протечку или даже проникновение
а для температуры немного оверкил как по мне. Но прикольно да
А у меня в серверной почти в каждой стойке top-of-rack switch есть с датчиками температуры
которые вполне нативно мониторятся тем же заббиксом
PR200SD
05.02.2019 11:52После того как повысилась температура, желательно начинать действовать сразу, включать кондиционер или вентиляцию или что у Вас еще припасено, независимо есть канал связи или нет, графики это для общей картины на объекте или последующего анализа. Один из вариантов решения подобных задач описывал в статье, там и графики и архивы habr.com/ru/post/424791, с нужным количеством каналов можно реализовать всю необходимую автоматику. Сейчас на той же плате добавил работу с датчиками ds18b20, можно подключить на шину до 16 шт, пока тестирую на 8 разведенных по дому витой парой, общая длина метров 40, значения можно архивировать, выводить на WEB страницу, читать через Modbus TCP, а если использовать с программируемым реле то можно реализовать управляющие алгоритмы. В автономной работе без программируемого устройства можно еще добавить датчик влажности, еще все значения можно отправлять по mqtt, есть несколько роликов с примерами youtube.com/channel/UCj4HeZMvSH5H3d_t6iDlQOQ
sim31r
05.02.2019 11:53либо подключить внешний UART-USB мост типа CP2102. Не очень люблю подобные костыли
Ну понятно в этом своя схемотехническая красота, минимализм.
Но мост это специализированное аппаратное решение, заточенное на работу с USB, а в микроконтроллере может быть минимальная обвязка самая. Есть ли там защита от статики? На схеме для согласования с USB портом всего 2 резистора на 33 Ома. В промышленных решениях и гальваническую развязку добавляют, и сложные цепи согласования, это не костыль, а необходимость, вот пример, и схема.
NickyScout
Мы, в свое время, решили такую задачу чисто софтовым методом — измеряли температуру внутри корпуса нескольких серверов, усредняли, и ставили триггер на превышение. По моему, стандартные счетчики температуры у системы выводились в Windows, дальше все было элементарно.
Позднее решение дополнили бэкапным независимым датчиком с GSM модемом (обычная самая дешевая «сигналка» для дачи с датчиком температуры). На случай, если в момент отказа кондея что-то случится с сетью/системой мониторинга, или просто будет ночь.