Jump to content
iT4iT.CLUB
Kitsum

Обучаем Zabbix работать с MQTT протоколом

Recommended Posts

Всем привет. Начнем как всегда с предыстории!

Цель, сбор данных с различных устройств на очень большой территории промышленного предприятия. Естественно финансирование просто огромное, хватит на большую пачку семечек и пачку индийского чая, возможно даже сдача останется, но не факт. А Вы как думали? В сказку попали? В связи с этим устройства самодельные, на базе популярных микроконтроллеров фирмы ATmel с прикрученным Ethernet. И естественно самый простой способ обмена не критической информацией - MQTT протокол. Т.к. предприятие не малое, цеха большие, то IT оборудование раскидано на агрегатах и для защиты от воздействия внешней среды, оно находится в гермозонах. Температура внутри поддерживается кондиционерами, но они, как и все в этом мире, стремятся раствориться в небытии, и с легкостью потянут за собой все оборудование, что трудится в гермозонах на благо предприятия.

И так. Для начала Вам понадобится свой брокер c MQTT клиентом. Хотя у Вас он скорее всего уже есть. Его роль может выполнять как сам zabbix сервер, так и отдельная машина. В последнем случае дополнительно потребуется установка zabbix агента.

Все инструкции и дистрибутивы имеются на официальном сайте mosquitto.org

Я использую в качестве операционной системы Linux Ubuntu и для меня все очень просто.

sudo apt-get install mosquitto mosquitto-clients

Настройка брокера - это отдельная тема и затрагивать её здесь не будем.

Вносим дополнения в конец файла конфигурации zabbix агента на сервере

nano /etc/zabbix/zabbix_agentd.conf

Добавляем пользовательский параметр MQTT

UserParameter=mqtt[*],/usr/bin/mosquitto_sub -h 127.0.0.1 -t $1 -C 1 -N 2>/dev/null

Сброс ошибок в /dev/null необходим из-за возможности их появления в случае запуска клиента от пользователя, у которого нет собственного домашнего каталога. В противном случае можно получить в довесок к выводу сопроводительное письмо со следующим текстом.

Цитата

Warning: Unable to locate configuration directory, default config not loaded.

Переходим в панель управления Zabbix.

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

mqtt[адресс необходимого топика]
mqtt[/room213/door1/lock/status]
mqtt[/garage/smoke/level]
mqtt[/room/sensors/temperature1]

Каждый ключ соответствует адресу топика с которого нужно взять ту или иную информацию. И сама структура топика просто идеальна для иерархии оборудования или ветвления расположений объектов. Но Вы и так это видите.

Создаем узел сети с ip адресом Zabbix сервера или просто 127.0.0.1, тип проверки  "Zabbix агент". Указываем интересующий нас топик и слушаем.

ВАЖНО: Клиенты рассылающие сообщения должны использовать параметр "-r, --retain" для сохранения сообщения у брокера. Без этого параметра Zabbix не сможет получить данные т.к не поддерживает постоянную связь с брокером, а лишь забирает последние данные по установленному интервалу времени.

Команда для отправки тестовой строки "message" в топик "test/string"

/usr/bin/mosquitto_pub -h 127.0.0.1 -r -t test/string -m "message"

Для начала мне потребовалось снимать показания температуры внутри и снаружи гермозон. Это экстренная необходимость т.к в случае ч.п, в зимнее время, температуры внутри может превышать 30 градусов Цельсия, а в летнее температура пола рядом со зданием в котором находится гермозона может превышать 70-80 градусов Цельсия, а про температуру оборудования я вообще молчу. И да, мы не конфеты делаем, к сожалению...

Скрытый текст

000.JPG

Для меня удобнее создать шаблон, который будет добавлен к серверу с MQTT брокером. Это дает гибкость в случае замены самого брокера или миграции сервера на другую платформу. Интересующий нас ключ отмечен на рисунке, все остальное на Ваше усмотрение.

zabbix_mqtt_1.png

Все данные показанные ниже идут с тестового стенда, установленного за пределами экстремальных зон!

Так выглядят первые элементы данных. Это показания с двух датчиков температуры и данные с внутреннего таймера микроконтроллера. Последние показания нужны для отслеживания зависания устройства. такое и мало вероятно. Но оно и имеет сторожевой таймер, лишняя перестраховка в промышленных масштабах не помешает.

zabbix_mqtt_2.png

Текущие показания.

zabbix_mqtt_3.png

Ну и естественно график, куда без него. Прост и так скудный)

zabbix_mqtt_4.png

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

Edited by Kitsum
  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

Привет друзья.

Обкатка прошла успешно и пришло время расширить функционал и обзавестись дополнительными плюшками. А именно:

  1. Добавлять устройства по реальными ip адресами, а не эмитировать их через петлю сервера 127.0.0.1
  2. Реализовать возможность подключения как к приватному брокеру с системой авторизации, так и оставить поддержку открытых брокеров
  3. Перенести весь функционал в шаблон
  4. Предусмотреть возможность использования одного шаблона с различными брокерами. А также разделить адрес топика на две части - корневой путь, который можно выстраивать динамически у каждого узла и статическую часть, несущую как смысловую нагрузку, так и сами данные.

