Track Home Power Usage & Cost with Home Assistant

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.

Home Assistant Power Usage Graphs
Home Assistant Power Usage Graphs

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:
  • 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.

See also  2024 HomeTechHacker Year In Review

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:

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_kwh

This 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: 51

The 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: 2

kWh 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.

See also  Livtab LT90 Pro Smart Table Review: A Party-Ready Smart Coffee Table

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: 2

And now I have the following in my Home Assistant frontend:

Home Assistant Power Usage

Along with a couple of charts:

Realtime Power Usage
Daily power usage

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:

Electrical cost inputs

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-usd

And now my Home Assistant frontend has these costs automatically updated:

Power usage costs

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.

See also  SwitchBot Universal Remote: A Good Addition To A Growing Ecosystem

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.

Share this:

3 thoughts on “Track Home Power Usage & Cost with Home Assistant”

    • 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!

Comments are closed.

Track Home Power Usage & Cost with Home Assistant

by HomeTechHacker time to read: 10 min