A Home Assistant integration that provides half-hourly pricing data for Octopus Energy Agile Export tariffs.
The integration is designed mainly to support automations that make use of export pricing data. The single main sensor displays the current price, but extra attributes on the sensor provide:
- A list of today's price slots (as a dictionary).
- A list of tomorrow's price slots (as a dictionary).
- The current price slot.
With some custom template sensors layered on top of this, you can do things like:
- Decide whether to use solar PV to charge a battery or export.
- Decide when to discharge a battery to the grid to maximise profit.
- Decide to run power-hungry devices at times of low export prices.
This integration is delivered as a HACS custom repository.
- Download and install HACS.
- Add a custom repository in HACS. You will need to enter the URL of this repository when prompted:
https://github.com/cdpuk/octopus-export
.
When adding the integration you'll be prompted for your Distribution Network Operator (DNO) region. Agile pricing varies across the country, so it's important to choose the correct region to receive accurate data.
You can make a best guess based on the region names, but the best way is to read digits 9 and 10 from your MPAN (as seen on your bill). The map on to the options displayed on the configuration screen.
The following examples might be useful for creating advanced template sensors using template.yaml
in your config
directory.
Useful for discharging a battery at the best time to optimise profit.
This particular example finds the 3 best slots between 16:00 and midnight, then computes a binary value in_top_slot
which will be true
if we're currently in one of those slots.
This might be combined with additional logic to work out whether you're better off keeping hold of battery charge until the next day.
- binary_sensor:
name: Discharge for profit (PM)
icon: mdi:cash
state: >
{% set rates_today = state_attr('sensor.agile_export_rate', 'rates_today') %}
{% set sorted_rates_today_pm = dict((rates_today.items() | list)[16*2:24*2]) | dictsort(by='value') %}
{% set top_slots_today_pm = (dict(sorted_rates_today_pm).keys() | list)[-3:] %}
{% set current_slot = state_attr('sensor.agile_export_rate', 'current_slot') %}
{% set in_top_slot = current_slot in top_slots_today_pm %}
{% if sufficient_profit and discharge_slots > 0 and in_top_slot -%}
on
{%- else -%}
off
{%- endif %}
This example takes an average of the export rates in the middle of the day tomorrow (between 12:00 and 16:00) as a rough attempt work out what we might get for suplus energy tomorrow.
Combined with the above example, this can be used to work out whether you're better off discharging a battery in the evening, or saving it until the next day.
- sensor:
name: Charging opportunity cost tomorrow
unit_of_measurement: £/kWh
icon: mdi:cash
state: >
{% set rates_tomorrow = state_attr('sensor.agile_export_rate', 'rates_tomorrow') %}
{% if rates_tomorrow | count > 0 %}
{{ (rates_tomorrow.values() | list)[12*2:16*2-1] | average | round(4) }}
{% else %}
unavailable
{% endif %}
If you want to contribute to this please read the Contribution Guidelines.