Благодаря доступности, небольшим размерам и энергопотреблению, а также возможности подключения различных периферийных устройств микрокомпьютер Raspberry Pi широко используется как для творчества, так и для серьезных применений. 

К сожалению, с Raspberry Pi, как и с любым другим подобным устройством, могут возникать различные проблемы, от снижения производительности из-за перегрева до полного выхода из строя. В учебных или развлекательных проектах это не приведет к ощутимым последствиям. Но если Raspberry Pi установлен в системах, требующих надежной работы, необходим контроль работоспособности микрокомпьютера.

Для каких применений будет желателен мониторинг работоспособности Raspberry Pi?

Например, если на базе Raspberry Pi создан Web-сервер, который должен быть доступен круглосуточно, роутер, система видеонаблюдения, система умного дома, система контроля какого-либо  оборудования или параметров, полученных от внешних устройств. Одно из подобных применений в сервисе SAAS интернет-магазинов — недорогой сервер управления онлайн-кассами, расположенный в офисах продаж.

В этой статье мы расскажем, как с помощью Zabbix можно организовать мониторинг работоспособности и производительности узла Raspberry Pi, контроль его напряжения питания и температуры. Также мы опишем простейшую систему обнаружения протечек воды, созданную с применением датчика MH-RD с контроллером YL-38, подключенного к шине GPIO Raspberry Pi, и сервера Zabbix.

Установка Zabbix Agent2 в ОС Raspberry Pi OS

Прежде всего, установите в Raspberry Pi OS (прежнее название Raspbian) вашего микрокомпьютера агент Zabbix Agent2. Для этого откройте страницу https://www.zabbix.com/download. Выберите на этой странице параметры установки — версию Zabbix как 6.2, операционную систему Raspberry Pi OS, вашу версию OS, например 10 (Buster), и компонент Zabbix Agent2 (рис. 1).

Рис. 1. Выбор параметров установки Zabbix Agent2
Рис. 1. Выбор параметров установки Zabbix Agent2

Узнать версию Raspberry Pi OS можно с помощью такой команды:

$ cat /etc/debian_version
10.13

В данном случае установлена Raspberry Pi OS версии 10.13, поэтому в параметрах установки агента нужно выбрать 10 (Buster).

После выбора параметров установки на странице https://www.zabbix.com/download появится инструкция.

Прежде чем начинать установку, обновите пакеты:

# apt update
# apt upgrade

Установка репозитория и сервиса zabbix-agent2

Далее установите нужный репозиторий Zabbix и выполните установку агента и программы zabbix-sender:

# wget https://repo.zabbix.com/zabbix/6.2/raspbian/pool/main/z/zabbix-release/zabbix-release_6.2-2%2Bdebian10_all.deb
# dpkg -i zabbix-release_6.2-2+debian10_all.deb
# apt update
# apt install zabbix-agent2 zabbix-sender

После установки перезапустите агент и проверьте его состояние:

# systemctl restart zabbix-agent2
# systemctl status zabbix-agent2

Настройка конфигурации агента zabbix-agent2

Для настройки конфигурации агента zabbix-agent2 отредактируйте файл /etc/zabbix/zabbix_agent2.conf.

Когда мы настраиваем конфигурацию агента, работающего на обычном физическом или виртуальном сервере, расположенном в дата-центре, то в параметре Server указываем адрес IP сервера Zabbix, а в параметре Hostname — его имя, под которым он будет добавлен в список хостов сервера Zabbix.

При этом предполагается, что агент Zabbix будет работать в так называемом пассивном режиме, когда сервер Zabbix отправляет запросы на получение метрик на контролируемый сервер по его IP адресу.

В случае Raspberry Pi часто оказывается так, что микрокомпьютер находится за роутером и получает «серый» адрес из локальной сети. При этом без настройки проброса порта на роутере не получится получить доступ к микрокомпьютеру извне по его адресу IP.

Однако можно поступить и по-другому. Достаточно перевести агент Zabbix, работающий на Raspberry Pi, в активный режим.

Для этого адрес сервера Zabbix нужно прописать в параметре ServerActive файла конфигурации /etc/zabbix/ zabbix_agent2.conf.

