В основной серверной всё просто — установлена одна такая плата (закуплена давным-давно предшественником вместе с основным оборудованием), воткнут APC-шный термодатчик, заведён агент в Заббиксе, всё работает по SNMP. Скучно :) На мониторинг удалённой аппаратной оборудования нет, средств тоже — см. выше. Поэтому было решено проявить смекалку, сэкономить бюджет и заодно прокачать новый навык путём конструирования простого и дешёвого «наколенного» решения, вписывающегося, тем не менее, в существующую инфраструктуру мониторинга Zabbix.
Необходимые компоненты:
- Основа системы — Arduino Nano V3
- Модуль локальной сети (ethernet-shield)
- И, собственно, цифровой датчик температуры на базе DS18B20
Общая стоимость компонентов — $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)
intermed
06.07.2017 11:57+1Делал то же самое только с выгрузкой в google app engine и рисованием графиков в google charts
Используется 4 датчика
Работает на удивление стабильно.
Вдруг кому пригодится, исходники тут https://github.com/vasiasan/AchinskBCDr_Ups
10.07.2017 16:15простите, никогда не работал с этим app engine, его там как нужно конфигурировать? этот engine в бесплатном пользовании или надо подписываться на триал у них? спасибо за внимание
dmitryrf
06.07.2017 12:16+1Добавлю несколько замечаний про DS18B20. Если не нужна точность в 1/16 (а она редко бывает нужна), то её можно снизить до 1/2, значительно сократив время измерения (почти в 10 раз, с 750 до 94 мс). Также нужно иметь в виду, что при частых измерениях датчик будет саморазогреваться.
Ещё при внешнем питании можно опрашивать выход, чтобы определить момент завершения преобразования и еще немного сократить время измерения.
vanrisk
06.07.2017 12:36Если сервера полноценные, то имхо лучше снимать показания с датчика окружающей среды, есть почти во всех серверах. А если есть IPMI, IMM или iLO то можно напрямую zabbix-ом снимать показания, без установки какого либо ПО на сам сервер.
roofcat
06.07.2017 12:36+2как возможный альтернативный вариант (если по условиям допустим wifi) — esp8266 с прошивкой wifi-iot, по цене сравнимо или чуть дешевле.
Mogwaika
10.07.2017 12:42Если не надо работать от батареек (а ESP так же плохо работает от батареек), проще orange pi zero за 9$. Там и ethernet и wifi и много других плюшек.
trublast
06.07.2017 12:41Немножко не в тему, но «экономить бюджет и мониторить температуру» можно используя вместо ИБП APC бюджетные бесперебойники вроде IPPON/Powercom. У них встроенный датчик температуры, в отличие от APC. Естественно, данные можно снимать только по USB/RS232, но если хочется по LAN — на помощь приходят девайсы типа TP-Link MR3020 с Openwrt на борту и установленным nut (в свое время покупались по 700р/шт)
Конечно мониторится не температура в помещении, а температура ИБП, но пока не работает инвертор (бесперебойник в режиме bypass) — можно ее считать за температуру помещения.
clawham
06.07.2017 17:51нука расскажите сколько стоит ваш ардуино нано + езернет шилд? а теперь погуглите сколько стоит любой модуль из линейки ESP8266 и ему не надо ничего! питание да датчик повешал и вуаля — все работает обновляется типа\ет моргает и т.д. ещё и по воздуху прошивки обновлять можно.
kisaa
07.07.2017 01:35Сколько стоит — указано в статье, менее 600 рублей всё вместе. Но:
1. Я пока не настолько крут в микроконтроллерах (вообще, это мой первый «проект»), и Ардуино — неплохой старт в таком случае
2. В том помещении (и в окрестностях) беспроводной сети нет, а ставить ее специально для беспроводного мониторинга — не очень похоже на экономию средств.clawham
07.07.2017 08:19esp 8266 пишется вообще намного проще ем ардуина, работает быстрее чем ардуина и имеет 4 мегабайта флеши для кода/юзерфайлов.
esp8266 можно программировать в той же вами любимой ардуине, а можно вообще просто скриптовым языком и примеров под ваши задачи — 100500 — главное что все они одинаковые и если вы берете пример от 8266 — 100% что он у вас запустится загрузится и будет работать.
По поводу кабеля и интернета — ну кагбэ кабель надо было вести, собачки обжимать и стены сверлить и как и любому кабелю ему надо быть во чтото воткнутым. + просто так инет в кабеле не появляется — нужен где-то роутер. вот роутер поменять на вайфайный и таких датчиков можно навешивать 100500. не говоря уже о том что и сама есп легко может быть реальной точкой доступа а логи писаться могут на встроенную 4 мегабайтную флешку. все это делается за час полтора с нуля — у меня было именно так. в обед пришла посылка из китая а вечером дома уже стояло 3 самописца с моим любимым функционалом. стоимость еспшки 2 доллараDemosfen
07.07.2017 10:51100500 на обычной дешевой точке не получится. 20-30 клиентов и сетка начинает лагать.
На самом деле здесь ни ардуина ни еспшка не нужны. Сеть все равно человек раскидал, можно было штатно раскидать датчики на шине 1-wire — до 100 метров вообще без проблем (больше не проверял).clawham
07.07.2017 12:05лично конектил 180 еспшек и прочих ИОТ к dir-300
лагать по вашему это снижение скорости? иот это один два пакета В МИНУТУ! никаких там проблем нет.
проблемы есть когда ты по 300 мбит вайфаю качаеш файл с компа подключенного гигабиткой(тоесть реально 150 мегабит имееш и тут к этой же точке начинает прошиваться esp8266 — тоесть не один пакет а цемый мегабайт бинарник передаваться — тогда да — скорость обновления еспшки падает раза в 3 против стенд-алона а скорость скачивания проседает до 20 мегабит. ну тут все логично — сеть работает на скорости самого тормозного учасника.и это естественно еспшка которая аппаратно не более 24 мегабит может. но каждый ли день вы прошиваете еспшку одновременно качая гигабайты через вайфай?
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'а обращаться)clawham
07.07.2017 12:12есп32 глючная недоделанная греющаяся и жрущая хрень… реально я не понимаю зачем оно нужно… даже 8266 сильно избыточна во многих применениях. а тем более в метеостанции. И на 8266 этих метеостанций уже 100500 штук понаписано — вообще реально никаких проблем нет купить отладку под 8266 за 3 уе и припаять 3 проводка — все готово. хексы скачиваются готовые, к точке доступа конектится с телефона и там уже настраивается все… что ещё надо-то?
SolarW
07.07.2017 13:39на 8266 этих метеостанций уже 100500 штук понаписано — вообще реально никаких проблем нет купить отладку под 8266 за 3 уе и припаять 3 проводка — все готово. хексы скачиваются готовые
Так я об этом и писал.
Я ни разу не программист в этих ваших ардуинах поэтому когда понадобилось реализовать некое устройство то взял esp8266, понижайку с 5в до 3.3в, три кондера и жменьку резисторов чтобы неиспользуемые выводы подтянуть.
После этого залил прошивку от WiFi-IoT.com и получил все что хотел.
С любыми датчиками, приделанным OLED-дисплейчиком и кнопками.
SolarW
07.07.2017 10:49https://github.com/zbx-sadman/zabbuino/wiki/Zabbuino-in-Russian-(for-release-1.2.x) — а чем это не подошло?
kisaa
07.07.2017 13:47Это, судя по описанию, крутая штука, и я на нее натыкался, но мне это показалось некоторым оверкиллом для моей задачи.
SolarW
07.07.2017 21:48Ну не так уж и оверкилл…
Проект модульный, отключите лишнее, оставьте нужное…
К тому же вы пишете:
При этом, как обычно, возможности весьма ограничены, и «выбить» значительные средства на сложные системы мониторинга температуры (к ним я отношу и платы управления с термодатчиками для стоечных ИБП APC) — это отдельный квест.
А данный проект можно присоединить к APC Smart UPS и снимать с него имеющиеся показания.
Ну или присоединить PZEM-004(T) стоящий не так уж много денег и мониторить напряжение/потребляемую мощность/силу тока/количество потребленной энергии.
Плюс там же в wiki почитайте кейсы использования — интересно выглядит модульный индикатор, показывающий количество активных алертов в Заббиксе.
Автор проекта — большой поклонник Заббикса, активный участник форума отвечающий на многие вопросы новичков.
mickvav
Ds18b20-х на одну шину можно посадить дофига, так что естественный upgrade — передавать адрес конкретного датчика аргументом.