I’ve been tracking the power usage in my home for years. To reduce costs, I wanted to understand what uses power in my house and to reduce electricity waste. After moving my Z-Wave whole-home energy monitoring device natively to Home Assistant previously, I decided to take power usage monitoring to the next level. Throughout all my efforts, I’ve been able to reduce my energy usage by 20% over the last year by:
- Automating high usage lights.
- Automating and coordinating my 2 separate HVAC systems to work efficiently.
- Discovering and eliminating/controlling all “vampire” devices. I control some vampire devices with smart switches. They only have power during the parts of the day when they would be used.
- Cutting the cord. A couple of Rokus use a lot less energy than the set-top boxes I used to have. Also, I had built up a pretty big and power-hungry MythTV infrastructure that I have since retired.
Read on for how I track real-time and daily home power usage and costs, as well as track power usage over time.
Editor’s Note: This is energy automation project to do before the summer.

Table of Contents
What I needed to get started tracking power usage
Here are the things I used to track my power usage. You can substitute different items, and I’ve made some suggestions below:
- Aeotec Home Energy Meter 1E. This is an older Z-Wave home energy meter that they don’t make anymore. You will definitely find it cheaper than on Amazon. There are a few other options for newer devices, like:
- The newer Aeotec Home Energy Meter 8.
- The Shelly EM.
- The Sense Home Energy Monitor.
- You can also take a more DIY approach, like Open Energy Monitor. Just make sure you get one that is compatible with where you live.
- You need to know what it takes to install a whole-home energy monitor. They aren’t hard, just scary to some. Depending on your device, you may need to modify the approach I used for the same graphs and tracking, but you can do it!
- Access to your utility meter rates. Rates often change with the season and are different for different “blocks” of usage. I came up with a way to handle these changes and still accurately calculate costs.
- Home Assistant. You can visualize the data using many different systems and automation controllers. This article will focus on how I did it with Home Assistant. If you aren’t using Home Assistant, I highly recommend it. It’s pretty easy to get going.
- MQTT. If you aren’t using MQTT for your home automation, you’re missing out on a powerful and easy-to-use smarthome hub technology. Here’s how I set MQTT up with Home Assistant.
Editor’s Note: Check out these additional smart devices that will help you with energy efficiency and savings.
Overview of the problems I had to solve
Since my Home Energy Monitor reports power usage via Z-wave, half of my job was done already. For storing short-term historical information, I simply needed to use the recorder functionality of Home Assistant. However, things get more complicated when I store monthly power usage over time or keep track of daily totals. The home energy monitor just reports a continuous amount of kilowatt-hours used (KWh) until you reset the meter to 0. It also reports the Watts used at a point in time. But it doesn’t have a daily meter.
The second problem I had to solve was converting usage to dollars (cost). Obviously, the meter has no idea how much electricity costs in my area. It also doesn’t know all the nuances of rates at different times of the year and blocks of usage.
Overview of how I solved the problems
I solved the energy tracking and cost problems by:
- Creating MQTT sensors to take daily snapshots of KWh usage
- Writing monthly usage to a file for long term usage data
- Using input number objects to allow me to set electrical block rates via the Home Assistant UI
- Using template sensors to utilize the cost inputs to calculate electrical costs in real-time
The details of my power usage implementation
Editor’s Note: Home Assistant evolves quickly. The examples below reflect current best practices as of 2020, but the underlying approach remains the same.
First, let me give a caveat. This is certainly not the only way to accomplish what I accomplished. I don’t even know if it is the best way (probably isn’t). I do know that it works and gives me all the information I want to track. My goal here is to give an example implementation that you can modify and improve upon for your implementation. Okay, with that said, here we go…
Step 1: Store monthly power usage in a file
One of the things I want to do is keep track of my power usage over time. This will help me notice long-term trends and compare them to what the power company says I used in case there are errors. There are lots of ways to store the data, but saving to a CSV file monthly is simple and sufficient for my needs.
Home Assistant natively supports this via the notify file platform. To set up the file writing, I added the following to the “notify:” section of my configuration.yaml file:
- platform: file name: filenotify filename: /home/homeassistant/.homeassistant/energy_usage.csv timestamp: true
This allows the notify.filenotify service to write data to the energy_usage.csv file. The “timestamp: true” line tells Home Assistant to timestamp each entry into the file. Now, I just need a monthly automation to write the aggregate power usage to this file:
- id: reset_home_energy_monitor
alias: Reset Home Energy Monitor
initial_state: 'true'
trigger:
- platform: time
at: '00:00:00'
condition:
- condition: template
# Change the number here to get whatever day of the month you want.
value_template: "{{ now().day == 1 }}"
action:
- service: notify.filenotify
data_template:
message: ", {{ states.sensor.aeon_labs_dsb09104_home_energy_meter_energy.state }}"
- service: script.reset_hem_kwhThis automation writes the value of the of my home energy sensor (sensor.aeon_labs_dsb09104_home_energy_meter_energy) to the file I specified in the configuration.yaml at midnight on the first day of each month. At the end of this automation, I run the reset_hem_kwh script, which resets the kWh counter back to 0 to start a new month:
reset_hem_kwh:
alias: Reset Home Energy Monitor
sequence:
- service: zwave.reset_node_meters
data:
node_id: 51The result is an energy_usage.csv file that looks like:
Home Assistant notifications (Log started: 2019-06-01T07:00:00.013334+00:00) -------------------------------------------------------------------------------- 2019-07-01T07:00:00.008753+00:00 , 944.28 2019-08-01T07:00:00.027159+00:00 , 887.46 2019-09-01T07:00:00.012449+00:00 , 873.92 2019-10-01T07:00:00.009933+00:00 , 878.74 2019-11-01T07:00:00.062430+00:00 , 905.13 2019-12-01T08:00:00.020522+00:00 , 923.04
Step 2: Create sensors for daily tracking
The whole home energy monitor reports real-time watt usage and kWh usage since the monitor was reset. It doesn’t keep track of the total usage today or how much was used yesterday. In order to keep track of daily power usage, I created two new MQTT sensors:
- platform: mqtt name: "kWh usage yesterday" unit_of_measurement: "kWh" state_topic: "power/wholehome/yesterday" qos: 2 - platform: mqtt name: "midnight kWh running total" unit_of_measurement: "kWh" state_topic: "power/wholehome/midnight" qos: 2
To make this work, I use MQTT via an automation that runs right before midnight to update the kWh usage for yesterday and to capture what the kWh usage was at midnight:
- id: update_kwh_usage
alias: Update kWh Usage
initial_state: 'true'
trigger:
- platform: time
at: '23:59:45'
action:
- service: mqtt.publish
data:
topic: power/wholehome/yesterday
payload_template: "{{ (states('sensor.aeon_labs_dsb09104_home_energy_meter_energy') | float - states('sensor.midnight_kwh_running_total') | float) | round(2) }}"
retain: true
qos: 2
- service: mqtt.publish
data:
topic: power/wholehome/midnight
payload_template: "{{ states('sensor.aeon_labs_dsb09104_home_energy_meter_energy') | float }}"
retain: true
qos: 2kWh usage yesterday is equal to the current running kWh total from the whole home sensor minus what that total was at midnight yesterday. Then I update the midnight total for the new day.
I also created a template sensor in the platform: template sensors section of my configuration.yaml:
kwh_usage_today:
friendly_name: "kWh usage today"
unit_of_measurement: "kWh"
value_template: "{{ (states('sensor.aeon_labs_dsb09104_home_energy_meter_energy') | float - states('sensor.midnight_kwh_running_total') | float) | round(2)}}"This sensor updates its value to the current daily usage in real-time by subtracting the total kWh at midnight from the current kWh. To make sure all this works, I also have to remember to reset the midnight kWh sensor value to 0 when I reset the whole home sensor. This requires me to add a publish command to the reset_home_energy_monitor automation I showed earlier. The final automation looks like:
- id: reset_home_energy_monitor
alias: Reset Home Energy Monitor
initial_state: 'true'
trigger:
- platform: time
at: '00:00:00'
condition:
- condition: template
# Change the number here to get whatever day of the month you want.
value_template: "{{ now().day == 1 }}"
action:
- service: notify.filenotify
data_template:
message: ", {{ states.sensor.aeon_labs_dsb09104_home_energy_meter_energy.state }}"
- service: script.reset_hem_kwh
- service: mqtt.publish
data:
topic: power/wholehome/midnight
payload: 0
retain: true
qos: 2And now I have the following in my Home Assistant frontend:

Along with a couple of charts:


Step 3: Find and use power cost rates
At this point, I had good ways of tracking usage, but I also wanted to quantify the costs in real-time. I was able to find my electrical rates online (and in my statements). A couple of complications are that my power company has different rates at different times of the year, and the rates change depending on how much electricity is used. For example, my rate changes after I’ve used 480 kWh in a month, and it also includes a set daily service charge. Effectively, my electrical usage for less than the first block size (currently 480 kWh) is the result of the following equation:
Power cost this month = (First block rate * kWh so far this month) + (Daily Service charge * number of days)
If I’m at more than 480 hours then it’s:
Power cost this month = (First block rate * 480) + (Second block rate * (kWh this month - 480)) + (Daily Service charge * number of days)
My electrical cost so far today, if my electrical use is less than the first block size, can be calculated with the following equation:
Power cost so far today = (First block rate * kWh so far today) + (Daily Service charge)
I can make adjustments to my calculations for power costs today and yesterday, depending on how many kWh are in each block. I won’t bore you with all the equations here. The key thing is that these blocks and rates change, and I don’t want to hardcode them into the Home Assistant equation,s so I created a few input_number fields:
###Inputs for Electricity usage calculations### first_block: name: "First Block Rate per kWh" min: 0.0000 max: 5.0000 mode: box step: .001 end_block: name: "End Block Rate per kWh" min: 0.0000 max: 5.0000 mode: box step: .001 daily_service_charge: name: "Daily Service Charge" min: 0.0000 max: 5.0000 mode: box step: .001 current_first_block_size: name: "Current First Block Size" min: 0 max: 1000 mode: box unit_of_measurement: kWh
These fields allow me to enter the values as they change in the frontend of Home Assistant:

I can then use these fields in template sensors that automatically calculate costs:
platform: template
sensors:
electricity_cost_yesterday:
friendly_name: "Electricity Cost Yesterday"
unit_of_measurement: '$'
icon_template: mdi:currency-usd
value_template: >-
{% if states('sensor.kwh_usage_yesterday') | float < states('input_number.current_first_block_size') | float /30 %}
{{ ((states('sensor.kwh_usage_yesterday') | float) * (states('input_number.first_block') | float) + (states('input_number.daily_service_charge') | float)) | round(2) }}
{%- else -%}
{{ (((states('sensor.kwh_usage_yesterday') | float) - states('input_number.current_first_block_size') | float /30) * (states('input_number.end_block') | float) + (states('input_number.daily_service_charge') | float) + (states('input_number.current_first_block_size') | float /30 * (states('input_number.first_block') | float))) | round(2)}}
{%- endif %}
electricity_cost_today:
friendly_name: "Electricity Cost So Far Today"
value_template: >-
{% if states('sensor.kwh_usage_today') | float < states('input_number.current_first_block_size') | float /30 %}
{{ ((states('sensor.kwh_usage_today') | float) * (states('input_number.first_block') | float) + (states('input_number.daily_service_charge') | float)) | round(2) }}
{%- else -%}
{{ (((states('sensor.kwh_usage_today') | float) - states('input_number.current_first_block_size') | float /30) * (states('input_number.end_block') | float) + (states('input_number.daily_service_charge') | float) + (states('input_number.current_first_block_size') | float /30 * (states('input_number.first_block') | float))) | round(2)}}
{%- endif %}
unit_of_measurement: '$'
icon_template: mdi:currency-usd
electricity_cost_month:
friendly_name: "Electricity Cost So Far This Month"
value_template: >-
{% if states('sensor.aeon_labs_dsb09104_home_energy_meter_energy') | float < states('input_number.current_first_block_size') | float %}
{{ ((states('sensor.aeon_labs_dsb09104_home_energy_meter_energy') | float) * (states('input_number.first_block') | float) + (states('input_number.daily_service_charge') | float)*30) | round(2) }}
{%- else -%}
{{ (((states('sensor.aeon_labs_dsb09104_home_energy_meter_energy') | float) - states('input_number.current_first_block_size') | float) * (states('input_number.end_block') | float) + (states('input_number.current_first_block_size') | float * (states('input_number.first_block') | float)) + (states('input_number.daily_service_charge') | float)*30) | round(2)}}
{%- endif %}
unit_of_measurement: '$'
icon_template: mdi:currency-usdAnd now my Home Assistant frontend has these costs automatically updated:

Final thoughts
Now I have real-time and historical visibility into my electricity usage and costs. That alone has been enough to help me spot waste, understand what actually drives our bill, and make small changes that add up over time.
From here, I may go further—building more sophisticated views in something like Grafana, or even adding a simple LED display that makes energy usage visible to the whole family. Not because the charts are the point, but because awareness changes behavior.
This is the same systems-first mindset I talk about in Life by Design: using simple, automated feedback loops to make better decisions easier without relying on constant attention or discipline. You don’t need to obsess over the data. You just need the right signals in the background, quietly nudging you in the right direction.
What projects have you done to monitor power usage? Let me know in the comments or on Twitter!
This page contains affiliate links. If you purchase an item using an affiliate link I will receive a small commission at no cost to you. Affiliates do not influence my recommendations. Read my disclosures for more information.



Great article but why didn’t you use Home Assistants utility meter integration?
In truth, because I didn’t even know about it until you mentioned it :). I’ll look into redoing some of this with that integration. I don’t think it does all I want it to do, but it certainly takes care of a few things. I didn’t even think to look for a component because I kind of built this in pieces over time, and never really looked at it from a whole implementation standpoint. Thanks!
Dooh. Sorry about that! I’m using that in combination with a sensor like yours to calculate cost. Happy to share my code on Github.