In my last post I described how I optimised my home heating with Home Assistant and then created virtual energy sensors to monitor my estimated gas usage from Home Assistant’s Energy Dashboard. In this post I’ll describe how I used the same strategy to monitor the real-time energy use of the majority of devices in my house without using any power meters. A big shout out to the amazing Powercalc integration for Home Assistant, which makes this a relatively simple process, with extremely powerful results.

Recap

My initial goal was to create an virtual energy sensor for my gas boiler, which could be monitored by the energy dashboard:

I first needed to create a virtual power meter:

template:
 - sensor:
   - name: combi_boiler_current_power_usage
     unique_id: combi_boiler_current_power_usage
     unit_of_measurement: W
     device_class: power
     state_class: measurement
     state: >
       {{ is_state('switch.combi_boiler_relay_switch', 'on') | iif(states('input_number.combi_boiler_power_usage'), 0) }}

The state of the above sensor will evaluate to zero if the boiler relay switch is off, or to the value of the input_number.combi_boiler_power_usage input helper if the boiler is on. Some note on the attributes defined above:

  • unit_of_measurement: W is important. According to the docs for the integration platform, a sensor that measures in units of “W” will be integrated into an energy sensor in units of kWh.
  • device_class: power is important. From my testing, this is necessary for the integration platform to produce an output sensor that has the attribute device_class: energy, which is necessary for it to work with the Energy Dashboard.
  • state_class: measurement. According to the sensor platform docs this describes the sensor as measuring a current value (vs a predicted value or an aggregate of some kind), and it is necessary to opt into long-term statistics. I haven’t tested if it is strictly necessary for our purposes, but it seems like good practice.

To turn the power sensor into a virtual energy meter,  I defined an “integration” sensor as follows:

sensor:
 - platform: integration
   name: boiler_energy_kwh
   source: sensor.combi_boiler_current_power_usage
   unit_prefix: k
   method: left

I now had a working energy sensor:

Note the attributes device_class: energy and state_class: total, which make this sensor compatible with the Home Assistant’s energy management dashboard. I could now add the sensor to the energy dashboard as follows:

This approach can be generalized to create a virtual energy meter for anything you can estimate the current power of. The pattern is a power meter, followed by an energy meter:

template:
- sensor:
  - name: test_virtual_power_sensor
    unit_of_measurement: W
    device_class: power
    state_class: measurement
    state: 10
 
sensor:
- platform: integration
  name: test_virtual_energy_meter
  source: sensor.test_virtual_power_sensor
  unit_prefix: k
  method: left

My next mission was to create a new virtual sensor to represent the roughly fixed amount of gas we use heating domestic hot water each day. However, I realised that I could avoid creating all these sensors by hand, and instead use the Powercalc integration to create them for me. 

The Powercalc Integration

Bram Gerritsen’s Powercalc integration automates the creation of the kind of virtual energy sensors I created above. It is especially powerful when it comes to lights, as it automatically recognises the device and model of popular smart lights and looks up its current state in a community-contributed lookup table to find a good estimate of its current power usage. In my case, it automatically detected every smart light in the house.

Powercalc not only makes it easy to estimate your lights, but it allows you to produce virtual energy meters for any device that Home Assistant knows the state of, such as relay switches, robot vacuums, media players, smart speakers, phones, cameras, and anything with an IP address on your network. Any dumb devices that are always on and have stable power usage can also be added in. With a bit of templating you could also represent dumb devices that operate on a predictable schedule.  

The first step was to take stock of all the electrical devices in my house. I made a spreadsheet, and gave each device a category: 

  • Smart lights. Powercalc would look after these automatically.
  • HA-integrated devices. Current power consumption could be predicted from the current state of these devices.
  • Always-on. Power consumption can be predicted because it is always the same.
  • Dumb devices. Devices that Powercalc won’t work for.

I came up with 69 devices, only 9 of which Powercalc wouldn’t work for. 

I then worked through each of the HA-integrated devices to identify a sensor in HA that represented the state of that device. I also came up with estimates of power usage of each device by combining internet research with some empirical testing with a power meter, and a little guesswork.

Here is the final spreadsheet:

Reviewing Device Sensors

Before proceeding to create a Powercalc configuration, I reviewed the devices in the spreadsheet to make sure each of them had an appropriate Home Assistant sensor to work with. 

I found a few devices that were always on,  but didn’t have any representation in Home Assistant. Powercalc allows you to deal with these using the fixed_daily_energy directive, but this only produces an energy sensor, and does not produce a power sensor. I wanted to be able to see a real-time estimate of total current power consumption, including these devices.  To work around this, I created template sensors in Home Assistant to represent the always-on state of each of these devices. I needed to create a template sensor for each device, because each entity_id configured in Powercalc must be unique. 