Вам понадобится mosquitto-clients. У меня сервер под Linux Ubuntu поэтому от этого и будем отталкиваться. Если у Вас что-то иное, то действуйте по аналогии.

sudo apt-get install mosquitto-clients

Далее создаем дополнительный внешний скрипт для Zabbix. По умолчанию, все используемые сервером скрипты располагаются по адресу /usr/lib/zabbix/externalscripts

Быстро узнать какой каталог использует Ваш сервер можно так

cat /etc/zabbix/zabbix_server.conf | grep ExternalScripts

Добавляем новый скрипт и заодно выставляем на него права. В моем случае, сервер работает от имени пользователя zabbix

cd /usr/lib/zabbix/externalscripts
touch ./mqtt
chown zabbix:zabbix ./mqtt
chmod 555 ./mqtt

Скрипт станет посредником между Zabbix сервером и брокером. Его основная задача, это прием входных параметров, их подсчет и принятие решения о том чем эти самые параметры являются. А вот и сам скрипт

Скрытый текст

#!/bin/bash
if [[ $# = 0 || $# > 4 ]]
then
  echo "Bad arguments"
  exit 1
fi
BROKER="127.0.0.1"
TOPIC=""
LOGIN=""
PASSW=""
case $# in
  1 )
    TOPIC="$1"
    ;;
  2 )
    BROKER="$1"
    TOPIC="$2"
    ;;
  3 )
    TOPIC="$1"
    LOGIN="$2"
    PASSW="$3"
    ;;
  4 )
    BROKER="$1"
    TOPIC="$2"
    LOGIN="$3"
    PASSW="$4"
    ;;
esac
SELECT="/usr/bin/mosquitto_sub -h $BROKER -i zabbix -t $TOPIC -C 1 -N"
if [[ -n "$LOGIN" && -n "$PASSW" ]]
then
  SELECT="$SELECT -u $LOGIN -P $PASSW"
fi
$SELECT 2>/dev/null

 

Скрипт способен принимать до 4 входных параметров и от их количества будет зависеть то, какое место займет каждый из перечисленных параметров.

Теперь в самом zabbix сервере, при создании нового элемента данных, нам доступна внешняя проверка mqtt принимающая до 4 параметров

  1. mqtt[<топик>]
  2. mqtt[<адрес сервера>, <топик>]
  3. mqtt[<топик>, <имя пользователя>, <пароль>]
  4. mqtt[<адрес сервера>, <топик>, <имя пользователя>, <пароль>]

А вот и сам тестовый шаблон: mqtt-temperature.zip

Очень удобным решением будет использование пользовательских макросов в создаваемых шаблонах и в самих узлах. Создаем новый узел сети, теперь можно указывать его реальный ip адрес, и переходим в раздел "макросы". Макросы узла имеют приоритет над макросами прикрепленного к узлу шаблона.

zabbix-mqtt-macros1.png

Таким макросом мы можем указать корневой топик для всей веки собираемой информации. Если переключиться на "макросы узла сети и унаследованные", то мы получим весь список доступных макросов.

zabbix-mqtt-macros2.png

Таким образом мы можем указать основные настройки на уровне шаблона и вносить мелкие корректировки в эти самые настройки уже на уровне самого узла сети. Также Вы можете добавить собственные макросы и предусмотреть для них место в логике скрипта. Например, добавить возможность выбора порта брокера или иного параметра для mosquitto_sub

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

zabbix-mqtt-macros3.png

Далее работаем с ними также, как и с обычными параметрами

zabbix-mqtt-macros4.pngzabbix-mqtt-macros5.png

zabbix-mqtt-macros6.png

Для проверки работоспособности удобно использовать программу mqtt-spy

zabbix-mqtt-macros7.png

ЕЩЕ РАЗ НАПОМИНАЮ: Клиенты рассылающие сообщения должны использовать параметр "-r, --retain" для сохранения сообщения у брокера. Без этого параметра Zabbix не сможет получить данные т.к не поддерживает постоянную связь с брокером, а лишь забирает последние данные по установленному интервалу времени.

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites

Как повторить устройство, используемое для мониторинга температуры и передающее показания на zabbix через mqtt протокол, можно прочитать тут

 

Share this post


Link to post
Share on other sites

Маленькое дополнение к последнему посту с мониторингом MQTT брокера Mosquitto в реальном времени.

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

Для этих целей можно взять, как опорный, топик из раздела $SYS, например, время работы сервера

$SYS/broker/uptime

По умолчанию раздел $SYS обновляется каждые 10 секунд, но это значение может быть иным или обновления могут быть отключены полностью. Проверьте Ваше значение в конфигурационном файле /etc/mosquitto/mosquitto.conf

sys_interval 10

Далее переходим в Zabbix и создаем новый триггер. Сам Zabbix предоставляет функция nodata(), работающую совместно с траппами и возвращающую:

  • 1 - если не было получено данных за указанный промежуток времени в секундах. Период не может быть меньше 30 секунд.
  • 0 - наоборот

