Когда энергия дешевле — вовремя, чтобы её использовать

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

Хаб делает сравнение. Он определяет, какие периоды дешёвые, по правилам, которые вы задаёте, и публикует одно небольшое сообщение: что открыто сейчас и что откроется следующим. Что-то другое читает это сообщение и действует.

⚠️ Хаб ничего не переключает. На нём нет реле и нет настройки, которая заставила бы его что-то включать или выключать. Он вычисляет окна и публикует их. Решение и переключение принадлежат тому, что читает уведомление: автоматизации Home Assistant, диверсору или зарядному устройству, которое само подписано на MQTT. Если вы искали устройство, которое управляет нагрузкой по цене, — это не оно.


Это не только для динамических цен

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

Поэтому эта страница полезна, независимо от того, используете вы динамические цены или нет. Рыночная цена меняет то, насколько дешёвые периоды смещаются от дня ко дню; сам механизм один и тот же.

Правилам нужны установленные часы хаба: они используют часовой пояс самого хаба, чтобы определить, что такое «день» и «07:00». См. Время.


Три вида правил

До восьми правил, у каждого есть название, которое вы выбираете, и каждое включается и выключается отдельно. Название хранится на хабе не длиннее 23 байт — приложение прямо об этом говорит, а русская буква занимает два байта.

Цена ниже уровня

Приложение называет его «Цена ниже уровня». Вы задаёте цену, при которой или ниже которой окно открывается, и цену, при которой или выше которой оно закрывается. Окно — это сигнал, а что с ним делать, решает то, что его читает.

Параметр
on_below активно, пока полная цена покупки не выше этого значения
off_above остаётся активным, пока цена не достигнет этого значения; должно быть не ниже on_below

Два уровня нужны для того, чтобы цена, которая колеблется около одного числа, не заставляла окно мигать каждый период. Если их сделать равными, мигание и будет, поэтому оставьте зазор.

Используйте, когда порог абсолютный: «работать, пока электричество дешевле 10 центов, когда бы это ни случилось».

Самые дешёвые периоды в интервале

Приложение называет его «Самые дешёвые периоды в интервале» — «для нагрузки, которая может работать в любое время интервала, например водонагревателя». Вы задаёте количество 15-минутных периодов и часы, в которых их искать.

Параметр
periods от 1 до 96, каждый по 15 минут
from_h, to_h ежедневный интервал в местных часах; если to_h не позже from_h, интервал переходит через полночь, а равные часы означают все 24 часа
consecutive если включено, периоды должны идти одним непрерывным блоком

Используйте, когда известно, сколько нужно работать: «четыре самых дешёвых 15-минутных периода между 22:00 и 06:00». Если consecutive включено, вы получаете один непрерывный час вместо четырёх разрозненных периодов — это то, что нужно для всего, что не любит прерываний.

Самые дешёвые периоды до времени

Приложение называет его «Самые дешёвые периоды до времени» — «для нагрузки, которая должна быть выполнена к определённому времени, например электромобиля к 07:00». Та же идея, что и выше, но привязанная к часу, к которому нагрузка должна закончиться.

Параметр
periods от 1 до 96
deadline_h местный час, к которому нагрузка должна быть выполнена
consecutive как выше

Каждый день хаб смотрит на 24 часа, заканчивающиеся в этот час, и выбирает в них самые дешёвые периоды.

Используйте, когда настоящее ограничение — срок: «дайте ей два часа работы до 07:00 и выберите для этого два самых дешёвых часа ночью».

Если правило нельзя выполнить, оно отклоняется, а не тихо урезается: запрос большего числа периодов, чем вмещает интервал, возвращает ответ с указанием неверного поля. Это сделано намеренно: окно, молча укороченное, чтобы влезть, было бы другим правилом, чем то, что вы написали.


Два флага, если окно не нужно

Помимо правил есть два простых уровня:

Флаг Истинен, пока
«Сейчас дёшево» ниже текущая цена покупки не выше заданного вами уровня
«Низкая цена продажи» ниже текущая цена продажи не выше заданного вами уровня — отдача стоит мало или ничего

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


Что публикуется

Одно сообщение, меньше килобайта, в топик rbgrid/<mac>/price — retained, то есть сохраняемое брокером, поэтому всё, что подключится позже, сразу получит текущее состояние. Также оно доступно по GET /api/v1/signal и в сборке ESPHome через rbgrid_cmd.

Поле Что сообщает
period_from, period_until 15-минутный период, к которому относится сообщение
buy, sell, currency текущие цены покупки и продажи, валюта
price_state, provenance состояние динамической цены и откуда взята цена: ваш источник, запасной, передача из Home Assistant, среднее за час или ваш план
rank_buy, rank_sell место этого периода в местном дне: 1 — самый дешёвый; 0 — ещё не известно
periods_today сколько периодов сегодня известны — знаменатель для этого места
windows[] одна запись на каждое включённое правило: его название, активно ли оно, до какого времени и когда начнётся в следующий раз
buy_cheap, sell_low два флага
ts, v когда сформировано сообщение и версия его схемы

