GivEnergy Battery Automation for Demand Flexibility Service (DFS) Octopus Saving Sessions
Have you been taking part in the Octopus Saving Sessions? Also known as DFS or Demand Flexibility Service, if you’re not with Octopus then your supplier might have a different name for it. I think Eon Next calls it Energy Shift and Ovo is calling it Power Move. Whatever it’s called, I have a problem, and that problem is my battery which has a tendency to run out of charge during the winter before these sessions begin. Well, I have a solution in the form of an automation of course!
Having a home battery like mine, which is an 8.2kWh GivEnergy one, is great. In theory during these Saving Sessions my battery should be able cover our use and we’d draw absolutely nothing from the grid at all for those periods. The problem is that my battery just doesn’t have enough capacity to get me through a full day during the Winter with its lack of sunshine. So by the time we get to the evening when the saving sessions normally take place, I’ve got no capacity left!
I found myself estimating how much capacity I’d need to get through the session, and then manually pausing the battery’s discharge before I got to that threshold. Just before the session begins I’d resume it again. This involved a lot of clock watching, and it got me thinking… can I automate this? Of course I can! I came up with an automation for Home Assistant, which I then turned into a blueprint to make it easier for anyone to install. It essentially watches your battery percentage to make sure it doesn’t drop below the percentage that you want reserved for the saving session. If it does drop too low, it’ll pause the discharge and resume it again just before the session starts to make sure you don’t draw anything from the grid.
I’m going to make a massive assumption here that you already have your GivEnergy battery connected to Home Assistant. If you don’t, then check out this article which will talk you through that whole process.
Create Helpers
You’re going to need to create some helpers before we can configure the blueprint.
- The first helper is a date/time helper but set for date only. This will be used to store the date of the upcoming saving session.
- The second and third helpers are also date/time helpers, but set for time only. One will store the start time of the saving session, the other is for the end time.
- The fourth and final helper is an input_number helper. Set this to have a minimum value of 1, maximum value of 100, and the unit of measurement as percentage. You’ll use this helper to set how much battery capacity you wish to reserve per hour for the saving session.
Install the Blueprint
Now it’s time to install the blueprint. The easy way is to click the button below which should automatically download and install it for you, provided you have configured My Home Assistant correctly:
The harder manual method involves copying and pasting the below configuration into a text file named octopus_saving_session.yaml.
blueprint: name: Octopus Saving Session for GivEnergy description: Prevents the battery from discharging if theres not enough remaining charge for a scheduled Saving Session, and enables discharge again before the session begins. domain: automation input: battery_soc: name: Battery SOC sensor description: Live state of charge (percentage) of the battery (sensor entity) selector: entity: domain: - sensor octopus_saving_session_day: name: Octopus Saving Session Day description: The date of the scheduled Saving Session (input_datetime helper. Date only.) selector: entity: domain: - input_datetime octopus_saving_session_start_time: name: Octopus Saving Session Start Time description: What time does the Saving Session begin? (input_datetime helper. Time only.) selector: entity: domain: - input_datetime octopus_saving_session_end_time: name: Octopus Saving Session End Time description: What time does the Saving Session finish? (input_datetime helper. Time only.) selector: entity: domain: - input_datetime battery_percentage_per_hour: name: Battery Percentage Per Hour description: How much battery percentage, per hour, do you need to make sure is reserved? (input_number. limit 1-100) selector: entity: domain: - input_number battery_enable_discharge_switch: name: Enable battery discharge switch description: Switch which enables or disables the batterys ability to discharge. When on, discharge is possible. (switch) selector: entity: domain: - switch battery_mode: name: Battery Mode description: The current mode of the battery, so as we know whether its in eco mode or not (select) selector: entity: domain: - select mode: single max_exceeded: silent variables: battery_soc: !input battery_soc octopus_saving_session_day: !input octopus_saving_session_day octopus_saving_session_start_time: !input octopus_saving_session_start_time octopus_saving_session_end_time: !input octopus_saving_session_end_time battery_percentage_per_hour: !input battery_percentage_per_hour trigger: - platform: state alias: Trigger whenever the battery SOC changes entity_id: - !input battery_soc id: soc_change - platform: time_pattern minutes: /15 id: check_the_time condition: - alias: Only execute this automation on the saving session day condition: template value_template: >- {{ (now().date() + timedelta(days=0)) | string == states(octopus_saving_session_day) }} - alias: Only run after 7am to avoid the battery charging hours condition: time after: "07:00:00" action: - choose: - alias: >- When the battery SOC changes, check that we have enough reserve for the saver session and pause discharge if necessary conditions: - condition: trigger id: soc_change - alias: >- We are not within 15 minutes of the start time of the saving session condition: template value_template: >- {{ ((now().hour * 3600) + (now().minute * 60) + now().second )|int < (state_attr(octopus_saving_session_start_time,'timestamp')-(15*60))|int }} - alias: We dont have enough battery left (SOC < required power) condition: template value_template: >- {{ states(battery_soc)|int < (((state_attr(octopus_saving_session_end_time,'timestamp') - state_attr(octopus_saving_session_start_time,'timestamp'))/3600)*states(battery_percentage_per_hour)|int + states(battery_percentage_per_hour)|int)|int }} - alias: Battery is currently discharging condition: state entity_id: !input battery_mode state: Eco sequence: - alias: Disable the battery discharge to conserve it for the saver session service: homeassistant.turn_off data: {} target: entity_id: !input battery_enable_discharge_switch - service: notify.persistent_notification data: message: >- Battery SOC getting too low for scheduled saving session. Pausing discharge. - alias: >- If the battery is not in Eco mode 15 minutes before the Saving Session, Enable It! conditions: - condition: trigger id: check_the_time - alias: If the battery is not in eco mode condition: not conditions: - condition: state entity_id: !input battery_mode state: Eco - alias: >- Are we after 15 minutes before saving session starts, but before the actual start? condition: template value_template: >- {{ (((now().hour * 3600) + (now().minute * 60) + now().second )|int >= (state_attr(octopus_saving_session_start_time,'timestamp')-(15*60))|int) and (((now().hour * 3600) + (now().minute * 60) + now().second )|int < (state_attr(octopus_saving_session_start_time,'timestamp'))|int) }} sequence: - alias: Enable the battery discharge for the saving session service: homeassistant.turn_on data: {} target: entity_id: !input battery_enable_discharge_switch - service: notify.persistent_notification data: message: Battery was paused, resuming discharge for saving session
Make sure you have the File Editor add-on installed in Home Assistant. Open the add-on, then navigate to your config folder, the blueprints folder in there, and the automation folder in there. Click on the Upload File button at the top, choose the yaml file you saved previously and click on Ok to complete the import.
You’ll then need to reload your automations before it can be used by clicking on Developer Tools and selecting the ‘Automations’ link under YAML configuration reloading.
Create the Automation
Next we create the automation itself. Go to Settings, Automations, and click on the blue Create Automation button. We’re going to use a blueprint so choose “Octopus Saving Session for GivEnergy” from the drop-down list.
You’ll then be presented with a lot of drop-down boxes which I promise you is a lot easier to use than having to dive into the automation configuration manually to change all of the various entities I had set! I’m trying to be nice to you all here. Let’s go through these one by one.
First choose the entity that give you your current battery percentage. It might be called sensor.givtcp_soc or something similar.
Now choose the four helper entities that created earlier for Octopus Saving Session Day, Octopus Saving Session Start Time, Octopus Saving Session End Time and Octopus Saving Session Battery Percentage Per Hour.
We then need to tell the automation which switch entity controls the enabling and disabling of battery discharge. We’re looking for the one with “Enable Discharge” in the name.
And finally the automation needs to know which mode the battery is currently in. GivTCP provides a ‘select’ entity called ‘mode’ which we’ll use. Basically the automation will be checking to see if the battery is in Eco mode or not. Eco mode means that it’s discharging to your home so hopefully preventing you from drawing from the grid. Save the automation and give it a nice obvious name.
Dashboard
There’s one final step to get this working and that is adding those helpers you created to your dashboard for easy access. You can of course present these on your dashboard in any way you see fit. As an example, in the below screenshot I have simply added them to an ‘entities’ card.
Calculating how much energy you’ll need to get you through the saving session is a bit trickier. I guess the non-scientific way of doing this is by keeping an eye on your typical usage during the evenings. When I take part in the saving sessions I still try to shift the usage around a bit to minimise what I’m using then anyway in order to prevent any power spikes which would cause me to draw from the grid before the battery has had chance to ramp up. So I avoid using the oven, kettle, things like that. If you’d like to be a bit more scientific then I work on a background power of 600 watts during the session which is 0.6kWh per hour. My battery is 8.2kWh, but I reserve 10% of that in case of a power cut, which gives me 7.4kWh. 0.6kWh is just over 12% of that usable capacity. I err on the side of caution and set the battery percentage per hour slide to 15%.
Behind the scenes, the automation will work out how much is required for the saver session based on the length of that session. So if you have a one hour session scheduled, that would be 15% reserved, plus an extra 15% just in case, so it won’t let your battery drop below 30% before the session begins on that day. If you have a two hour session then that would 30% reserved plus an extra 15% just in case and your battery won’t be allowed to drop below 45% until the session begins.