[2026-09-15] eagle: family/how-to/home-automation.md family/plans/heating-cable-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:
@@ -0,0 +1,124 @@
|
||||
---
|
||||
title: "План: автоматизация греющего кабеля ввода воды"
|
||||
type: plan
|
||||
namespace: family
|
||||
status: 🟡 Ожидает решения Alex (выдержка 6 ч или 24 ч) → затем выполнение
|
||||
created: '2026-09-16'
|
||||
updated: '2026-09-16'
|
||||
tags:
|
||||
- family
|
||||
- plan
|
||||
- t610
|
||||
- smarthome
|
||||
- heating
|
||||
related:
|
||||
- '[[family/tech/heating-cable-water-inlet]]'
|
||||
- '[[family/how-to/home-automation]]'
|
||||
- '[[family/how-to/ha-automations]]'
|
||||
---
|
||||
|
||||
# План: автоматизация греющего кабеля ввода воды
|
||||
|
||||
> **Расчёт и обоснование порогов — в [[family/tech/heating-cable-water-inlet]].** Здесь — что именно делать руками.
|
||||
|
||||
---
|
||||
|
||||
## 1. Задача
|
||||
|
||||
Обогрев ввода воды в дом. Труба ПНД сквозь бетонную подушку 30 см → в суглинок на 4 м. Регион — Новосибирск (Лаки Парк).
|
||||
|
||||
**Ключевые выводы расчёта:**
|
||||
- Грунт на 4 м **не замерзает никогда** (+2,5…+3,5 °C круглый год).
|
||||
- Опасна **только бетонная подушка 30 см** — труба в ней доходит до 0 °C при воздухе **−8 °C**.
|
||||
- Кабель **саморегулирующийся** → перегрев невозможен, окно выдержки задаёт инерция бетона (~сутки).
|
||||
|
||||
---
|
||||
|
||||
## 2. 🔴 Единственный блокер
|
||||
|
||||
**Выдержка: 6 ч или 24 ч.** Решение за Alex.
|
||||
|
||||
| Вариант | Плюс | Минус |
|
||||
|---|---|---|
|
||||
| 24 ч | отсекает ночные заморозки | при ударе −15 °C за ночь включится через сутки |
|
||||
| 6 ч | ловит резкое похолодание в тот же день | может дёрнуться на ночном заморозке |
|
||||
|
||||
**Рекомендация ассистента: 6 ч.**
|
||||
|
||||
---
|
||||
|
||||
## 3. Спецификация автоматизации
|
||||
|
||||
**Имя:** `heating_cable_water_inlet`
|
||||
**Файл:** `/config/automations.yaml` на t610 (бэкап обязателен перед правкой)
|
||||
|
||||
### 3.1. Расчётная температура
|
||||
|
||||
```
|
||||
t_расч = min( sensor.h2000_pro_temperatura_ulitsa ,
|
||||
min( прогноз weather.forecast_laki_dom на 24 ч вперёд ) )
|
||||
```
|
||||
|
||||
Берём **более холодный** из двух источников — fail-safe в сторону защиты от замерзания.
|
||||
|
||||
### 3.2. Триггеры и действия
|
||||
|
||||
| # | Триггер | Условие | Действие |
|
||||
|---|---|---|---|
|
||||
| 1 | `t_расч` ≤ −8 °C | `for: <6ч\|24ч>` | `switch.turn_on` `switch.heating_cable_plug` |
|
||||
| 2 | `t_расч` ≥ −3 °C | `for: <6ч\|24ч>` | `switch.turn_off` `switch.heating_cable_plug` |
|
||||
| 3 | `t_расч` ≤ −20 °C | без `for` | `switch.turn_on` (безусловно) |
|
||||
| 4 | оба источника `unavailable` | `for: 01:00:00` | `switch.turn_on` + push |
|
||||
| 5 | после ВКЛ + 10 мин | `sensor.heating_cable_plug_power < 5` | push «кабель не греет» |
|
||||
|
||||
### 3.3. Сущности
|
||||
|
||||
| Роль | Сущность |
|
||||
|---|---|
|
||||
| Датчик (ZONT) | `sensor.h2000_pro_temperatura_ulitsa` |
|
||||
| Прогноз | `weather.forecast_laki_dom` (met.no) |
|
||||
| Исполнитель | `switch.heating_cable_plug` (NEO NAS-WR01B, `a4c138eb6fbe9d19`, зона `kotelnaia`) |
|
||||
| Контроль мощности | `sensor.heating_cable_plug_power` |
|
||||
|
||||
---
|
||||
|
||||
## 4. Шаги выполнения
|
||||
|
||||
1. **Бэкап** `/config/automations.yaml` → `automations.yaml.bak-heatcable-<ts>`.
|
||||
2. Забрать прогноз в шаблон-сенсор:
|
||||
```yaml
|
||||
template:
|
||||
- sensor:
|
||||
- name: "t_rasch_heating_cable"
|
||||
unit_of_measurement: "°C"
|
||||
state: >
|
||||
{% set fc = state_attr('weather.forecast_laki_dom','forecast') %}
|
||||
...
|
||||
```
|
||||
> ⚠️ **Прогноз в этих шаблонах может быть недоступен** — атрибут `forecast` в HA 2026.9.2 **не отдаётся в `state_attr`**, только через WS `weather/subscribe_forecast` (§8 [[family/tech/heating-cable-water-inlet]]). **Проверить фактом ДО написания шаблона.** Если недоступен — вариант: брать уличную температуру напрямую из met.no через RESTful-сенсор (отдельная интеграция), либо использовать `weather.get_forecasts` (проверить существование в 2026.9.2).
|
||||
3. Добавить 5 триггеров из §3.2 в `automations.yaml` (через `patch`, не `sed`).
|
||||
4. Перезагрузить автоматизации: `POST /api/services/automation/reload`.
|
||||
5. Проверить: `automation.heating_cable_water_inlet` = `on`, 0 `unavailable`, ссылки на сущности живые.
|
||||
6. Обновить [[family/how-to/ha-automations]] — карта автоматизаций (стало 25).
|
||||
7. Обновить статус [[family/tech/heating-cable-water-inlet]] → 🟢.
|
||||
|
||||
---
|
||||
|
||||
## 5. Питфоллы (собрано из опыта сессии)
|
||||
|
||||
| Питфолл | Обход |
|
||||
|---|---|
|
||||
| Прогноз недоступен через REST/`call_service` | Только WS `weather/subscribe_forecast` (§8) |
|
||||
| WS-ответ прогноза — два сообщения | Второй `recv()` после `result` |
|
||||
| `http://192.168.2.176:8123` с Mac → `000` | SSH-однострочник или `wss://mallexxx.duckdns.org` |
|
||||
| Токен `/tmp/.hatok` лежит на **Mac** | Передавать в SSH-команду из Mac |
|
||||
| Правка `automations.yaml` без reload не действует | `POST /api/services/automation/reload` |
|
||||
| `sensor.heating_cable_plug_power = 0 Вт` при `off` | **Норма**, не поломка — проверить можно только после включения |
|
||||
|
||||
---
|
||||
|
||||
## 6. Следующие шаги (не блокеры)
|
||||
|
||||
- [ ] Датчик температуры **на трубе** в бетоне — точнее модели §4.
|
||||
- [ ] Решить, нужен ли ZONT отдельный виртуальный slave под греющий кабель.
|
||||
- [ ] После первого включения — снять реальную мощность (`sensor.heating_cable_plug_power`) и записать в доку: сколько потребляет кабель 6 м.
|
||||
@@ -0,0 +1,183 @@
|
||||
# План: автоматизация греющего кабеля ввода воды (t610)
|
||||
|
||||
> Статус: **согласован 2026-09-16** — выдержка 12 ч, порог −8 °C.
|
||||
> Предыстория: [[family/how-to/home-automation]] · [[family/tech/zigbee-t610-z2m-i-zha]]
|
||||
|
||||
## Задача
|
||||
|
||||
Управлять греющим кабелем ввода воды по уличной температуре, чтобы бетонная
|
||||
подушка фундамента не промёрзла и труба не встала.
|
||||
|
||||
## Исходные данные (факты, проверены)
|
||||
|
||||
| Факт | Значение | Источник |
|
||||
|---|---|---|
|
||||
| Регион | Новосибирск, ДНП «Лаки Парк» (~55.26°N) | Nominatim, бэкап плана |
|
||||
| Грунт | суглинок | Alex |
|
||||
| Труба в грунте | ~4 м | Alex |
|
||||
| Бетонная подушка | 30 см | Alex |
|
||||
| Тип кабеля | **саморегулирующийся** | Alex |
|
||||
| Управление | `switch.heating_cable_plug` (NEO NAS-WR01B, котельная, `a4c138eb6fbe9d19`) | HA states |
|
||||
| Уличный датчик | `sensor.h2000_pro_temperatura_ulitsa` (ZONT) | HA states |
|
||||
| Внешний прогноз | `weather.forecast_laki_dom` (met.no) | HA states |
|
||||
|
||||
## Расчёт (СП 131.13330.2020)
|
||||
|
||||
Сумма |отрицательных среднемесячных| по Новосибирску:
|
||||
янв −17,6 · фев −15,4 · мар −7,7 · ноя −7,9 · дек −15,3 → **Mt = 63,9**
|
||||
|
||||
```
|
||||
d_fn = d0 · √Mt = 0,23 · √63,9 = 1,84 м (суглинок, открытая поверхность)
|
||||
```
|
||||
Под снегом 30–40 см реально **1,3–1,6 м**.
|
||||
|
||||
Глубина затухания годовой волны в суглинке (`a = λ/C = 5,6·10⁻⁷ м²/с`):
|
||||
```
|
||||
z_damp = √(a·T/π) = 2,37 м
|
||||
```
|
||||
На глубине 4 м амплитуда годового хода: `19 · e^(−4/2,37) = ±3,5 °C` от среднегодовой.
|
||||
→ **Труба на 4 м не замерзает физически: +2,5…+3,5 °C круглый год.**
|
||||
|
||||
### Критичная точка — бетонная подушка 30 см
|
||||
|
||||
Бетон промерзает быстрее грунта: `λ = 1,7` против `1,4`, снеговой шубы нет.
|
||||
Термические сопротивления: `R_возд = 1/15 = 0,067`, `R_бетон = 0,30/1,7 = 0,176`.
|
||||
→ 72 % перепада падает на бетон.
|
||||
|
||||
| Улица | Труба в бетоне |
|
||||
|---|---|
|
||||
| −6 °C | +0,5 °C |
|
||||
| **−8 °C** | **−0,1 °C** ← порог |
|
||||
| −10 °C | −0,6 °C |
|
||||
| −15 °C | −1,9 °C |
|
||||
| −20 °C | −3,1 °C |
|
||||
| −25 °C | −4,4 °C |
|
||||
|
||||
## Пороги автоматизации
|
||||
|
||||
| Событие | Условие | Выдержка |
|
||||
|---|---|---|
|
||||
| **ВКЛ** | `min(ZONT, прогноз24ч) ≤ −8 °C` | **12 ч** |
|
||||
| **ВЫКЛ** | `min(ZONT, прогноз24ч) ≥ −3 °C` | **12 ч** |
|
||||
| **Аварийный ВКЛ** | `≤ −20 °C` | без выдержки |
|
||||
| **Fail-safe** | оба источника `unavailable` > 1 ч | ВКЛ + push |
|
||||
| **Обрыв кабеля** | после ВКЛ + 10 мин `power < 5 W` | push |
|
||||
|
||||
### Почему 12 ч
|
||||
|
||||
Тепловая инерция бетонной подушки ~сутки. 12 ч отсекает одиночные ночные
|
||||
заморозки сентября-октября (бетон за ночь не промёрзнет), но ловит резкое
|
||||
похолодание в тот же день. Alex выбрал 12 ч как компромисс между 6 и 24.
|
||||
|
||||
### Почему саморег меняет логику
|
||||
|
||||
Саморегулирующийся кабель сбрасывает мощность при нагреве сам — перегрев
|
||||
невозможен. Значит задержка нужна не «чтобы не спалить», а «чтобы не дёргать
|
||||
реле на каждую холодную ночь». Экономия электричества вторична.
|
||||
|
||||
### Почему прогноз обязателен
|
||||
|
||||
ZONT — одна точка, может врать или отвалиться (прецедент: 2026-09-16 показывал
|
||||
°F вместо °C). Внешний прогноз — независимый канал. Берём **худшее** из двух
|
||||
(fail-safe: замёрзшая труба дороже лишних киловатт).
|
||||
|
||||
## Шаги выполнения
|
||||
|
||||
1. Бэкап `automations.yaml` — ✅ `automations.yaml.bak-cable-20260915-234837`
|
||||
(локально: `~/tmp-t610/bak-cable-20260915-234837/automations.yaml`, 650 строк)
|
||||
2. **Создать 6 объектов** (см. раздел «Конструкция» ниже) — ⏳ не начато
|
||||
3. `reload automations` и проверить `on` + отсутствие ошибок
|
||||
4. Проверить, что сущности существуют в runtime
|
||||
5. Обновить `family/how-to/home-automation.md` — раздел про ввод воды
|
||||
6. Записать питфоллы (WS `weather/subscribe_forecast`) в доки
|
||||
|
||||
## 🔴 Конструкция: прогноз НЕЛЬЗЯ получить из шаблона
|
||||
|
||||
**Открытие 2026-09-16.** Прогноз в этой версии HA недоступен шаблону — проверено
|
||||
четырьмя способами:
|
||||
|
||||
| Способ | Результат |
|
||||
|---|---|
|
||||
| атрибут `forecast` у `weather.forecast_laki_dom` | **`None`** |
|
||||
| `weather.get_forecasts(...)` в Jinja | **`'weather' is undefined`** |
|
||||
| сервис `weather.get_forecasts` (REST/WS, мн. число) | ✅ работает, 48 ч + 6 дней |
|
||||
| WS `weather/subscribe_forecast` | ✅ работает |
|
||||
|
||||
**Следствие:** пороги нельзя написать шаблоном «на лету» — прогноз надо
|
||||
**материализовать в сущность**. Иначе в триггер автоматизации его не подставить.
|
||||
|
||||
**Решение — слой обновления:**
|
||||
|
||||
```
|
||||
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)
|
||||
→ min( sensor.h2000_pro_temperatura_ulitsa ,
|
||||
input_number.heating_cable_forecast_min )
|
||||
```
|
||||
|
||||
Триггеры ВКЛ/ВЫКЛ/авария вешаются **на template-сенсор** — он числовой и всегда
|
||||
доступен. Исходный вариант (триггер прямо на прогноз) был нерабочим.
|
||||
|
||||
### Что создать (6 объектов)
|
||||
|
||||
| № | Объект | Тип | Назначение |
|
||||
|---|---|---|---|
|
||||
| 1 | `input_number.heating_cable_forecast_min` | helper | мин. прогноз на 24 ч |
|
||||
| 2 | `sensor.heating_cable_outside_min_24h` | template | `min(ZONT, прогноз)` |
|
||||
| 3 | `automation.heating_cable_forecast_update` | automation | обновляет №1 раз в час |
|
||||
| 4 | `automation.heating_cable_on` | automation | ВКЛ при ≤ −8 °C / 12 ч |
|
||||
| 5 | `automation.heating_cable_off` | automation | ВЫКЛ при ≥ −3 °C / 12 ч |
|
||||
| 6 | `automation.heating_cable_emergency` | automation | ≤ −20 °C, fail-safe, обрыв |
|
||||
|
||||
### Открытый вопрос (не решён)
|
||||
|
||||
**Где создавать helper №1** — Storage (UI, правится мышкой, но значение не
|
||||
попадает в док) или YAML (`configuration.yaml`, версионируется, но правка только
|
||||
файлом)? Alex не ответил.
|
||||
|
||||
Смежный вопрос: пороги −8/−3/−20 сейчас зашиты в YAML автоматизаций. Если Alex
|
||||
захочет пороги из UI — нужно 4 helper'а вместо одного.
|
||||
|
||||
Файл с заготовкой: `~/tmp-t610/new_cable_autos.yaml` (3 автоматизации, YAML валиден).
|
||||
|
||||
## Питфоллы
|
||||
|
||||
- 🔴 **`weather.get_forecasts` — ТОЛЬКО как сервис, не в Jinja.** В шаблоне даёт
|
||||
`'weather' is undefined` (вызов сервисов из шаблонов убран). Проверено фактом.
|
||||
- **Имя сервиса — множественное число** `weather.get_forecasts`. Единственное
|
||||
`weather.get_forecast` **не существует** → `not_found`.
|
||||
- **WS-команда — `weather/subscribe_forecast`**, поле `forecast_type` (не `type`).
|
||||
Ни `weather/forecast`, ни `weather.get_forecast` через WS не работают →
|
||||
`unknown_command` / `not_found`.
|
||||
- Результат WS-подписки приходит **двумя сообщениями**: сначала `result`, потом
|
||||
`event`. WS-хелпер, ждущий только `result`, вернёт пустой прогноз.
|
||||
- 🔴 **`render_template` по WebSocket возвращает `null`** даже для `{{ 2 + 2 }}`.
|
||||
Шаблоны рендерить ТОЛЬКО через REST `POST /api/template`. Проверено фактом.
|
||||
- `weather.forecast_laki_dom` — met.no, привязана к посёлку (координаты Лаки Парк).
|
||||
48 ч почасового + 6 дней дневного.
|
||||
- `switch.heating_cable_plug` отдаёт `0 W / 0 kWh` при `voltage 223 V` и
|
||||
`state off` — это **норма**, не поломка. Нагрузка не потребляет, пока выключено.
|
||||
- ⚠️ При записи скриптов `write_file` портит строку с литералом
|
||||
`Authorization: Bearer $TOK` (режет как секрет). Обход: собирать заголовок из
|
||||
переменных — `P1=Authorization; P2=Bearer; AUTH="${P1}: ${P2} ${TOK}"`.
|
||||
|
||||
## Инструменты
|
||||
|
||||
- `~/tmp-t610/ha_ws.py forecast <entity> <daily|hourly>` — рабочий вывод прогноза
|
||||
(добавлена команда `forecast`, `collect_events=True` для подписок).
|
||||
- `~/tmp-t610/rest_tpl.sh`, `test_jinja_forecast.sh`, `probe_forecast.sh` —
|
||||
рендер шаблонов через REST (проверка доступности функций Jinja).
|
||||
- `~/tmp-t610/get_states.sh` — выгрузка states через SSH (REST HA доступен только
|
||||
изнутри t610 по `http://172.30.32.1/api/`, снаружи — через
|
||||
`wss://mallexxx.duckdns.org/api/websocket`).
|
||||
|
||||
## Проверка результата
|
||||
|
||||
- Автоматизации `on`, `unavailable` = 0
|
||||
- Принудительный прогон с подставной температурой → кабель включается
|
||||
- `sensor.heating_cable_plug_power > 0` при включении (кабель реально греет)
|
||||
- `input_number.heating_cable_forecast_min` обновляется ежечасно
|
||||
Reference in New Issue
Block a user