Hermes-агент: настройка Zigbee2MQTT
и Sonoff на Raspberry Pi
Ты уже знаешь: Hermes — это не очередной чат-бот, а LLM-агент с долговременной памятью и доступом к shell. Именно он берёт на себя грязную работу: установку, конфигурацию, отладку Zigbee2MQTT и Mosquitto. А твоя задача — просто описать желаемое состояние умного дома. Дальше Hermes сам подключится по SSH к Raspberry Pi и сделает всё чисто, документируя каждый шаг.
В этой статье я покажу реальный промпт-диалог с агентом, который разворачивает Zigbee-шлюз с адаптером Sonoff (CC2652P или Zigbee 3.0), настраивает MQTT-брокер и готовит инфраструктуру под твой уникальный «клон» умного дома — PHP + аналитика через БД.
📦 Что нам понадобится
- Raspberry Pi 3/4/5 (или Zero 2 W) — на борту Raspberry Pi OS Lite (64bit)
- USB-адаптер Zigbee: Sonoff ZBDongle-E (рекомендую) или Sonoff ZBDongle-P
- USB-удлинитель (обязательно, чтобы избежать помех USB 3.0)
- Hermes-агент (запущен на твоём основном ПК или VPS с доступом к SSH Pi)
- Цель: чтобы zigbee2mqtt.conf и mosquitto работали, и любые датчики (Aqara, Ikea, Tuya) светились в MQTT топиках.
🔐 Шаг 1. Готовим Raspberry Pi для удалённого управления
Hermes должен заходить без паролей и знать IP. Выполни один раз руками (или скажи агенту):
# на Raspberry Pi (или через imager)
sudo raspi-config → Interface Options → SSH → Включить
# создаём ключ на стороне Hermes и копируем
ssh-copy-id pi@192.168.1.XXX
# проверяем
ssh pi@192.168.1.XXX "uname -a"
Hermes запоминает окружение — после первого успешного входа он сам будет знать, куда подключаться.
🤖 Диалог с Hermes: установка Mosquitto + Zigbee2MQTT
Ниже — реальный пример промпта, который ты отправляешь агенту. Hermes сам разбивает на шаги, выполняет команды, проверяет результат и запоминает прогресс.
> Промпт для Hermes:
"У меня Raspberry Pi по адресу 192.168.1.100, пользователь pi.
Подключись по SSH, установи и настрой:
1. Mosquitto MQTT брокер (порт 1883, слушать локально и с моего ПК)
2. Node.js 20.x и npm
3. Zigbee2MQTT последней стабильной версии
4. Адаптер Sonoff (USB) — должен быть виден как /dev/ttyACM0 или /dev/ttyUSB0
5. Конфигурация zigbee2mqtt: MQTT сервер localhost:1883, base_topic: zigbee2mqtt
6. frontend порт 8080 для отладки
7. Автозапуск через systemctl для mosquitto и zigbee2mqtt
После каждого шага проверяй и выводи статус. Используй память, чтобы не повторять команды."
📋 Что Hermes делает внутри (по шагам)
Агент выполняет shell-команды и комментирует их в логе. Ты увидишь примерно такую сессию:
🤖 [Hermes] → Обновление системы и установка Mosquitto
$ ssh pi@192.168.1.100 "sudo apt update && sudo apt install -y mosquitto mosquitto-clients"
🤖 [Hermes] → Включаем MQTT на автозапуск и открываем порт (firewall не блокирует)
$ ssh pi@192.168.1.100 "sudo systemctl enable mosquitto && sudo systemctl restart mosquitto"
🤖 [Hermes] → Устанавливаю Node.js 20 (официальный репозиторий)
$ ssh pi@192.168.1.100 "curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash - && sudo apt install -y nodejs"
🤖 [Hermes] → Клонирую Zigbee2MQTT в /opt/zigbee2mqtt
$ ssh pi@192.168.1.100 "sudo git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt && sudo chown -R pi:pi /opt/zigbee2mqtt"
🤖 [Hermes] → Установка зависимостей npm
$ ssh pi@192.168.1.100 "cd /opt/zigbee2mqtt && npm ci"
🤖 [Hermes] → Проверка USB-адаптера Sonoff
$ ssh pi@192.168.1.100 "ls -l /dev/serial/by-id/ | grep -i sonoff"
Результат: usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_V2_XXXX -> ../../ttyACM0
🤖 [Hermes] → Генерация конфига configuration.yaml
(пишет файл /opt/zigbee2mqtt/data/configuration.yaml)
# /opt/zigbee2mqtt/data/configuration.yaml
homeassistant: false
permit_join: true
mqtt:
base_topic: zigbee2mqtt
server: mqtt://localhost:1883
user: ''
password: ''
serial:
port: /dev/ttyACM0
adapter: ezsp # для Sonoff ZBDongle-E (для -P используй 'deconz')
frontend:
port: 8080
advanced:
channel: 20
pan_id: 6754
network_key: GENERATE
🔌 Адаптер Sonoff: устранение проблем с доступом
Hermes сам может добавить правило udev, чтобы не приходилось каждый раз менять права:
🤖 [Hermes] → исправляю права доступа к последовательному порту
$ ssh pi@192.168.1.100 "echo 'SUBSYSTEM==\"tty\", ATTRS{idVendor}==\"10c4\", ATTRS{idProduct}==\"ea60\", MODE=\"0666\", SYMLINK+=\"zigbee\"' | sudo tee /etc/udev/rules.d/99-zigbee.rules"
$ ssh pi@192.168.1.100 "sudo udevadm control --reload-rules && sudo udevadm trigger"
После этого адаптер Sonoff всегда доступен как /dev/zigbee — удобно и предсказуемо.
🧪 Проверка и запуск
Hermes запустит сервисы и проверит, что MQTT получает данные от Zigbee2MQTT:
🤖 [Hermes] → создаю systemd-сервис для zigbee2mqtt
$ ssh pi@192.168.1.100 "sudo tee /etc/systemd/system/zigbee2mqtt.service > /dev/null" <
🏠 Интеграция с твоим PHP + БД + MQTT-клоном
После работы Hermes у тебя в системе появляются MQTT-топики для каждого Zigbee-датчика. Твой велосипед на PHP слушает их через php-mqtt/client или просто пишет в базу:
<?php
// пример консьюмера, который сохраняет температуру в PostgreSQL
$loop = React\EventLoop\Loop::get();
$client = new PhpMqtt\Client\MQTTClient('192.168.1.100', 1883, $loop);
$client->subscribe('zigbee2mqtt/0x00158d0001a2b3c4', function ($topic, $message) {
$data = json_decode($message, true);
$pdo->prepare("INSERT INTO sensor_data (sensor_id, temp, humidity, battery) VALUES (?, ?, ?, ?)")
->execute([$data['device_id'], $data['temperature'], $data['humidity'], $data['battery']]);
}, 0);
$client->loop();
А команды на включение розетки или лампы отправляешь обратно в MQTT через топик zigbee2mqtt/FRIENDLY_NAME/set.
🧰 Что Hermes делает, если что-то идёт не так?
Благодаря долговременной памяти агент не «забывает» предыдущие попытки. При ошибке:
- 🔍 Проверяет
journalctl -u zigbee2mqtt -n 50 - 📌 Сравнивает порты:
lsusbvs конфиг - 🔁 Перезапускает службы в правильном порядке (mosquitto → zigbee2mqtt)
- 📄 Предлагает скорректировать параметры адаптера (например, сменить adapter с ezsp на zstack)
Ты просто описываешь проблему словами: «Hermes, Zigbee2MQTT не видит Sonoff, выдает permission denied» — и агент сам лечит права udev.
🧠 Заключение: ИТ как разговор с памятью
С Hermes настройка Zigbee-шлюза под PHP-умный дом перестаёт быть «квестом по гуглению ошибок». Агент не только исполняет команды, но и помнит архитектуру твоего «клона»: ему можно один раз объяснить, что ты используешь PostgreSQL, а команды в MQTT отправляешь через кастомный скрипт send.php. И при следующих задачах (обновить конфиг, добавить новый датчик) он будет действовать в рамках твоей парадигмы.
Попробуй такой подход — и ты увидишь, как обычный Raspberry Pi превращается в управляемого цифрового ассистента, а не «чёрный ящик с непонятными логами».
Комментарии
Пока нет комментариев. Будьте первым!