Aeon Home Energy Meter v1 -- Read Clamps Separately

Yeah, if it ain’t broke, don’t fix it. Likely a reporting error that isn’t important to the overall use of the device, apparently.

I wonder if there is another way to get the firmware version.

Ya got me…

I have V3.60
What code should I be using???

Yesterday I installed the one from the bellow post it seemed to be correct values if I changed to 120V but I got no kWh readings.

Today I tried this one. now kWh is working but I cant change the Voltage and the Power readings are high.

.
I would avoid the code linked in the OP, as it’s confirmed to not function correctly per the most recent update:
.

@Omyn, great setup! Just curious, how are you using all the data from your 4 HEMs (logging data, alerts for devices turning on/off)?

I asm interested to know what OS you guys have on your phone so I can determine if it is an IOS problem rendering the screen. As all I get on my screen is the two on the far right top KWH and bottom watts the other 4 tiles are filled with 2 dotted lines.

I’m using an Android, and Dana is as well. I don’t know about the rest.

1 Like

Well then maybe I am encountering the dreaded IOS rendering problem. Which means the code has to be modified. I guess we won’t be seeing that soon.

Or you could switch to Android. :wink:

(Grinning and running and ducking)

1 Like

Did that! Never again. Once you get an iPhone there isn’t any turning back. I have had every major iPhone and none of the minor updates. Love them. They are safe and bullet proof.

Funny…same here, tried iPhone for a while and never again. Once you get an Android phone there isn’t any turning back! :slight_smile: :slight_smile: :slight_smile:

Reminds me of the word processor wars of my youth…Wordstar vs. WordPerfect. :smiley:

2 Likes

Yes I remember that. I have been involved in the computer industry since 1964. During that period until a few years ago I worked for a company that produced computer shows, and I managed them. So you can imagine all the equipment I had. I have built at least 500 PC’s for people and companies. I loved the PC until I got my first Mac. I now have 4 Macs, two iPads and two iPhones.

1 Like

Great question. I’m not really using it for anything right now other than checking my phone while I’m out of the house to ensure nothing is major is running. At this point, I just wanted a proof of concept that I could capture them as different data points and my next steps will be putting the the data points to use.

My intentions are things like:

  • High load appliance logging (gives me insight into cost of appliance as opposed to whole house energy costs)
  • Alerts based on the transition of load to non-load to monitor when appliances like dryer/washer/dishwasher complete their cycles
  • I would also like some type of energy usage dashboard that will give me more level of granularity than just whole house usage.

Run a VM with Android on it… There are plenty of free applications that let you run a VM of android on desktop. Not sure what’s available for Mac but there has to be something available.

Any idea why mine will not populate?

Perfect timing, @Omyn.

I just picked up a second short extension cord today and hooked up the washer w/it and put the second clamp on it so I’m officially monitoring both washer and dryer w/my first HEM.

I was coming back here to see if it’s going to be possible to create a CoRE piston based on individual clamp readings?

I.e., create two CoRE pistons, one watching clamp 1 (washer) and the other watching clamp 2 (dryer). E.g., monitor Clamp 1 on washer - when goes from >30 to <15 (washer resting draw when on is about 11) means that washer just finished up and send a push message/text to let us know the washer just finished. Similar for the dryer.

Will we be able to do that?

Here is how I used an Aeon HEM v1 to monitor and provide alerts for both my washer and dryer.

2 Likes

