Откуда берётся ваша цена

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

Об этом страница: откуда хаб берёт эту цену, что он с ней делает и как увидеть, какую цену он использовал. Что показывает экран и что делать, когда цифра выглядит неверной, описано на странице Динамические цены.

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


Коротко

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

Цепочка по порядку

Для каждого 15-минутного периода хаб определяет одну цену:

источник что это значит
1 Основной поставщик, которого вы выбрали, для вашей зоны
2 Запасной необязательный, и обязательно другой поставщик; используется только для периодов, которые основной не покрывает
3 Ваш план ставка зоны, действующая в этот период, — см. Тарифы

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

Зачем стоит задать запасной источник

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

Не у каждой зоны есть второй источник. Двенадцать областей покрыты двумя и более источниками из списка ниже: SE1–4 и NO1–5 (Nord Pool наряду с национальным источником), DK1–2 и NL (Energy-Charts наряду с другим), причём SE4 и NO2 покрыты тремя. Для AT, BE, CH, CZ, DE-LU, EE, FI, FR, HU, IT-North, LT, LV, PL, SI и регионов Великобритании второго поставщика здесь нет — поэтому либо запасным будет отправка из Home Assistant, либо эти периоды перейдут на ставку зоны плана.


Источники

Источник Тип Разрешение Области Валюта
Energy-Charts (Fraunhofer ISE) биржевая 15 минут AT, BE, CH, CZ, DE-LU, DK1, DK2, FR, HU, IT-North, NL, NO2, PL, SE4, SI EUR
Nord Pool (неофициальный портал данных) биржевая 15 минут SE1–4, NO1–5, DK1–2, FI, EE, LV, LT своя область: SEK, NOK, DKK или EUR
Elpriset just nu (SE) биржевая 15 минут SE1–4 SEK
Hva koster strømmen (NO) биржевая 1 час NO1–5 NOK
EnergyZero (NL) всё включено 15 минут NL EUR
Octopus Agile (UK) всё включено 30 минут 14 регионов GSP, A–P GBP
Home Assistant выбираете вы: биржевая или всё включено какую передадут — валюта вашего плана

Ни одному источнику в этом выпуске не нужен токен или учётная запись.

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

Биржевая или «всё включено» — самое важное, что нужно выбрать верно, и это объясняется ниже, потому что ошибка здесь — самый частый способ получить завышенную цифру стоимости.

⚠️ Валюта не конвертируется. Хаб не переведёт SEK в EUR. Зона, валюта которой отличается от валюты вашего плана, отклоняется при сохранении (поле возвращает ошибку), а источник в другой валюте пропускается, а не приближается. Nord Pool SE3 требует план в SEK; Energy-Charts DE-LU требует план в EUR. Сначала задайте валюту плана, затем выберите зону, которая ей соответствует.

Атрибуция показывается, и это намеренно

Каждый источник несёт формулировку, которую требует его собственная лицензия, например Bundesnetzagentur | SMARD.de / Energy-Charts (CC BY 4.0), и хаб выводит её на странице «Цены». Это не украшение: это условие, на котором данные можно использовать, и оно говорит вам, что перед вами. Energy-Charts отдаётся только для зон, опубликованных по CC BY 4.0.

Nord Pool подключён через неофициальный портал данных, и хаб сообщает об этом там, где называет источник. Соглашения об обслуживании за ним нет: он может измениться или прекратиться без предупреждения. Используйте его осознанно и, где возможно, задавайте запасной: SE1–4, NO1–5 и DK1–2 покрыты и другим источником из этого списка, но для FI, EE, LV и LT Nord Pool — единственный, и там единственный доступный запасной вариант — отправка из Home Assistant.


Что ваш договор делает с ценой

Рыночная цена — не то, что вы платите. Два типа источников различаются тем, сколько остального уже включено в число.

Биржевой источник: цена — начало цепочки

