Установка mosquitto + ZigBee2MQTT на FreeBSD
FreeBSD выбрана по следующим причинам:
- Менее требовательна к железным ресурсам.
- В портах и репозиториях есть актуальные версии необходимого программного обеспечения, которое постоянно обновляется.
- Мое теплое отношение к данной операционной системе :)
Расписывать что такое MQTT, mosquitto и ZigBee2MQTT не буду, кто не знает читаем: CC2531 + ZigBee2MQTT, отказываемся от шлюзов производителей. В качестве координатора использую USB железку CC2538, которая поддерживает ZigBee версии 3, покупалось здесь.
Подготовка
Необходимо установить git, node.js и npm. ZigBee2MQTT требует версии Node v10.x, v12.x, v14.x, v15.x или v16.x, на данный момент последняя версия Node в пакетах v16, а в портах v17, не будем отступать от документации и поставим 16 версию.
Для установки из пакетов:
# pkg install git node npm
Для установки из портов:
# cd /usr/ports/devel/git # make install clean # cd /usr/ports/www/node16/ # make install clean # cd /usr/ports/www/npm/ # make install clean
Установка и настройка mosquitto
Устанавливаем MQTT брокер mosquitto.
Установка из пакетов:
# pkg install mosquitto
Установка из портов:
# cd /usr/ports/net/mosquitto # make install clean
В файл /usr/local/etc/mosquitto/mosquitto.conf
вносим следующие изменения:
listener 1883 retain_available true autosave_interval 1800 persistence true persistence_file mosquitto.db persistence_location /var/lib/mosquitto allow_anonymous false password_file /usr/local/etc/mosquitto/passwd
Создаем нового пользователя usermosquitto с паролем passmosquitto для подключения к mosquitto:
# mosquitto_passwd -c /usr/local/etc/mosquitto/passwd usermosquitto
Добавляем сервис в автозапуск и стартуем его:
# service mosquitto enable # service mosquitto start
Установка и настройка ZigBee2MQTT
Создаем пользователя zigbee2mqtt
, от которого будет работать сервис.
pw useradd -n zigbee2mqtt -G dialer <span class="enlighter-text">-s /sbin/nologin </span>-m -w no
Создаем папку /opt/zigbee2mqtt
# mkdir -p /opt/zigbee2mqtt
Клонируем репозиторий ZigBee2MQTT:
# git clone https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
Устанавливаем права:
# chown -R <code>zigbee2mqtt</code>:<code>zigbee2mqtt</code> /opt/zigbee2mqtt
Устанавливаем зависимости:
# cd /opt/zigbee2mqtt # npm ci
При корректной установке в ответ будет выведено сообщение вида:
node-pre-gyp info ok added 456 packages in 123.456s
Сообщения уровня WARNING
игнорируем.
Редактируем файл настроек /opt/zigbee2mqtt/data/configuration.yaml
:
homeassistant: true permit_join: false mqtt: base_topic: zigbee2mqtt server: 'mqtt://localhost' user: mqttuser password: mqttpassword serial: port: /dev/cuaU0 advanced: channel: 20 log_level: debug network_key: - 11 - 22 - 33 - 44 - 55 - 66 - 77 - 88 - 99 - 00 - 99 - 88 - 77 - 66 - 55 - 44 frontend: port: 8080
Здесь:
homeassistant: true
- включение интеграции с Home Assistant.permit_join: false
- подключение новых устройств. Для подключения новых устройств необходимо выставить в true, рекомендуемое значение false во избежание подключения случайных устройств.server: 'mqtt://localhost'
- адрес сервера MQTT брокера.user: mqttuser
- пользователь с доступом к MQTT брокеру.password: mqttpassword
- пароль для доступа к MQTT брокеру.port: /dev/cuaU0
- порт устройства (в моем случае CC2538). Для доступа к порту пользователь должен входить в группуdialer
.channel: 20
- ZigBee канал.log_level: debug
- уровень ведения логов. Уровень Debug рекомендуется включать только для отладки или возникновении проблем.network_key: [ 11, 22, 33, 44, 55, 66, 77, 88, 99, 00, 99, 88, 77, 66, 55, 44 ]
- ключ шифрования ZigBee сети.port: 8080
- порт Web интерфейса.
При переезде сервиса с одного сервера на другой, как в мое случае, достаточно перенести папку data
со всем содержимым.
Запускаем ZigBee2MQTT:
# cd /opt/zigbee2mqtt # npm start
Если ошибок нет, то останавливаем программу комбинацией клавиш Ctrl+C
.
Создаем файл для запуска сервиса при старте системы.
# nano /usr/local/etc/rc.d/zigbee2mqt
Заполняем его:
#!/bin/sh # # PROVIDE: zigbee2mqtt # REQUIRE: LOGIN # KEYWORD: shutdown . /etc/rc.subr name="zigbee2mqtt" rcvar="${name}_enable" pidfile_child="/var/run/${name}.pid" pidfile="/var/run/${name}_daemon.pid" logfile="/var/log/${name}_daemon.log" : ${zigbee2mqtt_enable:="NO"} : ${zigbee2mqtt_user:="zigbee2mqtt"} : ${zigbee2mqtt_group:="zigbee2mqtt"} : ${zigbee2mqtt_data_dir:="/opt/zigbee2mqtt/data"} load_rc_config ${name} command=/usr/sbin/daemon extra_commands=upgrade export ZIGBEE2MQTT_DATA=${zigbee2mqtt_data_dir} ZIGBEE2MQTT_DIR=/opt/zigbee2mqtt upgrade_cmd="${name}_upgrade" zigbee2mqtt_upgrade() { run_rc_command stop 2>/dev/null; _rcstop_=$? (cd "$ZIGBEE2MQTT_DIR" && /usr/local/bin/npm ci) [ $? -eq 0 ] && [ ${_rcstop_} -eq 0 ] && run_rc_command start } start_precmd="${name}_prestart" zigbee2mqtt_prestart() { NODE=/usr/local/bin/node [ ! -e "${pidfile_child}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${pidfile_child}" [ ! -e "${pidfile}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${pidfile}" [ ! -e "${logfile}" ] && install -g "${zigbee2mqtt_group}" -o "${zigbee2mqtt_user}" -- /dev/null "${logfile}" rc_flags="-f -o ${logfile} -P ${pidfile} -p ${pidfile_child} $NODE ${ZIGBEE2MQTT_DIR}/cli.js ${rc_flags}" } stop_postcmd="${name}_poststop" zigbee2mqtt_poststop() { rm -f -- "${pidfile_child}" } run_rc_command "$1"
Добавляем сервис в автозапуск и стартуем его:
# chmod +x /etc/rc.d/zigbee2mqtt # service zigbee2mqtt enable # service zigbee2mqtt start
Запускаем браузер и проверяем что всё работает по адресу http://IP_ZigBee2MQTT_Server:8080
Обновление ZigBee2MQTT
Для обновления до последней версии необходимо остановить сервис ZigBee2MQTT, в каталоге программы сделать резервную копию папки data
:
# service zigbee2mqtt stop # cd /opt/zigbee2mqtt/ # cp -R data data-backup # git checkout HEAD -- npm-shrinkwrap.json
Здесь может выдать ошибку:
fatal: detected dubious ownership in repository at '/opt/zigbee2mqtt' To add an exception for this directory, call: git config --global --add safe.directory /opt/zigbee2mqtt
Если сообщение появляется, то добавляем в исключения и повторно запускаем предыдущую команду:
# git config --global --add safe.directory /opt/zigbee2mqtt # git checkout HEAD -- npm-shrinkwrap.json
Обновляем:
# git pull # npm ci
Восстанавливаем из резервной копии папку data
и запускаем сервис:
# cp -R data-backup/* data # rm -rf data-backup # service zigbee2mqtt start
Комментарии
Сам не поборол этот глюк, если такое происходит, то восстанавливаю данные из backup.
Можно скрипт сделать, который перед запуском восстанавливал папку из резервной копии, а копии делать раз в день по cron.