June 11

Страх и ненависть в HA Container (Jethome D1)

Сколько раз говорил себе не пытаться установить Home Assistant на старом или слабом железе. Прислали мне JetHome JetHub D1 и была очень простая задача - сделать пару датчиков температуры и влажности, пару герконов на вход и впн для связи с основным сервером. Как говорится, приключение на 20 минут. Поставить Home Assistant, настроить входы/выходы, но нет…

Раз на контроллере есть 1-wire, modbus и встроенный zigbee шлюз - почему бы и их не проверить. Вообще, такие наборы достаточно интересная штука, все на дин рейку, сразу тебе и входы/выходы и протоколы. Даже образ с готовым HA, брокером и zigbee есть на Supervised. Вот только спойлер - не вытянул контроллер Supervised, через некоторое время намертво вис.

Я давно хотел попробовать более сложные установки HA без аддонов - хотел - получил. Потренировался ставить HA Container , отдельно mqtt брокер, zigbee2mqtt, owserver и периферию JetHub в MQTT через mqtt-io. Только терминал, только хардкор.

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

По мнению ИИ так надо спасать Jethome D1 и через mOtt

Железо

Контроллер

Главный герой Linux контроллер JetHome JetHub D1 https://docs.jethome.ru/ru/controllers/linux/din_rail/d1.html .

Моя версия и характеристики:

  • Четырехъядерный процессор Amlogic A113X (ARM Cortex-A53) с рабочей частотой до 1,4 ГГц.
  • Оперативная память 1 ГБайт DDR3.
  • Энергонезависимая память eMMC flash 16 ГБайт.

Все бы хорошо, но вот оперативной памяти сильно не хватает, да и на сайте Home Assistant указано что нужно минимум 2 Гб оперативки, а лучше 4 гб. Однако, в версии с контейнером может быть проще.

На борту:

2 модбаса - что хорошо, так как можно настроить 2 линии связи с разными характеристиками.

Встроенный zigbee шлюз на CC2652P1

1-wire для датчиков

4 входа и 3 выхода.

Для решения локальной задачи очень даже отлично.

Датчики и реле

Я подключил 2 датчика DS18B20 https://aliclick.shop/r/c/1sxnd293uqpxijo3?erid=2SDnjcLyXXs

Для тестирования модбаса взял свое реле Modbus-Rtu модуль реле 12V, RS485/TTL 1 канал. и датчки от wirenboard Температуры и влажности WB . Датчик от wb вообще улет, данных много, дизайн прикольный - есть даже Пищалка и очень громкая, если использовать в помещении то смело заменит пожарную сигнализацию. Я собрал возможные параметры под modbus для HA тут https://gist.github.com/smirnowegor/6f6fa8f1c5a3f1a728b3bf5287ec88d9

Забавно, как из нескольких датчиков + преобразователь rs 485 + пищалка получается устройство со стоимостью почти 4,5 тыс. … ну ладно.

Для теста взял умную лампу вроде такой https://aliclick.shop/r/c/1sxncysydc4eumb6?erid=2SDnjecv68d и площадку с кнопками 4х4 https://aliclick.shop/r/c/1sxnd61hszp2g74a?erid=2SDnjd8w9GZ. Кстати для тестов очень удобная площадка, компактно и понятно.

Быстро (не очень) действие и работоспособность.

HA в конетейнере конечно сильно легче чем supervised, даже на таком железе при подключенных устройствах система имеет запас.

А ВОТ Supervised!!!!

Для сравнения с чистой системой после установки supervised - все забито под завязку.

  • Главная проблема - острая нехватка оперативной памяти и постоянное использование Swap. Это приводит к тому, что система крайне медленная и нестабильная.
  • Docker-демон (dockerd) сам по себе потребляет аномально много CPU и MEM. Это может быть связано с тем, что ему постоянно не хватает памяти для нормальной работы, или он пытается обработать множество контейнеров, которые борются за ресурсы.
  • Перенос mqtt-io в систему был успешным, но это не решило проблему с общей нехваткой памяти, так как homeassistant и dockerd все еще доминируют.

Получалось так, что через определенное время на Supervised контроллер подвисал и не реагировал ни на кнопки ни на ssh. Отлючение аддонов типа zigbee2mqtt тоже не спасно положение, ведь память забита уже на старте была.

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

