Динамические цены на электроэнергию в Home Assistant: почему показатель стоимости дрейфует и как держать цену рядом с кВт·ч

  • Проверено на прошивке v1.2.1
  • Начало работы

Если ваш тариф следует за рынком, вы, скорее всего, это уже видели. Панель Energy показывает стоимость за вчера. Через день вы смотрите снова, и цифра другая. Или в одном часе лежит всплеск энергии, которую никто не использовал, по цене, которая была в этот час.

Вы не выдумываете, и вы не одни:

«Почему-то панель всегда считает больше, чем должна.» — odechr, обсуждение на форуме Home Assistant, тема 496113

«Показывает стоимость/доход намного выше реального.» — andreaskin, тема 647174

Это не ошибка, которую можно найти в собственной конфигурации, поэтому она переживает столько вечеров поисков. Это несоответствие двух временны́х гранулярностей.

Механизм в одном абзаце

Home Assistant считает энергию по своей долгосрочной статистике, которая почасовая. Для фиксированного тарифа это именно то, что нужно: час по одной ставке — это час по одной ставке. Для контракта, который меняет цену в течение дня, проблема в часе — а когда что-то прерывает запись, час становится всей проблемой.

Лучшее описание написал тот, с кем это случилось:

«Это просто добавляет всю пропущенную энергию к часу, в который система снова включилась.» — anon11644107, тема 965144

Так: Home Assistant перезапускается, или датчик выпадает и возвращается, и счётчик делает скачок. Энергия пропуска реальна — ваш счётчик её учёл, — но она приходит разом, попадает в час перезапуска и тарифицируется по цене этого часа. Если пропуск захватил самые дешёвые ночные часы, а вы вернулись к завтраку, вы только что купили ночь по утренней цене.

Два столбчатых графика на одной оси 00:00–09:00. Сверху, «Что произошло на самом деле»: четыре маленьких зелёных столбца по 1.5 кВт·ч в 02:00, 03:00, 04:00 и 05:00, с подписью «6 кВт·ч по ночной цене», и тёмный столбец 0.4 кВт·ч в 08:00 с пометкой «по утренней цене». Снизу, «Что записала панель»: между 02:00 и 05:00 ничего — пунктирный пустой контур с подписью «пропуск — нет данных» — и один высокий тёмный столбец 6.4 кВт·ч в 08:00, со стрелкой от пропуска к нему с подписью «записано, когда регистратор вернулся». Внизу целиком: «6.4 кВт·ч, всё по утренней цене»

Та же схема встречается и в других формах. Сенсорная интеграция может умножиться на тысячу после перезапуска — это открытая проблема в ядре Home Assistant, #136428, описанная так:

«После перезапуска Home Assistant значение сенсорной интеграции умножается на 1000.» — roumano, core #136428

А устройство, которое теряет питание, может сбросить свой счётчик в ноль, и принимающая сторона прочитает это как потребление:

«Из-за этого наши Shelly 3EMs перезагружаются, и HA записывает огромный пик — 1000-ки кВт·ч потребления.» — msa, тема 479362

Ничего из этого не говорит о том, что Home Assistant плохо сделан. Почасовая статистика — разумное решение, а обходные пути, которыми делятся люди, — шаблоны доступности, исправление строк в Developer Tools → Statistics, выбор метода left для Riemann integration — работают. Просто это много вечеров ради цифры, которую не должно приходиться защищать.

Что меняется, когда цена применяется там, где измеряется энергия

Альтернатива — не лучшая панель. Это перенос решения на шаг раньше, на устройство, которое измеряет.

Хаб RBgrid определяет одну цену на каждый 15-минутный период: из выбранного вами источника цен на сутки вперёд (day-ahead) для вашей зоны, из резервного (backup), если в первом нет данных за этот период, а иначе из вашего тарифного плана. Ваш контракт накладывается сверху — множитель (factor), надбавка (markup), затем налоги за кВт·ч, сетевой сбор (grid fee) и сбор (levy) по вашему плану, затем НДС (VAT) — если только источник уже не публикует розничную цену. Тогда ничего не добавляется и ничего не считается дважды.

Потом он делает то, что важно для этой статьи: он сохраняет использованную цену рядом с энергией, за которую её заплатили, с источником каждого периода, и хранит это 40 дней.

Из этого следуют три вывода, и в них вся суть:

  • Пропуск остаётся пропуском — на хабе. Хаб продолжает измерять и считать стоимость, пока Home Assistant перезапускается, потому что ни одна из этих задач не живёт в Home Assistant. В его собственной записи нет неверного часа, и ничего не нужно восстанавливать потом. Что покажет Home Assistant, зависит от того, как данные хаба до него доходят, и это в следующем разделе.
  • Цена привязана к своей энергии. Стоимость 02:15–02:30 была посчитана по цене 02:15–02:30 в тот момент, и эта пара записана. Она не зависит от того, в каком часе число прочитают позже.
  • Это можно проверить. Не «доверьте цифре», а прочитайте строку.

Почасовая статистика Home Assistant остаётся почасовой. Эта статья не утверждает обратного, и ничто здесь не меняет того, что сохраняет Energy dashboard. Деньги с 15-минутной точностью живут на хабе и в его собственном журнале; в Home Assistant попадает то почасовое представление, которое он всегда вёл.

Что реально доходит до Home Assistant и по какому маршруту

