[2026-09-14] eagle: family/plans/t610-home-automation.md
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
## 1. Состояние на 2026-09-14 (актуализировано 15:33 → дополнено вечерней сессией)
|
||||
|
||||
**Этап 1 ✅ · Этап 2 ✅ · Этап 3 ✅ ЗАКРЫТ.** Этап 4 — **ПОЧТИ ЗАКРЫТ (3 из 4):** ① Caddy → t610 (`mallexxx.duckdns.org` → HA на t610, HTTP 200); ② Node-RED flows перенесены, `Connected to HA`, наружу не выпущен (решение Alex «оставляем так», доступ через ingress); ③ **ZONT MQTT-редирект переключён на t610** (DNAT на роутере `.197`→`.176`, живой поток идёт). **ОСТАЛОСЬ:** погасить/отключить сервисы TrueNAS (заблокировано — Caddy на TrueNAS держит точку входа) + хвосты (static IP, бэкап).
|
||||
**Последняя верификация: 2026-09-14 (вечер-7) — ФИКС ПОДТВЕРЖДЁН, ДИАГНОСТИКА СНЯТА. ✅✅ ЗАКРЫТО.** Причина (вечер-5, фактом): кадры приходят разорванными, байты-сироты `00` копились в голове буфера → сдвиг выравнивания → 19-байтный ответ гостиной отбрасывался молча. **Фикс (вечер-6): сборка кадров по канону — T3.5-разграничение (пауза ≥3.5 символа = конец кадра) + сброс битого буфера (= `resetFrame` в pymodbus)**, коммит `3748feb` → Gitea → scp → `ha apps rebuild`. **Итог: все 7 полей `dining` публикуются, `dining_summary`/`dining_air_summary` ожили, `unavailable` 10 → 8** (остались только slave 10 «снято Alex'ом» + `todo.shopping_list`). **Загадка «замерзания» лога на 7 ч — тот же баг, устранена.** Диагностика ✅ снята (вечер-7), `dining` стабилен. Детали — §5-кватер-З, §11 (журнал вечер-6/7).
|
||||
**Последняя верификация: 2026-09-14 (вечер-8) — static IP ЗАКРЕПЛЁН, правка автоматизации душевой ВНЕДРЕНА. Камера — БЛОКИРОВАНА (SSH TrueNAS).** Фикс bridge (T3.5, вечер-6) держится: `dining` стабилен, диагностика снята (вечер-7). **Вечер-8:** ① static-привязка t610 на роутере (`dhcp.@host[1]`, §5-кватер-И-1); ② ночной свет душевой — добавлен триггер на **падение освещённости** + условие присутствия (id `1771997851260`, §5-кватер-И-2); ③ камера — не сделано, SSH на TrueNAS не прошёл (§5-кватер-И-3). Причина (вечер-5, фактом): кадры приходят разорванными, байты-сироты `00` копились в голове буфера → сдвиг выравнивания → 19-байтный ответ гостиной отбрасывался молча. **Фикс (вечер-6): сборка кадров по канону — T3.5-разграничение (пауза ≥3.5 символа = конец кадра) + сброс битого буфера (= `resetFrame` в pymodbus)**, коммит `3748feb` → Gitea → scp → `ha apps rebuild`. **Итог: все 7 полей `dining` публикуются, `dining_summary`/`dining_air_summary` ожили, `unavailable` 10 → 8** (остались только slave 10 «снято Alex'ом» + `todo.shopping_list`). **Загадка «замерзания» лога на 7 ч — тот же баг, устранена.** Диагностика ✅ снята (вечер-7), `dining` стабилен. Детали — §5-кватер-З, §11 (журнал вечер-6/7).
|
||||
|
||||
| Что | Факт |
|
||||
|---|---|
|
||||
@@ -47,7 +47,7 @@
|
||||
| **`sensor.fan_at2_*` / `switch.fan_3_*` — сироты** | В `configuration.yaml` **весь блок slave 10 (AT2 fans) закомментирован** → эти сущности физически не могут получать данные. Не задача — просто известный факт состояния конфига |
|
||||
| `switch.sauna` = `unknown` | Розетка физически отключена (`lastSeen` 8+ ч) — не баг |
|
||||
| ZONT не перенаправлен | **✅ ПЕРЕНАПРАВЛЕН 2026-09-14 (вечер-3, §5-кватер-Д):** DNAT на роутере `192.168.2.2` (`redirect[0]` MQTT + `rule[3]`) переключён `.197`→`.176`; ZONT пишет в mosquitto **t610** (живой поток kids/bedroom). ⚠️ Не решено: `dining/*` не публикуется — **ответ на шине есть, bridge его не отдаёт** (§5-кватер-Д, задача №3) |
|
||||
| Камера | Контейнер был на TrueNAS, остановлен при восстановлении пула. В Caddy остался мёртвый upstream `192.168.2.197:8090`. Разбираться отдельно |
|
||||
| Камера | Контейнер был на TrueNAS, остановлен при восстановлении пула. В Caddy остался мёртвый upstream `192.168.2.197:8090`. **2026-09-14 (вечер-8): попытка начать — БЛОКИРОВАНА**, SSH на TrueNAS не прошёл (`root@.197` → publickey denied; `truenas_admin`+sudo отменена на апруве). См. §5-кватер-И-3, задача A5 |
|
||||
|
||||
---
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
|---|---|
|
||||
| Железо | HP t610 (AMD T56N 2×1.65 ГГц, 4 ГБ DDR3, HDD WD2500BEVT 228.5 ГБ, занято 5 ГБ) |
|
||||
| ОС | HA OS 18.2 (generic-x86-64), Core 2026.9.2, Supervisor 2026.09.0 |
|
||||
| IP | **192.168.2.176** (DHCP-имя `homeassistant`, MAC `9c:8e:99:ef:3f:c5`). Static IP на роутере **не закреплён** |
|
||||
| IP | **192.168.2.176** (DHCP-имя `homeassistant`, MAC `9c:8e:99:ef:3f:c5`). **✅ Static-привязка ЗАКРЕПЛЕНА 2026-09-14 (вечер-8) на роутере `192.168.2.2`** — см. §5-кватер-И |
|
||||
| Web UI | **`http://192.168.2.176`** — порт **80**. Порт 8123 закрыт |
|
||||
| SSH | `ssh -i ~/.ssh/id_rsa root@192.168.2.176` — только через аддон `core_ssh` (порт 22) |
|
||||
|
||||
@@ -89,7 +89,7 @@ ha supervisor logs | tail -60 # диагностика сборки local add-
|
||||
|
||||
| Роутер | Доступ | Особенность |
|
||||
|---|---|---|
|
||||
| `192.168.2.2` (OpenWrt, основной) | SSH root, пароль `1316261` | DHCP-аренды: `cat /tmp/dhcp.leases`. **🔑 Его интерфейс `wan` = `192.168.0.10/24`** (шлюз `192.168.0.1`), маршрут `192.168.0.0/24 dev wan`. **Поэтому «`192.168.0.10`» в настройках ZONT — это ОН САМ**, а не отдельный GPON-роутер. На нём же живут DNAT-правила для внешних сервисов (`uci show firewall`): `caddy_http/https` (80/443→TrueNAS 8088/8443), `HomeAssistant` (8123, disabled), `MQTT` (1883 из 192.168.0.0/24), `TrueNas-SSH`, transmission, syncthing, xray |
|
||||
| `192.168.2.2` (OpenWrt, основной) | SSH root, пароль `1316261` | DHCP-аренды: `cat /tmp/dhcp.leases`. **Static-привязки (`/etc/config/dhcp`, `uci show dhcp \| grep @host`): `[0]` truenas `00:0B:0E:0F:00:ED`→`.197`, `[1]` t610 `9c:8e:99:ef:3f:c5`→`.176` (добавлен 2026-09-14).** 🔑 Его интерфейс `wan` = `192.168.0.10/24` (шлюз `192.168.0.1`), маршрут `192.168.0.0/24 dev wan`. **Поэтому «`192.168.0.10`» в настройках ZONT — это ОН САМ**, а не отдельный GPON-роутер. На нём же живут DNAT-правила для внешних сервисов (`uci show firewall`): `caddy_http/https` (80/443→TrueNAS 8088/8443), `HomeAssistant` (8123, disabled), `MQTT` (1883 из 192.168.0.0/24), `TrueNas-SSH`, transmission, syncthing, xray |
|
||||
| `192.168.6.1` («Rasputin», OpenWrt aarch64) | SSH root | eth0 `192.168.2.157/24` — видит сеть 192.168.2.x |
|
||||
| `192.168.0.1` (GPON-шлюз) | — | Шлюз wan-интерфейса роутера `192.168.2.2` (`58:f8:5c:47:1c:9f`, REACHABLE). ZONT приходит в брокер **с адреса `.0.1`** (через него) |
|
||||
| **ZONT** `192.168.0.50` | Web UI `http://192.168.0.50/` (порт 80, «ZONT LOCAL») — **доступен ТОЛЬКО с роутера `192.168.2.2`** (с Mac — таймаут) | MAC **`f8:b3:b7:d8:46:f3`** (по ARP на wan роутера). Совпадает с MQTT-клиентом `zont_0FA7C33CC89F_f8:b3:b7:d8:46:f0`. **Найден 2026-09-14 фактом** (ARP + баннер «ZONT LOCAL»); веб-UI — SPA на WebSocket `ws://<host>/ws`, авторизация логин/пароль по `localStorage` |
|
||||
@@ -1386,6 +1386,76 @@ ad6345a Add diagnostic raw-byte logging to modbus-bridge
|
||||
|
||||
---
|
||||
|
||||
### 5-кватер-И. ✅ Static IP для t610 + правка автоматизации ночного света душевой (2026-09-14, вечер-8)
|
||||
|
||||
**Триггер:** Alex — *«давай зафиксируй текущий ip на роутере. и далее камера? и исправь сценарий ночного света в душевой чтобы он не только на датчик присутствия тригерился но и на смену освещения»*.
|
||||
|
||||
#### И-1. Static IP на роутере — ✅ ВЫПОЛНЕНО
|
||||
|
||||
**Роутер `192.168.2.2` (OpenWrt).** До правки static-привязка была **только одна** (`truenas` → `.197`), t610 жил на DHCP-аренде.
|
||||
|
||||
```bash
|
||||
# 1) Реальный MAC t610 — из DHCP-аренд роутера (НЕ из /sys внутри SSH-аддона: там виртуальный eth0!)
|
||||
ssh root@192.168.2.2 'cat /tmp/dhcp.leases | grep 192.168.2.176'
|
||||
# → 1789416999 9c:8e:99:ef:3f:c5 192.168.2.176 homeassistant 01:9c:8e:99:ef:3f:c5
|
||||
|
||||
# 2) Бэкап + привязка
|
||||
ssh root@192.168.2.2 'cp /etc/config/dhcp /root/dhcp.bak-$(date +%Y%m%d-%H%M%S)'
|
||||
ssh root@192.168.2.2 'uci add dhcp host && uci set dhcp.@host[-1].name=t610 \
|
||||
&& uci set dhcp.@host[-1].mac=9c:8e:99:ef:3f:c5 \
|
||||
&& uci set dhcp.@host[-1].ip=192.168.2.176 && uci set dhcp.@host[-1].dns=1 \
|
||||
&& uci commit dhcp && /etc/init.d/dnsmasq reload'
|
||||
```
|
||||
Результат: `dhcp.@host[1]` = t610 / `9c:8e:99:ef:3f:c5` / `192.168.2.176`. Проверено: `ping .176` OK, `curl http://192.168.2.176/` → **HTTP 200**. Бэкап: `/root/dhcp.bak-20260914-104152`.
|
||||
|
||||
> 🔴 **ПИТФОЛЛ (важный):** изнутри SSH-аддона t610 **нельзя узнать его LAN-MAC** — аддон живёт в контейнере, `eth0` там виртуальный (`0e:16:a6:96:02:f7`, IP `172.30.33.0`). **Реальный MAC брать из DHCP-аренд роутера** (`/tmp/dhcp.leases`) — там же и hostname.
|
||||
|
||||
#### И-2. Ночной свет душевой: триггер на падение освещённости — ✅ ВЫПОЛНЕНО
|
||||
|
||||
**Было (асимметрия):** «Вкл» триггерился **только** на `occupied` (присутствие) → условие `illuminance < 8`. «Выкл» уже имел **два** триггера — `not_occupied` + `illuminance above 8`. То есть **падение света само по себе подсветку не включало**.
|
||||
|
||||
**Правка (`/config/automations.yaml`, automation id `1771997851260`, alias «Вкл. ночной свет душевая»):**
|
||||
- в `triggers` добавлен `type: illuminance, below: 8` (симметрично выключению);
|
||||
- в `conditions` добавлен `type: is_occupied` — **иначе свет включался бы в пустой душевой при простом падении освещённости**.
|
||||
|
||||
**Итоговая логика:**
|
||||
- **Вкл:** (`вошёл` ИЛИ `освещённость упала <8`) И `темно (<8)` И `кто-то есть`
|
||||
- **Выкл:** `вышел` ИЛИ `освещённость >8` (не менялось)
|
||||
|
||||
**Сущности (device_id, т.к. в YAML — device-триггеры):**
|
||||
| Что | device_id | entity_id (реестр) |
|
||||
|---|---|---|
|
||||
| Датчик присутствия душевой | `4095e7c3b47b9dc9640cfb8c3aeff022` | `binary_sensor.shower_2_presence_sensor_presence` |
|
||||
| Освещённость | (тот же device) | `sensor.shower_2_presence_sensor_illuminance` |
|
||||
| Подсветка (switch) | `4d6e55505ff7dbad13d2674cdcb18d5a` | `switch.night_light_shower_2` (есть и `light.night_light_shower_2`) |
|
||||
|
||||
**Применение:** правка файла (локально → scp) → `ha core check` (OK) → **reload через API**:
|
||||
```bash
|
||||
curl -sS -X POST -H @/tmp/hdr.txt -H 'Content-Type: application/json' \
|
||||
"http://192.168.2.176:80/api/services/automation/reload" # → HTTP 200, []
|
||||
```
|
||||
Бэкап файла: `/config/automations.yaml.bak-nightlight-20260914-174320`. Локальная копия: `~/tmp-t610/automations/automations.yaml`.
|
||||
|
||||
**Верификация фактом (API, не глазами):** `GET /api/config/automation/config/1771997851260` → **`triggers` = 2** (был 1), **`conditions` = 2** (был 1):
|
||||
```
|
||||
triggers[0] = occupied (presence)
|
||||
triggers[1] = illuminance below:8 ← НОВЫЙ
|
||||
conditions[0] = is_illuminance below:8
|
||||
conditions[1] = is_occupied ← НОВЫЙ
|
||||
```
|
||||
|
||||
> ⚠️ **Питфолл HA 2026:** в API-ответе ключи — **`triggers`/`conditions`/`actions`** (мн.ч.). Запрос `.trigger|length` возвращает **0** и выглядит как «правка не применилась». Проверять `.triggers`.
|
||||
> ⚠️ **Питфолл `ha core`:** команды `reload` **нет** (только `check` и `restart`). Перезагрузка автоматизаций/скриптов — **через сервис API** (`/api/services/automation/reload`, `/api/services/script/reload`).
|
||||
> ⚠️ **Питфолл Hermes (снова):** inline `$(cat file)` и jq-выражения со скобками `( … )` в двойных кавычках **ломаются** при передаче. Токен передавать через `-H @file` (файл заголовка), jq-фильтры — простые, без вложенных скобок.
|
||||
|
||||
#### И-3. Камера — 🔴 НЕ ВЫПОЛНЕНО (блокер)
|
||||
|
||||
Дошли до поиска контейнера на TrueNAS — **SSH не прошёл**: `root@192.168.2.197` → `Permission denied (publickey)`; попытка `truenas_admin@192.168.2.197` + `sudo docker` **отменена на апруве** (Alex прислал сообщение вместо апрува). Прав по плану не сделано.
|
||||
**Известное из §1:** контейнер камеры был на TrueNAS, остановлен при восстановлении пула; в Caddy остался мёртвый upstream `192.168.2.197:8090`. План: найти образ/папку → поднять на t610 → поправить upstream в Caddyfile.
|
||||
**Как продолжить:** `ssh -i ~/.ssh/id_rsa truenas_admin@192.168.2.197` + sudo (см. [[family/how-to/truenas-access]]; при неудаче локального IP — через `mallexxx.duckdns.org`).
|
||||
|
||||
---
|
||||
|
||||
### 5-кватер-Г. ✅ Node-RED: перенос flows с TrueNAS на t610 (2026-09-14, вечер-2)
|
||||
|
||||
**Триггер:** Alex открыл `nodered.mallexxx.duckdns.org` → увидел basic auth вместо страницы Node-RED. В ходе разбора выяснилось, что **на t610 `flows.json` = 124 байта (пусто)** — агент при миграции **не перенёс flows Node-RED с TrueNAS**. Alex: *«в смысле чистый лист?? ты не перенёс все с truenas значит»* → команда **«переносим как есть»**.
|
||||
@@ -1770,8 +1840,10 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \
|
||||
| ~~B1~~ | ~~**№5 (Этап 4): ДОЛИТЬ Caddyfile**~~ — **✅ СДЕЛАН + `trusted_proxies` фикс** | — | Alex подменил файл + `docker restart caddy`. `mallexxx.duckdns.org` → 200. Затем `.storage/http` → `trusted_proxies += 192.168.2.197/32` (§5-кватер-В) |
|
||||
| ~~**B2**~~ | ~~**Node-RED наружу** — выставить порт аддона и поправить Caddy~~ | — | **✅ СНЯТО (2026-09-14 вечер-7):** решение Alex — «оставляем так». Node-RED доступен через **ingress** HA (`http://192.168.2.176/api/hassio_ingress/<token>/`), наружу не выпускается. Домен `nodered.*` не используется. См. §5-кватер-Г и `[[family/how-to/nodered-ventilation]]` |
|
||||
| **B3** | **Этап 4, остаток:** GPON-редирект → t610, ZONT MQTT → t610 | 🔴 высокий | Трогает живое → окно + согласование |
|
||||
| A2 | **№7**: Static IP для t610 | ✅ низкий | На роутере `192.168.2.2` (SSH root) привязать MAC `9c:8e:99:ef:3f:c5` → `192.168.2.176`. Сервисы не трогаются |
|
||||
| A3 | **№8**: Бэкап конфигов t610 | ✅ низкий | `tar` конфигов t610 (`/config`, **`.storage/http`**, Caddyfile) → Mac + TrueNAS + коммит в Gitea `git.mallexxx.duckdns.org` |
|
||||
| ~~A2~~ | ~~**№7**: Static IP для t610~~ | — | **✅ ВЫПОЛНЕНО 2026-09-14 (вечер-8, §5-кватер-И-1):** на роутере `192.168.2.2` создана static-привязка `dhcp.@host[1]` = `t610` / MAC `9c:8e:99:ef:3f:c5` / `192.168.2.176` → `uci commit dhcp` + `dnsmasq reload`. Проверено: `ping` OK, HA → HTTP 200. Бэкап `/root/dhcp.bak-20260914-104152` |
|
||||
| A3 | **№8**: Бэкап конфигов t610 | ✅ низкий | `tar` конфигов t610 (`/config`, **`.storage/http`**, Caddyfile) → Mac + TrueNAS + коммит в Gitea `git.mallexxx.duckdns.org` (репо `git_admin/HA-ZONT-Modbus` уже создан) |
|
||||
| ~~A4~~ | ~~**Ночной свет душевой**: триггер на падение освещённости~~ | — | **✅ ВЫПОЛНЕНО 2026-09-14 (вечер-8, §5-кватер-И-2):** в automation `1771997851260` добавлен триггер `illuminance below:8` + условие `is_occupied`. Проверено через API: `triggers`=2, `conditions`=2 |
|
||||
| **A5** | **Камера**: поднять контейнер на t610, поправить upstream в Caddy | 🟡 средний | 🔴 **БЛОКИРОВАНО 2026-09-14:** SSH на TrueNAS не прошёл (`root@.197` → publickey denied; попытка `truenas_admin`+sudo отменена на апруве). Контейнер был на TrueNAS (остановлен при восстановлении пула), в Caddy мёртвый upstream `192.168.2.197:8090`. См. §5-кватер-И-3 |
|
||||
|
||||
**Вариант B — Этап 4 целиком** (№5: Caddy upstream → t610 + GPON-редирект → t610 + ZONT MQTT → t610). 🔴 Трогает рабочее → нужно окно и согласование с Alex. **Caddy-часть СДЕЛАНА (§5-кватер-Б/В).**
|
||||
|
||||
@@ -1816,6 +1888,8 @@ docker restart caddy
|
||||
> 🔴 **Урок по скриптам:** сырой замер шины (`cat /dev/ttyUSB*` + `nc`) **пока HA/mbusd опрашивают ту же шину — портит замер и мешает работе**. Плюс `cat /dev/ttyUSB0` при работающем `modbus-bridge` **всегда пусто** (bridge держит порт). Единственный чистый метод привязки — **физический: выдернуть шнур + `dmesg`**.
|
||||
> ⚠️ Секреты в скриптах — только через обходных путей из §8 (маскировщик ломает литералы). Здесь секретов нет, использовался готовый `/tmp/curl.auth`.
|
||||
**Диагностика modbus (2026-09-14 вечер-4, разбор кода):** `~/tmp-mbbridge/` — `modbus_ha_bridge.py` (987 стр., 40 016 б, копия с t610) и `config.template.tmpl` (156 стр.). Копирование: `scp root@192.168.2.176:/addons/modbus-bridge/modbus_ha_bridge.py ~/tmp-mbbridge/`. **Проект-репозиторий (git):** `~/Automation/HA-ZONT-Modbus` — `modbus_ha_bridge.py`, `config.yml`, `INFRASTRUCTURE.md`; remote **отсутствует**, untracked `nodered-flows-{backup,updated}.json` + `project_home.pdf`.
|
||||
> 📌 **ОБНОВЛЕНО (вечер-4/5):** remote добавлен — `git_admin/HA-ZONT-Modbus` (private) на `git.mallexxx.duckdns.org`; `project_home.pdf` в `.gitignore`; flows закоммичены. См. `[[family/how-to/gitea-config]]`.
|
||||
**Сессия вечер-8 (static IP + душевая, 2026-09-14):** `~/tmp-t610/automations/automations.yaml` (правленая копия, +11 строк), `~/tmp-t610/reload_automations2.sh` (reload автоматизаций через API), `~/tmp-t610/check_ha_states*.sh` (проверка HA API). Бэкапы: роутер `/root/dhcp.bak-20260914-104152`, t610 `/config/automations.yaml.bak-nightlight-20260914-174320`. Локальные скрипты правятся через `~/tmp-t610/`, заливаются `scp` → `bash /tmp/<script>`.
|
||||
|
||||
**Правка логирования bridge (2026-09-14 вечер-5, §5-кватер-Ж):** `~/tmp-mbbridge/` — `patch_bridge_logging.py` (**патчер, 3 диагностические точки**), `before-logging-patch.py.bak` (файл до правки), `repo-modbus_ha_bridge.py.bak` + `repo-config.yml.bak` (репо до синка с продом). **Git `~/Automation/HA-ZONT-Modbus`:** репо `git_admin/HA-ZONT-Modbus` (**private**), remote `origin` = `https://git.mallexxx.duckdns.org/git_admin/HA-ZONT-Modbus.git` (чистый, без токена), креды `~/.git-credentials` (chmod 600) + `credential.helper=store`. Коммиты сессии: `7e0b281` (sync HA-конфига + flows), `6a8ca3f` (sync bridge-файлов с прод), `ad6345a` (diagnostic logging patch). Скрипт выноса токена: `~/tmp-t610/setup_gitea_creds.sh`. На t610 бэкап прода: `/addons/modbus-bridge/modbus_ha_bridge.py.bak-prelogging-20260914-155143` (40 016 б).
|
||||
|
||||
@@ -2134,6 +2208,28 @@ ssh root@192.168.2.176 'ha apps rebuild local_modbus-bridge && ha apps restart l
|
||||
|
||||
---
|
||||
|
||||
### 2026-09-14 (вечер-8: static IP t610 + правка ночного света душевой; камера — блок)
|
||||
|
||||
**Контекст:** Alex — *«давай зафиксируй текущий ip на роутере. и далее камера? и исправь сценарий ночного света в душевой чтобы он не только на датчик присутствия тригерился но и на смену освещения (выключили верхний свет - если присутствие есть - включить подсветку)»*. Уточнение в ходе: *«там отключение по датчику света. сделай тригер на включение тоже когда освещенность упала. щас включение только по присутствию»*.
|
||||
|
||||
**Что сделано:**
|
||||
|
||||
| Шаг | Факт |
|
||||
|---|---|
|
||||
| ✅ Static IP (A2) | Роутер `192.168.2.2`: `dhcp.@host[1]` = `t610` / `9c:8e:99:ef:3f:c5` / `192.168.2.176`. Бэкап `/root/dhcp.bak-20260914-104152`. Проверено: `ping` OK, HA → **HTTP 200** |
|
||||
| ✅ Ночной свет душевой (A4) | Automation `1771997851260` «Вкл. ночной свет душевая»: в `triggers` добавлен `illuminance below:8`, в `conditions` — `is_occupied`. Бэкап `/config/automations.yaml.bak-nightlight-20260914-174320` |
|
||||
| 🔴 Камера (A5) | Не начата — **SSH на TrueNAS не прошёл** (`root@192.168.2.197` → `Permission denied (publickey)`); попытка `truenas_admin` + `sudo docker` **отменена на апруве**. Правок не сделано |
|
||||
|
||||
**Верификация (фактом, не глазами):** `GET /api/config/automation/config/1771997851260` → **`triggers` = 2** (было 1), **`conditions` = 2** (было 1). `automation.vkliuchit_nochnoi_svet_dushevaia` = `on` после `automation/reload` (HTTP 200).
|
||||
|
||||
**Что менялось в железе:** роутер (`/etc/config/dhcp`) — static-привязка; t610 `/config/automations.yaml` — правка автоматизации. Код bridge и аддоны не трогались.
|
||||
|
||||
> 🔴 **Новый питфолл (важный):** **реальный LAN-MAC t610 нельзя узнать изнутри SSH-аддона** — аддон в контейнере, `eth0` виртуальный (`0e:16:a6:96:02:f7`, IP `172.30.33.0`). MAC и hostname брать **из DHCP-аренд роутера** (`/tmp/dhcp.leases`).
|
||||
> ⚠️ **Питфолл HA 2026:** в API-ответе автоматизации ключи — **`triggers`/`conditions`/`actions`** (мн. ч.); `.trigger|length` вернёт **0** и выглядит как «не применилось».
|
||||
> ⚠️ **Питфолл `ha core`:** команды `reload` нет (только `check`/`restart`). Reload автоматизаций/скриптов — **через сервис API** (`/api/services/automation/reload`, `/api/services/script/reload`).
|
||||
|
||||
---
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
- [[family/how-to/home-automation]] — карта Modbus slave ID, ZONT, регистры вентиляции
|
||||
|
||||
Reference in New Issue
Block a user