Активный режим предполагает, что агент Zabbix сам отправляет данные серверу Zabbix, пользуясь шаблонами, подключенными к хосту. В метриках шаблонов при этом нужно выбрать активный агент Zabbix agent (active).

Установка сервера Zabbix в Raspberry Pi OS версии 11

Начиная с версии 11 Raspberry Pi OS появилась возможность установки на Raspberry Pi полноценного сервера Zabbix (рис. 2).

Рис. 2. Установка сервера Zabbix на Raspberry Pi
Рис. 2. Установка сервера Zabbix на Raspberry Pi

При выборе Server, Frontend, Agent на странице https://www.zabbix.com/download появится соответствующая инструкция.

Надо сказать, что с точки зрения надежности микрокомпьютер Raspberry Pi — не самый лучший выбор для сервера системы мониторинга, особенно если нужно контролировать критичные системы высокой доступности. 

Даже при наличии бесперебойного источника питания Raspberry Pi и размещения микрокомпьютера в зоне с благоприятным температурным режимом, остается еще один фактор, влияющий на надежность — карта памяти microSD. 

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

Если для сервера Zabbix все же выбран Raspberry Pi, создайте несколько таких серверов для взаимного мониторинга или попробуйте использовать кластер высокой доступности Zabbix (на русском языке для версии 6.0 описание кластера можно найти здесь).

Шаблон и триггеры агента zabbix-agent2

После установки агента Zabbix Agent2 добавьте к узлу Raspberry Pi шаблон Linux by Zabbix agent active при помощи веб-интерфейса сервера Zabbix. Обратите внимание, что для работы агента в активном режиме мы подключили активный вариант шаблона.

На рис. 3 показаны подключенные шаблоны Linux by Zabbix agent active и Template Raspberry Pi (имя узла приведено только для примера). Первый из них собирает метрики, обычные для узла Linux, а второй — метрики, специфичные для Raspberry Pi (мы расскажем об этом шаблоне в следующем разделе статьи).

Рис. 3. Подключение шаблонов к узлу Raspberry Pi
Рис. 3. Подключение шаблонов к узлу Raspberry Pi

Перечень метрик и триггеров, определенных в шаблоне Linux by Zabbix agent active, вы можете найти здесь

Эти метрики позволяют контролировать загрузку процессора, свободное пространство на диске, объем свободной памяти, трафик, интенсивность переключения контекста и другие параметры, характерные для «обычного» сервера Linux.

Однако в этом шаблоне нет метрик и триггеров, специфичных для Raspberry Pi. В частности, там нет таких метрик, как температура CPU, напряжение питания микрокомпьютера и памяти microSD, метрики фиксации перехода CPU из-за перегрева в режим Throttle State с пониженной производительностью и других важных метрик. Также нет возможности мониторинга состояния шины GPIO, а значит и подключенных к ней устройств.

Для контроля только что перечисленных метрик можно использовать дополнительные шаблоны в неизменном или доработанном виде, например, шаблон zabbix-agent-on-RasPi.

Шаблон zabbix-agent-on-RasPi

Шаблон zabbix-agent-on-RasPi предназначен для сбора специфической для Raspberry Pi информации. Он доступен здесь: https://github.com/bobbolous/zabbix-agent-on-RasPi. Загрузите его и добавьте к узлу контролируемого Raspberry Pi через веб-интерфейс вашего сервера Zabbix.

На рис. 3 этот шаблон показан под именем Template Raspberry Pi.

Установка шаблона

Для установки шаблона создайте на узле Raspberry Pi каталог scripts и сделайте его текущим:

# mkdir scripts
# cd scripts

Загрузите в каталог скрипт raspberrypi.sh, входящий в состав шаблона zabbix-agent-on-RasPi, и разрешите его исполнение:

# wget https://raw.githubusercontent.com/bobbolous/zabbix-agent-on-RasPi/master/raspberrypi.sh
# sudo chmod 755 /etc/zabbix/scripts/raspberrypi.sh

Добавьте пользователя zabbix в группу video и gpio для предоставления этому пользователю необходимых разрешений:

# usermod -aG video zabbix
# usermod -aG gpio zabbix

Группа video предоставляет доступ к видеокарте или веб-камере, а группа gpio нужна для доступа к контактам интерфейса GPIO. Список групп в Raspberry Pi OS с кратким описанием можно найти здесь.

После настройки атрибутов и прав проверьте работу скрипта, получив с его помощью температуру CPU микрокомпьютера от имени пользователя zabbix:

# sudo -u zabbix /etc/zabbix/scripts/raspberrypi.sh temperature
53.2

В нашем случае CPU нагрелся до 53,2 градусов цельсия, что вполне допустимо.

После проверки работы скрипта raspberrypi.sh загрузите на свой локальный компьютер и установите на сервер Zabbix файл шаблона Template-Raspberry-Pi.xml, загрузив его с сайта.

Добавьте загруженный шаблон к контролируемому узлу Raspberry Pi.

Чтобы шаблон заработал, допишите в конец файла конфигурации агента Zabbix /etc/zabbix/zabbix_agent2.conf строку:

UserParameter=raspberrypi.sh[*],/etc/zabbix/scripts/raspberrypi.sh $1

После этого перезапустите сервис zabbix-agent2:

# service zabbix-agent2 restart
# service zabbix-agent2 status

Метрики и триггер

Через некоторое время после перезапуска агента в разделе Latest Data веб-интерфейса Zabbix для контролируемого узла Raspberry Pi появятся данные метрик (рис. 4).

Рис. 4. Данные метрик шаблона zabbix-agent-on-RasPi
Рис. 4. Данные метрик шаблона zabbix-agent-on-RasPi

На рис. 5 мы показали трафик изменения температуры CPU одного из наших микрокомпьютеров за последний час (доменное имя приведено только для примера).

Рис. 5. График изменения температуры CPU за последний час
Рис. 5. График изменения температуры CPU за последний час

В шаблоне zabbix-agent-on-RasPi определен только один триггер с уровнем серьезности Warning:

last(/Template Raspberry Pi/raspberrypi.sh[temperature])>79

Он срабатывает, когда температура CPU превышает 79 градусов.

Вы можете добавить собственные триггеры, актуальные для вашей системы.

Доработка шаблона zabbix-agent-on-RasPi

Если изучить скрипт /etc/zabbix/scripts/raspberrypi.sh, то видно, что для получения значения метрик в нем вызывается программа /opt/vc/bin/vcgencmd с различными параметрами.

Например, для определения температуры системы на чипе (system-on-a-chip, SoC) используется такая команда:

# /opt/vc/bin/vcgencmd measure_temp
temp=49.4'C

Описание параметров программы vcgencmd есть в документации: https://www.raspberrypi.com/documentation/computers/os.html#vcgencmd.

Вы можете добавить секции в скрипт raspberrypi.sh для сбора новых метрик, отредактировав соответствующим образом шаблон Template Raspberry Pi через веб-интерфейс сервера Zabbix.

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

Способ заключается в применении следующей команды:

# cat /sys/class/thermal/thermal_zone0/temp
48312

Для получения температуры в градусах Цельсия нужно разделить на 1000 значение, которое команда вывела на консоль. Но мы будем делить на 1000 не в скрипте, а настроим предварительную обработку метрики в Zabbix.

Добавьте  в оператор case такой блок:

cputemperature)
  cat /sys/class/thermal/thermal_zone0/temp
  ;;

После сохранения скрипта проверьте его работу, запустив от имени пользователя zabbix:

# sudo -u zabbix /etc/zabbix/scripts/raspberrypi.sh cputemperature
48312

Теперь перейдем к добавлению метрики в шаблон Template Raspberry Pi. Создайте метрику CPU temperature, указав параметр cputemperature в поле Key (рис. 6).

Рис. 6. Добавление метрики CPU temperature
Рис. 6. Добавление метрики CPU temperature

Обратите внимание, что в списке Type выбран активный агент Zabbix agent (active).

