This post describes the evolution of my HEMS code to control my dumb wet goods (dishwasher and washing machine) using smart plugs.
The program for my HEMS works as described below. For clarity I’ve emboldened the new steps associated with the control of the wet goods:
- Download the cost data for Agile from Octopus. The API provides 48 hours of data, but I use only 24 hours at a time. I download at 16:45 to create a schedule from 17:00 today to 17:00 tomorrow. I use two fields only: the date-time stamp and the energy price inc-VAT.
- Calculate cycle cost. Reverse sort the unit cost data in descending time, and combine the energy price with the load profile for each non-interruptible device (dishwasher and washing machine) to estimate the cost of running a washing cycle starting on each half hour. Add as third and fourth fields to the data file.
- Establish start time for each non-interruptible load. For each appliance in turn, sort the cost data in ascending cycle cost. Enable the appliance for interval with the lowest cycle cost within an acceptable time window (typically the first row), and overwrite remaining instructions from the prior day. Repeat for other appliances.
- Establish on times for each interruptible load. For all interruptible loads (battery, car charger and immersion heater) sort the data in ascending unit cost. Replicate the unit cost column for each interruptible load. For each load enable for the required number of half-hourly intervals within the time window set by the user, and disable for higher cost half-hourly intervals.
- Prepare user screens. Sort data file by ascending time, split into first and second 12-hour periods, and present as two HTML files.
The top level scheduling script which runs automatically at 16:45 each day is a shell script which calls a series of awk scripts to: (i) calculate cycle costs for wet goods, (ii) determine start time(s) for each wet-goods appliance, (iii) determine on/off times for interruptible loads.
Awk is a pattern-matching program for processing text files. Such text files may be thought of a series of records and fields in a textual database. Awk may seem an odd choice of scripting languages, but essentially the processing of a text file of 96 time and unit pairs to create HTML files of 48 times and cost combinations is a text file processing task. Along the way as each on or off decision is made a system call to the OS is made by awk to copy an on or off script to a time-stamped script (e.g. either washingmachineon.sh or washingmachineoff.sh is copied to washingmachine_0930.sh). An internal timer called cron runs each half-hour so, for example, at 09:30 it runs all the scripts with 0930 in their names which updates the status of each controlled device.
At the time of writing we have 5 HEMS-controlled devices:
- Battery storage – interruptible – the only device with 3 states (normal, charge-only, force charge).
- Car charger (EVSE) – interruptible – on/off.
- Dishwasher – non-interruptible- on only.
- Immersion heater – interruptible – on/off.
- Washing machine – non-interruptible – on only.
Since this post was written the control of the hot water has evolved further.
At the time of writing the ImmerSUN by default was set for self-consumption where it diverted any solar surplus proportionately to hot water, and the HEMS switched the ImmerSUN to Boost at full power from time to time when grid price is attractive.
Now however a third mode – holiday mode – is available. In holiday mode self-consumption is disabled so that surplus solar that would previously have been diverted is now exported. On days with significant daytime negative pricing the HEMS switches the ImmerSUN default from self-consumption to holiday. This has the effect of increasing export earlier in the day to reserve capacity for increased import later in the day as a grid-balancing aid.
Thus there are now 3 modes of ImmerSUN operation switched by the HEMS:
1. Boost – when the immersion heater is run at full power.
2. Self-consumption – when the immersion heater runs at variable power to track the solar surplus (which is the usual non-Boost default)
3. Disabled (holiday mode) – when the immersion heater will not operate (which is the new non-Boost default for days with significant daytime negative pricing)