template:
  binary_sensor:
  - name: fridge_always_on
    state: on
 
  - name: garden_camera_always_on
    state: on
 
# ...etc

For convenience, I added a template sensor to do a better job of giving the current state of the robot vacuum:

- name: xiaomi_vacuum_charging_state
 unique_id: xiaomi_vacuum_charging_state
 icon: 'mdi: battery-charging-medium'
 state: >-
   {% if states('vacuum.xiaomi_vacuum_cleaner') == 'docked' %}
     {% if state_attr('vacuum.xiaomi_vacuum_cleaner', 'battery_level')|int < 100 %}
       charging
     {% else %}
       docked
     {% endif %}
   {% else %}
   cleaning
   {% endif %}

I found that although my Synology NAS was integrated with Home Assistant, there wasn’t a binary sensor to tell if it is currently powered on or not. I fixed this with a ping sensor.

binary_sensor:
- platform: ping
  host: 10.0.0.35
  count: 3
  scan_interval: 60
  name: Diskstation

I did the same thing for my main workstation, and used the state of the resulting binary_sensor to represent the power usage of my computer, monitor, dock and associated equipment.

The Powercalc Config

The next job was to translate the spreadsheet into a Powercalc config. To make this easier to manage, I split the Powercalc configuration out by adding the following into configuration.yaml:

# Energy tracking
# Powercalc for power/energy estimates
powercalc:
 
sensor powercalc_label: !include powercalc.yaml

Here is my final powercalc.yaml file:


- platform: powercalc
  create_group: All Estimated Usage
  entities:

    - create_group: All Lights
      entities:

      - create_group: Upstairs Lights
        entities:
        - entity_id: light.landing_light

        - create_group: Bedroom Lights
          entities:
            - entity_id: light.master_bedroom_light
            - entity_id: light.back_bedroom_light
            - entity_id: light.boxroom_light

        - create_group: Bathroom Spots
          entities:
            - entity_id: light.bathroom_spot_1
            - entity_id: light.bathroom_spot_2
            - entity_id: light.bathroom_spot_3
            - entity_id: light.bathroom_spot_4

      - create_group: Downstairs Lights
        entities:
        - entity_id: light.hall_light
        - entity_id: light.stairs_toilet_light
        - entity_id: light.living_room_light
          manufacturer: innr
          model: RB 285 C

        - entity_id: light.living_room_lamp
        - entity_id: light.dining_room_light
        - entity_id: light.utility_room_light

        - create_group: Kitchen Spots
          entities:
            - entity_id: light.kitchen_spot_1
            - entity_id: light.kitchen_spot_2
            - entity_id: light.kitchen_spot_3
            - entity_id: light.kitchen_spot_4
            - entity_id: light.kitchen_spot_5
            - entity_id: light.kitchen_spot_6

        - create_group: Driveway Lights
          entities:
            - entity_id: light.front_driveway_lamp_left
            - entity_id: light.front_driveway_lamp_right
            - entity_id: light.front_porch_light

        - create_group: Kitchen Cabinets
          entities:
            - entity_id: switch.north_kitchen_cabinet_lights
              # 14W + 4W LED strips.
              # Measured locally as 18W, with 1.1W added by relay switch when under load.
              # standby power represents passive power consumed by relay switch (measured at 0W)
              standby_power: 0.0
              fixed: 
                power: 19.1

            - entity_id: switch.south_kitchen_cabinet_lights
              # 10W + 10W LED strips.
              # Measured locally as 20W, with 1.1W added by relay switch when under load.
              # standby power represents passive power consumed by relay switch (measured at 0W)
              standby_power: 0.0
              fixed: 
                power: 21.1
        
        - entity_id: switch.garden_lights
          # 2X 30W LED bulbs plus relay plug (measured at 1.1W under load)
          # standby power represents passive power consumed by relay switch (measured at 0W).
          standby_power: 0.0
          fixed:
            power: 61.1
        
        - entity_id: switch.attic_lamp
          # 1X 30W LED bulb plus relay plug (measured at 1.1W under load)
          # standby power represents passive power consumed by relay switch (measured at 0W).
          standby_power: 0.0
          fixed:
            power: 31.1
        
    - create_group: Always On Devices
      entities:

      # The following devices are integrated into HA, but are generally always on.
      - entity_id: switch.siren
        name: Siren
        # Locally measured at 0.5W
        standby_power: 0.5
        fixed:
          # See https://help.aeotec.com/support/solutions/articles/6000167689-siren-gen5-technical-specifications-
          power: 0.5
      
      - entity_id: binary_sensor.router
        fixed:
          # Netgear Nighthawk R7000 - measured locally.
          power: 9.0
      
      - entity_id: binary_sensor.diskstation
        fixed:
          # Synology Diskstation DS218, measured locally
          power: 14.9
        
      - entity_id: switch.air_ionizer
        name: Air Ionizer
        fixed:
          # 3.4W according to device label, 3.6W as measured locally. 
          # Attached to relay plug, which adds 1.1W under load.
          power: 4.7
      
      - entity_id: binary_sensor.aarlo_connected_living_room_camera
        name: Living Room Camera
        # Arlo Q
        # Locally measured as 2.4W standby, 2.5W playing
        standby_power: 2.4
        fixed:
          power: 2.5
        
      - entity_id: binary_sensor.aarlo_connected_baby_monitor
        name: Baby monitor
        # Arlo ABC1000 Baby/Pet Monitor
        # Locally measured as 3.1W playing, 3W when off
        standby_power: 3.0
        fixed:
          power: 3.1
      
      # The following entities are using "always on" template sensors that always evaluate to the 'on' state.
      - entity_id: binary_sensor.garden_camera_always_on
        name: Garden Camera
        fixed:
          # See https://services.google.com/fh/files/misc/nestiqoutdoor_productenvironmenteeport.pdf
          # 34kWh / year = 3.88W
          power: 3.88

      - entity_id: binary_sensor.doorbell_always_on
        name: Doorbell
        fixed:
          # See https://services.google.com/fh/files/misc/nestiqoutdoor_productenvironmenteeport.pdf
          power: 3.88

      - entity_id: binary_sensor.nest_protect_always_on
        name: Nest Protect
        fixed:
          # Estimate - can't find data
          power: 0.1
      
      - entity_id: binary_sensor.smoke_detectors_always_on
        name: Smoke Detectors
        fixed:
          # See https://community.element14.com/challenges-projects/design-challenges/energy-harvesting/b/blog/posts/carbon-monoxide-detector-power-consumption
          # 1mA @ 3V = 0.003W
          # X2 (kitchen, hall)
          power: 0.006
      
      - entity_id: binary_sensor.network_switch_always_on
        name: Network Switch
        fixed:
          # See https://eu.dlink.com/pl/pl/-/media/business_products/dgs/dgs-1008p/datasheet/dgs_1008p_d1_datasheet_en_eu.pdf
          # Switch power is just 0.25W, but measured at 4.5W - 5W. It is powering a PoE camera.
          power: 5
      
      - entity_id: binary_sensor.fridge_always_on
        name: Fridge
        fixed:
          # Fridge label states daily consumption of 0.66kwH / day = 27.5W
          power: 27.5

      - entity_id: binary_sensor.modem_always_on
        name: Modem
        fixed:
          # Virgin Media Hub, measured locally
          power: 11.6
      
      - entity_id: binary_sensor.home_assistant_host_always_on
        name: Home Assistant Host
        fixed:
          # Home Assistant Blue, ODroid N2+ (measured locally)
          power: 3.2
      
      - entity_id: binary_sensor.wireless_tag_manager_always_on
        name: Wireless Tag Manager
        fixed:
          # Estimated from max current 0.3A @ 5V.
          power: 1.5
      
      

    - create_group: Variable Consumption Devices
      entities:
      
      - entity_id: switch.combi_boiler_relay_switch
        name: Combi Boiler Electricity
        # See https://www.vokera.co.uk/wp-content/uploads/2013/11/Vision-Combi-25-30C-User-Installation-and-Servicing-manual.pdf
        # Rated as drawing 119W of power while on, presumably to run pump.
        # Standby power represents passive power consumed by relay switch.
        # Relay switch measured as using 1.1W when under load.
        standby_power: 0.0
        fixed:
          power: 120.1
      
      - entity_id: switch.bathroom_extractor_fan
        # Extractor fan rated at 25W but measured locally at 22.1W.
        # standby power represents passive power consumed by relay switch
        standby_power: 0.0
        fixed:
          # Fan power at 22.1W plug relay at 1.1W
          power: 23.2
      
      - create_group: All Speakers
        entities:
          - entity_id: media_player.back_bedroom_assistant
            # Google Nest Mini - Locally measured at 1.5W
            standby_power: 1.5
            fixed:
              states_power:
                playing: 2.5
                idle: 1.5

          - entity_id: media_player.master_bedroom_assistant
            # Google Nest Mini - Locally measured at 1.5W
            standby_power: 1.5
            fixed:
              states_power:
                playing: 2.5
                idle: 1.5

          - entity_id: media_player.hall_assistant
            # Google Nest Mini - Locally measured at 1.5W
            standby_power: 1.5
            fixed:
              states_power:
                playing: 2.5
                idle: 1.5

          - entity_id: media_player.dining_room_speaker
            fixed:
              # Sonos One Gen 2
              # See: https://support.sonos.com/s/article/256?language=en_US
              # See: https://en.community.sonos.com/components-228996/power-consumption-6763681
              # (Locally measured at following values)
              power: 3
              states_power:
                playing: 5

          - entity_id: media_player.master_bedroom_speaker
            fixed:
              # Sonos Play:1
              # See: https://support.sonos.com/s/article/256?language=en_US
              # (Locally measured at following values)
              power: 3.5
              states_power:
                playing: 4.2

      - create_group: TV
        entities:
          - entity_id: media_player.beam
            fixed:
              # Sonos Beam Gen 2 + 2X Sonos Play:1 for LHS/RHS channels
              # See https://support.sonos.com/s/article/256?language=en_US
              # Locally measured Beam @ 4.0W idle, 9W playing
              # 4W + 3.5 + 3.5
              power: 11.0
              states_power:
                # See https://en.community.sonos.com/components-228996/power-consumption-6763681
                # 9W + 4.2W + 4.2W = 17.4
                playing: 17.4

          - entity_id: media_player.shield_android
            name: Television
            # Ratings for Nvidia shield plus Panasonic P42ST30B TV
            # Locally measured:
            #   TV: 11.6W standby, 183W idle (static image), 265W playing video
            #   Nvidia shield: 3.5W standby/off, 5W idle/paused, 7.5W playing.
            standby_power: 19.1
            fixed:
              states_power:
                idle: 188
                paused: 188
                playing: 272.5

      - create_group: Phone Charging
        entities:
          
          - entity_id: binary_sensor.pixel_5_is_charging
            name: Pixel5 Phone
            fixed:
              power: "{{ iif(is_state('binary_sensor.pixel_5_battery_state', 'charging'), 10.5, 0.1) }}"
          
          - entity_id: binary_sensor.p20_pro_is_charging
            name: P20Pro Phone
            # P20 Pro. Locally measured 0W when not plugged in, and 10.5W when charging via "supercharger".
            fixed:
              power: "{{ iif(is_state('sensor.p20_pro_battery_state', 'charging'), 10.5, 0) }}"

      - create_group: Tablet Charging
        entities:

          - entity_id: binary_sensor.samsung_tablet_is_charging
            name: Samsung Tablet
            # See https://www.notebookcheck.net/Review-Samsung-10-1-Galaxy-Tab-2-Tablet-MID.77084.0.html
            # Locally measured at 5.6W interactive, 2.6W standby
            fixed:
              power: "{{ iif(is_state('binary_sensor.samsung_tablet_interactive', 'on'), 5.6, 2.6) }}"

          - entity_id: binary_sensor.wall_panel_is_charging
            name: Wall Panel
            # See https://www.notebookcheck.net/Amazon-Fire-HD-10-2019-Tablet-Review-A-10-inch-tablet-at-a-bargain-price.445713.0.html
            fixed:
              power: "{{ iif(is_state('binary_sensor.wall_panel_interactive', 'on'), 3.74, 0.28) }}"


      - entity_id: sensor.xiaomi_vacuum_charging_state
        name: Robot Vacuum
        fixed:
          states_power:
            # Measured locally at following values:
            charging: 29
            docked: 2.9
            cleaning: 0
      
      - entity_id: binary_sensor.workstation
        name: Workstation
        standby_power: 0
        fixed:
          power: 85

    
    # Boiler hot water estimate (based on 0.7M3 daily usage in summer)
    - name: Domestic Hot Water Energy
      daily_fixed_energy:
        value: 7.9807

The end result

I created a new dashboard to view real-time power consumption:

I also added the top-level Powercalc’s summary sensor into the energy dashboard, along with pricing info from my electricity tariff, and a couple of Powercalc sub-groups as “individual devices”:

Next Steps

Although I now have detailed power consumption estimates for 60 out of 69 devices in my house, the remaining 9 big dumb appliances are probably the biggest energy hogs. To measure them I need to install some power meters. After some research I have selected the Shelly EM with two clamps, and will be installing this in my consumer unit / fuse box / breaker box to measure power usage at the main 63A switch using a 120A CT clamp, and power usage on my 32A oven/hob circuit using a 50A CT clamp. I will be supplementing this with a handful of Shelly Plus 1PM and Shelly 2PM Plus relays to measure power at the other large appliances.