Это состояние, а не событие

Уведомление публикуется заново на каждой границе 15-минутного периода, а также сразу при любом изменении: открытии или закрытии окна, поступлении новых цен, изменении правила или уровня.

Стройте автоматизацию на текущем значении, а не на приходе сообщения. Получатель, который воспринимает каждую публикацию как событие, будет срабатывать много раз в течение длинного окна и пропустит переход, который случился, пока он был офлайн. Получатель, который читает windows[].active и действует по тому, что там написано, прав в каждый момент, в том числе в момент переподключения — для этого и нужен retained.

Открытия и закрытия также записываются в журнал самого хаба, где их можно прочитать позже в События:

price: window 'Boiler' on until <time>
price: window 'Boiler' off, next <time>

Пример, нарисованный честно

Бойлер, который работает в два самых дешёвых часа ночи:

  1. На хабе: правило с названием Boiler, вид «Самые дешёвые периоды в интервале», 8 периодов, с 22:00 до 06:00, consecutive включено.
  2. В Home Assistant: автоматизация, которая запускается по топику MQTT rbgrid/<mac>/price (или, в сборке ESPHome, по собственной сущности хаба).
  3. Её условие читает запись Boiler в windows[]. Активно — Home Assistant включает выключатель бойлера. Не активно — выключает.

Каждое решение в этом списке после шага 1 принимает Home Assistant. Хаб добавил одно утверждение: этот период входит в описанное вами окно. Диверсор или зарядное устройство, которое подписано на топик само, работает так же, и разделение то же: хаб констатирует факт о цене, а другое устройство решает, что с ним делать.

Из этого следует и то, что хаб не может быть причиной того, что что-то не запустилось. Если автоматизация не сработала, сначала читайте уведомление: оно говорит, что хаб считал верным, и это можно проверить.


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

  • Хаб не переключает ничего. Это и есть вся конструкция, а не пробел, который ждёт заполнения.
  • Восемь правил. Девятое отклоняется, а не молча отбрасывается.
  • Окон для продажи нет. Окна используют полную цену покупки; для отдачи используйте флаг «Низкая цена продажи» ниже.
  • Без установленных часов ничего не работает. Правила описывают часы и дни, а хаб, который не синхронизировал часы, не может их разместить.

Если работает не так, как ожидалось: что проверить

Окно никогда не открывается. Прочитайте само уведомление: в windows[] для каждого включённого правила есть next_start. Если next_start есть, правило работает, и вы просто раньше времени. Если правила нет в списке, оно выключено.

Окно каждый день открывается в другое время, а я ждал фиксированного. Это правило «самых дешёвых периодов» работает как задумано: дешёвые периоды смещаются, когда смещаются цены. Если нужны одни и те же часы каждый день, вам нужна зона в вашем плане, а не окно.

Окно мигает. Правило «ниже уровня» с двумя слишком близкими уровнями и ценой между ними. Увеличьте зазор между включением и выключением.

Правило не сохранилось — его отклонили. В ответе назван поле. Обычные две причины: периодов больше, чем может вместить окно, или цена выключения ниже цены включения.

Окна игнорируют динамическую цену и следуют плану. Они следуют полной цене покупки каждого периода, которая переходит к плану, когда ни одна динамическая цена не покрывает этот период. Проверьте поле provenance в уведомлении: plan там означает, что для этого периода не действовала рыночная цена — см. Откуда берётся ваша цена.

rank_buy равен 0. У места пока нет знаменателя: сегодняшние цены известны не полностью. Значение заполнится по мере поступления цен.

Автоматизация срабатывает снова и снова в течение одного окна. Она срабатывает на сообщение, а не читает состояние. Уведомление публикуется каждые 15 минут по замыслу; поставьте условие автоматизации на windows[].active.

Автоматизация пропустила окно, которое, по журналу, открылось. Получатель был офлайн в момент перехода и ждёт событие, которое уже произошло. Читайте сохранённое сообщение при подключении — для этого оно и сохраняется.

Часы сдвинуты на постоянное смещение. Правила используют часовой пояс самого хаба, а не телефона или Home Assistant. Проверьте Время.

Я хочу, чтобы окно учитывало и мою плату за мощность. Не учитывает — окна относятся к цене за кВт·ч. Наибольшее потребление за расчётный период измеряется отдельно и ни во что не переводится в деньги: см. Пики потребления.

⚠️ Для любых работ внутри электрощитка вызывайте квалифицированного электрика.