Zabbuino - маленькое устройство для большого мониторинга.
- Войдите на сайт для отправки комментариев
Чт, 15/12/2016 - 16:07
Я давно почитываю этот форум и, порой, заимствую полезные решения для своих разработок.
Но, как мне кажется, только брать - это неправильно, поэтому решил поделиться своим. Наверняка каждый уже в той или иной мере реализовывал то, что я хочу предложить. Но, быть может, кто-то еще не успел и воспользуется Zabbuino.
Что же это такое... Вариация "Умного дома"? Нет. Автономное устройство? Снова нет. Метеостанция? Ну, может быть.
Zabbuino - программная составляющая миниатюрного агента системы мониторинга Zabbix. Возможно вы слышали о ней или, даже, уже используете. Впрочем, вышло так, что кроме Zabbix вы можете использовать Cacti, RRDTool и любые другие - достаточно того, чтобы они умели принимать значение метрики, передаваемое простым текстом, из STDIO или TCP-сокета.
Концептуально Zabbuino не требует предконфигурирования подключаемой перефирии на уровне прошивки. Логическая привязка датчиков к выводам Arduino, которая используется в качестве аппаратной части, осуществляется на стороне системы мониторинга, а точнее - в самом запросе. Первичные схемы подключения перефирийных устройств совершенно стандартные - прямиком из уроков по Arduino.
Логичен вопрос - что позволяет делать такой агент, куда его примотать? Ответ таков Zabbuino - это "гейт в мир физических процессов" для системы мониторинга. С его помощью Zabbix может понять, что в помещении упала температура, течет крыша или пропало напряжение на сегменте силовой сети. На основании этих данных система может принять решение и послать агенту команду на включение тревожного маячка, или отображении факта произошедшего события на мини-дисплее, подключенному к другому мини-агенту и находящемуся на столе удаленного оператора.
Впрочем, можно и без усложнения себе жизни мерять температуру воды в аквариуме, атмосферное давление или качество линии электропитания, отображая это на графиках.
И напоследок - картинки:
Характеристики электрической сети с Peacefair PZEM-004
Информация с датчика BME280
Костыли и нечестный код сложены тут (извините, но я слышал, что 300кб исходников постить на форум кто-то запретил): https://github.com/zbx-sadman/Zabbuino
Более подробная документация: https://github.com/zbx-sadman/Zabbuino/wiki
Если возникли вопросы - задавайте. Не обещаю, что смогу ответить на все, но постараюсь.
[Надеюсь что второй пост можно будет редактировать и использовать для уточнения технической информации]
[Надеюсь что второй пост можно будет редактировать и использовать для уточнения технической информации]
я запретил - только третий.
и, правильно сделал - накуя на форуме постить исходники гитхаба?
А по теме так никто и не отписался.
Автор, если ты сам все это замутил, то жму руку.
Я Заббикс крутил лет пять назад. Но без ардуино (тогда и не знал о таком) не вкурил в неё. Понял, что система мониторинга, сбор данных. Но что, откуда - осталось загадкой. Сейчас же видя все эти "костыли" всё становится понятней.
Вопрос сразу по делу: команды отправляются с сервера заббикса? Что есть в данном случае 192.168.0.1?
И чем сами графики строятся? Штатными средствами Zabbix'а?
И чем сами графики строятся? Штатными средствами Zabbix'а?
Применительно к Zabbix
На сервере Zabbix создается "учетная" запись узла. На эту запись навешиваются элементы данных. В каждый активированный элемент данных начинают поступать значения метрик, которые Zabbix-сервер запрашивает у агента через определенные периоды. На базе этих полученных значений Zabbix может генерировать события. Ну и, естественно, отрисовывать графики - час-день-неделя-год-пять (за то время, в течении которого проводились опросы).
Т.е., например, к Zabbuino прицеплен DS18B20 (пин D4). В Zabbix создается узел с адресом 192.168.0.1. К этой "учетной" записи присоздается элемент данных с ключом DS18x20.temperature[4,9,0x284AE0D4010000DA]. С этого момента каждые N секунд (минут, часов) Zabbix начинает теребить агента: "У тебя там, на 4-м пине, висит термометр с ID=0x284AE0D4010000DA. Спроси у него текущую температуру с разрешением в 9 бит". Агент отвечает значением температуры или кодом ошибки, Zabbix записывает полученное к себе в БД. Если к этому элементу данных привязаны триггеры, то при превышении температуры выше какого-то порога (гистерезис настраивается тоже) или отрыве датчика, генерируется событие, которое приводит к определяемому действию - отсылке e-mail, sms, команды агенту щелкнуть релюшкой или нарисовать что-то на Character LCD. Все полученные за время опросов данные доступны к отображению в виде одиночных, групповых и прочих графиков в Web-интерфейсе Zabbix (штатное средство).
Но точно так же можно запрашивать метрики в shell-скрипте и подавать их на вход RRDUpdate, что позволяет хранить данные и отрисовывать графики без применения тяжеловесных систем мониторинга.
Адрес задаваемый в Zabbuino - это адрес агента, по которому к нему будет обращаться Zabbix-server. Активный режим работы агента (когда он шлёт данные самостоятельно, выяснив, какие элементы данных привязаны к его учетке на Zabbix-серевере) на данный момент не реализован.
Решил попробовать Zabbuino. Зашил версию 1.2.1. Через zabbix_get опрашиваю PZEM, а в ответ приходит -135.
Запрос zabbix_get -s 192.168.10.11 -k "PZEM004.voltage[4,5,0xC0A80101]"
Надо как-то отдельно настраивать пины 4 и 5?
Нет, не надо. Либо пины наоборот указали, либо адрес не сопадает. Ну, или счетчик просто не отвечает (хардварная проблема). -135 - это таймаут соединения.
-135 - это таймаут соединения.
Ага! Проверил состояние A4, A5, а там высокий уровень. А эти ноги у меня отвечают за отключение питание на PZEM и нажатие кнопку сброса. Сбросил заработало.
Простите, что-то не понял, пинаю с сервера:
Что я не доделал? Zabbix клиента на сервер нужно вешать или?
Установить zabbix_get (не знаю, зачем он в отдельный пакет засовывается): https://www.zabbix.com/forum/zabbix-help/44447-zabbix_get-error?p=260816...
Огромное спасибо! (ну ни фига, оперативность ;))
Всё равно не работает:
Проверьте логику, пожалуйста, а то уже не варит:
Ну, это вопрос уже не по моему прожекту, а по вашему самописному. Хотите, чтобы я за его отладку сел?
Даже вот так вот:
в общем, не знаю я уже...
Нет, конечно. Тем более, у вас на ethernet, у меня на wifi...
Да и какой он самописный, два обрывка криво скочем склеил. Просто не пойму, почему три комманды, которые в одной цепочке ифов дают разный результат. Две падают по таймауту, третья сбрасывает соединение. Ладно, завтра ковырять буду.
Из явных проблем я вижу, что readString нигде не обнуляется, только конкатенируется. Вот и выходит у вас, что на каждом коннекте к старому ключу добавляется новый. Что при этом даст сравнение?
Короче, не обращайте на мою чуш внимания, это всё переписывть с нуля надо. Проще, чем исправлять.
А вам это зачем вообще - хотите Zabbix-агента в беспроводной сети сделать?
Беспроводной контроль температуры в цехе. До 10, скажем точек.
Но я уже отказываюсь от этой идеи, из 5 штук ESP-01 стабильно работает (просто пингуется) только одна. Надо что-то другое городить.
Поэтому я и не портирую Zabbuino на ESP. Визгу много, шерсти мало.
Сейчас у меня есть проект на CAN-шине (одна пара) - как раз для производственных условий. Все метрики пушатся на Zabbix.
dupe
Так если проводами, то можно и гирлянду ds1820 на "няньку" повесить и будет она через w5100 всё это добро лить. Идея-то была именно по wifi.
Не, раз одна живая есть, надо хоть ради прикола сделать.
Выбор за вами, безусловно. При озвученном выборе я бы вешал гирлянду, если есть возможность.
Возьни с проводами много. У меня 50 АРМ по всему зданию разбросано. Рабочие зоны, а это две трети, в нонстопе. Проще тогда уж переходники на ch340 и ds18b20. Вот эту мысль точно нужно продумать.
Можете меня поздравить. ESP8266-01 с Zabbix'ом таки работает. Правда пока в наколенно-тестовом режиме, но данные отдаёт, они видны, графички есть, красота, короче.
Добро пожаловать на борт. Советую при работе в режиме траппера сразу подвесить триггер на nodata(), в противном случае отрыв агента может быть незаметен на графике.
Добро пожаловать на борт. Советую при работе в режиме траппера сразу подвесить триггер на nodata(), в противном случае отрыв агента может быть незаметен на графике.
Есть байка, что сервисным инженерам Cisco после сдачи сертификационных экзаменов назначается пенсия. За моральный ущерб. За настройку Zabbix'а, полагаю, должно быть что-то подобное положено. ;) Ладно, хоть конструктор триггеров есть.
Добрый день!
А более по подробно можно?
Схема подключения?
Скетч?
Спасибо.
В первопосте две ссылки: на исходник и на подробную документацию.
Извеняюсь,может,за столь тупые вопросы.
Но с Arduino работаю недавно.
Интересует следующие:
Когда заливаешь на Ардуино zabbuino.ino , показывает ошибку exit status 1, а в описании скетча zabbuino.ino указано что нужно обратится к cfg_basic.h
Что нужно делать с этим файлом(cfg_basic.h)?
Его нужно где то прописать?
у меня Adruino UNO и arduino ethernet shield w5100.
И подключен температурный датчик ds18b20.
Спасибо.
Как Вы исходники с GitHub к себе забрали - через зеленую кнопку "Clone or download"?
Да,скачал.Открыл Ardiuno IDE.
Файл-->Открыть-->zabbuino.ino
При компеляции выдает:
Arduino: 1.8.5 (Windows 10), Плата:"Arduino/Genuino Uno"
C:\Users\admin\Downloads\zabbuino-master\zabbuino-master\zabbuino\zabbuino.ino:16:28: fatal error: src/dispatcher.h: No such file or directory
#include "src/dispatcher.h"
^
compilation terminated.
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
То есть,мне нужно добавить библиотеку src/dispatcher.h?
Правильно понимаю?
Спасибо.
Всё понятно. Сразу, после распаковки архива, переименуйте каталог zabbuino-master в zabbuino. После всё должно быть OK. Это всё проделки гитхаба.
Спасибо тебе,добрый человек!!!
Залил в ардуино скетч, все нормально!
Импортировал все шаблоны в zabbix.
Но там не оказалось именно шаблона для DS18B20.
Или этот параметр включается отдельно в файле cfg_basic.h?
#define FEATURE_OW_ENABLE
/*/
/=/ Enable Dallas DS18x20 sensors handling and command:
/=/ - DS18x20.Temperature[]
/*/
#define FEATURE_DS18X20_ENABLE
/**** I2C bus ****/
/*/
/=/ Enable I2C processing and commands:
/=/ - I2C.Scan[];
/=/ - I2C.Write[];
/=/ - I2C.Read[];
/=/ - I2C.BitWrite[];
/=/ - I2C.BitRead[]
/=/
/*/
Так же ,где в самом скетче прописано с какого пина читать данные с датчика ds18b20?
Сейчас датчик подключен к ардуино следующим способом:
+5 - vdd
End - End
8 pin -- Data
Интуитивно думаю что меняется вот тут --> uint8_t dsAddr[8];
То есть,8 это номер пина на ардуино?
#ifdef FEATURE_DS18X20_ENABLE
case CMD_DS18X20_TEMPERATURE:
//
// DS18x20.temperature[pin, resolution, id]
//
if (!isSafePin(argv[0])) {
goto finish;
}
uint8_t dsAddr[8];
dsAddr[0] = 0;
// Convert sensor ID (if its given) from HEX string to byte array (DeviceAddress structure) and validate (sub not finished) it.
// Sensor ID is equal DeviceAddress.
// if convertation not successfull or ID not valid - return DEVICE_ERROR_WRONG_ID
if (('\0' != *optarg[2]) && (8 != hstoba(dsAddr, optarg[2]))) {
rc = DEVICE_ERROR_WRONG_ID;
} else {
rc = getDS18X20Metric(argv[0], argv[1], dsAddr, payload);
}
goto finish;
#endif // FEATURE_DS18X20_ENABLE
Спасибо тебе за консультацию!
Шаблоны для DS-ки делать бессмысленно. Просто создайте в хосте новый айтем c ключом, описанным в мануале (искать по DS18x20.Temperature). Исходники править не требуется.
Это я уже понял.
Делать через zabbix_get -s 192.168.0.227 -k "DS18x20.Temperature[2,9,0x284bd6d4010000f5]"
Не могу понять где мне нужно прописать в программе // DS18x20.temperature[pin, resolution, id]
Он же должен где то прописываться, что бы Ардуино понимал с какого пина ему считывать данные.
И при запросе с командной строки zabbix_get -s 192.168.0.1 -k "DS18x20.Temperature[2,9,0x284bd6d4010000f5]" не выдает температуру.
Уже не знаю куда мне копать!
C zabbix пингую Arduino.
Посылаю запрос,а ответа с температрного датчика нет((((((
Вы в мануале нашли раздел "Датчики окружающей среды"? Что там написано сразу под "DS18x20.temperature[pin, resolution, id]" ?
С этим рахобрался.
Почему теперь не корректно опрашивает температру.
Почему Вы указываете пин #2, если датчик на восьмом?
Сейчас датьчик подключен на 2 пин.
и вот что получается:
Ну, сделайте ow.scan[2]
Ну, это может быть, конечно. Zabbix v4 мне всю лысину проел уже - "сделали удобненько", сломав совместимость с ранними версиями. Наверное не все баги вытестировал ещё.
В крайнем случае можно id вообще не писать - первый ответивший на шине термометр должен сдать температуру.
да,у меня стоит 4.0.
То есть это не у меня руки кривые)))))
Что не могу подключить датчик))))
То есть,если будет Zabbix 3.0 то все будет работать?
Правильно я Вас понял?
Насчёт рук - не знаю, но сам я всё ещё на v2.4 и v3.4 сижу, там ключ plain text-ом заходит и с ним проблем нет. А в v4 устроили Холокост - plain text не поддерживается вовсе, нужно бинарный пакет формировать. А так, как прожект никто не финансирует, полное покрытие тестами на все существующие версии мне устраивать не сильно интересно. В целом я попроверял отдельные ключи - работало с zabbix_get от v4. А этот, видать, пропустил...
Ну, чтобы убедится в этом точно, можно дёрнуть zabbix_get с репы для 3.x и проделать тот же фокус, что и прежде. Можно даже из под винды, чтобы с пакетами не мучаться.
У меня где то валяется Zabbix 3.0.
Завтра попробую на нем все проделать,что сегодня делал с Вами.
Как поробую,отпишусь!
Надеюсь что все заработает))))
Спасибо Вам за помощь!
Вообщем УРА)))
С Zabbix 3.4 все заработало!
Может тип данных в айтеме должен быть float?