Чтобы включить предварительную обработку значения, полученного от скрипта raspberrypi.sh с параметром cputemperature, откройте вкладку Preprocessing. Добавьте там с помощью ссылки Add шаг Custom multiplier, передав в качестве множителя значение 0.001 (рис. 7).

Рис. 7. Добавляем предварительную обработку метрики
Рис. 7. Добавляем предварительную обработку метрики

Умножение на 0.001 эквивалентно делению на 1000, поэтому Zabbix получит в результате правильное значение температуры (рис. 8).

Рис. 8. График изменения температуры для метрики CPU temperature
Рис. 8. График изменения температуры для метрики CPU temperature

В качестве альтернативы вы можете добавить в скрипт raspberrypi.sh блок с командой, которая не потребует настройки предварительной обработки значения метрики:

# perl -e 'm/(\d+)/; $x=$1; s/\d+//; printf ("%.1f", ( $x / 1000))' -p /sys/class/thermal/thermal_zone0/temp
48.3

Здесь запускается небольшой скрипт на языке Perl, который делит полученное значение на 1000.

Обнаружение протечки воды

Приведем пример практического применения Zabbix для мониторинга оборудования, подключенного к интерфейсу GPIO микрокомпьютера Raspberry Pi. Это оборудование предназначено для обнаружения протечки воды, но подобным образом можно контролировать состояние любых других устройств, способных изменять состояние цифровых линий GPIO.

Соберем устройство, показанное на рис.  9.

Рис. 9. Устройство для контроля протечки воды
Рис. 9. Устройство для контроля протечки воды

Показанный на рис. 9 контроллер LoRa в этом проекте не используется, но его применение было описано в статье «DIY: передаем данные на километры с помощью контроллера Micro::Bit и радиомодуля EBYTE LoRa».

Датчик протечки воды

Для обнаружения протечки воды мы будем использовать датчик дождя или капель MH-RD с контроллером YL-38, созданный на базе компаратора LM393. Контроллер YL-38 показан на рис. 10.

Рис. 10. Контроллер датчика дождя или капель YL-38
Рис. 10. Контроллер датчика дождя или капель YL-38

Этот датчик с контроллером можно купить, например, на Алиэкспресс или на сайте https://supereyes.ru/catalog/Datchiki_arduino/Datchik_dozhdya_kapel_MH_RD_s_kontrollerom/.

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

Подключение контроллера YL-38

С одной стороны платы контроллера YL-38 есть два контакта для подключения датчика, а с другой — четыре контакта для подключения питания и микроконтроллера:

  • Vcc – питание датчика 3.3-5 В;

  • GND – земля;

  • A0 – переключение режима (аналоговый или цифровой);

  • D0 – цифровое значение наличия влажности (1 или 0)

Для работы с Raspberry Pi для YL-38 нужно использовать напряжение питания 3.3 В, подключив его к контакту Vcc.

Вывод GND соедините с общим проводом Ground микрокомпьютера Raspberry Pi.

Контакт D0 подключите к контакту GPIO 2 микроконтроллера (вывод с номером 3). Хорошее описание порта GPIO есть в документации.

Что же касается контакта A0, то оставьте его свободным.

Все коммутации рекомендуем выполнять, когда питание Raspberry Pi выключено. А перед включением питания проверьте дважды все соединения, чтобы не повредить микрокомпьютер из-за ошибки.

Калибровка контроллера YL-38

На плате контроллера YL-38 есть подстроечный резистор, предназначенный для калибровки. Сразу после включения питания загорится светодиод, расположенный около этого резистора. Вращая отверткой шлиц резистора, добейтесь зажигания второго светодиода, который находится на плате ближе к компаратору LM393.

Теперь убедитесь, что поверхность датчика MH-RD сухая, и поворачивайте шлиц резистора против часовой стрелки, пока второй светодиод не погаснет.

Далее опустите MH-RD в чашку с водой и медленно вращайте шлиц резистора по часовой стрелке до тех пор, пока второй светодиод вновь не загорится.

Если теперь вытащить MH-RD из воды и дать высохнуть, то второй светодиод погаснет.