Запись хаба и Energy dashboard — это разные вещи, и вторая зависит от того, как вы их соединили. Это важнее, чем кажется, потому что от этого зависит, покажет ли экран скачок в час перезапуска.

  • Если Energy dashboard берёт стоимость из собственной сущности стоимости хаба, час, который она показывает, — это сумма периодов, каждый из которых хаб оценил отдельно, а не одна почасовая средняя, применённая к куску энергии.
  • Если вы оставили собственный датчик цены поверх энергии хаба, Home Assistant считает его как и раньше, с той гранулярностью, которая у него всегда была. Журнал хаба и панель тогда расходятся, и правильный — тот, где есть периоды.
  • Перезапуск по-прежнему прерывает то, что записывает Home Assistant, что бы ни делал хаб в это время. Ваши энергия и деньги на хабе целы. Исправляется ли пропуск внутри Home Assistant, зависит от маршрута и от одной настройки, о которой стоит знать.

Почасовой импорт статистики и настройка, о которой никто не упоминает

Интеграция RBgrid относится к одному из двух способов запуска хаба: хаб прошит как устройство ESPHome. Если ваш хаб работает на автономной прошивке и связывается с Home Assistant по MQTT, импорта включать не нужно. Переход между ними — это перепрошивка, а не настройка, поэтому это выбор на старте, а не переключатель, который переворачивают потом.

На этом маршруте интеграция каждый час запрашивает у хаба его собственную почасовую книгу и записывает её в долгосрочную статистику Home Assistant как второй набор строк, рядом с тем, что Home Assistant уже ведёт для ваших живых датчиков, — каждый час с энергией и стоимостью, которые хаб посчитал за этот час. Это работает само, раз в час, догоняя с того места, где остановилось, поэтому пауза в несколько дней заполняется час за часом, а не сваливается в один. Кнопка Import into HA statistics на вкладке History запускает тот же проход немедленно, а не является отдельным механизмом. В выборщиках Home Assistant строки появляются под именами вроде RBgrid Hub Main energy in и … cost.

⚠️ По умолчанию Energy dashboard на эти строки не смотрит. Мастер настройки интеграции подключает панель к живым счётчикам, и на них перезапуск по-прежнему показывает знакомый скачок в час, когда Home Assistant вернулся. Строки импорта, в которых нет пропуска, доступны в настройках источников Energy dashboard — их нужно выбрать вручную.

Итак, честная картина трёхслойная: собственная запись хаба никогда не содержит неверного часа; импортированная статистика даёт Home Assistant копию этой записи без пропусков; а панель показывает ту из двух, на которую вы её направите.

Как проверить свой счёт построчно

Это стоит сделать один раз, чтобы в следующий раз, когда цифра покажется неверной, было где посмотреть.

  1. Откройте страницу хаба Цены и перейдите в Applied prices.
  2. Выберите нужный день. Таблица — одна строка на каждый закрытый 15-минутный период, столбцы: Период · Покупка · Продажа · Источник.
  3. Скачайте CSV. Столбцы — время начала в собственном времени хаба, цена покупки, всё включено (all-in buy price), цена продажи (sell price) и источник.
  4. Сравните интересующий вас отрезок с выпиской вашего поставщика.

Столбец Источник — тот, который чаще всего пропускают, а потом он оказывается нужен. Он говорит, откуда взялась цена каждого периода: основной источник (primary), резервный, цена, переданная из Home Assistant, среднее за час, если ваш контракт рассчитывается почасово, или ваш тарифный план, когда ни один рыночный источник не покрыл период. Строка с plan — не ошибка: это значит, что рыночной цены в силе за этот период не было, поэтому её оценила зонная ставка. Это другое число, и оно получено верно.

День может содержать меньше 96 строк. Это не потерянная цена: журнал записывает периоды, в которых хаб работал, поэтому перезапуск, обновление или отключение питания оставляют пропуск, а пропуск означает, что хаба в тот момент там не было.

Чего это не делает

Стоит сказать прямо, потому что страница о ценах — самое лёгкое место, где можно подразумевать больше, чем правда.

  • Оно не совпадёт с выпиской вашего поставщика точь-в-точь. Мы измеряем у ваших клещей, а они — на своём счётчике. Журнал показывает, какой период чего стоил и почему, а не что напишет ваш счёт.
  • Оно ничего не переключает. Хаб может сообщить вам — и сообщить автоматизации — что отрезок дешёвый, в виде уведомления. Что включает посудомоечную машину — Home Assistant, переключатель нагрузки или вы.
  • Оно не меняет гранулярность Home Assistant. См. примечание выше; это стоит повторить, потому что на это больше всего надеются.
  • Это не оценка вашего контракта. Подходит ли вам контракт с динамической ценой, решаете вы и ваш поставщик.

Где читать дальше

  • Where your price comes from — источники, цепочка резервных вариантов, что ваш контракт делает с рыночной ценой.
  • How cost is calculated — цепочка от измеренного кВт·ч до денег, с двумя ветками для биржевых и «всё включено» источников.
  • Every circuit into Home Assistant — два способа запустить хаб вместе с Home Assistant.

Цитаты взяты из публичных обсуждений на форуме Home Assistant и из GitHub issues, с их авторами и номерами тем, чтобы вы могли прочитать обсуждение целиком — включая части, которые расходятся с этой статьёй.