У нас есть 4 входа которые подключены к 4х4 площадке, все четыре входа шустро реагирует и идут как бинарный сенсор. К ним можно прицепить как раз таки реле, которое катушкой на 220в будет подключена к розетке, а контакты в разрыв от Vout (20) и на Discrete inputs (16) как раз на вход. Замкнуто = есть электричество, размокнуто = нет элеткричества. Конечно сам контроллер и роутер должны быть на бесперебойнике. С герконами та же история, ставим в разрыв между 20 и 2м выходом (17). В Ha есть 4 входа + одна кнопка на самом контроллере

Контроллер имеет 3 независимых релейных выхода с типом контактов NO контакт. Максимальный коммутируемый переменный ток для резистивных нагрузок составляет 5A при напряжении до 250В. Механический ресурс реле - 10 000 000 переключений (о как!). Я подключил для теста 12в светодиоды пару штук. 3 реле выступают как переключатели + ещё можно отдельно включить зеленый и красный светодиоды на контроллере. Со светодиодами интересная идея, можно очень приблизительно вывести статус - если есть устройства не в сети = красным, но кто будет заглядывать в щиток а не в телеграм?

Датчики 1-wire подключаются к отдельному входу, можно собрать гирлянду из датчиков. На дальность и количество датчиков не проверял, подключил 2 для проверки. Все подключается красный +, черный -, а желтый данные. Работает через owserver который нужно отдельно установить в linux. Вот мне интересно, а как же такое устанавливается если есть Home Assistant OS. Странно что иногда отваливаются, приходится удалять и добавлять заново + перезагружать owserver.

Модбасов 2 и они отображаются как USB0 и USB1. Я подцепил реле тестовое, а к реле лампу что бы видеть как срабатывает. Хотя щелкает оно будь здоров. Работает очень шустро, может из-за короткой дистанции, но разницы со встроенным реле по скорости срабатывания я не обнаружил.

Для управления код очень простой … хотя чему тут быть сложному = вкл и выкл. Что интересно, через esphome можно намного сложнее управление сделать, вплоть до присвоения адреса, а в home assistant как то грустно. Подробнее про esphome для этого реле тут Modbus-Rtu модуль реле 12V, RS485/TTL 1 канал.

modbus:
  # Модуль на USB0 – оставляем без изменений (например, реле)
  - type: serial
    method: rtu
    name: "modbus_relay_hub"
    port: /dev/ttyUSB1  # Укажите правильный COM-порт для HA
    baudrate: 9600
    stopbits: 1
    bytesize: 8
    parity: N
    # timeout: 5  # При необходимости
    # delay: 1    # При необходимости
    switches:
      - name: "Modbus Реле"
        slave: 1
        address: 0x0000
        write_type: coil

Зигби лампа по встроенному шлюзу через zigbee2mqtt который в отдельном приложении.

Добавил системный монитор и все … подключать ещё что-то из интеграций не рискнул. Думаю можно навесить ещё устройств по зигбии и модбасу и хватит)

Простенькие автоматизации для включения кнопок и выключить все долгим удержанием.

В качестве умного дома для “гаража” вполне хватит.

В качестве питания блок на 12в 2А.

Вывод, а потом скучная установка.

Да для этого контроллера есть готовый образ с Home Assistant и он запускается. В нем даже предустановлен брокер и прочее, нашел даже HACS и УД Яндекса. Вот только этот тюнинг не вывезло железо. Поэтому и пришлось через адок пройти с установками всего по отдельности.

Когда возишься с нормальным железом как-то забываешь о трудностях. Установил супервайзд и легко добавляешь аддоны - которые просто божественно интегрированы. Когда ресурсов мало, тогда конечно нужно крутиться.

Чего я вдруг взялся за слабое железо? Мне было интересно поднять Ха на таком железе и посмотреть что можно сделать. Я был очень удивлен, что разница в потреблении ресурсов такая огромная. Даже на таком слабом железе ХА нормально работает, а “аддоны” которые стоят отдельно шустро открываются. Тут я задумиался, а может и ок свой домашний сервер сделать без аддонов.

То что все отдельно не доставляет проблем - просто заходишь на отдельный адрес для zigbee2mqtt и там уже подключаешь устройства. Все прокидывается в ХА автоматически без проблем.

Зачем ХА для простой задачи? В нем удобнее делать автоматизации, возьмем даже блупринт для разных нажатий - скачал - настроил и работает. После терминального ада это как спасение.

Мало не самих ресурсов, а оперативной памяти. А так, все работает, хоть и пришлось помучиться.

Адовая установка

При попытке подключиться через remote ssh к контроллеру - он просто виснет. Я только в процессе вспомнил про этот инструмент, а так все через nano.