Когда контроллер YL-38 определяет, что поверхность MH-RD сухая, то на выводе D0 будет значение единицы, а когда влажная — значение 0. Вы можете проверить это мультиметром.

Если все работает правильно, калибровку YL-38 можно считать оконченной.

Доработка скрипта raspberrypi.sh

Теперь добавьте в скрипт raspberrypi.sh блок, который будет читать данные с контакта GPIO 2:

moisture)
 # get YL-38 D0 data
 echo "2" > /sys/class/gpio/export
 sleep 1
 echo "in" > /sys/class/gpio/gpio2/direction
 cat /sys/class/gpio/gpio2/value
 echo "2" > /sys/class/gpio/unexport
 ;;

Здесь в первой строке скрипт активирует порт GPIO 2. Далее выполняется задержка на одну секунду, чтобы дождаться окончания активации.

После этого скрипт настраивает порт  GPIO 2 для ввода информации и выводит полученное из него цифровое значение:

echo "in" > /sys/class/gpio/gpio2/direction
cat /sys/class/gpio/gpio2/value

Затем скрипт деактивирует порт GPIO 2.

Данная процедура описана здесь (за исключением необходимой задержки).

Подготовив скрипт, проверьте его работу:

# sudo -u zabbix /etc/zabbix/scripts/raspberrypi.sh moisture
1

Если вы получили сообщение об ошибке, убедитесь, что пользователь zabbix был добавлен в группу gpio:

# usermod -aG gpio zabbix

Добавление метрики в шаблон

После отладки измененного скрипта raspberrypi.sh добавьте в шаблон Template Raspberry Pi метрику Moisture State (рис. 11).

Рис. 11. Добавление метрики Moisture State в шаблон Template Raspberry Pi
Рис. 11. Добавление метрики Moisture State в шаблон Template Raspberry Pi

При добавлении метрики выберите в поле Type строку Zabbix agent (active).

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

last(/Template Raspberry Pi/raspberrypi.sh[moisture])=0

Теперь вы можете настроить для этого триггера, например, отправку SMS на ваш номер, если обнаружена протечка.

На рис. 12 мы показали график изменения метрики обнаружения протечки, полученный в результате манипуляций с датчиком MH-RD и чашкой с водой.

Рис. 12. График изменения метрики обнаружения протечки воды
Рис. 12. График изменения метрики обнаружения протечки воды

Разумеется, детектор протечки воды, сделанный подобным образом, годится лишь как учебный проект. Мы рассказали о нем для иллюстрации возможности мониторинга оборудования, подключенного к Raspberry Pi. В серьезных случаях для защиты от протечек лучше использовать промышленные решения.

Файлы к статье

Модифицированные файлы шаблона zabbix-agent-on-RasPi и скрипта raspberrypi.sh можно загрузить здесь:

https://github.com/AlexandreFrolov/shop2you_zabbix_monitoring/blob/main/Template-Raspberry-Pi-2.xml
https://github.com/AlexandreFrolov/shop2you_zabbix_monitoring/blob/main/raspberrypi.sh

Автор: Александр Фролов.


НЛО прилетело и оставило здесь промокод для читателей нашего блога:

— 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.

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


  1. OptimumOption
    10.10.2022 11:20
    +1

    Логичнее был бы заголовок "Мониторинг IoT с помощью Zabbix на базе Raspberry Pi"


  1. smart_pic
    10.10.2022 14:38

    А всего навсего можно было взять это https://www.chipdip.ru/product/pic-micro-web?ysclid=l92o7ao62r232806651

    ТСР клиентом конектиться к серверу и слать показания температуры и влажности пола. Рабочий диапазон температур минус 40 - плюс 120 градусов. При наличии РОЕ на роутере даже блок питания не нужен.

    При существующей тенденции скоро потребуется для подобной задачи компьютер не ниже четырех ядерного. (шутка)


    1. OptimumOption
      11.10.2022 12:30

      Шутите? Четырехкубитового!


  1. ilyakruchinin
    11.10.2022 02:02

    Zabbix-агент прекрасно читает файлы через vfs.file.contents
    Нет никакой необходимости использовать "cat" (подпроцесс и лишний overhead).