Таким образом, наша проверка будет выглядеть следующим образом

{broker:topic[uptime].nodata(60)}=1

или, если используются полные имена, так

{broker:topic[$SYS/broker/uptime].nodata(60)}=1

где broker - имя узла сети в Zabbix.

В итоге, мы получаем взведенный триггер, если данные о времени работе брокера не будут обновлены в течении одной минуты.

  • Thanks 1

Share this post


Link to post
Share on other sites

Добрый день! Мажордомо (и Win и Lin) у меня упорно не хочет получать данные MQTT. MQTT-Explorer, mqtt-spy, MQTTBox и mqttfx корректно работают и видят все сообщения от ESP. В своих поисках начинаю пробовать запустить Zabbix.

Вопросы:

1. на какую убунту ставить Zabbix (железо целерон, win7 работает нормально).

2. mosquitto есть на китайском роутере openwrt , оставить брокер внешним или установить на убунту с заббиксом?

Заранее благодарен за ответ.

Share this post


Link to post
Share on other sites
20.10.2017 в 15:35, Kitsum сказал:

ЕЩЕ РАЗ НАПОМИНАЮ: Клиенты рассылающие сообщения должны использовать параметр "-r, --retain" для сохранения сообщения у брокера.

а как esp будет отсылать сообщения с параметром -r?

Share this post


Link to post
Share on other sites
03.03.2017 в 15:32, Kitsum сказал:

Переходим в панель управления Zabbix.

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

Добрый день! Получилось поставить только Zabbix 4.2 из установленного на Ubuntu 16.04 образа (ISO) c оф.сайта. Москито запустился, в конф.файл добавил MQTT. А в Zabbixe не вижу MQTT. Может не там смотрю?

Скрытый текст

zabbix.thumb.jpg.cd69b2ac23faad10826e8b55ae566194.jpg

 

Share this post


Link to post
Share on other sites
17.05.2019 в 21:04, post125 сказал:

1. на какую убунту ставить Zabbix (железо целерон, win7 работает нормально).

Под любой вариант Ubuntu, будь то сервер или рабочая станция, zabbix можно поставить из готовых пакетов. Более того, zabbix не использует GUI, а весь интерфейс реализован на уровне web сервера.

17.05.2019 в 21:04, post125 сказал:

2. mosquitto есть на китайском роутере openwrt , оставить брокер внешним или установить на убунту с заббиксом?

Возможны оба варианта, но если уже есть функционирующий MQTT брокер и его работа Вас устраивает, то и смысла переносить его нет. Вы всегда успеете это сделать позже.

17.05.2019 в 21:41, post125 сказал:

а как esp будет отсылать сообщения с параметром -r?

Если использовать самую распространенную библиотеку "PubSubClient" для реализации MQTT протокола под ESP на C++, то пользователю предоставлен метод publish в качестве третьего параметра принимающий булево значение (true) для установки флага -r. Это требование необходимо выполнить только в том случае, если организовывать сбор данных в Zabbix через внешнюю проверку.

15 часов назад, post125 сказал:

А в Zabbixe не вижу MQTT. Может не там смотрю?

В web интерфейсе Zabbix визуальных изменений не произойдет. В зависимости от варианта, выбранного Вами для реализации MQTT протокола в Zabbix, Вам становятся доступны специальные ключи, принимающий в качестве параметра имя топика откуда необходимо забирать данные. Я советую Вам использовать последний вариант, в котором Zabbix ловит данные через ловушки (zabbix trapper), а транзитом данных от MQTT брокера до Zabbix занимается демон, написанный на Python. Прочитайте внимательно выделенный пост выше. Если будут сложности, то пишите.

  • Thanks 1

Share this post


Link to post
Share on other sites
20.05.2019 в 16:23, Kitsum сказал:

Возможны оба варианта, но если уже есть функционирующий MQTT брокер и его работа Вас устраивает, то и смысла переносить его нет. Вы всегда успеете это сделать позже.

Спасибо!

Брокер на роутере работает (правда пока с заббиксом не пробовал его подружить), а вон на целероне почему-то только принимает и передаёт внутри самого себя, другие устройства локальной сети его не видят.

вопрос решен, заработало из под centos7

Edited by post125

Share this post


Link to post
Share on other sites
10.11.2017 в 12:20, Kitsum сказал:

sudo crontab -u zabbix -e

Добрый день!

на centose 7 аббикc запустился, москитто то же. Пытаюсь подружить заббикс с mqtt. застрял на crontabе.

[root@localhost media]# crontab -u zabbix -e
no crontab for zabbix - using an empty one

подскажите, пожалуйста, куда копать

Share this post


Link to post
Share on other sites

@post125 Это полный текст сообщения, которое Вы получаете? Скорее всего есть еще что-то. На крайний случай, на время теста, Вы можете добавить задачу в планировщик пользователя root.

sudo crontab -e

 

  • Thanks 1

Share this post


Link to post
Share on other sites
10.11.2017 в 12:20, Kitsum сказал:

pip3 install paho-mqtt