Расширение Remote SSH для VS Code позволяет работать с файлами и кодом, расположенным на удаленном сервере, предоставляя при этом полный функционал локальной интегрированной среды разработки (IDE). Забудьте о навигации по файлам в nano, где каждое действие требует изучения мануала (помните Ctrl+O, Enter, Ctrl+X для сохранения и выхода?). Или о загадке vim, из которого, по слухам, можно выйти только после долгого и мучительного изучения (:wq! или :q!). Инструмент хороший, жаль что не работает на этом контроллере.

Установим образ

Качать образ с ха не надо - зря потраченное время. Аддоны хоть и предустановлены, но ими без суепрвайзд не воспользоваться.

А вот что нужно это чистая система https://fw.jethome.com/devices/jethome/D1/ В шапке можно заметить версию для SD, но нам нужна burning версия чуть ниже

И приложение USB Burning Tool v2.2.3 тоже нужно, оно где-то рядом. Его открываем и загружаем наш образ Import Image.

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

Отключаем обязательно от постоянного питания

И удерживая кнопку boot с помошью иголки подключаем к USB.

В USB Burning Tool после загрузки образа нажимаем Старт, у себя я ничего не менял. Программа немного подвиснет на 99% но завершит нормально.

SSH и начинаем.

Я использую терминал из VS Code и так как romete ssh не работает то весь мануал идет через терминал.

Разные элементы можно повторить на любом контроллере на debian. Процесс установки все по отдельности - это то ещё испытание. Чат гпт конечно помогает, но очень часто уходит в галлюцинации.

А почему бы и не мануалы от производителя … любой мануал протухает, так и тут. Эти мануалы все равно помогают.

Ощущение от процесса установки:

Что будем делать? Можно пролистнуть ниже если не потребуется какой-то шаг.

1 Установим Owserver для датчиков 1-wire

2 Поставим брокер Mosquitto и Zigbee2mqtt. Если второй может и не пригодиться, то вот без первого не будут работать встроенные реле

3 Родное приложение по управлению входами и реле.

4 Ставим Home Assistant Container

5 Добавляем в конфигурацию управление через modbus и mqtt в Home Assistant

Датчики 1-wire

Если к любому контроллеру подключен порт с 1-wire мы можем его добавить в HA. Для этого нужен OWSERVER.

Переходим в терминал и устанавливаем.

sudo apt-get install owfs ow-shell

Проверяем конфиг файла:

sudo nano /etc/owfs.conf

Найдите в нем и закомментируйте строку:

*# server: FAKE = DS18S20,DS2405*

Добавьте в файл строку:

server: w1

Теперь в файле конфигурации должны присутствовать строки:

server: port = localhost:4304 server: w1

Перезапустите службу owserver:

sudo systemctl restart owserver

Проверяем статус

systemctl status owserver

Добавляем в автозагрузку

sudo systemctl enable owserver

Когда установим Home Assistant в разделе интеграций будет добавление датчиков 1-wire

Поставим брокер Mosquitto и Zigbee2mqtt как отдельные сервисы.

Не сразу удалось установить и подружить брокер с Zigbee2mqtt - самое веселое было определение правильного порта для zigbee. Официальная инструкция конечно же устарела, особенно много произошло после появления версии Zigbee2mqtt 2.0…

Установка необходимых компонентов (Node.js, npm, pnpm, Mosquitto)

Начнем с установки всего, что нужно для работы Zigbee2MQTT. Откройте терминал на вашем JetHub H1 и выполните команды для обновления списка пакетов и самой системы:

Обновление системы:

sudo apt update sudo apt upgrade -y #Я у себя не делал апгрейд, на всякий случай.

Установка Node.js и npm. Zigbee2MQTT работает на Node.js. Установим его вместе с менеджером пакетов npm.

sudo apt install -y nodejs npm

Установка pnpm (рекомендуемый менеджер пакетов для Zigbee2MQTT). Zigbee2MQTT предпочитает использовать pnpm для управления зависимостями. Если его нет, Zigbee2MQTT может не запуститься.

sudo npm install -g pnpm

Установка Mosquitto (MQTT-брокера). Mosquitto - это легковесный MQTT-брокер, который Zigbee2MQTT использует для обмена данными с Home Assistant и другими системами.

sudo apt install -y mosquitto mosquitto-clients

Настройка Mosquitto

Теперь настроим Mosquitto, чтобы он мог принимать соединения от Zigbee2MQTT. Откройте файл конфигурации Mosquitto.

sudo nano /etc/mosquitto/mosquitto.conf

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

allow_anonymous true

pid_file /run/mosquitto/mosquitto.pid persistence true

persistence_location /var/lib/mosquitto/

