[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:
@@ -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` — стрим прогноза
|
||||
|
||||
|
||||
@@ -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. Имена — множественное число
|
||||
|
||||
|
||||
Reference in New Issue
Block a user