buy = ( spot × factor
        + markup
        [ + your plan's zone rate, if "zones stack" is on ]
        + your plan's per-kWh energy tax
        + grid fee
        + renewable levy )
      × ( 1 + your plan's VAT )

factor (множитель) и markup (надбавка) — условия вашего договора: коэффициент и добавка за кВт·ч. Всё остальное берётся из плана, который вы уже ввели на странице Тарифы, поэтому план важен и тогда, когда цена динамическая.

Допустимые диапазоны, и значение вне них отклоняется, а не обрезается: factor от 0 до 10, markup от −100 до 100.

Источник «всё включено»: цена — вся цепочка

buy = the provider's price

Из плана ничего не добавляется — ни налога, ни платы за сеть, ни сбора, ни НДС.

⚠️ Это механизм, который предотвращает самую частую ошибку в стоимости. Цена «всё включено» уже содержит налоги и НДС. Если пропустить её через формулу для биржевой, каждый из них добавится второй раз, и ваши затраты окажутся заметно завышенными. EnergyZero и Octopus Agile помечены как «всё включено» именно поэтому — класс поставщика задаёт хаб, а не вы; в списке поставщиков вы видите его как · всё включено и в строке формулы. Класс выбираете вы только для Home Assistant, где вы указываете, какой тип передаёте. Если ваши затраты выглядят раздутыми, а сама цена верна, именно это нужно прочитать первым.

Home Assistant как источник

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

В сборке ESPHome Home Assistant сразу значится среди источников; в самостоятельной прошивке он появляется в списке, когда пришла первая отправка. В обоих случаях динамические цены выключены, пока вы их не включите, а источник выбираете вы — Home Assistant — один из вариантов в списке, а не уже выбранный.

Всё на этой странице верно для обеих сборок: хаб ESPHome работает на том же ядре и с тем же загрузчиком, с теми же поставщиками, расписанием и цепочкой запасных вариантов. Различается только место настройки — в сборке ESPHome это панель RBgrid в Home Assistant, а не веб-приложение.


Сторона продажи

Экспорт оценивается отдельно и никогда тем же числом, что и импорт. Три режима:

Режим Цена продажи — это
От поставщика (по умолчанию) экспортная цена самого источника, где она есть, иначе ставка продажи зоны вашего плана
По тарифному плану ставка продажи зоны вашего плана
Биржевая цена × множитель − плата spot × export factor − export fee

Множитель продажи принимает от 0 до 10, плата за отдачу от −100 до 100 (k_sell и плата за отдачу в API). К стороне продажи налог и НДС не применяются.

Стоимость отданной энергии по-прежнему никогда не вычитается из ваших затрат. Импортированная энергия и её стоимость, экспортированная энергия и её ценность — рядом; см. Экономика. Динамическая цена меняет числа, но не это правило.


Расчёт по среднему за час: когда ваш договор считается по часам

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

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

Периоды, оплаченные так, помечаются hourly_mean в журнале цен, чтобы их можно было отличить потом.


Отрицательные цены и пол

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

Если ваш договор не пропускает отрицательные цены, задайте пол: Минимальная цена покупки и Минимальная цена продажи (от −100 до 100, или «Нет»; floor_buy и floor_sell в API). Если оставить пустым, каждое читается «Нет: отрицательные цены проходят как есть». Пол применяется последним, после всего остального.

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


Когда приходят цены

  • Сегодняшние цены загружаются, как только день перестаёт быть полностью покрыт.
  • Завтрашние загружаются с 11:00 UTC, когда начинается публикация рынка дня вперёд; в приложении это подано так, как читатель это воспринимает, — «обычно приходят после 13:00 CET».
  • Если загрузка не удалась или завтрашних цен ещё нет, хаб повторяет попытку каждые 15 минут до 15:00 UTC, затем раз в час. После 15:00 UTC страница также прямо об этом сообщает: состояние становится «Цен на завтра ещё нет».

Поэтому пустая вторая половина графика до полудня — это нормально, а не неисправность: завтрашнего дня ещё не существует.

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

price: state A -> B (source …)
FAIL price: <provider> <zone> fetch failed (<reason>), retry in N min

Причина — одна из fetch_failed, http_status, parse, auth, no_data_for_zone или rate_limited, и от неё зависит, что с этим делать (см. ниже). Текущее состояние и то, до какого момента известны цены, — на странице «Цены» и в API как price_state и valid_until.


Запись: какая цена использована для каждого периода

Применённая цена каждого 15-минутного периода записывается с её источником и хранится 40 дней — в том числе когда динамические цены выключены, где запись просто читается plan. Скачать её в CSV можно на странице «Цены».

prov откуда взята цена
source ваш основной источник
backup ваш запасной источник
ha_push переданная Home Assistant или другим клиентом
hourly_mean среднее за этот час, по настройке вашего договора
plan ставка зоны вашего тарифного плана

🔑 Именно это делает цифру стоимости проверяемой, а не просто заслуживающей доверия. Монитор, который показывает вам стоимость, просит поверить ему на слово. Монитор, который показывает цену, которую он использовал, для каждого периода и откуда она взята, даёт вам сам расчёт — а 40 дней достаточно, чтобы разобраться со спорным вопросом, имея под рукой ежемесячную выписку.

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


Где цена появляется ещё

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

Если у вас прошивка v1.2.0, обновитесь

В примечаниях к выпуску хаба есть одна рекомендация, и её стоит выполнить, а не пролистать: обновитесь с v1.2.0, если вы используете динамические цены.

На v1.2.0 загруженные периоды цен хранились в небольшом хранилище настроек хаба — том же, где лежат текущий час и опорные значения энергии. При включённых динамических ценах цены могли заполнить его, и тогда перезапуск мог потерять часть измеряемого часа. Хаб сообщает об этом, когда это случается: журнал хаба содержит FAIL hour persist …: ESP_ERR_NVS_NOT_ENOUGH_SPACE.

v1.2.1 переносит периоды цен в файловую систему хаба и освобождает это место при первом запуске, записывая price: stores moved from NVS to the file system. Ничего из того, что делает читатель, не меняется, и ничего на этой странице не читается иначе ни на одной из версий, — но описанный сбой становится невозможным.

Правила дешёвых окон и цифры пиков импорта невелики и остаются в хранилище настроек на обеих версиях: «хранилища цен перенесены» не значит, что всё связанное с ценами переехало.

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

Сказано прямо, потому что каждый из этих пунктов читатель может разумно ожидать:

  • Нет Tibber, нет Amber. Не реализовано. Если ваш поставщик один из них, передавайте цену из Home Assistant.
  • Нет конвертации валюты. Валюта вашего плана и валюта зоны должны совпадать.
  • Нет соглашения об обслуживании за Nord Pool. Конечная точка — неофициальный портал данных и может измениться без предупреждения.
  • Нет управления нагрузкой. Хаб измеряет и оценивает; он ничего не переключает. Уведомление — точка передачи.
  • Нет расчёта платы за мощность. Пики измеряются, а не закладываются в ваши затраты.

Если цифра неверна: что проверить

Мои затраты сильно завышены, а сама цена выглядит верно. Ваш источник — «всё включено», но его обрабатывают как биржевой, поэтому налоги и НДС плана добавляются поверх цены, которая их уже содержала. Для сетевого поставщика класс задаёт хаб, а не вы: прочитайте его в списке поставщиков, где источник «всё включено» помечен · всё включено, и в строке формулы. Для Home Assistant класс — ваш: проверьте Что передаёт Home Assistant.

Мои затраты выглядят слишком низкими, или цена ниже, чем в приложении моего поставщика. Обратное: биржевая цена без условий договора. Проверьте, что factor и markup соответствуют договору и что план, на котором они стоят, содержит ваш сбор за энергию, плату за сеть, сбор и НДС. Голая биржевая цена — оптовая цифра, а не розничная.

Половина графика пустая. Если это до середины дня, завтрашние цены ещё не опубликованы — хаб начинает спрашивать с 11:00 UTC, и они обычно приходят после 13:00 CET. Если уже после этого, посмотрите в События строку FAIL price: и прочитайте её причину.

FAIL price: … no_data_for_zone. Поставщик ответил, но не по вашей зоне. Либо зоны нет в списке этого источника, либо источник перестал её отдавать. Смените зону или источник.

FAIL price: … parse или http_status, снова и снова. Источник изменился или не работает. Для этого случая и существует запасной источник; задайте его от другого поставщика, покрывающего ту же зону, — если в списке для вашей зоны такой есть; см. Зачем стоит задать запасной источник выше.

FAIL price: … rate_limited. К поставщику с вашего адреса пришло слишком много запросов. Хаб отступает сам — каждые 15 минут до 15:00 UTC, затем раз в час, — так что это пройдёт само. Если это длится сутки, что-то ещё в вашей сети опрашивает ту же конечную точку.

Я сохранил зону, и её отклонили. Валюта зоны не совпадает с валютой вашего плана, а хаб не конвертирует. Задайте валюту плана той, в которой торгует ваш рынок, затем сохраните зону.

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

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

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

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

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