log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d

port 1883

Сохраните и закройте файл. Нажмите Ctrl+O, затем Enter для сохранения, и Ctrl+X для выхода.

Перезапустите службу Mosquitto.

sudo systemctl restart mosquitto

Проверьте статус Mosquitto. Убедитесь, что Mosquitto запущен без ошибок. Ищите Active: active (running). sudo systemctl status mosquitto Если есть ошибки, просмотрите логи: sudo journalctl -u mosquitto.service -f.


Установка и настройка Zigbee2MQTT

Теперь установим и настроим саму службу Zigbee2MQTT.

Создайте директорию для Zigbee2MQTT и перейдите в нее от имени root. sudo mkdir /opt/zigbee2mqtt cd /opt/zigbee2mqtt

Загрузите Zigbee2MQTT и установите зависимости.

sudo git clone <https://github.com/Koenkk/zigbee2mqtt.git> . sudo npm install

Это может занять некоторое время.

Создайте файл конфигурации configuration.yaml.

sudo nano /opt/zigbee2mqtt/data/configuration.yam

Вставьте вашу рабочую конфигурацию, изменив IP-адрес на IP-адрес вашего Mosquitto-сервера (в нашем случае 192.168.2.41).

homeassistant: true
permit_join: true
mqtt:
  base_topic: zigbee2mqtt
  server: mqtt://192.168.2.41
serial:
  port: /dev/ttyAML2
  adapter: zstack
advanced:
  channel: 15
  pan_id: 0x1a62
  network_key: [1, 3, 5, 7, 9, 11, 13, 15, 0, 2, 4, 6, 8, 10, 12, 13]
frontend:
  enabled: true
  port: 8080
  host: 0.0.0.0

Сохраните и закройте файл. Нажмите Ctrl+O, затем Enter для сохранения, и Ctrl+X для выхода.


Создание службы systemd для Zigbee2MQTT

Создадим службу, чтобы Zigbee2MQTT запускался автоматически и работал в фоновом режиме.

Создайте файл службы.

sudo nano /etc/systemd/system/zigbee2mqtt.service

Вставьте следующее содержимое.

[Unit]
Description=zigbee2mqtt
After=network.target mosquitto.service

[Service]
ExecStart=/usr/bin/npm start
WorkingDirectory=/opt/zigbee2mqtt
User=root
Group=root
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Сохраните и закройте файл. Нажмите Ctrl+O, затем Enter для сохранения, и Ctrl+X для выхода.

Перезагрузите systemd, включите и запустите службу Zigbee2MQTT.

sudo systemctl daemon-reload

sudo systemctl enable zigbee2mqtt.service

sudo systemctl start zigbee2mqtt.service


Шаг 5: Проверка и доступ к Zigbee2MQTT

Последний, но очень важный шаг!

Проверьте статус Zigbee2MQTT.

sudo systemctl status zigbee2mqtt.service

Убедитесь, что служба активна (Active: active (running)).

Просмотрите логи Zigbee2MQTT.

sudo journalctl -u zigbee2mqtt.service -f

Вы должны увидеть сообщения об успешном подключении к Zigbee-адаптеру и к MQTT-брокеру, а затем строку: info: z2m: Zigbee2MQTT started!.

Откройте веб-интерфейс Zigbee2MQTT: Например: http://192.168.2.41:8080 `http://<IP-адрес_вашего_JetHub_H1>:8080`

Узнайте IP-адрес вашего JetHub H1. Найдите IP-адрес (например, 192.168.x.x).

ip a

Откройте веб-браузер на вашем компьютере и введите адрес:

Теперь вы должны увидеть веб-интерфейс Zigbee2MQTT, где вы сможете начать сопряжение своих Zigbee-устройств, нажимая на кнопку "Permit join (All)".

Абсолютно такой же как и аддон, только работает шустрее.

Родное приложение по управлению входами и реле.

С этим я возился дольше всего, постоянно ругался на занятые порты. Помогла частично официальная иснтрукция.

Подготовка системы и установка mqtt-io (без виртуальной среды)

Обновите список пакетов и установите необходимые утилиты:

sudo apt update sudo apt install python3-pip gpiod libgpiod-tools

Установите mqtt-io глобально (без виртуальной среды):

sudo pip3 install mqtt-io

Этой командой mqtt-io будет установлен в системный интерпретатор Python3.

Проверьте, что утилиты gpiodetect и gpioinfo доступны: sudo gpiodetect sudo gpioinfo Вы должны увидеть список обнаруженных GPIO-чипов и информации по линиям.

