Power Monitoring Not Working So Well

I've been using my HEM v1's, a few Iris Outlets, and some Aeon Smart Outlets for the last few months on Hubitat. They are really bad about updating with built-in or modified ST drivers.

Who's using these and are you getting much success with them?

HEM v1
Aeon Smart Metering Switch DSC06106-ZWUS
Iris Outlet

Aeon Home Energy Monitor (updated every 5 minutes? can't change, not consistent)
jscgs350 : My Aeon Home Energy Monitor Gen1 (ST) (Needs refresh via RM, but not consistent)

Generic Z-Wave Outlet (does nothing)
jscgs350 : My Aeon Metering Switch (ST) (Refresh button works, but RM doesn't refresh it, updated values don't push to my InfluxDB app)

Generic Zigbee Outlet (no energy reading, updates watts mostly consistently but can't set interval)
blebson : Iris Smart Plug (ST) (Inconsistent and randomly stops updating at all)

Here's the 5 minute interval issue, vs what I want at 15 second interval:

Top is some Iris Outlets and Aeon Metering Switch on ST, bottom is Hubitat.

Here's my Dryer HEMv1 showing randomness with an ST driver set to 15 seconds:

And the RM rule doing the 15 second refresh request:

It just stops scheduling jobs for no reason, and Event List shows nothing for the Rule.

I've removed random devices and put on ST, they start graphing properly right away, then excluded/removed and put back on Hubitat, and nothing changes. Configure either doesn't fully reset the device or doesn't send updated settings is my random guess.

Any help would be appreciated, if I can get this working correctly, I can remove all remaining Zigbee and Z-Wave devices from my ST hub!

I'm using the Aeon HEM v1 with @ogiewon 's port of @mike.maxwell 's HEM Laundry monitoring device driver. I don't know if it's measuring the power usage accurately or not. Not what I care about for this use. I only want to know if the dryer or washer are running. For that, it works really well. The washer's power consumption is flakey, but that's just my washer. I had to modify the code a bit and create two special rules to handle its schizophrenia. The dryer is solid though. Off means OFF for that old boy.

1 Like

I tried that driver as well but it doesn't report power or energy.

Yeah, it's just watts to indicate laundry is finished. You could try @Cobra 's HEM v2. It's for Gen 5, but you could probably modify it to work with a v1 HEM.

I gave that a shot too. I suck at modifying these things. :slight_smile:

I have several Iris Outlets and they report power very nicely. Everything works if your app only needs to consume unsolicited reports.
However, I could not get the outlets to respond to Refresh commands. (The Refresh Button on the web interface does not do anything and I get nothing in response to MQTT calls).

I have noticed the same thing from the same 2 device types...

1 Like

Another option for your washer is to put a sensor on it that has an accelerometer and notify based on that being active and then becoming inactive for x minutes.

I graph almost all power usage in my home. Then set thresholds for abnormal power usage. I can see when my furnace filter is dirty, when the kids forget to sleep their computers, when my wife leaves the stove on.

Monitoring the washer/dryer cycle isn't a priority for this.

I also use power from my entertainment centers to dictate if automatic lights should turn on or not. Power from the family computers to set mood lighting if I'm playing a game or just working, if the kids are watching a movie or doing homework.

I use wattage differences of 5-10w sometimes to dictate behaviors of my system. I really need consistent power readings. Electrical usage in today's tech heavy world is very revealing. :wink:

You should check Sense if you haven't already.

Their video is pretty basic and makes it look like it's not much more that what we can do with an Aeon HEM, but it's significantly more sophisticated. This segment on This Old House is a much better demo of what's possible with the system.


That's cool!

It would need real-time API access for what is needed, maybe it does. I'll research more later.

But I can say all my HEMv1's and outlets cost less than that. But it would be awesome to have a single device if it could differentiate between all my devices.

Yeah, they have a hue integration and they're working on more. There's an IFTTT integration and an Alexa skill too. With the IFTTT integration you can create a trigger from any device their system knows about, which would basically be everything electrical in your home since it's so sensitive.

Curb Energy is another option:

You can put CT clamps on various breakers in your panel. I had one for a year but sold it during a Home addition because I ran out of space in my panel with additional breakers and wiring.

Some folks on the ST forum created an integration:

This integration was released after I sold my Curb so I have no experience with it. You can ask questions on ST community. :grimacing:

Is there still no solution for the v1 HEM? I find the wattage does not change. This worked without any issues when I was using it on the ST platform and was able to monitor changes of only a couple watts,

This is the one I am using at my house, not sure if you have tried this:

 *  Aeon HEM1
 *  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at:
 *      http://www.apache.org/licenses/LICENSE-2.0
 *  Unless required by applicable law or agreed to in writing, software distributed under the License is distributed
 *  on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License
 *  for the specific language governing permissions and limitations under the License.
 *  Aeon Home Energy Meter v1 (US)
metadata {
    definition (name: "My Aeon Home Energy Monitor v3", namespace: "jscgs350", author: "SmartThings") 
    	capability "Energy Meter"
    	capability "Power Meter"
    	capability "Configuration"
    	capability "Sensor"
    	capability "Refresh"
    	capability "Polling"
    	capability "Battery"
    	attribute "energy", "string"
    	attribute "energyDisp", "string"
    	attribute "energyOne", "string"
    	attribute "energyTwo", "string"
    	attribute "power", "string"
    	attribute "powerDisp", "string"
    	attribute "powerOne", "string"
    	attribute "powerTwo", "string"
    	command "reset"
    	command "configure"
    	command "resetmaxmin"
    fingerprint deviceId: "0x2101", inClusters: " 0x70,0x31,0x72,0x86,0x32,0x80,0x85,0x60"


	preferences {
		input "kWhCost", "string", title: "\$/kWh (0.16)", defaultValue: "0.16" as String, displayDuringSetup: true

def parse(String description) {
    //log.debug "Parse received ${description}"
	def result = []
	//log.debug "desc: ${description}"
    def cmd = zwave.parse(description, [0x31: 1, 0x32: 1, 0x60: 3])
    if (cmd) {
        result << createEvent(zwaveEvent(cmd))
    //if (result) log.debug "Parse returned ${result}"
    def statusTextmsg = ""
    statusTextmsg = "Min was ${device.currentState('powerOne')?.value}\nMax was ${device.currentState('powerTwo')?.value}"
    sendEvent("name":"statusText", "value":statusTextmsg)
    //log.debug statusTextmsg
    return result

def zwaveEvent(hubitat.zwave.commands.meterv1.MeterReport cmd) {
    //log.debug "zwaveEvent received ${cmd} ${cmd.payload} ${cmd.format()}"
    def dispValue
    def newValue
    def timeString = new Date().format("yyyy-MM-dd h:mm a", location.timeZone)
    if (cmd.meterType == 33) {
        if (cmd.scale == 0) {
            newValue = cmd.scaledMeterValue
            //log.debug state
            if (newValue != state.energyValue) {
                dispValue = String.format("%5.2f",newValue)+"\nkWh"
                sendEvent(name: "energyDisp", value: dispValue as String, unit: "")
                state.energyValue = newValue
                BigDecimal costDecimal = newValue * ( kWhCost as BigDecimal)
                def costDisplay = String.format("%3.2f",costDecimal)
                sendEvent(name: "energyTwo", value: "Cost\n\$${costDisplay}", unit: "")
                [name: "energy", value: newValue, unit: "kWh"]
        } else if (cmd.scale == 1) {
            newValue = cmd.scaledMeterValue
            if (newValue != state.energyValue) {
                dispValue = String.format("%5.2f",newValue)+"\nkVAh"
                sendEvent(name: "energyDisp", value: dispValue as String, unit: "")
                state.energyValue = newValue
                [name: "energy", value: newValue, unit: "kVAh"]
        else if (cmd.scale==2) {                
            newValue = Math.round( cmd.scaledMeterValue )       // really not worth the hassle to show decimals for Watts
            if (newValue != state.powerValue) {
                dispValue = newValue+"w"
                sendEvent(name: "powerDisp", value: dispValue as String, unit: "")
                if (newValue < state.powerLow) {
                    dispValue = newValue+"w"+" on "+timeString
                    sendEvent(name: "powerOne", value: dispValue as String, unit: "")
                    state.powerLow = newValue
                if (newValue > state.powerHigh) {
                    dispValue = newValue+"w"+" on "+timeString
                    sendEvent(name: "powerTwo", value: dispValue as String, unit: "")
                    state.powerHigh = newValue
                state.powerValue = newValue
                [name: "power", value: newValue, unit: "W"]

def zwaveEvent(hubitat.zwave.commands.batteryv1.BatteryReport cmd) {
    def map = [:]
    map.name = "battery"
    map.unit = "%"
    if (cmd.batteryLevel == 0xFF) {
        map.value = 1
        map.descriptionText = "${device.displayName} has a low battery"
        map.isStateChange = true
    } else {
        map.value = cmd.batteryLevel
    //log.debug map
    return map

def zwaveEvent(hubitat.zwave.Command cmd) {
    // Handles all Z-Wave commands we aren't interested in
    log.debug "Unhandled event ${cmd}"

def refresh() {
    log.debug "Refreshed ${device.name}"
    def cmds = delayBetween([
    zwave.meterV2.meterGet(scale: 0).format(),
    zwave.meterV2.meterGet(scale: 2).format()
log.debug "refresh cmds ${cmds}"

def poll() {

def reset() {
    log.debug "${device.name} reset kWh/Cost values"
    state.powerHigh = 0
	state.powerLow = 99999

	def timeString = new Date().format("yyyy-MM-dd h:mm a", location.timeZone)
    sendEvent(name: "energyOne", value: "Energy Data (kWh/Cost) Reset On:\n"+timeString, unit: "")       
    sendEvent(name: "energyDisp", value: "", unit: "")
    sendEvent(name: "energyTwo", value: "Cost\n--", unit: "")

    def cmd = delayBetween( [
        zwave.meterV2.meterGet(scale: 0).format(),
    	zwave.meterV2.meterGet(scale: 2).format()

def resetmaxmin() {
    log.debug "${device.name} reset max/min values"
    state.powerHigh = 0
    state.powerLow = 99999
	def timeString = new Date().format("yyyy-MM-dd h:mm a", location.timeZone)
    sendEvent(name: "energyOne", value: "Watts Data (min/max) Reset On:\n"+timeString, unit: "")
    sendEvent(name: "powerOne", value: "", unit: "")    
    sendEvent(name: "powerTwo", value: "", unit: "")    

    def cmd = delayBetween( [
        zwave.meterV2.meterGet(scale: 0).format(),
    	zwave.meterV2.meterGet(scale: 2).format()

def configure() {
    log.debug "${device.name} configuring device"
    def cmd = delayBetween([
    	//zwave.configurationV1.configurationSet(parameterNumber: 255, size: 4, scaledConfigurationValue: 1).format() 	// Performs a complete factory reset.  Use this all by itself and comment out all others below.  Once reset, comment this line out and uncomment the others to go back to normal
        zwave.configurationV1.configurationSet(parameterNumber: 3, size: 1, scaledConfigurationValue: 1).format(),      // Disable selective reporting, so always update based on schedule below <set to 1 to reduce network traffic>
        zwave.configurationV1.configurationSet(parameterNumber: 4, size: 2, scaledConfigurationValue: 50).format(),     // (DISABLED by first option) Don't send unless watts have changed by 25 <default is 50>
        zwave.configurationV1.configurationSet(parameterNumber: 8, size: 1, scaledConfigurationValue: 10).format(),     // (DISABLED by first option) Or by 5% <default is 10>

        zwave.configurationV1.configurationSet(parameterNumber: 101, size: 4, scaledConfigurationValue: 4).format(),    // Combined energy in Watts
        zwave.configurationV1.configurationSet(parameterNumber: 111, size: 4, scaledConfigurationValue: 60).format(),   // Every 60 Seconds (for Watts)

        zwave.configurationV1.configurationSet(parameterNumber: 102, size: 4, scaledConfigurationValue: 8).format(),    // Combined energy in kWh
        zwave.configurationV1.configurationSet(parameterNumber: 112, size: 4, scaledConfigurationValue: 300).format(),   // every 5 minutes (for kWh)

        zwave.configurationV1.configurationSet(parameterNumber: 103, size: 4, scaledConfigurationValue: 0).format(),    // Disable report 3
        zwave.configurationV1.configurationSet(parameterNumber: 113, size: 4, scaledConfigurationValue: 0).format()     // Disable report 3

1 Like

Lots of choices for v1. It's the newer units that are still in need of driver love.

Are you using it for power monitoring or laundry?

Thanks. I will try this driver.

I am using it for monitoring my whole house energy use.

Looks like after power cycling the device it started to update, for about 15-20 minutes but now even after polling or refreshing the device the wattage does not change. I can't see it being a weak signal issue because my Hubitat is in the exact same location as my ST hub was and I never had an issue when it was on ST. Also the HEM has not moved. I am using the driver that chuck posted above.

How many seconds you have it to refresh the wattage?

I haven't changed any of the code from its default which looks to be 60 seconds, but it has been way over 60 seconds anyways without a change. I also tried manually hitting refresh.

Download the Hubitat app