A python script to control charging/decharging of home battery based on electriciy price. The fundamental idea is to charge the battery from grid when electricity price is low and discharge the battery to the grid when the price is high. The charging/discharging scheme is optimized to maximize revenue over a single day.
The script also includes support to set the value of a sensor in HA to control the heating level. This sensor is set to "Off", "Normal" or "Eco" based on actual energy price compared to todays average price.
This script will add functionality to a Home Assistant system running an Huawei Solar Integration (https://github.com/wlcrs/huawei_solar, thanks Thijs W.! ) to control Huawei Sun SOLAR inverter and battery.
The script must be installed as a detached process running 24/7 on any computer running on the same LAN as Home Assistant. A dedicated Raspberry Pi can be used for this, but if you know how to do it it is possible to run this on the same piece of hardware as Home Assistant.
Home Assitant will do the actual control of charging and discharging of the battery. This script will use the Home Assistant REST inteface to instruct Home Assistant to charge or discharge the battery. This is done by means of an entity input_select.battery_mode, which can hold the following states: "Charge", "Discharge" or "Idle". Example of associated automation code follows below.
This script implements a timed loop. Once per hour it will look into a charge control vector (a python list) that holds a character in 24 positions, one position for each hour. 'H' means high price and will result in discharging of the battery. 'L'indicates low price and battery will be charged. '0' basically means no operation, i.e the battery is idle. At 15:00 electricity price for next day is fetched from the broker (in this case Tibber) and the price graph is analyzed to find peaks and valleys. A planned charge control vector is created based on this data. Every night at 0:00, next days planned vector will replace the current control vector.
You need Home Asssitant up and running with the above mentioned Huawei Solar integration. You need to verify the integration works and Home Assistant can read available sensors in the inverter. You also must setup the Time of Use mode in the inverter using the FusionSolar app connected to the inverter integrated LAN. You should define a 23 h long discharging segment and the remaining hour as a charging segment. You should select this hour when the electricity price normally is high, e.g in the morning. This segment is never used but must be there to make the Time of Use mode work.
You also need to define a helper, input_select.battery_mode with the following states: "Charge", "Discharge", "Idle". Create an automation that selects corresponding battery mode when selector changes value. Here follows an example of how this YAML code could look like:
- alias: charge_battery
description: Will set battery to charging mode
trigger:
- platform: state
entity_id: input_select.battery_mode
to: "Charge"
action:
- service: select.select_option
target:
entity_id: select.battery_working_mode
data:
option: "Time Of Use"
- service: number.set_value
target:
entity_id:
- number.battery_maximum_charging_power
- number.battery_maximum_discharging_power
data:
value: 2500
mode: single
- alias: discharge_battery
description: Will set battery to discharging mode
trigger:
- platform: state
entity_id: input_select.battery_mode
to: "Discharge"
action:
- service: select.select_option
target:
entity_id: select.battery_working_mode
data:
option: "Fully Fed To Grid"
- service: number.set_value
target:
entity_id:
- number.battery_maximum_charging_power
- number.battery_maximum_discharging_power
data:
value: 2500
mode: single
- alias: idle_battery
description: Will keep battery idle by setting max_charge/discharge_power to 0
trigger:
- platform: state
entity_id: input_select.battery_mode
to: "Idle"
action:
- service: input_select.select_option
target:
entity_id: select.battery_working_mode
data:
option: "Maximise Self Consumption"
- service: number.set_value
target:
entity_id:
- number.battery_maximum_charging_power
- number.battery_maximum_discharging_power
data:
value: 0
mode: single
Update battery.py with your private tokens to access your Home Assistant system and to fetch data from the broker. Run the script in test mode to check everything works as expected:
python3 ./battery.py -t
Please note the script utilizes libraries only available for python3, so you must have this version installed in your system
To run this script as a service (24/7 with automatic start/restart), modify the systemd service profile, battery.service, to reflect the path you to your script. Install this service by means of the following commands:
sudo cp battery.service /etc/systemd/system
sudo systemctl enable battery.service
sudo systemctl start battery.service