Анализ текущего состояния GPIO через sysfs

Проверьте содержимое каталога sysfs для GPIO:

ls -l /sys/class/gpio

Вы увидите, что там присутствуют ссылки, например, gpio522, gpio538, gpio539, gpio540, gpio541, gpio542, gpio548, gpio553, gpio555, gpio556, gpio557, gpio558. Это означает, что соответствующие GPIO-линии уже экспортированы через sysfs и могут конфликтовать с работой mqtt-io через libgpiod.

Если таких экспортированных линий нет (т.е. если в каталоге присутствует только файл export и ссылки на gpiochip), то этап unexport можно пропустить. Но в данном случае они присутствуют.

Освобождение (Unexport) конфликтующих GPIO-линий

Чтобы mqtt-io мог корректно работать с GPIO, их нужно «разэкспортировать» из sysfs. Для этого можно выполнить команду unexport для каждого номера.

Проверка вручную (по одному номеру): Например, для gpio522 выполните:

sudo sh -c "echo 522 > /sys/class/gpio/unexport"

Затем аналогично для остальных:

sudo sh -c "echo 538 > /sys/class/gpio/unexport" sudo sh -c "echo 539 > /sys/class/gpio/unexport" sudo sh -c "echo 540 > /sys/class/gpio/unexport" sudo sh -c "echo 541 > /sys/class/gpio/unexport" sudo sh -c "echo 542 > /sys/class/gpio/unexport" sudo sh -c "echo 548 > /sys/class/gpio/unexport" sudo sh -c "echo 553 > /sys/class/gpio/unexport" sudo sh -c "echo 555 > /sys/class/gpio/unexport" sudo sh -c "echo 556 > /sys/class/gpio/unexport" sudo sh -c "echo 557 > /sys/class/gpio/unexport" sudo sh -c "echo 558 > /sys/class/gpio/unexport"

Если какая-либо команда возвращает ошибку «Недопустимый аргумент», значит для этого конкретного номера unexport не требуется (линия может быть неактивной).

Автоматизация через systemd (рекомендуется): Чтобы при каждом запуске mqtt-io конфликтующие GPIO-линии освобождались автоматически, встроим нужный цикл в unit-файл. Мы используем конструкцию, которая перебирает нужные номера и игнорирует ошибки: ExecStartPre=sh -c "for N in 522 538 539 540 541 542 548 553 555 556 557 558; do echo $N > /sys/class/gpio/unexport 2>/dev/null || true; done" Эта строка будет выполняться перед запуском mqtt-io.


Настройка файла конфигурации mqtt-io

Создайте или отредактируйте файл /etc/mqtt-io.yaml.

sudo nano /etc/mqtt-io.yaml

Пример содержимого (с подставленным MQTT‑брокером и нужными параметрами): ОТСТУПЫ ВАЖНЫ! (дзен может их искажать)

mqtt:
  host: 192.168.2.41
  status_payload_running: available
  status_payload_stopped: unavailable
  status_payload_dead: unavailable
  ha_discovery:
    name: JetHub
    enabled: true

# GPIO
gpio_modules:
  - name: gpio
    module: gpiod
    chip: /dev/gpiochip0

digital_inputs:
  - name: jethub_front_button
    module: gpio
    pin: 10        # "UserButton": вход, active-low
    inverted: true
    poll_interval: 0.1
    ha_discovery:
      component: binary_sensor
      name: JetHub Front Button

  - name: jethub_input_1
    module: gpio
    pin: 46        # "Input1": вход, active-high
    poll_interval: 0.1
    ha_discovery:
      component: binary_sensor
      name: JetHub Input 1
  - name: jethub_input_2
    module: gpio
    pin: 45        # "Input2": вход, active-high
    poll_interval: 0.1
    ha_discovery:
      component: binary_sensor
      name: JetHub Input 2
  - name: jethub_input_3
    module: gpio
    pin: 44        # "Input3": вход, active-high
    poll_interval: 0.1
    ha_discovery:
      component: binary_sensor
      name: JetHub Input 3
  - name: jethub_input_4
    module: gpio
    pin: 43        # "Input4": вход, active-high
    poll_interval: 0.1
    ha_discovery:
      component: binary_sensor
      name: JetHub Input 4

