Home Assistant CLI
Коннектор к Home Assistant: подключился → сделал → напечатал → вышел.
CLI: python ~/.claude/tools/ha_client.py <command>.
Когда использовать
- Прочитать/изменить состояние устройств в Home Assistant (свет, розетки, климат, сенсоры).
- Вызвать любой HA-сервис (
light.turn_on, climate.set_temperature, media_player.play_media...).
- Посмотреть историю состояний сенсора, live-поток событий, конфиг инстанса, комнаты/устройства.
HA vs Яндекс умный дом
Навыка под Яндекс IoT в паке нет — колонка ниже нужна, чтобы понять, туда ли ты
вообще пришёл, а не чтобы им пользоваться.
| Критерий |
Home Assistant (этот skill) |
Яндекс IoT |
| Где живёт |
Локально (свой сервер/RPi/Docker), работает без интернета |
Облако Яндекса |
| Устройства |
2000+ интеграций: Zigbee, Z-Wave, MQTT, ESPHome, Xiaomi, и Яндекс-устройства тоже подключаемы |
Только устройства, привязанные к аккаунту Яндекса |
| Автоматизации |
Полноценные (triggers/conditions/scripts), история, дашборды |
Сценарии Алисы, проще |
| Голос |
Опционально (в т.ч. проброс в Алису) |
Алиса нативно |
| Когда брать |
Нужен локальный контроль, не-Яндекс устройства, history/events, сложные автоматизации |
Устройства уже в Яндекс-экосистеме и нужен быстрый доступ/Алиса |
Если HA-инстанса нет, CLI при отсутствии кредов сам печатает, что настроить.
Установка / настройка
- Нужен работающий HA-инстанс (Home Assistant OS на RPi/mini-PC или Docker:
docker run -d --name homeassistant --network=host ghcr.io/home-assistant/home-assistant:stable).
- Токен: HA web UI → профиль (слева внизу) → вкладка Security → Long-lived access tokens → Create Token.
- Свои значения — в переменные окружения или в свой
~/.claude/.credentials.master.env
(образец — ~/.claude/templates/.credentials.master.env.example; в репозиторий — никогда):
HA_URL — базовый URL, например http://homeassistant.local:8123 или http://192.168.x.x:8123
HA_TOKEN — long-lived access token из шага 2
- Зависимости:
pip install requests websockets — requests для REST, websockets для
events/areas/devices. Проверено на websockets 15.x.
Команды
| Команда |
Что делает |
API |
ping |
Жив ли API |
GET /api/ |
states [--domain light] |
Все состояния, фильтр по домену |
GET /api/states |
get <entity_id> |
Одна сущность + атрибуты |
GET /api/states/<id> |
call <domain> <service> [--entity id] [--data '{...}'] |
Любой сервис |
POST /api/services/<d>/<s> |
on <entity_id> / off <entity_id> / toggle <entity_id> |
Быстрые шорткаты |
homeassistant.turn_on/turn_off/toggle |
history <entity_id> [--hours 24] |
История состояний |
GET /api/history/period/<ts> |
events [--type state_changed] [--limit 50] |
Live-поток событий (WS), остановка по лимиту или Ctrl+C |
WS subscribe_events |
config |
Версия, локация, компоненты |
GET /api/config |
areas / devices |
Комнаты / устройства |
WS config/area_registry/list, config/device_registry/list — внутренний frontend-API, не гарантирован между версиями; CLI честно сообщит, если команда недоступна |
У каждой команды есть --json (машинный вывод) и --help.
Примеры
# Проверка связи
python ~/.claude/tools/ha_client.py ping
# Весь свет в доме
python ~/.claude/tools/ha_client.py states --domain light
# Включить свет на кухне на 50% яркости
python ~/.claude/tools/ha_client.py call light turn_on --entity light.kitchen --data '{"brightness_pct": 50}'
# Просто вкл/выкл/переключить
python ~/.claude/tools/ha_client.py on switch.heater
python ~/.claude/tools/ha_client.py toggle light.bedroom
# Температура за 12 часов
python ~/.claude/tools/ha_client.py history sensor.living_room_temperature --hours 12
# Следить за изменениями состояний (20 событий и выход)
python ~/.claude/tools/ha_client.py events --type state_changed --limit 20
# JSON для скриптов
python ~/.claude/tools/ha_client.py states --domain sensor --json
Гочи
- Креды не заданы → exit 2 + печать инструкции по настройке (не трейсбек). Так и задумано, пока HA-инстанса нет.
on/off/toggle идут через универсальный домен homeassistant.* — работают для light/switch/fan/media_player и т.п.; для доменных параметров (яркость, цвет, температура) — используй call с --data.
--data — строго JSON в одинарных кавычках снаружи (PowerShell: --data '{\"brightness\": 128}' или через Git Bash без экранирования).
history использует UTC-таймстамп в URL (закодированный +00:00) — окно задаётся --hours, не датами.
events без --type подписывается на ВСЕ события — на живом инстансе это шумно; обычно нужен --type state_changed.
areas/devices — WebSocket-команды внутреннего API реестров (их использует frontend HA). В официальной REST-документации их нет; стабильны годами, но формально «требуют проверки» на конкретной версии HA — при недоступности CLI сообщит об этом явно.
- 401 → токен отозван/невалиден: создать новый long-lived token; 404 на
get → сущности не существует (проверь states).
- POST
/api/services/... возвращает список состояний, изменившихся за время вызова — пустой список не значит «не сработало» (например, устройство уже было в целевом состоянии).
Чек-лист
1---2name: home-assistant3description: Умный дом Home Assistant через ha_client.py: состояния, сервисы, история, события. Триггеры: «включи свет через HA», «hass».4---56# Home Assistant CLI78Коннектор к Home Assistant: подключился → сделал → напечатал → вышел.9CLI: `python ~/.claude/tools/ha_client.py <command>`.1011## Когда использовать1213- Прочитать/изменить состояние устройств в Home Assistant (свет, розетки, климат, сенсоры).14- Вызвать любой HA-сервис (`light.turn_on`, `climate.set_temperature`, `media_player.play_media`...).15- Посмотреть историю состояний сенсора, live-поток событий, конфиг инстанса, комнаты/устройства.1617### HA vs Яндекс умный дом1819Навыка под Яндекс IoT в паке нет — колонка ниже нужна, чтобы понять, туда ли ты20вообще пришёл, а не чтобы им пользоваться.2122| Критерий | Home Assistant (этот skill) | Яндекс IoT |23|----------|------------------------------|---------------------------|24| Где живёт | Локально (свой сервер/RPi/Docker), работает без интернета | Облако Яндекса |25| Устройства | 2000+ интеграций: Zigbee, Z-Wave, MQTT, ESPHome, Xiaomi, и Яндекс-устройства тоже подключаемы | Только устройства, привязанные к аккаунту Яндекса |26| Автоматизации | Полноценные (triggers/conditions/scripts), история, дашборды | Сценарии Алисы, проще |27| Голос | Опционально (в т.ч. проброс в Алису) | Алиса нативно |28| Когда брать | Нужен локальный контроль, не-Яндекс устройства, history/events, сложные автоматизации | Устройства уже в Яндекс-экосистеме и нужен быстрый доступ/Алиса |2930Если HA-инстанса нет, CLI при отсутствии кредов сам печатает, что настроить.3132## Установка / настройка33341. Нужен работающий HA-инстанс (Home Assistant OS на RPi/mini-PC или Docker:35 `docker run -d --name homeassistant --network=host ghcr.io/home-assistant/home-assistant:stable`).362. Токен: HA web UI → профиль (слева внизу) → вкладка Security → Long-lived access tokens → Create Token.373. Свои значения — в переменные окружения или в свой `~/.claude/.credentials.master.env`38 (образец — `~/.claude/templates/.credentials.master.env.example`; в репозиторий — никогда):39 - `HA_URL` — базовый URL, например `http://homeassistant.local:8123` или `http://192.168.x.x:8123`40 - `HA_TOKEN` — long-lived access token из шага 2414. Зависимости: `pip install requests websockets` — `requests` для REST, `websockets` для42 `events`/`areas`/`devices`. Проверено на websockets 15.x.4344## Команды4546| Команда | Что делает | API |47|---------|-----------|-----|48| `ping` | Жив ли API | `GET /api/` |49| `states [--domain light]` | Все состояния, фильтр по домену | `GET /api/states` |50| `get <entity_id>` | Одна сущность + атрибуты | `GET /api/states/<id>` |51| `call <domain> <service> [--entity id] [--data '{...}']` | Любой сервис | `POST /api/services/<d>/<s>` |52| `on <entity_id>` / `off <entity_id>` / `toggle <entity_id>` | Быстрые шорткаты | `homeassistant.turn_on/turn_off/toggle` |53| `history <entity_id> [--hours 24]` | История состояний | `GET /api/history/period/<ts>` |54| `events [--type state_changed] [--limit 50]` | Live-поток событий (WS), остановка по лимиту или Ctrl+C | WS `subscribe_events` |55| `config` | Версия, локация, компоненты | `GET /api/config` |56| `areas` / `devices` | Комнаты / устройства | WS `config/area_registry/list`, `config/device_registry/list` — **внутренний frontend-API**, не гарантирован между версиями; CLI честно сообщит, если команда недоступна |5758У каждой команды есть `--json` (машинный вывод) и `--help`.5960## Примеры6162```bash63# Проверка связи64python ~/.claude/tools/ha_client.py ping6566# Весь свет в доме67python ~/.claude/tools/ha_client.py states --domain light6869# Включить свет на кухне на 50% яркости70python ~/.claude/tools/ha_client.py call light turn_on --entity light.kitchen --data '{"brightness_pct": 50}'7172# Просто вкл/выкл/переключить73python ~/.claude/tools/ha_client.py on switch.heater74python ~/.claude/tools/ha_client.py toggle light.bedroom7576# Температура за 12 часов77python ~/.claude/tools/ha_client.py history sensor.living_room_temperature --hours 127879# Следить за изменениями состояний (20 событий и выход)80python ~/.claude/tools/ha_client.py events --type state_changed --limit 208182# JSON для скриптов83python ~/.claude/tools/ha_client.py states --domain sensor --json84```8586## Гочи8788- **Креды не заданы** → exit 2 + печать инструкции по настройке (не трейсбек). Так и задумано, пока HA-инстанса нет.89- `on`/`off`/`toggle` идут через универсальный домен `homeassistant.*` — работают для light/switch/fan/media_player и т.п.; для доменных параметров (яркость, цвет, температура) — используй `call` с `--data`.90- `--data` — строго JSON в одинарных кавычках снаружи (PowerShell: `--data '{\"brightness\": 128}'` или через Git Bash без экранирования).91- `history` использует UTC-таймстамп в URL (закодированный `+00:00`) — окно задаётся `--hours`, не датами.92- `events` без `--type` подписывается на ВСЕ события — на живом инстансе это шумно; обычно нужен `--type state_changed`.93- `areas`/`devices` — WebSocket-команды внутреннего API реестров (их использует frontend HA). В официальной REST-документации их нет; стабильны годами, но формально «требуют проверки» на конкретной версии HA — при недоступности CLI сообщит об этом явно.94- 401 → токен отозван/невалиден: создать новый long-lived token; 404 на `get` → сущности не существует (проверь `states`).95- POST `/api/services/...` возвращает список состояний, изменившихся **за время вызова** — пустой список не значит «не сработало» (например, устройство уже было в целевом состоянии).9697## Чек-лист9899- [ ] `HA_URL` + `HA_TOKEN` заведены в окружении (или в своём `.credentials.master.env`)100- [ ] `ping` отвечает `API running.`101- [ ] `states` показывает сущности → entity_id для дальнейших команд брать отсюда102- [ ] Перед `call` с нестандартным сервисом — проверить его существование в HA (Developer Tools → Services); CLI не валидирует имена сервисов103- [ ] Для скриптов/агентов — всегда `--json`