в Убунте 18.04 (с Питоном 3,6) так не сработало

Скрытый текст

# pip3 install paho-mqtt
Invalid requirement: 'paho-'
Traceback (most recent call last):
  File "/usr/share/python-wheels/packaging-17.1-py2.py3-none-any.whl/packaging/requirements.py", line 93, in __init__
    req = REQUIREMENT.parseString(requirement_string)
  File "/usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py", line 1632, in parseString
    raise exc
  File "/usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py", line 1622, in parseString
    loc, tokens = self._parse( instring, 0 )
  File "/usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py", line 1379, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py", line 3395, in parseImpl
    loc, exprtokens = e._parse( instring, loc, doActions )
  File "/usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py", line 1383, in _parseNoCache
    loc,tokens = self.parseImpl( instring, preloc, doActions )
  File "/usr/share/python-wheels/pyparsing-2.2.0-py2.py3-none-any.whl/pyparsing.py", line 3183, in parseImpl
    raise ParseException(instring, loc, self.errmsg, self)
pyparsing.ParseException: Expected stringEnd (at char 4), (line:1, col:5)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/req/req_install.py", line 82, in __init__
    req = Requirement(req)
  File "/usr/share/python-wheels/packaging-17.1-py2.py3-none-any.whl/packaging/requirements.py", line 97, in __init__
    requirement_string[e.loc:e.loc + 8]))
pip._vendor.packaging.requirements.InvalidRequirement: Invalid requirement, parse error at "'-'"

 

работает без тройки:

Скрытый текст

# pip install paho-mqtt
Collecting paho-mqtt
  Downloading https://files.pythonhosted.org/packages/25/63/db25e62979c2a716a74950c9ed658dce431b5cb01fde29eb6cba9489a904/paho-mqtt-1.4.0.tar.gz (88kB)
    100% |████████████████████████████████| 92kB 1.3MB/s 
Building wheels for collected packages: paho-mqtt
  Running setup.py bdist_wheel for paho-mqtt ... done
  Stored in directory: /root/.cache/pip/wheels/82/e5/de/d90d0f397648a1b58ffeea1b5742ac8c77f71fd43b550fa5a5
Successfully built paho-mqtt
Installing collected packages: paho-mqtt
Successfully installed paho-mqtt-1.4.0

 

на дальнейшей работоспособности может сказаться?

На Убунте 18.04 этап с "crontab -u zabbix -e" прошел нормально, добавил @reboot /media/zabbixMqttClient.py start, запустил службу

Завтра продолжу, спасибо!

PS: если я заменю в файле zabbixMqttClient.py MQTT mqtt_server =  c  mqtt.it4it.club на  127.0.0.1, еще где-то надо будет сделать аналогичнные замены?

Edited by post125

Share this post


Link to post
Share on other sites
20.05.2019 в 16:23, Kitsum сказал:

Прочитайте внимательно выделенный пост выше. Если будут сложности, то пишите.

Прочитал неоднократно, постарался всё исполнить в точности. Сам заббикс работает(без mqtt), москитто на том же компе работает. 

в zabbixMqttClient.py:

Скрытый текст

""" Настройки MQTT """
mqtt_server = "127.0.0.1"
mqtt_port = 1883
mqtt_login = ""
mqtt_password = ""
mqtt_client_id = "zabbixServer"
mqtt_short_names = True

""" Настройки Zabbix """
zabbix_server = "127.0.0.1"
zabbix_port = 10051
zabbix_sender = "/usr/bin/zabbix_sender"

#zabbix_sender = "C:\\Zabbix Agent Installer\\bin\\win64\\zabbix_sender.exe"

""" Настройки общие """
pid_file = "/tmp/zabbixMqttClient.pid"

Демон вроде работает - команды start/stop при его запуске выполняются без ошибок, если повтроно запустить start, пишет:

root@zabbix:~# /media/zabbixMqttClient.py start
pidfile /tmp/zabbixMqttClient.pid already exist. Daemon already running?root@zabbix:~# 

в самом заббиксе импортировал шаблон, всё прописал, но данные до него не доходят:

Скрытый текст

494960287_5.thumb.jpg.daaa94492b78f5bf19532715512a68a6.jpg

 

Подскажите, пожалуйста, что не так делаю?

Share this post


Link to post
Share on other sites
26.05.2019 в 00:09, post125 сказал:

Прочитал неоднократно, постарался всё исполнить в точности. Сам заббикс работает(без mqtt), москитто на том же компе работает. 

в zabbixMqttClient.py:

  Показать содержимое

Демон вроде работает - команды start/stop при его запуске выполняются без ошибок, если повтроно запустить start, пишет:


root@zabbix:~# /media/zabbixMqttClient.py start
pidfile /tmp/zabbixMqttClient.pid already exist. Daemon already running?root@zabbix:~# 

в самом заббиксе импортировал шаблон, всё прописал, но данные до него не доходят:

  Показать содержимое

 

Подскажите, пожалуйста, что не так делаю?

Смею предположить что команда stop не гасит процесс. Попробуйте использовать команду kill и pid указаный в файле zabbixMqttClient.pid