Looked at that, but:

  1. When I go to set up a piston on CoRE, and select the HEM as the button device, it only represents one button. I don’t get an option to choose Button 1 or Button 2 for the “If” statement - only

  2. The dryer is easy to set up (or will be, once I work out issue #1 above) as it runs close to 500 watts the entire time. The washer, however, ranges from 3 watts to 300 watts during the wash cycle (3 watts during short rest periods). So it’s not clear to me how to set up a rule for that.

Any help on 1 and 2 above?

Dana,

Oh yea, I remember that issue now… Here is a copy of my tweaked version of @Mike_Maxwell’s DTH for the Washer/Dryer Aeon HEM v1 device. This will properly “announce” the correct number of “buttons” for this device as 2, thereby allowing Core to receive each of the button events so you can send out push/text messages. This has been 100% reliable for me. Hope this helps!

Not sure about your second issue. Does it ever drop below 3W?

/*
Custom Laundry monitor device for Aeon HEM V1 

*/

metadata {
	definition (name: "Aeon HEM V1 Laundry DTH", namespace:	"MikeMaxwell", author: "Mike Maxwell") 
	{
		capability "Configuration"
		capability "Switch"
        capability "Button"
        //capability "Energy Meter"
		capability "Actuator"
		capability "Holdable Button"
		capability "Sensor"

        attribute "washerWatts", "string"
        attribute "dryerWatts", "string"
        attribute "washerState", "string"
        attribute "dryerState", "string"
        
//        command "configure"
        
		fingerprint deviceId: "0x2101", inClusters: " 0x70,0x31,0x72,0x86,0x32,0x80,0x85,0x60"
	}

	preferences {
       	input name: "washerRW", type: "number", title: "Washer running watts:", description: "", required: true
        input name: "dryerRW", type: "number", title: "Dryer running watts:", description: "", required: true
    }
	
    simulator {

	}

	tiles(scale: 2) {
    	multiAttributeTile(name:"laundryState", type: "generic", width: 6, height: 4, canChangeIcon: false){
        	tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
//            	attributeState "on", label:'Laundry Running', icon:"st.Appliances.appliances1", backgroundColor:"#53a7c0"
//            	attributeState "off", label:'Laundry Done', icon:"st.Appliances.appliances1", backgroundColor:"#ffffff"
            	attributeState "on", label:'', icon:"st.samsung.da.dryer_ic_dryer", backgroundColor:"#79b821"
            	attributeState "off", label:'', icon:"st.samsung.da.dryer_ic_dryer", backgroundColor:"#ffffff"
        	}
                   
            tileAttribute("device.switch", key: "SECONDARY_CONTROL") {
             	attributeState "on", label:'Laundry Running'
            	attributeState "off", label:'Laundry Done'
    		}
        }   

/*        
        valueTile("washerState", "device.washerState", width: 3, height: 2, canChangeIcon: true) {
        	state "default", label:'Washer\n${currentValue}'        
        }
        valueTile("dryerState", "device.dryerState", width: 3, height: 2, canChangeIcon: true) {
        	state "default", label:'Dryer\n${currentValue}'        
        }
*/
        standardTile("washerState", "device.washerState", width: 3, height: 3, canChangeIcon: true) {
        	state "off", label:'${name}', icon: "st.samsung.da.washer_ic_washer", backgroundColor:"#ffffff"
            state "on", label:'${name}', icon: "st.samsung.da.washer_ic_washer", backgroundColor:"#79b821"
        }
        standardTile("dryerState", "device.dryerState", width: 3, height: 3, canChangeIcon: true) {
        	state "off", label:'${name}', icon: "st.samsung.da.dryer_ic_dryer", backgroundColor:"#ffffff"
            state "on", label:'${name}', icon: "st.samsung.da.dryer_ic_dryer", backgroundColor:"#79b821"
        }

		valueTile("washer", "device.washerWatts", width: 3, height: 2, decoration: "flat") {
            state("default", label:'Washer\n${currentValue} Watts', foregroundColor: "#000000")
        }

		valueTile("dryer", "device.dryerWatts", width: 3, height: 2, decoration: "flat") {
            state("default", label:'Dryer\n${currentValue} Watts', foregroundColor: "#000000")
        }
       
		standardTile("configure", "device.configure", width: 2, height: 2, inactiveLabel: false, decoration: "flat") {
			state "configure", label:'', action:"configuration.configure", icon:"st.secondary.configure"
		}

		main "laundryState"
		details(["laundryState","washerState","dryerState","washer","dryer","configure"])
	}
}

def parse(String description) {
	def result = null
	def cmd = zwave.parse(description, [0x31: 1, 0x32: 1, 0x60: 3])
	if (cmd) {
		result = createEvent(zwaveEvent(cmd))
	}
	if (result) { 
		log.debug "Parse returned ${result?.descriptionText}"
		return result
	} else {
	}
}

