Дано: cc2531 usb плата с программатором, датчики температуры и влажности Sonoff SNZB-02
Задача: на FreeBSD организовать мониторинг температуры в доме.
Примечание: сначала пытался завести на CC2652, но не смог.
Итог:
Ход решения
Для подключения ZigBee устройств и датчиков необходим шлюз, который обеспечит взаимодействие между ними. Зачастую каждый производитель выпускает шлюзы поддерживающие только устройства своей экосистемы. Не все шлюзы возможно подключить к альтернативным системам управления и не все, подключенные через шлюз устройства, могут поддерживаться, бывает, что у устройств ограничен функционал. Решить подобные проблемы и объединить наши устройства поможет USB координатор CC2531 стоимостью 5$. Заказать можно на одной известной торговой китайской торговой площадке, устройства предлагаются в двух вариантах, со встроенной и внешней подключаемой антенной, предпочтительнее второй вариант, т.к. при недостаточном уровне сигнала можно заменить антенну на более мощную.
На сайте проекта ZigBee2MQTT подробно расписан порядок действий, ниже будет представлен вольный пересказ того, что необходимо выполнить:
- Прошивка CC2531
- Установка Home Assistance
Прошивка СС2531 в Windows
- Установка flash-programmer-1.12.8
- Установите драйвер для CC Debuger(swrc212a)
- Подключите оба устройства
CC2531
CC debugger
к вашему компьютеру с помощью USB. - Если индикатор на отладчике CC горит красным, нажмите кнопку сброса настроек на отладчике CC. Теперь индикатор на отладчике CC должен загореться зеленым. Если нет, используйте руководство пользователя CC debugger,, для устранения неполадок.
- Загрузите прошивку CC2531_DEFAULT_20211115
- Запустите SmartRF Flash Programmer, настройте, как показано ниже, и нажмите
Perform actions
. Убедитесь, что выбран.hex
файл, а не сам.bin
!
- Отключаем модуль от компьютера и CC Debugger’а.
Установка Home Assistance
(далее предосталяю слово автору статьи https://dan.langille.org/2022/08/27/getting-home-assistant-running-in-a-freebsd-13-1-jail/). Работало на лето 2023, в декабре уже не работает. (( нужен питон 3.11 и дальше упёрся в ошибку «NotImplementedError: Unsupported platform: freebsd13» ERROR: Failed building wheel for zlib-ng
pkg install rust python311 py311-sqlite3 cmake
похоже тупик, на фрибсд не поставить теперь: https://github.com/home-assistant/core/issues/76278, остается вариант виртуальной машины. Иди к нему
—————————————————————————
Дальше на 17.12.2023 уже не актуально:
Дальнейшие инструкции описывают установку программного обеспечения HA на FreeBSD
- Эти пакеты я установил первыми. Другие, упомянутые выше, будут установлены позже, через pip.
root@homeassistant:/ # pkg install rust py39-pillow py39-sqlite3
Создание пользователя
Я создаю пользователя homeassistant:
root@homeassistant:/ # pw useradd homeassistant -w no -m -c "Home Assistant" root@homeassistant:/ # pw groupmod dialer -m homeassistant root@homeassistant:/ # chmod 770 /home/homeassistant
Chmod заключается в том, чтобы уберечь других от конфиденциальной информации.
Каталог установки
root@homeassistant:/ # mkdir -p /usr/local/etc/homeassistant root@homeassistant:/ # chown homeassistant:homeassistant /usr/local/etc/homeassistant
Остальное выполняется от имени пользователя homeassistant
Вышеуказанные команды были запущены от имени root пользователя.
Приведенные ниже команды выполняются от имени пользователя homeassistant.
В идеале я бы хотел, чтобы код не изменялся пользователем, который его запускает, в основном по соображениям безопасности. Последние тенденции в программном обеспечении, похоже, игнорируют такие аспекты безопасности, как этот, и предполагают, что пользователь может изменять код.
Создайте виртуальную среду
Сделайте это от имени пользователя homeassistant:
root@homeassistant:/ # su -l homeassistant homeassistant@homeassistant:~ $
Создайте виртуальную среду Python:
homeassistant@homeassistant:~ $ python3.9 -m venv /usr/local/etc/homeassistant homeassistant@homeassistant:~ $ ls -l /usr/local/etc/homeassistant total 19 drwxr-xr-x 2 homeassistant homeassistant 12 Aug 26 13:27 bin drwxr-xr-x 2 homeassistant homeassistant 2 Aug 26 13:27 include drwxr-xr-x 3 homeassistant homeassistant 3 Aug 26 13:27 lib lrwxr-xr-x 1 homeassistant homeassistant 3 Aug 26 13:27 lib64 -> lib -rw-r--r-- 1 homeassistant homeassistant 76 Aug 26 13:27 pyvenv.cfg homeassistant@homeassistant:~ $
Активируйте нашу виртуальную среду:
homeassistant@homeassistant:~ $ chmod 700 /usr/local/etc/homeassistant/bin/activate homeassistant@homeassistant:~ $ /usr/local/etc/homeassistant/bin/activate
Установка некоторых зависимостей
Установите программное обеспечение, которое не работает в виде пакетов. Это заняло около 15 секунд.
homeassistant@homeassistant:~ $ /usr/local/etc/homeassistant/bin/pip install wheel sqlalchemy fnvhash Collecting wheel Downloading wheel-0.37.1-py2.py3-none-any.whl (35 kB) Collecting sqlalchemy Downloading SQLAlchemy-1.4.40.tar.gz (8.3 MB) ---------------------------------------- 8.3/8.3 MB 19.2 MB/s eta 0:00:00 Preparing metadata (setup.py) ... done Collecting fnvhashs Downloading fnvhash-0.1.0.tar.gz (1.9 kB) Preparing metadata (setup.py) ... done Collecting greenlet!=0.4.17 Downloading greenlet-1.1.3.tar.gz (91 kB) ---------------------------------------- 91.6/91.6 KB 2.3 MB/s eta 0:00:00 Preparing metadata (setup.py) ... done Using legacy 'setup.py install' for sqlalchemy, since package 'wheel' is not installed. Using legacy 'setup.py install' for fnvhash, since package 'wheel' is not installed. Using legacy 'setup.py install' for greenlet, since package 'wheel' is not installed. Installing collected packages: fnvhash, wheel, greenlet, sqlalchemy Running setup.py install for fnvhash ... done Running setup.py install for greenlet ... done Running setup.py install for sqlalchemy ... done Successfully installed fnvhash-0.1.0 greenlet-1.1.3 sqlalchemy-1.4.40 wheel-0.37.1 WARNING: You are using pip version 22.0.4; however, version 22.2.2 is available. You should consider upgrading via the '/usr/local/etc/homeassistant/bin/python -m pip install --upgrade pip' command.
Обновите pip, потому что так сказали
Давайте просто обновим это, потому что там сказано. Эта команда завершилась примерно за 6 секунд.
homeassistant@homeassistant:~ $ /usr/local/etc/homeassistant/bin/python -m pip install --upgrade pip Requirement already satisfied: pip in /srv/homeassistant/lib/python3.9/site-packages (22.0.4) Collecting pip Downloading pip-22.2.2-py3-none-any.whl (2.0 MB) ---------------------------------------- 2.0/2.0 MB 11.3 MB/s eta 0:00:00 Installing collected packages: pip Attempting uninstall: pip Found existing installation: pip 22.0.4 Uninstalling pip-22.0.4: Successfully uninstalled pip-22.0.4 Successfully installed pip-22.2.2
Главное действо
Установите homeassistant. Это занимает около 9 минут. Полный вывод этой команды приведен здесь.
homeassistant@homeassistant:~ $ /usr/local/etc/homeassistant/bin/pip install homeassistant Collecting homeassistant Downloading homeassistant-2022.8.7-py3-none-any.whl (18.5 MB) ---------------------------------------- 18.5/18.5 MB 16.6 MB/s eta 0:00:00 Collecting python-slugify==4.0.1 Downloading python-slugify-4.0.1.tar.gz (11 kB) Preparing metadata (setup.py) ... done ... ... Building wheel for multidict (pyproject.toml) ... done Created wheel for multidict: filename=multidict-6.0.2-cp39-cp39-freebsd_13_1_release_p1_amd64.whl size=32246 sha256=8fd6edc246e35bd9cc5e3c42e4060e896f45b0d402bfacae6cfe1cafeb5dcb9e Stored in directory: /usr/home/homeassistant/.cache/pip/wheels/09/2e/af/35665f2dc3fdfa03603e3164d8d900effca39bd1ca5598f8d2 Successfully built aiohttp bcrypt ciso8601 cryptography lru-dict orjson python-slugify pyyaml yarl frozenlist MarkupSafe multidict Installing collected packages: voluptuous, text-unidecode, rfc3986, pytz, lru-dict, ifaddr, ciso8601, voluptuous-serialize, urllib3, typing-extensions, sniffio, six, pyyaml, python-slugify, PyJWT, pycparser, orjson, multidict, MarkupSafe, idna, h11, frozenlist, charset-normalizer, certifi, awesomeversion, attrs, atomicwrites-homeassistant, async-timeout, astral, yarl, requests, jinja2, cffi, bleak, anyio, aiosignal, httpcore, home-assistant-bluetooth, cryptography, bcrypt, aiohttp, httpx, homeassistant Successfully installed MarkupSafe-2.1.1 PyJWT-2.4.0 aiohttp-3.8.1 aiosignal-1.2.0 anyio-3.6.1 astral-2.2 async-timeout-4.0.2 atomicwrites-homeassistant-1.4.1 attrs-21.2.0 awesomeversion-22.6.0 bcrypt-3.1.7 bleak-0.15.1 certifi-2022.6.15 cffi-1.15.1 charset-normalizer-2.1.1 ciso8601-2.2.0 cryptography-36.0.2 frozenlist-1.3.1 h11-0.12.0 home-assistant-bluetooth-1.3.0 homeassistant-2022.8.7 httpcore-0.15.0 httpx-0.23.0 idna-3.3 ifaddr-0.1.7 jinja2-3.1.2 lru-dict-1.1.8 multidict-6.0.2 orjson-3.7.8 pycparser-2.21 python-slugify-4.0.1 pytz-2022.2.1 pyyaml-6.0 requests-2.28.1 rfc3986-1.5.0 six-1.16.0 sniffio-1.2.0 text-unidecode-1.3 typing-extensions-4.3.0 urllib3-1.26.12 voluptuous-0.13.1 voluptuous-serialize-2.5.0 yarl-1.7.2
Запуск homeassistant
Эта команда установит / соберет / скомпилирует дополнительные зависимости. Произойдет некоторая компиляция. Это может занять 10-15 минут. Полный вывод этой команды показан здесь.
В случае успеха это не должно возвращаться в командную строку, и у вас будет запущен homeassistant.
НО я заметил, что homeassistant запускается в веб-интерфейсе до завершения этой команды. Подробности смотрите в следующем разделе.
homeassistant@homeassistant:~ $ /srv/homeassistant/bin/hass --ignore-os-check -v -v -v -v Unable to find configuration. Creating default one in /home/homeassistant/.homeassistant 2022-08-27 16:02:43.322 INFO (MainThread) [homeassistant.bootstrap] Config directory: /home/homeassistant/.homeassistant 2022-08-27 16:02:43.333 INFO (SyncWorker_0) [homeassistant.loader] Loaded homeassistant from homeassistant.components.homeassistant 2022-08-27 16:02:43.334 INFO (SyncWorker_1) [homeassistant.loader] Loaded persistent_notification from homeassistant.components.persistent_notification ... 2022-08-27 16:11:42.552 INFO (MainThread) [homeassistant.core] Starting Home Assistant 2022-08-27 16:11:42.578 INFO (MainThread) [homeassistant.components.zeroconf] Starting Zeroconf broadcast WARNING: No IPv4 address found on lo0 ! 2022-08-27 16:11:42.869 WARNING (SyncWorker_2) [scapy.runtime] No IPv4 address found on lo0 ! WARNING: No IPv4 address found on lo0 ! 2022-08-27 16:11:42.910 WARNING (SyncWorker_2) [scapy.runtime] No IPv4 address found on lo0 ! WARNING: more No IPv4 address found on ix0 ! 2022-08-27 16:11:43.074 WARNING (SyncWorker_2) [scapy.runtime] more No IPv4 address found on ix0 !
-
- –ignore-os-check требуется, поскольку FreeBSD не считается допустимой операционной системой для homeassistant.
- -v помогает с выводом отладки и выяснением, какая проблема мешает успешному выполнению кода.
Если он вернется обратно в командную строку без запуска приложения, запустите команду снова, возможно, добавив еще один -v в строку. Это может подсказать вам, какой модуль отсутствует.
Работает ли он?
В другом окошке терминала я увидел, как это работает:
root@homeassistant:/ # sockstat -4 root@homeassistant:/ # sockstat -4 USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS homeassistant python3.971240 3 tcp4 10.55.0.38:46719 151.101.0.223:443 homeassistant python3.971240 4 tcp4 10.55.0.38:46720 151.101.193.63:443 homeassistant python3.968255 10 tcp4 10.55.0.38:8123 *:* homeassistant python3.968255 12 udp4 10.55.0.38:5353 *:* root sendmail 28815 4 tcp4 10.55.0.38:25 *:* root syslogd 28775 5 udp4 10.55.0.38:514 *:* root@homeassistant:/ #
Это показывает, что homeassistant запущен. Найдите порт 8123 — это то, что вы хотите вставить в свой браузер. В моем случае это 10.55.0.38:8123.
Эти две другие строки, идущие на порт 443, — это homeassistant, обращающийся к загрузке исходного кода etc для установки.
ПРИМЕЧАНИЕ: это не https соединение, здесь нет TLS. Все, что вы вводите в этом соединении с браузером, передается на сервер открытым текстом.
Страница HomeAssistant, которую вы увидите первой.
3. Установка mosquitto + ZigBee2MQTT на FreeBSD
Подготовка
Необходимо установить 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
Установка и настройка mosquitto
Устанавливаем MQTT брокер mosquitto.
Установка из пакетов:
# pkg install mosquitto
В файл /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 true #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 zigbee2mqtt:zigbee2mqtt /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
Источники: https://stupidhouse.ru/node/7/
https://dan.langille.org/2022/08/27/getting-home-assistant-running-in-a-freebsd-13-1-jail/
https://stupidhouse.ru/node/55/