И если потом команда start отработает коректно, то значит "копать" в сторону неотработки команды stop

  • Thanks 1

Share this post


Link to post
Share on other sites
1 час назад, Maerhekil сказал:

Смею предположить что команда stop не гасит процесс. Попробуйте использовать команду kill и pid указаный в файле zabbixMqttClient.pid

И если потом команда start отработает коректно, то значит "копать" в сторону неотработки команды stop

Благодарю за ответ. Команда stop останавливает процесс, start - запускает, всё корректно. Просто если повторно дать star, пишет ,что процесс уже запущен. Это просто косвенное подтверждение, что процесс запущен. Проблема в том, что всё , вроде, запущено, а заббикс не принимает данные.

Share this post


Link to post
Share on other sites
24 минуты назад, post125 сказал:

Благодарю за ответ. Команда stop останавливает процесс, start - запускает, всё корректно. Просто если повторно дать star, пишет ,что процесс уже запущен. Это просто косвенное подтверждение, что процесс запущен. Проблема в том, что всё , вроде, запущено, а заббикс не принимает данные.

Ну если Вы уверены и проверили, что это косвенное подтверждение. Тогда ой...

  • Thanks 1

Share this post


Link to post
Share on other sites

@post125 попробуйте запустить скрипт в консольном режиме

zabbixMqttClient.py window

В выводе получите описания этапов подключения, например

connecting...
connected
client id: server.local
subscribe on "$SYS/#"
subscribe on "kitsum/espWeatherStation/#"
subscribe on "kitsum/serverRoom/#"

Далее должен начаться вывод сообщений, полученных от брокера

2019-05-30 07:52:46 $SYS/broker/messages/sent 216459 (host: broker, key: topic[messages/sent]) server response: ...
2019-05-30 07:52:46 $SYS/broker/publish/messages/sent 34211 (host: broker, key: topic[publish/messages/sent]) server response: ...
2019-05-30 07:52:46 $SYS/broker/bytes/sent 1809731 (host: broker, key: topic[bytes/sent]) server response: ...
2019-05-30 07:52:46 $SYS/broker/publish/bytes/sent 206329 (host: broker, key: topic[publish/bytes/sent]) server response: ...

Больше информации можно получить, включив вывод логов paho, для этого надо найти строку

#mqttc.on_log = on_log

Приводим её к такому виду

mqttc.on_log = on_log

Также можно модифицировать скрипт чтобы увидеть не стандартное поведение zabbix_sender

Ищем блок

