Homeassistant
На этой странице
Hermes Agent интегрируется с Home Assistant двумя способами:
- Шлюзовая платформа (Gateway) — подписывается на изменения состояний в реальном времени через WebSocket и реагирует на события
- Инструменты умного дома — четыре инструмента, вызываемых LLM, для запросов и управления устройствами через REST API
Настройка¶
1. Создайте долгоживущий токен доступа¶
- Откройте ваш экземпляр Home Assistant
- Перейдите в Профиль (нажмите на ваше имя на боковой панели)
- Прокрутите до раздела Долгоживущие токены доступа (Long-Lived Access Tokens)
- Нажмите Создать токен (Create Token) , дайте ему имя, например "Hermes Agent"
- Скопируйте токен
2. Настройте переменные окружения¶
[code]
# Добавьте в ~/.hermes/.env
# Обязательно: ваш долгоживущий токен доступа
HASS_TOKEN=your-long-lived-access-token
# Опционально: URL Home Assistant (по умолчанию: http://homeassistant.local:8123)
HASS_URL=http://192.168.1.100:8123
[/code]
info
Набор инструментов homeassistant автоматически включается, когда задан HASS_TOKEN. Шлюзовая платформа и инструменты управления устройствами активируются по одному токену.
3. Запустите шлюз¶
[code]
hermes gateway
[/code]
Home Assistant появится как подключённая платформа вместе с другими платформами обмена сообщениями (Telegram, Discord и т.д.).
Доступные инструменты¶
Hermes Agent регистрирует четыре инструмента для управления умным домом:
ha_list_entities¶
Получение списка сущностей Home Assistant, опционально с фильтрацией по домену или зоне.
Параметры:
domain(опционально) — Фильтр по домену сущности:light,switch,climate,sensor,binary_sensor,cover,fan,media_playerи др.area(опционально) — Фильтр по названию зоны/комнаты (сопоставляется с понятными именами):living room,kitchen,bedroomи др.
Пример:
[code]
List all lights in the living room
[/code]
Возвращает ID сущностей, состояния и понятные имена.
ha_get_state¶
Получение детального состояния одной сущности, включая все атрибуты (яркость, цвет, заданная температура, показания датчиков и т.д.).
Параметры:
entity_id(обязательно) — Сущность для запроса, напримерlight.living_room,climate.thermostat,sensor.temperature
Пример:
[code]
What's the current state of climate.thermostat?
[/code]
Возвращает: состояние, все атрибуты, временные метки последнего изменения/обновления.
ha_list_services¶
Получение списка доступных сервисов (действий) для управления устройствами. Показывает, какие действия можно выполнять для каждого типа устройств и какие параметры они принимают.
Параметры:
domain(опционально) — Фильтр по домену, напримерlight,climate,switch
Пример:
[code]
What services are available for climate devices?
[/code]
ha_call_service¶
Вызов сервиса Home Assistant для управления устройством.
Параметры:
domain(обязательно) — Домен сервиса:light,switch,climate,cover,media_player,fan,scene,scriptservice(обязательно) — Имя сервиса:turn_on,turn_off,toggle,set_temperature,set_hvac_mode,open_cover,close_cover,set_volume_levelentity_id(опционально) — Целевая сущность, напримерlight.living_roomdata(опционально) — Дополнительные параметры в виде JSON-объекта
Примеры:
[code]
Turn on the living room lights
→ ha_call_service(domain="light", service="turn_on", entity_id="light.living_room")
[/code]
[code]
Set the thermostat to 22 degrees in heat mode
→ ha_call_service(domain="climate", service="set_temperature",
entity_id="climate.thermostat", data={"temperature": 22, "hvac_mode": "heat"})
[/code]
[code]
Set living room lights to blue at 50% brightness
→ ha_call_service(domain="light", service="turn_on",
entity_id="light.living_room", data={"brightness": 128, "color_name": "blue"})
[/code]
Шлюзовая платформа: события в реальном времени¶
Адаптер шлюза Home Assistant подключается через WebSocket и подписывается на события state_changed. Когда состояние устройства меняется и соответствует вашим фильтрам, оно пересылается агенту как сообщение.
Фильтрация событий¶
Необходимая конфигурация
По умолчанию никакие события не пересылаются. Вы должны настроить хотя бы один из параметров watch_domains, watch_entities или watch_all, чтобы получать события. Без фильтров при запуске выводится предупреждение, и все изменения состояний молча игнорируются.
Настройте, какие события видит агент, в файле ~/.hermes/config.yaml в разделе extra платформы Home Assistant:
[code]
platforms:
homeassistant:
enabled: true
extra:
watch_domains:
- climate
- binary_sensor
- alarm_control_panel
- light
watch_entities:
- sensor.front_door_battery
ignore_entities:
- sensor.uptime
- sensor.cpu_usage
- sensor.memory_usage
cooldown_seconds: 30
[/code]
| Настройка | Значение по умолчанию | Описание |
|---|---|---|
watch_domains |
(нет) | Следить только за доменами сущностей (например, climate, light, binary_sensor) |
watch_entities |
(нет) | Следить только за указанными ID сущностей |
watch_all |
false |
Установите true, чтобы получать все изменения состояний (не рекомендуется для большинства настроек) |
ignore_entities |
(нет) | Всегда игнорировать эти сущности (применяется до фильтров по доменам/сущностям) |
cooldown_seconds |
30 |
Минимальное количество секунд между событиями для одной и той же сущности |
tip
Начните с небольшого набора доменов — climate, binary_sensor и alarm_control_panel покрывают большинство полезных автоматизаций. Добавляйте другие по мере необходимости. Используйте ignore_entities для подавления «шумных» датчиков, таких как температура CPU или счётчики времени работы.
Форматирование событий¶
Изменения состояний форматируются в читаемые сообщения в зависимости от домена:
| Домен | Формат |
|---|---|
climate |
«Режим HVAC изменён с 'off' на 'heat' (текущая: 21, целевая: 23)» |
sensor |
«изменилось с 21°C на 22°C» |
binary_sensor |
«сработал» / «сброшен» |
light, switch, fan |
«включён» / «выключен» |
alarm_control_panel |
«состояние сигнализации изменилось с 'armed_away' на 'triggered'» |
| (другие) | «изменилось с 'old' на 'new'» |
Ответы агента¶
Исходящие сообщения от агента доставляются как постоянные уведомления Home Assistant (через persistent_notification.create). Они отображаются на панели уведомлений HA с заголовком «Hermes Agent».
Управление подключением¶
- WebSocket с 30-секундным heartbeat для событий в реальном времени
- Автоматическое переподключение с возрастающей задержкой: 5с → 10с → 30с → 60с
- REST API для исходящих уведомлений (отдельная сессия, чтобы избежать конфликтов с WebSocket)
- Авторизация — события HA всегда авторизованы (список разрешённых пользователей не требуется, так как
HASS_TOKENаутентифицирует подключение)
Безопасность¶
Инструменты Home Assistant применяют ограничения безопасности:
Заблокированные домены
Следующие домены сервисов заблокированы для предотвращения выполнения произвольного кода на хосте HA:
shell_command— произвольные команды оболочкиcommand_line— датчики/выключатели, выполняющие командыpython_script— скриптовое выполнение Pythonpyscript— более широкая интеграция скриптовhassio— управление дополнениями, выключение/перезагрузка хостаrest_command— HTTP-запросы с сервера HA (вектор SSRF)
Попытка вызова сервисов из этих доменов возвращает ошибку.
ID сущностей проверяются по шаблону ^[a-z_][a-z0-9_]*\.[a-z0-9_]+$ для предотвращения инъекционных атак.
Примеры автоматизаций¶
Утренняя рутина¶
[code]
User: Start my morning routine
Agent:
1. ha_call_service(domain="light", service="turn_on",
entity_id="light.bedroom", data={"brightness": 128})
2. ha_call_service(domain="climate", service="set_temperature",
entity_id="climate.thermostat", data={"temperature": 22})
3. ha_call_service(domain="media_player", service="turn_on",
entity_id="media_player.kitchen_speaker")
[/code]
Проверка безопасности¶
[code]
User: Is the house secure?
Agent:
1. ha_list_entities(domain="binary_sensor")
→ checks door/window sensors
2. ha_get_state(entity_id="alarm_control_panel.home")
→ checks alarm status
3. ha_list_entities(domain="lock")
→ checks lock states
4. Reports: "All doors closed, alarm is armed_away, all locks engaged."
[/code]
Реактивная автоматизация (через события шлюза)¶
Когда агент подключён как шлюзовая платформа, он может реагировать на события:
[code]
[Home Assistant] Front Door: triggered (was cleared)
Agent automatically:
1. ha_get_state(entity_id="binary_sensor.front_door")
2. ha_call_service(domain="light", service="turn_on",
entity_id="light.hallway")
3. Sends notification: "Front door opened. Hallway lights turned on."
[/code]
- Настройка
- 1. Создайте долгоживущий токен доступа
- 2. Настройте переменные окружения
- 3. Запустите шлюз
- Доступные инструменты
ha_list_entitiesha_get_stateha_list_servicesha_call_service- Шлюзовая платформа: события в реальном времени
- Фильтрация событий
- Форматирование событий
- Ответы агента
- Управление подключением
- Безопасность
- Примеры автоматизаций
- Утренняя рутина
- Проверка безопасности
- Реактивная автоматизация (через события шлюза)