Идеи на будущее¶
Не задачи и не обещания — список того, что имеет смысл обдумать. Каждый пункт объясняет, какую реальную проблему он решает; если проблема так и не проявится на практике, пункт лучше выбросить, чем реализовывать.
Присутствие машины по локальному датчику вместо GPS¶
Проблема. GPS регулярно «теряет» стоящую машину: координаты уплывают
на пару сотен метров, и трекер сообщает not_home, хотя машина никуда не
уезжала. Сейчас это лечится двумя способами — идущий ток подтверждает
присутствие для уже начатой сессии, а старт перепроверяется на каждом пересчёте
всю сессию. Но остаётся окно, когда обоих механизмов мало: если трекер врёт
непрерывно с самого начала окна, зарядка так и не начнётся.
Идея. Положить в машину дешёвый Zigbee-датчик (например, температуры) и считать машину дома, пока датчик виден Zigbee-сети: её радиус как раз совпадает с «машина стоит у дома». В отличие от GPS такой признак не плавает — устройство либо на связи, либо нет.
Как это может выглядеть. Новый необязательный вход «Датчик присутствия
машины» (binary_sensor или любая сущность с last_seen), который участвует
в проверке зоны наравне с трекером: машина считается дома, если её видит
трекер или локальный датчик. Логика уже подготовлена — есть переменная
physically_present, к которой такой источник добавляется естественно.
Что надо продумать до реализации. - Как отличить «датчик пропал, потому что машина уехала» от «датчик пропал, потому что села батарейка». Вероятно, по возрасту последнего сообщения: свежее молчание — уехала, застарелое — сдох датчик. - Zigbee-сеть может добивать до соседнего двора, и тогда признак начнёт врать в другую сторону. Проверяется только на месте. - Батарейка в датчике садится за месяцы, и отказ будет тихим. Нужен собственный контроль свежести, иначе появится новый источник тихих сюрпризов.
Автоопределение недобора тока станцией¶
Проблема. Станция систематически отдаёт меньше запрошенного. По двум реальным ночам величина измерена точно и оказалась постоянной в амперах, а не в процентах:
| Уставка | Факт | Разрыв |
|---|---|---|
| 16 А | 14.69 А | 1.31 А |
| 19 А | 17.66 А | 1.33 А |
Разброс по всем пересчётам — сотые доли. Это не потери в проводах (росли бы с током) и не предел машины (она брала 17.66 А), а смещение самой станции. В долях разрыв тем заметнее, чем меньше ток: 8% при 16 А, но 22% при 6 А.
Замеры третьей и четвёртой ночей подтвердили это на более широком диапазоне (только установившийся режим, возраст уставки больше паузы между командами):
| Уставка | 11 А | 13 А | 18 А | 22 А | 25 А | 28 А |
|---|---|---|---|---|---|---|
| Недодача | 1.09 | 1.35 | 1.54 | 1.43 | 1.42 | 1.33 |
| В долях | 9.9% | 10.4% | 8.5% | 6.5% | 5.7% | 4.7% |
То есть форма компенсации не совпадает с формой дефекта: множитель в 10% точен около 13 А, но вдвое перебирает на 28 А и недобирает на малых токах. Это осознанный размен (см. ниже), а не недосмотр.
Величина измеряется и показывается (недодача_а в diag, строка
в журнале), а компенсация с версии 1.4.0 задаётся вручную — параметром
«Запас по току», множителем к расчёту.
Идея. Измерять разрыв автоматически, накапливать за прошлые сессии и подставлять поправку самому, без участия человека.
Почему не сделано автоматически. Три причины.
Первая — арифметическая, и она определила форму реализованного решения:
любая прибавка к расчётному току попадает в сравнение с уставкой в зоне
нечувствительности, притворяется вечным расхождением плана и переписывает
уставку на каждом пересчёте. Ровно от этой путаницы защищает
test_the_deadband_compares_setpoint_with_setpoint. Поэтому запас сделан
множителем: он сходится к устойчивому значению и там остаётся.
Вторая — устойчивость: если ток ограничивает не станция, а машина (сел бортовой зарядник, мороз, балансировка в конце заряда), автоматическая компенсация даёт положительную обратную связь. Расчёт показывает разгон 12 → 17 → 20.7 → 21.9 А при машине, берущей ровно 10 — до потолка, без единого лишнего ампера в батарее. Ручной запас этой петли не создаёт: он постоянен и не зависит от факта.
Третья выяснилась на третьей ночи — измерению нельзя доверять напрямую.
Сенсор тока станции обновляется с задержкой: он стоял на 11.669 А целых семь
минут, пока мощность росла 2592 → 5683 Вт (реальный ток по P/U доходил
до 25.6 А). Автоматика, подставляющая измеренную «недодачу» в расчёт, приняла
бы эти 16 А за истину. Сейчас величина считается только на установившемся
режиме, но для автоподстройки этого мало.
Работоспособный вариант должен компенсировать не ток, а энергию, причём
до превращения её в ток, и иметь собственное хранилище (input_number,
который пользователю пришлось бы заводить руками). Через КПД задача не
решается: доля непостоянна — 92% при 16 А, 78% при 6 А, 95% при 28 А.
Учёт кривой заряда на последних процентах¶
Проблема. Считается, что выше примерно 80% заряда машина сама снижает ток, и линейный план начинает врать.
Что показали измерения. На реальной машине (Voyah Dream) излома на 80% нет вовсе. Скорость держалась ровно 6.00 %/час семь часов подряд, с 55% до 97%, без единого отклонения. Замедление началось только на 97%:
| Участок | Скорость |
|---|---|
| 55 → 97% | 6.00 %/час |
| 97 → 99% | 4.00 %/час |
| 99 → 100% | ток упал 14.7 → 9.6 А, ~30 минут |
То есть ошибка линейной модели для этой машины — около 15–20 минут на последнем проценте, что уже покрывается параметром «Резерв времени».
Идея. Нелинейный план: закладывать замедление после порога, который пользователь может настроить под свою машину.
Почему не сделано. Резерв справляется, а выигрыш измерим и невелик. Куда дороже обходились недодача тока (около 40 минут за сессию) и потерянные команды станции — то и другое исправлено в 1.4.0. Точная кривая сильно различается между моделями, а ошибиться в ней хуже, чем не иметь её вовсе.
Раздача мощности между двумя машинами¶
Проблема. Одна станция и два электромобиля — сейчас не поддерживается никак. Флаг сессии позволяет не мешать чужой зарядке, но не делить между ними доступный ток.
Почему это отдельная задача. Одна автоматизация не может управлять двумя сессиями сразу: пришлось бы либо заводить по копии на каждую машину и как-то их синхронизировать, либо переносить логику в отдельную интеграцию. Для blueprint это уже за гранью разумной сложности.
Учёт тарифа и цен на электричество¶
Идея. Вместо фиксированного окна выбирать самые дешёвые часы по данным тарифного сенсора (Nord Pool, «Мой умный дом» и аналоги).
Почему не сделано. В России двухтарифный счётчик с фиксированными границами покрывает почти все случаи, а окно настраивается вручную. Идея имеет смысл в первую очередь для рынков с почасовым ценообразованием.
Подавление повторных уведомлений о проблемах с данными¶
Проблема. Пока данные о заряде негодны, хук ошибки вызывается на каждом пересчёте: за долгую сессию это до полутора десятков одинаковых сообщений. Такие уведомления быстро перестают читать, а вместе с ними пропускают и настоящие.
Почему не сделано. Watchdog «включено, но ток не идёт» решает это окном «сообщить один раз»: он знает возраст выключателя, то есть как давно длится проблема. Для данных такого якоря нет. Возраст самих данных не годится — сенсор мог замереть ещё до начала сессии, и окно оказалось бы закрыто с первого же пересчёта, то есть о реальной проблеме не сообщили бы вовсе. Проверено: попытка привязаться к возрасту данных ломает ровно тот случай, ради которого проверка и заведена.
Честный признак «как давно длится проблема» требует памяти между прогонами,
а блюпринт её не имеет. Варианты — вспомогательный input_datetime, который
пользователю пришлось бы создавать руками, или перенос логики в интеграцию.
Пока рекомендуется гасить повторы в самом действии уведомления (одинаковый
tag в notify заменяет предыдущее сообщение); это описано в
примерах настройки.
Фильтр сенсора «время с последнего выхода на связь»¶
Проблема. Вход «Сенсор времени с последнего выхода машины на связь»
отфильтрован по device_class: duration. У Voyah сенсор именно такой
(last_ping, единицы s), поэтому сейчас всё работает. Но у части интеграций
этот показатель выглядит иначе: Tesla, Renault и другие отдают дату
последнего контакта (device_class: timestamp), а некоторые — голое число
секунд вообще без класса. У таких пользователей сенсор просто не появится
в выпадающем списке, поле останется пустым, и вместе с ним отключится один
из трёх механизмов проверки достоверности данных о заряде — молча.
Идея. Снять device_class из фильтра, оставив domain: sensor, либо
разрешить оба класса списком [duration, timestamp].
Почему не сделано сейчас. Снятие фильтра — не бесплатное решение: тогда
в списке окажутся все сенсоры подряд, и легко выбрать тот, значение которого
код не поймёт. Шаблон soc_fresh умеет работать только с числом секунд;
у нечислового значения он идёт по ветке not is_number(...) и возвращает
true. Проверено на дате 2026-08-02T22:00:00+00:00: soc_fresh=true,
soc_problem='none' — данные признаны свежими, хотя машина не выходила
на связь трое суток. Это тихая противоположность задуманному, и она хуже
пустого поля: пустое поле хотя бы честно отключает проверку.
Что надо сделать вместе с этим. Прежде чем расширять фильтр, шаблон должен
уметь оба формата: если значение — число, это секунды; если разбирается как
дата, брать разницу с now(). Плюс рантайм-проверка «выбранный сенсор не даёт
ни числа, ни даты» с внятной причиной в alarm_reason — иначе неверный выбор
останется незаметным ровно так же, как сейчас незаметно пустое поле.
Проверка, что выбран правильный тип сенсора¶
Проблема. Селекторы не умеют отличить текстовый сенсор статуса от числового,
а сенсор здоровья батареи — от сенсора уровня заряда: оба sensor, оба
в процентах. Выбрав не тот, пользователь получит работающую, но неверно
работающую автоматизацию без единого сообщения об ошибке. Описания входов
об этом предупреждают, но их читают не все.
Идея. Рантайм-проверки, поднимающие alarm_reason: статус станции —
число (is_number(states(...)) при непустом статусе); здоровье батареи ведёт
себя как уровень заряда (растёт во время зарядки). Часть защиты уже есть —
здоровье вне диапазона 50–130 % игнорируется, а доля вроде 0.98 переводится
в проценты.
Что надо продумать. Числовой статус — законный случай (станции с кодами
0/1/2 существуют, и блюпринт их поддерживает), так что проверка должна
срабатывать только когда список статусов явно текстовый, а сенсор числовой.
Иначе получится ложная тревога у тех, у кого всё настроено верно.
Возраст сущности, переживающий обрыв связи¶
Проблема. Блюпринт измеряет время по last_changed, а тот обновляется
и при уходе сущности в unavailable. Секундный обрыв связи со станцией
омолаживает выключатель до нуля, и всё, что опирается на его возраст,
начинает врать:
| Что ломается | Как проявляется |
|---|---|
session_started_in_window |
«Доработать начатое» отваливается, если обрыв случился после конца окна. Проверено на реальной ночи: обрыв в 07:01 при окне до 06:55 отключал дозарядку |
switch_gap_elapsed |
Включение и смена режима блокируются ещё на command_gap после каждого обрыва |
no_power_alarm |
Watchdog «включено, но тока нет» отсчитывается заново; при частых обрывах может не сработать вовсе |
| Запись в журнал | «Сессия длилась N мин» показывает время с последнего обрыва |
Идея. Измерять возраст по источнику, устойчивому к недоступности.
У состояния есть last_reported, но он обновляется на каждом опросе
и потому не годится напрямую. Более честный путь — вспомогательный
input_datetime, куда блюпринт записывает момент старта сессии.
Почему не сделано. Требует от пользователя завести ещё одну сущность руками, а выигрыш узкий: страдает в основном дозарядка после конца окна, и лишь в те сессии, когда обрыв пришёлся на последние минуты. Отдельно стоит учесть, что флаг сессии на роль замены не подходит — аварийная дозарядка поднимает его так же, как ночная, и по нему дневной аварийный долив превращался бы в полноценную дневную сессию.