digital_outputs:
  - name: stat_led_red
    module: gpio
    pin: 26        # "LedRed": выход, active-low
    inverted: true
    ha_discovery:
      component: switch
      name: JetHub stat LED red
  - name: stat_led_green
    module: gpio
    pin: 27        # "LedGreen": выход, active-low
    inverted: true
    ha_discovery:
      component: switch
      name: JetHub stat LED green
  - name: jethub_relay_1
    module: gpio
    pin: 30        # "Output1": выход, active-high
    ha_discovery:
      component: switch
      name: JetHub Relay 1
  - name: jethub_relay_2
    module: gpio
    pin: 29        # "Output2": выход, active-high
    ha_discovery:
      component: switch
      name: JetHub Relay 2
  - name: jethub_relay_3
    module: gpio
    pin: 28        # "Output3": выход, active-high
    ha_discovery:
      component: switch
      name: JetHub Relay 3

Этот файл содержит настройки для подключения к MQTT‑брокеру (без полей user и password) и для управления GPIO.


Настройка и перезапуск unit-файла systemd для mqtt-io

Откройте unit-файл /etc/systemd/system/mqtt-io.service для редактирования:

sudo nano /etc/systemd/system/mqtt-io.service

Вставьте или отредактируйте содержимое unit-файла, включив ExecStartPre с циклом unexport:

[Unit]
Description=mqtt-io
After=network.target

[Service]
ExecStartPre=sh -c "for N in 522 538 539 540 541 542 548 553 555 556 557 558; do echo $N > /sys/class/gpio/unexport 2>/dev/null || true; done"
ExecStart=python3 -m mqtt_io /etc/mqtt-io.yaml
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root

[Install]
WantedBy=multi-user.target

Сохраните изменения и выйдите (Ctrl+O, Enter, затем Ctrl+X).

Обновите настройки systemd:

sudo systemctl daemon-reload

Запустите (или перезапустите) сервис mqtt-io:

sudo systemctl restart mqtt-io

Проверьте статус сервиса:

sudo systemctl status mqtt-io

Если статус — active (running), переходите к следующему шагу.

Проверьте логи сервиса:

sudo journalctl -u mqtt-io -f

В логах должны появляться сообщения вида «Subscribed to topic…», что свидетельствует об успешном подключении к MQTT-брокеру, а ошибки «Device or resource busy» больше не должны возникать.


Функциональное тестирование

Проверка MQTT-подключения: Подпишитесь на все топики, используя, например, mosquitto_sub:

mosquitto_sub -h 192.168.2.41 -t '#' -v

Если mqtt-io публикует сообщения о состояниях GPIO (или статусы «available», «unavailable»), вы увидите вывод.

Проверка через Home Assistant (если используется): При включённом MQTT discovery в файле конфигурации должны автоматически появиться устройства с именами из поля ha_discovery (например, «JetHub Front Button», «JetHub Input 1» и т.д.).

Физическая проверка: Если у вас имеется доступ к панели устройства, попробуйте нажать кнопку или изменить состояние входа/выхода и проверьте, поступают ли соответствующие изменения через MQTT.

Установка Home Assistant Container на JetHome D1 (Armbian)

Оказалось даже проще чем я думал. Сам ХА мне показалось что работает даже быстрее чем Supervised.

Установив ”аддоны” по отдельности у нас все работает так:

Установка Docker Engine

Теперь мы установим Docker, который будет управлять контейнером Home Assistant.

Установите необходимые пакеты для установки Docker через HTTPS.

sudo apt install ca-certificates curl gnupg lsb-release -y

Добавьте официальный GPG ключ Docker.

sudo mkdir -m 0755 -p /etc/apt/keyrings curl -fsSL <https://download.docker.com/linux/debian/gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Добавьте репозиторий Docker в APT источники: Эта команда автоматически определит архитектуру вашей системы (arm64) и версию Armbian/Debian.

echo \\ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] <https://download.docker.com/linux/debian> \\ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Снова обновите список пакетов (теперь он будет включать Docker репозиторий).

sudo apt update

Установите Docker Engine, containerd и Docker Compose.

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Проверьте, что Docker установлен и работает. Вывод должен показать Active: active (running). sudo systemctl status docker

Подготовка к запуску Home Assistant в Docker

Эти шаги необходимы для удобной работы с Docker и правильного хранения данных Home Assistant.

Добавьте вашего пользователя в группу docker (рекомендовано). Это позволит вам запускать команды docker без sudo. Замените ваш_основной_пользователь на имя пользователя, под которым вы входите на JetHome D1 (например, jethome или user или root). sudo usermod -aG docker ваш_основной_пользователь ВАЖНО: После выполнения этой команды выйдите из вашей SSH-сессии и зайдите ЗАНОВО, чтобы изменения вступили в силу. Если вы планируете работать только под root, этот шаг можно пропустить, но это не рекомендуется для повседневной работы.

