This module was conceived as an energy management optimization tool for residential electric power consumption and production systems. The goal is to optimize the energy use in order to maximize self-consumption. The main study case is a household where we have solar panels, a grid connection and one or more controllable (deferrable) electrical loads. Including an energy storage system using batteries is also possible in the code. The package is highly configurable with an object oriented modular approach and a main configuration file defined by the user. EMHASS was designed to be integrated with Home Assistant, hence it’s name. Installation instructions and example Home Assistant automation configurations are given below.
The main dependencies of this project are PVLib to model power from a PV residential installation and the PuLP Python package to perform the actual optimizations using the Linear Programming approach.
The source code for this package is available here.
It is recommended to install on a virtual environment.
For this you will need
virtualenv, install it using:
sudo apt install python3-virtualenv
Then create and activate the virtual environment:
virtualenv -p /usr/bin/python3 emhassenv cd emhassenv source bin/activate
Install using the distribution files:
python3 -m pip install emhass
Clone this repository to obtain the example configuration files. We will suppose that this repository is cloned to:
This will be the root path containing the yaml configuration files (
secrets.yaml) and the different needed folders (a
data folder to store the optimizations results and a
scripts folder containing the bash scripts described further below).
To upgrade the installation in the future just use:
python3 -m pip install --upgrade emhass
To run a command simply use the
emhass command followed by the needed arguments.
The available arguments are:
--action: That is used to set the desired action, options are:
--config: Define path to the config.yaml file
--costfun: Define the type of cost function, options are:
For example, the following line command can be used to perform a day-ahead optimization task:
emhass --action 'dayahead-optim' --config '/home/user/emhass' --costfun 'profit'
Before running any valuable command you need to modify the
secrets.yaml files. These files should contain the information adapted to your own system. To do this take a look at the special section for this in the documentation.
Home Assistant integration¶
To integrate with home assistant we will need to define some shell commands in the
configuration.yaml file and some basic automations in the
shell_command: dayahead_optim: /home/user/emhass/scripts/dayahead_optim.sh publish_data: /home/user/emhass/scripts/publish_data.sh
- alias: EMHASS day-ahead optimization trigger: platform: time at: '05:30:00' action: - service: shell_command.dayahead_optim - alias: EMHASS publish data trigger: - minutes: /5 platform: time_pattern action: - service: shell_command.publish_data
In these automations the optimization is performed everyday at 5:30am and the data is published every 5 minutes.
Create the file
dayahead_optim.sh with the following content:
#!/bin/bash . /home/user/emhassenv/bin/activate emhass --action 'dayahead-optim' --config '/home/user/emhass'
And the file
publish_data.sh with the following content:
#!/bin/bash . /home/user/emhassenv/bin/activate emhass --action 'publish-data' --config '/home/user/emhass'
Then specify user rights and make the files executables:
sudo chmod -R 755 /home/user/emhass/scripts/dayahead_optim.sh sudo chmod -R 755 /home/user/emhass/scripts/publish_data.sh sudo chmod +x /home/user/emhass/scripts/dayahead_optim.sh sudo chmod +x /home/user/emhass/scripts/publish_data.sh
The final action will be to link a sensor value in Home Assistant to control the switch of a desired controllable load. For example imagine that I want to control my water heater and that the
publish-data action is publishing the optimized value of a deferrable load that I have linked to my water heater desired behavior. In this case we could use an automation like this one below to control the desired real switch:
automation: trigger: - platform: numeric_state entity_id: - sensor.p_deferrable1 above: 0.1 action: - service: homeassistant.turn_on entity_id: switch.water_heater
A second automation should be used to turn off the switch:
automation: trigger: - platform: numeric_state entity_id: - sensor.p_deferrable1 below: 0.1 action: - service: homeassistant.turn_off entity_id: switch.water_heater