def zwaveEvent(physicalgraph.zwave.commands.multichannelv3.MultiChannelCmdEncap cmd) {
	//log.info "mc3v cmd: ${cmd}"
	if (cmd.commandClass == 50) {  
    	def encapsulatedCommand = cmd.encapsulatedCommand([0x30: 1, 0x31: 1])
        if (encapsulatedCommand) {
        	def scale = encapsulatedCommand.scale
        	def value = encapsulatedCommand.scaledMeterValue
            def source = cmd.sourceEndPoint
            def str = ""
            def name = ""
        	if (scale == 2 ){ //watts
            	str = "watts"
                if (source == 1){
                	name = "washerWatts"
                    if (value >= settings.washerRW.toInteger()){
                    	//washer is on
                        sendEvent(name: "washerState", value: "on", displayed: true)
                        state.washerIsRunning = true
                    } else {
                    	//washer is off
                        if (state.washerIsRunning == true){
                        	//button event
                            sendEvent(name: "button", value: "pushed", data: [buttonNumber: 1], descriptionText: "Washer has finished.", isStateChange: true)
                        }
                        sendEvent(name: "washerState", value: "off", displayed: true)
                        state.washerIsRunning = false
                    }
                } else {
                	name = "dryerWatts"
                    if (value >= settings.dryerRW.toInteger()){
                    	//dryer is on
                        sendEvent(name: "dryerState", value: "on", displayed: true)
                        state.dryerIsRunning = true
                    } else {
                    	//dryer is off
                        if (state.dryerIsRunning == true){
                        	//button event
                            sendEvent(name: "button", value: "pushed", data: [buttonNumber: 2], descriptionText: "Dryer has finished.", isStateChange: true)
                        }
                        sendEvent(name: "dryerState", value: "off", displayed: true)
                        state.dryerIsRunning = false
                    }
                }
                if (state.washerIsRunning || state.dryerIsRunning){
                	sendEvent(name: "switch", value: "on", descriptionText: "Laundry has started...", displayed: true)
                } else {
                	sendEvent(name: "switch", value: "off", displayed: false)
                }
                //log.debug "mc3v- name: ${name}, value: ${value}, unit: ${str}"
            	return [name: name, value: value.toInteger(), unit: str, displayed: false]
            }
        }
    }
}

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

def configure() {
	log.debug "configure()"
    initialize()
	def cmd = delayBetween([
    	//zwave.configurationV1.configurationSet(parameterNumber: 100, size: 4, scaledConfigurationValue:1).format(),	//reset if not 0
        //zwave.configurationV1.configurationSet(parameterNumber: 110, size: 4, scaledConfigurationValue: 1).format(),	//reset if not 0
        
    	zwave.configurationV1.configurationSet(parameterNumber: 1, size: 2, scaledConfigurationValue: 120).format(),		// assumed voltage
		zwave.configurationV1.configurationSet(parameterNumber: 3, size: 1, scaledConfigurationValue: 0).format(),			// Disable (=0) selective reporting
		zwave.configurationV1.configurationSet(parameterNumber: 9, size: 1, scaledConfigurationValue: 10).format(),			// Or by 10% (L1)
      	zwave.configurationV1.configurationSet(parameterNumber: 10, size: 1, scaledConfigurationValue: 10).format(),		// Or by 10% (L2)
		zwave.configurationV1.configurationSet(parameterNumber: 20, size: 1, scaledConfigurationValue: 1).format(),			//usb = 1
		zwave.configurationV1.configurationSet(parameterNumber: 101, size: 4, scaledConfigurationValue: 6912).format(),   	
		zwave.configurationV1.configurationSet(parameterNumber: 111, size: 4, scaledConfigurationValue: 30).format() 		// Every 30 seconds
	], 2000)

	return cmd
}

def installed() {
	configure()
}

def updated() {
	configure()
}

def initialize() {
	sendEvent(name: "numberOfButtons", value: 2)
}
6 Likes