Создайте каталог для данных Home Assistant. Это место на вашей хост-системе, где Home Assistant будет хранить всю свою конфигурацию, базу данных и логи. Ваши данные сохранятся, даже если вы обновите или пересоздадите Docker-контейнер.

sudo mkdir /opt/homeassistant sudo chown -R 1000:1000 /opt/homeassistant

Мы используем /opt/homeassistant как стандартное место для сторонних приложений.

Права 1000:1000 (UID:GID) соответствуют внутреннему пользователю Home Assistant в контейнере.

Запуск Home Assistant Container

Теперь самый главный шаг — запуск Home Assistant в Docker-контейнере.

Запустите Home Assistant. Скопируйте и вставьте следующую команду целиком. Обязательно измените Europe/Chisinau на вашу реальную временную зону! (Список можно посмотреть командой timedatectl list-timezones на Linux).

docker run -d \\ --name homeassistant \\ --privileged \\ --restart unless-stopped \\ -e TZ=Europe/Chisinau \\ -v /opt/homeassistant:/config \\ --network host \\ ghcr.io/home-assistant/home-assistant:stable

ПОЯСНЕНИЕ:

d: Запускает контейнер в фоновом режиме.

-name homeassistant: Присваивает контейнеру легко узнаваемое имя.

-privileged: Предоставляет контейнеру расширенные привилегии. Это критично для доступа к USB-устройствам (например, Zigbee-стику) и Bluetooth.

-restart unless-stopped: Контейнер будет автоматически запускаться при старте системы, если он не был остановлен вручную.

e TZ=Europe/Chisinau: Устанавливает временную зону.

v /opt/homeassistant:/config: Монтирует каталог /opt/homeassistant на вашей хост-системе в каталог /config внутри контейнера.

-network host: Контейнер использует сетевой стек хост-системы. Это упрощает обнаружение устройств в локальной сети.

ghcr.io/home-assistant/home-assistant:stable: Указывает Docker загрузить официальный стабильный образ Home Assistant.

Дождитесь загрузки образа и запуска контейнера. Первый запуск займет некоторое время, так как Docker будет загружать образ Home Assistant (он довольно большой).

Проверьте статус Docker-контейнера Home Assistant.

docker ps -a

Вы должны увидеть контейнер homeassistant со статусом Up ... seconds/minutes.

Чтобы посмотреть логи запуска Home Assistant:

docker logs homeassistant -f

Вы увидите вывод логов. Когда Home Assistant будет готов, вы увидите сообщения о запуске веб-сервера. Нажмите Ctrl+C, чтобы выйти из логов.


Доступ к Home Assistant и дальнейшие шаги

Доступ к веб-интерфейсу Home Assistant: После того как Home Assistant полностью запустится, откройте веб-браузер и перейдите по адресу: http://<IP_адрес_Jethome_D1>:8123 Вы должны увидеть страницу приветствия Home Assistant, где вам будет предложено создать первого пользователя (администратора).

Восстановление конфигурации (если есть):

ВАЖНО: Не пытайтесь использовать прямые бэкапы от Home Assistant Supervised (файлы .tar), так как они несовместимы с Home Assistant Container.

Вам нужно будет вручную скопировать ваши конфигурационные YAML-файлы (например, configuration.yaml, automations.yaml, scripts.yaml, secrets.yaml) из ваших бэкапов в каталог /opt/homeassistant на JetHome D1.

После копирования файлов, перезапустите контейнер Home Assistant. docker restart homeassistant

Доступ к Home Assistant configuration

Переход в папку:

cd /opt/homeassistant

Открытие конфигурации

sudo nano configuration.yaml

Привычная конфигурация в неудобном терминальном виде:


Добавляем в конфигурацию управление через modbus и mqtt в Home Assistant

После первичной настройки HA можно перейти в Устройства и службы и добавить интеграцию. Адрес используем нашего HA. Все автоматически подключажется.

Включая встроенные реле

С модбас чуть сложнее, так как у нас нет редактора нормального в качестве аддона мы идем в терминал и там настраиваем конфигурацию.

cd /opt/homeassistant

Открытие конфигурации

sudo nano configuration.yaml

У меня тестовое реле и датчик температуры, поэтому конфигурация будет тестовой - но тоже рабочей. Я выбрал наиболее оптимальные параметры для датчика температуры, а дополнительные можно посмотреть на гите https://gist.github.com/smirnowegor/6f6fa8f1c5a3f1a728b3bf5287ec88d9