if error == None:
    output = re.search('"processed: (\d+); failed: (\d+); total: (\d+); seconds spent: (\d+\.\d+)"', out$
    if output.group(2) != '0':
        answer = 'failed (time ' + output.group(4) + ')'
    elif output.group(1) != '0':
        answer = 'processed (time ' + output.group(4) + ')'
    else:
        answer = output.group(0)
        alert(time.strftime('%Y-%m-%d %H:%M:%S ', time.localtime()) + msg.topic + ' ' + str(msg.payload.decode('utf-8')) + ' (host: ' + host + ', key: ' + key + ') server response: ' + answer)
    else:
        alert(error)
    return 0

Приводим его к такому виду

if error == None:
    output = re.search('"processed: (\d+); failed: (\d+); total: (\d+); seconds spent: (\d+\.\d+)"', out$
    if output == None:
        alert('zabbix_sender error!')
        return 0
    elif output.group(2) != '0':
        answer = 'failed (time ' + output.group(4) + ')'
    elif output.group(1) != '0':
        answer = 'processed (time ' + output.group(4) + ')'
    else:
        answer = output.group(0)
        alert(time.strftime('%Y-%m-%d %H:%M:%S ', time.localtime()) + msg.topic + ' ' + str(msg.payload.decode('utf-8')) + ' (host: ' + host + ', key: ' + key + ') server response: ' + answer)
    else:
        alert(error)
    return 0

Также стоит попробовать отправить данные через zabbix_sender руками.

zabbix_sender -vv -z 127.0.0.1 -p 1883 -s broker -k topic[my/test/path] -o 555

Где:

  1. 127.0.0.1 - имя или ip mqtt адрес сервера
  2. 1883 - порт mqtt сервера
  3. broker - имя узла в zabbix на который адресовано сообщение
  4. topic[my/test/path] - это ключ элемента данных который присутствует в шаблоне или создан руками
  5. 555 - любое значение для теста
  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites
30.05.2019 в 12:39, Kitsum сказал:

попробуйте запустить скрипт в консольном режиме

Добрый день!

Увы, не смог подружить zabbix с mqtt. К счастью заработал мажордом  на 16-й убунте. Остановлюсь на этом варианте. Спасибо, за помощь, уже что-то вырисовывается.

  • Thanks 1

Share this post


Link to post
Share on other sites

Спасибо, добрый человек за твой труд и за возможность воспользоваться твоими наработками. Респект тебе. Esp8266-Mosquitto-zabbix4.4 работает.😁

Share this post


Link to post
Share on other sites

В centos 7 имелась проблема при запуске рабочего скрипта. Ругался на загрузку модуля paho-mqtt. Решил проблему создав символьную ссылку на модуль и положил ее в каталог откуда запускаю скрипт.

Share this post


Link to post
Share on other sites

Здравствуйте! Спасибо за статью, всё в итоге получилось, пользуюсь полгода, данные поступают в Zabbix. Но если начать использовать шифрование PSK между клиентом и сервером, то поток данных прекращается. Есть ли рабочий способ победить это дело?

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

  • Similar Content

    • By Kitsum
      Всем привет, в этой статье поговорим об уже надоевшей всем теме - "Метеостанция". Каждый пытается сделать что-то свое, вот и я не стал исключением и попытался материализовать свои эротические фантазии на контроллере ESP8266. Тема задумывалась уже давно как некое обновление для предыдущего проекта этой тематики, но из-за своей неспешности переросла в нечто самостоятельное.


      При всей привлекательности микроконтроллера ESP8266 с его большим объемом памяти, железной поддержкой Wi-Fi и массой разных плюшек, он не лишен недостатков. Самый основной - ограниченное количество поддерживаемых одновременных TCP соединений равное 5. Если превысить этот лимит, то контроллер потеряет связь с окружающим миром, при этом watchdog будет думать, что все в порядке, а следовательно, даже не попытается нам помочь. Будем стараться это помнить!
      Стоит начать с концепции
      Доступ к данным метеостанции нужно получать без установки внешних приложений и под любой операционной системой. Для этих целей подойдет практически любой современный браузер. Меня всем устраивает Chrome. Раз уж за основу взят HTTP протокол, стоит озаботиться экономией трафика и ограничением числа TCP соединений. Хорошим тоном будет передача всего необходимого для формирования страницы контента только при первом обращении, а все последующие операции, такие как отображение показаний с датчиков или настройку контроллера, производить через API. В этом нам поможет JQuery. А вот, чтобы ослабить болевые ощущения от передачи файлов с SPI Flash в браузер, стоит предусмотреть систему кэширования, например, Etag. Это позволит отдавать тяжелый контент единожды, а при последующих загрузках страницы просто подтверждать его актуальность на уровне Web сервера микроконтроллера и кэш браузера вступит в игру, неимоверно уменьшив время загрузки страницы! "Вы были правы в одном, Мастер: переговоры были недолгими." © Звездные войны. Эпизод 1 Из-за того, что метеостанция с датчиками и контроллером должна располагаться на улице, жизненно необходимо предусмотреть возможность обновлять прошивку ESP через Web интерфейс. Аналогичным образом должны обновляться файлы Web сервера расположенные на SPI Flash. Этот и предыдущий пункт вкупе позволят обновлять функционал микроконтроллера из домашней сети или из интернета, если конечно в этом возникнет острая необходимость. Чтобы никто посторонний не могу вмешаться в работу устройства или изменить файлы Web сервера, последний должен хотя бы как-то себя защищать. Пускать в панель управления только после авторизации, блокировать доступ при попытках брутфорса пароля. В конце концов, контроллер обязан самостоятельно генерировать ключи (salt) для авторизации, дабы сделать алгоритм непредсказуемым и исключить потенциальный взлом, в случае если злодей завладеет исходниками проекта. Понятно, что кому она там нужна, эта метеостанция, если её не завязывать с умным домом, если только из-за спортивного интереса, но как говориться “Береженого Бог бережет”. Датчики стоит расположить по уму - в метеобудке, а вот контроллер в сухом и закрытом боксе. Объединить их между собой, как мне кажется, удобнее по I2C шине - минимум проводов, максимум удобства. Практически на всех вариантах плат ESP-xx имеется штатный светодиод, можно воспользоваться им как для индикации режимов и состояния микроконтроллера, так и для вывода какой-либо промежуточной информации. Что касаемо режимов работы ESP8266, как ни странно, но он должен находить домашнюю Wi-Fi сеть и подключаться к ней. Если вдруг звезды не были к нам благосклонны, и домашняя беспроводная сеть приказала долго жить, контроллер обязан перейти в режим точки доступа (AP) дабы к нему можно было подключиться с какого-либо устройства и перенастроить его на другую сеть. А вот пока последнее не произошло, ESP должен периодически сканировать эфир в поисках долгожданной домашней точки доступа и, если боги были к нам милосердны, и домашняя сеть появилась в эфире, незамедлительно переключиться в режим клиента (STA) и в пылу страсти воссоединиться с ней. Ну и естественно, как же без отправки данных на внешние ресурсы, сейчас без этого не обходится ни одна уважающая себя кофеварка, не говоря уже о метеостанции. Думаю, что основным блюдом станет протокол MQTT, это уже облегчает возможность интеграции с умным домом, стулом или той же кофеваркой. Ну а на закуску добавим поддержку "ThingSpeak" и "Народного мониторинга". При желании можно нарастить функционал, благо памяти у микроконтроллера еще много. Как я себе это представляю
      Учтите, что на видео, данные с датчиков, эмитируются самим микроконтроллером, это нужно для наглядности. В жизни метеорологическая обстановка намного спокойнее слава Богу.
      Перейдем к физической сборки устройства
      Как по мне, так самый оптимальный вариант, это воспользоваться отладочной платой NodeMCU V3 и базой для неё. Таким образом, мы получим отличный комплект с разведенной на его борту всей необходимой обвязкой и возможностью питать устройство от 5 до 24 Вольт.

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

      Заливаем прошивку, образ SPI Flash и подключаем четырьмя проводами датчики. Справится даже ребенок.
      Ссылки:
      Базовая плата для NodeMCU V3 с преобразователем питания 5-24V в 5V Отладочная плата ESP8266 от NodeMCU Естественно никто не запрещает Вам развести свою плату. Если Вы это сделаете, скиньте нам свое творение, возможно мы перейдем на него. В идеале, все должно размещаться в метеобудке.
      Датчики взятые за основу
      Теперь настал момент озаботиться, где описанные выше ребята будут жить. В прошлый раз мы использовали для этих целей, найденную в подножном корме, электрическую распределительную коробку. Кроме дешевизны в этом решении нет ничего положительного.
      В этот раз мы воспользуемся более серьезным вариантом – "Метеорологическая будка Стивенсона". Она способна защитить датчики от прямых воздействий окружающей среды, но при этом имеет открытую структуру со стенками в виде жалюзи. Удобно, красиво и самое главное – правильно!
      Будка печатается на 3D принтере по эскизам опубликованным на Thingiverse неким kowomike, спасибо добрый человек! Архив с эскизами можно будет скачать в конце поста.

      Фото готовой будки

      Шпилька М8 крепится через зажимной хомут к мачте уличной антенны.
      Примерка. Шпилька практически не укорачивалась, чтобы не закрывать будку параболической Wi-Fi антенной.
      Хотя в моем случае все это сделано не правильно т.к это солнечная сторона дома. Доступа на теневую сторону дома у меня нет, поэтому приходиться довольствоваться тем, что имеем. По прошлой метеостанции мне говорили "на солнечной стороне все эти измерения - сферический конь в вакууме, слепи %описание-многА-букАв% и закрепи на теневой стороне дома".
      Я пока живу в панельном многоквартирном доме, как и не малая часть нашей страны. Доступ к теневой стороне дома (а для меня, по факту, это окна в подъезде) - прямой вызов всем гопникам района трущимся рядом, любопытным соседям с бегающими глазками и всей элите человечества скрашивающей фоном мою унылую и слишком простую, по их мнению, жизнь. Думаю, что мысль я донес.

      Датчики располагаются на разных уровнях. В основании находится датчик освещенности BH1750 и смотрит ровно вниз. Мне кажется, так он будет меньше пачкаться и покрываться пылью и при этом смотреть наружу сквозь минимальное количество препятствий для солнечного света. Вообще размещение этого датчика, это целая головная боль. Как не крути, все будет не то. Оставил так, ведь по сути важны не сами показания, а тенденция изменения. Хотя кого я пытаюсь обмануть, точность важна всегда! Предлагайте свои варианты.
      Намного проще обстоят дела с датчиком атмосферного давления BMP180 и влажности SI7021, кстати, с последнего мы также будем забирать данные о температуре. Их размещаем в оставшемся свободном пространстве будки, благо его там с избытком, но не в конусе т.к пространство в нем менее проветриваемое.

      Все хозяйство подключается между собой следующим образом
      NodeMCU | ESP 07/12 | Датчики ----------------------------- D2 | GPIO 4 | SDA D1 | GPIO 5 | SCL 3.3V | 3.3V | 3.3V GND | GND | GND ВАЖНО: при финальном монтаже устройства на его место службы, обязательно установите перемычку между пинами GPIO 0 (D3) и питанием 3.3 Вольта. Причины её установки описаны в закрепленном сообщении с описание обновления от 12.08.2017.
      Сам микроконтроллер будет спрятан в уже знаменитую распределительную коробку, закрепленную на шпильке, чуть ниже будки Стивенсона. У меня все находится на стадии неторопливой сборки с попутным поиском более удачных идей.
      Плата расширения, на которой будет установлена плата NodeMCU, закреплена через ножки для крепления компьютерных материнских плат в корпусах.

      Разъемы для подключения внешних датчиков и питающей линии установил на местах где была пара штатных заглушек. Закрепил все через переходную пластину, выпиленную из куска фольгированного текстолита. Естественно, предварительно пластина была протравлена, а вся медь искоренена, ибо в этом случае она нам не друг.
      Также была предусмотрена проставка из полиэтиленового поролона (используется в качестве упаковочного материала при транспортировке грузов) между текстолитом и корпусом, общей толщиной 5мм, а после затяжки крепежных винтов, его толщина не превышает 1мм. Это было сделано из-за опыта эксплуатации предыдущего (временного) бокса для этой метеостанции. Без проставки влага быстро найдет путь вовнутрь, и срок службы устройства снизится.
      Производим примерку.
      При окончательном монтаже обязательно необходимо удалить все не плотно прилегающие части полиэтиленового поролона, то есть те части, которые располагаются снаружи и не сдавлены крепежной текстолитовой пластиной. Это необходимо сделать для препятствования накоплению влаги в доступных для неё полостях. Также пришлось увеличить число крепежных болтов для более надежного прилегания текстолита, в противном случае он может выгибаться.
      Все самое сложное позади, остается только вывести на один разъем шину i2c с питание 3.3 Вольта, а на другой подвести пины питания платы расширения. Но т.к у меня валялся "хвост" отрезанный когда-то от не рабочего блока питания маршрутизатора, и я не побрезговал им воспользоваться по прямому назначению.

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

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


      Требования (!!!Читать обязательно!!!)
      Arduino IDE с поддержкой контроллера ESP8266, версия 2.6.2 (на версиях выше работоспособность не проверялась) Установленный модуль в Arduino IDE для загрузки файлов во Flash память микроконтроллера. Как установить описано тут. Для работы модуля загрузки файлов во Flash может понадобится последняя версия Python https://www.python.org/downloads/ Любой модуль на базе ESP8266 c Flash 4MB (3MB выделяем под SPIFFS) В параметрах выставляем lwIP версии 2 и максимальную производительность (lwIP v2 Higher Bandwidth) Сам архив с последней версией проекта. Скачать можно в конце статьи или по этой ссылке.   
      Обязательные библиотеки (!!!Читать обязательно!!!)
      ArduinoJson (v5.13.5) PubSubClient Ссылки на библиотеки сенсоров указаны в комментариях к коду. Сами библиотеки, как и обслуживаемые ими сенсоры, не являются обязательными. Вы вольны использовать любые датчики, как физические, так и программные.
      Порядок установки (!!!Читать обязательно!!!)
      Изучите файлы проекта с примерами использования тех или иных сенсоров. Все файлы с примерами начинаются с префикса users_, это users_auto.h, users_bme280_x2.h и т.д. Загрузите необходимые Вам библиотеки или используйте эти файлы как пример для добавления иных датчиков. Выставите необходимые настройки для контроллера в среде разработки Arduino IDE. Пример настроек указан на скриншоте выше. Обязательно убедитесь, что выбрано правильное распределение места для внутренней файловой системы, это значит, что 3MB должно быть выделено под файловую систему. Также проверяем, чтобы использовался lwIP v2 в режиме максимальной производительности (lwIP v2 Higher Bandwidth). Произведите загрузку программы с помощью среды разработки (Ctrl + U). Произведите загрузку содержимого каталога data в файловую систему. Меню/Инструменты/ESP8266 Sketch Data Upload Перед тем как устанавливать метеостанцию на постоянное место жительства, подтянуть GPIO-0 (пин D3 на плате NodeMCU) к питанию 3.3V. Во время данной процедуры, питание на контроллере должно отсутствовать. Первый запуск (!!!Читать обязательно!!!)
      Помните, что вся конфигурация микроконтроллера производится исключительно через web интерфейс. Никаких изменений значений тех или иных параметров в коде не требуется, а подобную практику будем считать плохим тоном.
      И так, после запуска микроконтроллера он сразу перейдет в аварийный режим и поднимет собственную точку доступа с именем WeatherStation. Это нормальное поведение т.к подразумевается использование метеостанции в домашней беспроводной сети, ну а раз о ней пока ничего не известно, то и подключаться не к чему.
      Подключитесь к данной сети с любого удобного устройства и перейдите в панель управления (для этого имеется соответствующая иконка, запутаться невозможно), контроллер будет доступен по адресу http://espws.local или http://192.168.4.1 При попытке входа в панель управления будет запрошено имя пользователя и пароль, по умолчанию admin/admin. После входа в панель управления перейдите в раздел "Основные настройки WiFi" и укажите имя и пароль Вашей домашней сети, а также, при необходимости, укажите пароль для подключения к точке доступа поднимаемой контроллером в аварийном режиме. Если все сделано правильно, то контроллер подключится к домашней сети в течении 5-и минут.
      Если Ваша домашняя сеть скрыта, то после первоначальной настройки необходимо перезагрузить контроллер. Это необходимо из-за частичной поддержки работы со скрытыми сетями. После перезагрузки контроллер увидит Вашу сеть и запомнит её MAC адрес. Помните об этом если захотите сменить домашний маршрутизатор.
      Хотите помочь проекту или спонсировать новый?
      Yandex.Money PayPal.me Файлы
       
    • By Kitsum
      Шаблон и список преобразований значений для мониторинга источников бесперебойного питания фирмы APC. 
      Подробное описание можно посмотреть в следующей теме.
       
    • By Kitsum
      Модуль предназначен для системы мониторинга Zabbix. Работает в качестве отдельного демона и осуществляет транзит сообщений от брокера до хостов в системе мониторинга. Подробное описание модуля можно посмотреть в следующей теме.
       
    • By Kitsum
      Демон осуществляет транзит данных с MQTT брокера в СУБД MySQL. Можно переправлять как все сообщения, так и конкретные топики. Подробное описание можно посмотреть в следующей теме.
       
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...