Измеряем температуру в доме, выводим инфу на сайт

Дано: cc2531 usb плата с программатором, датчики температуры и влажности Sonoff SNZB-02
Задача: на FreeBSD организовать мониторинг температуры в доме.

Примечание: сначала пытался завести на CC2652, но не смог.

Итог:

Ход решения

Для подключения ZigBee устройств и датчиков необходим шлюз, который обеспечит взаимодействие между ними. Зачастую каждый производитель выпускает шлюзы поддерживающие только устройства своей экосистемы. Не все шлюзы возможно подключить к альтернативным системам управления и не все, подключенные через шлюз устройства, могут поддерживаться, бывает, что у устройств ограничен функционал. Решить подобные проблемы и объединить наши устройства поможет USB координатор CC2531 стоимостью 5$. Заказать можно на одной известной торговой китайской торговой площадке, устройства предлагаются в двух вариантах, со встроенной и внешней подключаемой антенной, предпочтительнее второй вариант, т.к. при недостаточном уровне сигнала можно заменить антенну на более мощную.


На сайте проекта ZigBee2MQTT подробно расписан порядок действий, ниже будет представлен вольный пересказ того, что необходимо выполнить:

  • Прошивка CC2531
  • Установка Home Assistance

Прошивка СС2531 в Windows

  1. Установка flash-programmer-1.12.8
  2. Установите драйвер для CC Debuger(swrc212a)
  3. Подключите оба устройства CC2531  CC debugger к вашему компьютеру с помощью USB.
  4. Если индикатор на отладчике CC горит красным, нажмите кнопку сброса настроек на отладчике CC. Теперь индикатор на отладчике CC должен загореться зеленым. Если нет, используйте руководство пользователя CC debugger,открытое в новом окне, для устранения неполадок.
  5. Загрузите прошивку  CC2531_DEFAULT_20211115
  6. Запустите SmartRF Flash Programmer, настройте, как показано ниже, и нажмите Perform actions. Убедитесь, что выбран .hex файл, а не сам .bin!
  7. Отключаем модуль от компьютера и 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

  1. Эти пакеты я установил первыми. Другие, упомянутые выше, будут установлены позже, через 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/

Довольны?
[Оценок: 0 средняя: 0]