# Модуль на USB0 – оставляем без изменений (например, реле)
- type: serial
  method: rtu
  name: "modbus_relay_hub"
  port: /dev/ttyUSB1 # Укажите правильный COM-порт для HA
  baudrate: 9600
  stopbits: 1
  bytesize: 8
  parity: N
  # timeout: 5 # При необходимости
  # delay: 1   # При необходимости
  switches:
    - name: "Modbus Реле"
      slave: 1
      address: 0x0000
      write_type: coil

# Модуль на USB1 для датчика WB‑MSW v.4 (Modbus-адрес 191)
- type: serial
  method: rtu
  name: "modbus_msw_sensor_hub"
  port: /dev/ttyUSB0 # Укажите корректный порт для WB-MSW v.4
  baudrate: 9600
  stopbits: 1
  bytesize: 8
  parity: N
  # timeout: 5   # При необходимости
  # delay: 1     # При необходимости

  sensors:
    - name: "Modbus Адрес"
      slave: 191
      address: 128
      input_type: holding
      data_type: uint16
      unique_id: "msw_modbus_address_191"

    - name: "Влажность (0.01)"
      slave: 191
      address: 5
      input_type: input
      data_type: int16
      precision: 2
      scale: 0.01
      unit_of_measurement: "%"
      device_class: humidity
      unique_id: "msw_hum_0_01_191"

    - name: "Влажность (0.1)"
      slave: 191
      address: 1
      input_type: input
      data_type: int16
      precision: 2
      scale: 0.1
      unit_of_measurement: "%"
      device_class: humidity
      unique_id: "msw_hum_0_1_191"

    - name: "Влажность Сырая"
      slave: 191
      address: 285
      input_type: input
      data_type: int16
      precision: 2
      scale: 0.01
      unit_of_measurement: "%"
      device_class: humidity
      unique_id: "msw_raw_hum_191"

    - name: "Внутренняя Температура МК"
      slave: 191
      address: 124
      input_type: input
      data_type: int16
      precision: 2
      scale: 0.1
      unit_of_measurement: "°C"
      device_class: temperature
      unique_id: "msw_internal_temp_mcu_191"

    - name: "Напряжение Питания МК"
      slave: 191
      address: 123
      input_type: input
      data_type: uint16
      unit_of_measurement: "mV"
      device_class: voltage
      unique_id: "msw_voltage_mcu_191"

    - name: "Текущее Напряжение Питания"
      slave: 191
      address: 121
      input_type: input
      data_type: uint16
      unit_of_measurement: "mV"
      device_class: voltage
      unique_id: "msw_supply_voltage_191"

    - name: "Текущее Напряжение Питания (до усреднения)"
      slave: 191
      address: 125
      input_type: input
      data_type: uint16
      unit_of_measurement: "mV"
      device_class: voltage
      unique_id: "msw_supply_voltage_raw_191"

    - name: "Темп. Компенсация Самонагрева T/H"
      slave: 191
      address: 245
      input_type: holding
      data_type: int16
      scale: 0.01
      unit_of_measurement: "°C"
      unique_id: "msw_selfheat_comp_191"

    - name: "Температура (0.01)"
      slave: 191
      address: 4
      input_type: input
      data_type: int16
      scale: 0.01
      precision: 2
      unit_of_measurement: "°C"
      device_class: temperature
      unique_id: "msw_temp_0_01_191"

    - name: "Температура (0.1)"
      slave: 191
      address: 0
      input_type: input
      data_type: int16
      scale: 0.1
      precision: 2
      unit_of_measurement: "°C"
      device_class: temperature
      unique_id: "msw_temp_0_1_191"

    - name: "Температура Сырая"
      slave: 191
      address: 284
      input_type: input
      data_type: int16
      precision: 2
      scale: 0.01
      unit_of_measurement: "°C"
      device_class: temperature
      unique_id: "msw_raw_temp_191"

Получается так + реле.

#сделайсам #обучение #настройка #планирование #wirenboard

Способ 1 Поддержать автора

Способ 2 https://donate.stream/yoomoney410013774736621

или через криптокошелёк (Только USDT) TCHekdJZFndXpDrHZGuTmqFNcqhWBTTzPr


Связаться со мной. (Консультации, проектирование и обучение)

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

Мой телеграм канал, там все быстрее обновляется телеграм.

Сайт smart4home.ru и альтернативный Умный дом на любом этапе

Соц сети: RuTube канал Удобный дом / You Tube канал Удобный дом Яндекс Дзен: Удобный дом / InGram

Платформы специалистов: Авито / Профи.ру / Яндекс Услуги https://uslugi.yandex.ru/profile/EgorSmirnov-2294380?from=telek