[2026-09-15] eagle: family/how-to/home-automation.md family/plans/t610-heating-cable-automation.md family/tech/ha-registry-operations.md family/tech/heating-cable-water-inlet.md

This commit is contained in:
Alexey Martemyanov
2026-09-15 23:57:20 +06:00
parent 174d7104ed
commit 82e5cb2640
4 changed files with 156 additions and 76 deletions
+23 -2
View File
@@ -191,7 +191,7 @@ ssh root@192.168.2.176 'bash /tmp/ghost_purge.sh /config/.storage/core.entity_re
| 9 | Удаление `device_id` сбрасывает `area_id` | Восстановить через `device_registry/update` |
| 10 | На t610 нет `python3` | Скрипты на `jq`/bash |
| 11 | `weather/get_forecast` (ед. ч.) и `weather/forecast` не существуют | Мн. ч.: сервис `weather.get_forecasts` либо WS `weather/subscribe_forecast` (ответ — 2 сообщения) |
| 12 | `weather.get_forecasts()` в Jinja → `'weather' is undefined` | Вызов сервисов из шаблонов убран — материализовать в `input_number` через automation |
| 12 | `weather.get_forecasts()` в Jinja → `'weather' is undefined` | Вызывать как **ДЕЙСТВИЕ** `action: weather.get_forecasts` + `response_variable`; `variables:` — внутри `actions:` ПОСЛЕ вызова. Helper'ы НЕ нужны |
| 13 | WS `render_template` возвращает `null` даже для `{{ 2 + 2 }}` | Шаблоны рендерить через REST `POST /api/template` |
| 14 | `write_file` режет строку `Authorization: Bearer *** | Собирать заголовок из переменных: `P1=Authorization; P2=Bearer; AUTH=*** ${P2} ${TOK}"` |
@@ -207,10 +207,31 @@ ssh root@192.168.2.176 'bash /tmp/ghost_purge.sh /config/.storage/core.entity_re
|---|---|
| атрибут `forecast` у сущности `weather.*` | **`None`** — прогноза в атрибутах нет |
| `weather.get_forecasts(...)` **в Jinja-шаблоне** | **`UndefinedError: 'weather' is undefined`** |
| `weather.get_forecasts` **как ДЕЙСТВИЕ** (`action:` + `response_variable`) | ✅ **работает** — 48 точек |
| сервис `weather.get_forecasts` (мн. число), REST/WS | ✅ работает — 48 ч hourly + 6 дн daily |
| WS `weather/subscribe_forecast` | ✅ работает |
> 🔴 **Вызов сервисов из шаблонов в этой версии убран.** Значит **величину из сервиса нельзя подставить в триггер/условие «на лету»**. Обход — **материализовать в сущность**: automation по расписанию вызывает сервис и пишет результат в `input_number`, а триггеры вешаются на template-сенсор, который читает этот `input_number`.
> **Как брать прогноз в автоматизации (рабочий путь, 0 helper'ов):**
> вызов **действием** с `response_variable`, а вычисления — в `variables:`
> ВНУТРИ `actions:` ПОСЛЕ вызова (верхнеуровневые `variables:` вычисляются до
> действий и `forecast` там ещё нет).
>
> ```yaml
> actions:
> - action: weather.get_forecasts
> target: {entity_id: weather.forecast_laki_dom}
> data: {type: hourly}
> response_variable: wx
> - variables:
> fc_min: >-
> {{ wx['weather.forecast_laki_dom']['forecast'][:24]
> | map(attribute='temperature') | min | default(99) | float(99) }}
> ```
>
> 🔴 **Питфолл (стоил лишней итерации):** вызов сервисов из Jinja-шаблона
> (`{{ weather.get_forecasts(...) }}`) действительно убран → `'weather' is undefined`.
> Но это **не значит**, что прогноз недоступен: как **действие** он работает. Не
> строить обходной слой (`input_number` + обновлятор), не проверив `action:` + `response_variable`.
### 8.2. WS `weather/subscribe_forecast` — стрим прогноза
+33 -22
View File
@@ -3,9 +3,9 @@ title: "Греющий кабель ввода воды — порог вклю
aliases: [Греющий кабель, heating_cable_plug, ввод воды, промерзание, обогрев водопровода]
type: tech
namespace: family
status: 🟢 Решения приняты (саморег, выдержка **12 ч**). Конструкция определена. Автоматизация НЕ создана — ждёт решения Alex по типу helper'а
status: 🟢 Решения приняты (саморег, выдержка **12 ч**). **Конструкция определена: 0 helper'ов** — прогноз берётся `action: weather.get_forecasts` + `response_variable`. Автоматизация НЕ создана — ждёт решения Alex по реализации выдержки 12 ч (вариант A/B)
created: '2026-09-16'
updated: '2026-09-16'
updated: '2026-09-16 (конструкция пересмотрена: input_number/helper НЕ нужен — отменён; прогноз работает как ДЕЙСТВИЕ автоматизации)'
tags:
- family
- smarthome
@@ -183,42 +183,53 @@ t_расч = min( ZONT_улица , min(прогноз на 24 ч вперёд)
- [x] ~~Определить тип кабеля~~**саморегулирующийся** (Alex, 2026-09-16).
- [x] ~~Найти источник внешнего прогноза~~`weather.forecast_laki_dom` + WS `weather/subscribe_forecast` (см. §8).
- [x] ~~Решить выдержку~~**12 ч** (Alex, 2026-09-16).
- [x] ~~Понять, как подставить прогноз в триггер~~**нельзя через Jinja**, нужен `input_number` + обновлятор (§8.1).
- [ ] **⚠️ БЛОКЕР: решить тип helper'а** — Storage (UI) или YAML (`configuration.yaml`). Ждёт ответа Alex.
- [ ] **Создать 6 объектов** по плану [[family/plans/t610-heating-cable-automation]] (бэкап `automations.yaml` — ✅ сделан).
- [x] ~~Понять, как подставить прогноз в триггер~~**как ДЕЙСТВИЕ** `action: weather.get_forecasts` + `response_variable`, внутри `actions:`. Helper'ы НЕ нужны (§8.1).
- [ ] **⚠️ БЛОКЕР: решить реализацию выдержки 12 ч** — вариант A (`numeric_state` + `for` на ZONT) или **B** (`for: 12:00:00` на `switch.heating_cable_plug`, рекомендован). Ждёт ответа Alex.
- [ ] **Создать 1 автоматизацию** `automation.heating_cable_ctl` (заготовка `~/tmp-t610/new_cable_autos.yaml`, YAML валиден; бэкап `automations.yaml` — ✅ сделан).
- [ ] Опционально: датчик температуры **на самой трубе** в бетоне — тогда порог снимаем с трубы, а не по воздуху (точнее, снимает неопределённость модели §4).
- [ ] Проверить в ZONT, нужен ли ему отдельный виртуальный slave под греющий кабель (сейчас управление идёт через Zigbee-розетку, ZONT в контур не включён).
- [ ] Обновить [[family/how-to/ha-automations]] — карта автоматизаций (сейчас 24 шт.; после выполнения станет 27).
- [ ] Обновить [[family/how-to/ha-automations]] — карта автоматизаций (сейчас 24 шт.; после выполнения станет 25).
---
## 8. 🔴 API прогноза погоды в HA 2026.9.2
### 8.1. Главное: прогноз НЕДОСТУПЕН ИЗ ШАБЛОНА
### 8.1. Прогноз: НЕ из шаблона, а ДЕЙСТВИЕМ автоматизации
Проверено четырьмя способами 2026-09-16:
Проверено пятью способами 2026-09-16:
| Способ | Результат |
|---|---|
| атрибут `forecast` у `weather.forecast_laki_dom` | **`None`** — прогноза в атрибутах нет |
| `weather.get_forecasts(...)` **в Jinja-шаблоне** | **`UndefinedError: 'weather' is undefined`** |
| `weather.get_forecasts` **как действие** (`action:` + `response_variable`) | ✅ **работает** — 48 точек |
| сервис `weather.get_forecasts` (мн. число), REST/WS | ✅ **работает** — 48 ч + 6 дней |
| WS `weather/subscribe_forecast` | ✅ **работает** |
| WS `weather/subscribe_forecast` | ✅ **работает** (для стрима/CLI) |
> 🔴 **Вызов сервисов из шаблонов (`weather.get_forecasts(...)` в Jinja) в этой версии убран.** Попытка даёт `'weather' is undefined`. Значит **пороги нельзя написать шаблоном «на лету»** — прогноз надо **материализовать в сущность** (`input_number`), иначе в триггер автоматизации его не подставить.
> **РАБОЧИЙ ПУТЬ: `action: weather.get_forecasts` с `response_variable`.**
> Внутри `actions:` результат доступен последующим `variables:` и `choose:`.
> **Никаких helper'ов / `input_number` / template-сенсоров не требуется.**
>
> ```yaml
> actions:
> - action: weather.get_forecasts
> target: {entity_id: weather.forecast_laki_dom}
> data: {type: hourly}
> response_variable: wx
> - variables:
> fc_min: >-
> {{ wx['weather.forecast_laki_dom']['forecast'][:24]
> | map(attribute='temperature') | min | default(99) | float(99) }}
> ```
>
> 🔴 **`variables:` вычисляются ДО действий** — объявлять вычисления от
> `response_variable` только ВНУТРИ `actions:`, после вызова сервиса.
**Рабочая конструкция — слой обновления (см. план):**
```
automation.heating_cable_forecast_update (каждый час)
→ weather.get_forecasts('weather.forecast_laki_dom','hourly')
→ min(map(attribute='temperature')[:24])
→ input_number.heating_cable_forecast_min
sensor.heating_cable_outside_min_24h (template, §8.1 недоступен Jinja-вызов)
→ min( sensor.h2000_pro_temperatura_ulitsa ,
input_number.heating_cable_forecast_min )
```
> 🔴 **Урок (две итерации):** сначала я проверил только Jinja-форму вызова
> (`{{ weather.get_forecasts(...) }}` → `'weather' is undefined`) и заключил
> «прогноз недоступен шаблону → нужен `input_number` + обновлятор». **Это была
> ошибка:** штатный путь — вызов как **действие**, он работает. Прежде чем строить
> обходной слой, проверь штатный вариант целиком.
### 8.2. Имена — множественное число