Aeon Labs Energy Meter clamps

OK.
The direction of the clamps is irrelevant, it doesn’t matter which direction they face.
This meter device was designed to have one clamp on each leg of your 240 service, these are the two big ass wires that come from your meter to your panel box. One is black and the other is black with a red stripe usually.
When using these clamps on an appliance, irrespective of the voltage, the clamp must be placed around the hot (usually black) or the neutral wire (usually white) of the appliance circuit. If placed around both no reading will be produced.
Placing the clamp around the ground wire will also produce no reading.
If the appliance cord is one of the flat style (vs round), and enterprising individual can easily separate the conductors along the mold lines of the cord. With flat cords the ground conductor is in the middle.
I currently have an HEM with one clamp on my washer and the other on my electric dryer.
The voltage of the circuit is only relevant when the device calculates watts, as watts are a product of voltage * amperage.

4 Likes

The arrow is between the K & L I don’t recall which way it pointed, and I tried to find a copy of the instructions online to no avail, I will see if I can dig them out when I get home. As for weather or not it matters which way they point, I know in the manual I have it said to do KL on the other. I can’t imagine they would spell that out if it didn’t matter for something.

1 Like

cURL from what I am told, “comes with mac” you can just do it from the Terminal window. If you are using a windows PC, Download it from https://curl.haxx.se/download.html (I am not affiliated with them, this is just where I downloaded it from)

and this is the post on setting up plottwatt https://github.com/bdwilson/PlotWatt-SmartThings-Logger

1 Like

I just did this on my dryer and stove, both are 240v so I used both clamps. Unplug the appliance, take the service access cover off the back. Verify which wire is which with a multimeter. On my three conductor dryer the center was neutral, clamps went on the other two. On my 4 conductor stove there was a red and black which were the two clamp legs. Make sure to CAREFULLY separate the leads, you don’t want to expose copper when pulling them apart, then clamp and reattach the wires through the service panel. I found it easier to fully remove the cable to separate and position everything. Like Mike said, direction has no bearing on this. If you are doing a 110v cord, you have to make sure it’s only using one clamp and only on hot or neutral, also like he said. I have a third “spare” meter that I’ve randomly putting on things just to play with. Always get a solid, expected, reading with just one clamp plugged into port 1.

It’s hard to tell on this first picture, I may have circled the wrong one on the left, the outer two, should have a thicker jacket, are what you want, again, use a multimeter to verify. The L shaped plug is neutral, don’t want that one.

2 Likes

just a point of clarification, on a 220 circuit (like a range or a dryer), unless you’re interested in the actual energy draw, there is no need to use two clamps.
Meaning, if your intent with the HEM is to determine the appliances on off state and use that value in RM or something, one clamp on the red or the black phase will do.

3 Likes

Wow! Thanks, guys.
I think your smarts may just be enough to overcome my stupids. lol

A while back, I found that one thread that deals with using both clamps independently, but I was never able to make it work, because of…well…stupids. I think I have a much better understanding of some of this now, and would like to attempt it again.

The first thing I’m going to try next, is to just get one of my two v1 HEMs connected to something the proper way (with above posts added into my understanding).

After that, I want to move on to this…

I want to monitor cooking appliances in the kitchen (mainly, the microwave oven, and then eventually, the conventional oven and its associated stove-top; all are electric), and have the house fan turn on to circulate the air (mainly to disperse odors that tend to settle where I don’t want them, and to some small degree, filter them out).

When one of the kitchen appliances turns on (i.e. somebody is cooking something), it will trigger the main HVAC fan for the whole house to turn on, and then turn off x-minutes after the appliance turns back off.

If any part of that sounds whacky, please let me know. I’d love to hear anything else that anyone has to offer.

to use and configure the probes independently one must have a custom device type, as the HEM needs to be configured to report each of it’s clamps independently. That’s probably why it didn’t work for you.
There are threads and device types out there for this already.

Yep. I found this one…

It’s the one I mentioned above.
However, I was never able to get it to work…most likely due to my previously mentioned ‘stupids’. :slight_smile:

I will try it again with this newfound wisdom, and see if I can make it work.

If there’s anything different I need to do to monitor on-off of two different items with the two clamps using this device handler, please say something. :slight_smile:

I ended up writing up one from scratch for my laundry monitor solution.
It currently presses button 1 when the washer wattage falls below the value configured in preferences.
And button 2 when the dryer falls below it’s preference wattage.
You’re looking for the opposite sort of thing, but this would give you a much better starting device type.
It includes the correct configuration settings to enable independent reporting for each probe.

/*
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"

        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){
        	tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
            	attributeState "on", label:'Running', icon:"st.Appliances.appliances1", backgroundColor:"#79b821"
            	attributeState "off", label:'Nothing running', icon:"st.Appliances.appliances1", backgroundColor:"#ffffff"
        	}
        }
        valueTile("washerState", "device.washerState", width: 3, height: 2) {
        	state("on", label:'Washer:\nRunning', backgroundColor:"#79b821")
            state("off", label:'Washer:\nNot running', backgroundColor:"#ffffff")
        }
        valueTile("dryerState", "device.dryerState", width: 3, height: 2) {
        	state("on", label:'Dryer:\nRunning', backgroundColor:"#79b821")
            state("off", label:'Dryer:\nNot running', backgroundColor:"#ffffff")
        }
        valueTile("washer", "device.washerWatts", width: 3, height: 1, decoration: "flat") {
        	state("default", label:'Washer\n${currentValue}\nWatts', foregroundColor: "#000000")
        }
        valueTile("dryer", "device.dryerWatts", width: 3, height: 1, decoration: "flat") {
        	state("default", label:'Dryer\n${currentValue}\nWatts', foregroundColor: "#000000")
        }
		standardTile("configure", "command.configure", inactiveLabel: false) {
			state "configure", label:'', action: "configure", icon:"st.secondary.configure"
		}
		main "laundryState"
		details(["laundryState","washerState","dryerState","washer","dryer","configure"])
	}
}

def installed() {
	configure()					
}

def parse(String description) {
//	log.debug "Parse received ${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: false)
                        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: false)
                        state.washerIsRunning = false
                    }
                } else {
                	name = "dryerWatts"
                    if (value >= settings.dryerRW.toInteger()){
                    	//dryer is on
                        sendEvent(name: "dryerState", value: "on", displayed: false)
                        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: false)
                        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 "washerIsRunning: ${state.washerIsRunning}, dryerIsRunning: ${state.dryerIsRunning}"
            	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()"
    
	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: 60).format() 		// Every 60 seconds
	], 2000)

	return cmd
}
3 Likes

I think I can use this, thanks!

I currently use these to calculate overall energy usage. With all my monitoring devices I can then sum and subtract from my one meter that monitors the whole house, and see how much “leakage” I have with the few non monitored devices and most of my lights.

I then have the washer/dryer/dishwasher send alerts to the various family members that are tasked with those chores to alert them when cycles are complete. Bugs the crap out of them, but darn if they aren’t more efficient with it!

3 Likes

I don’t know what is going on I imported the Api which went fine then I opened terminal and entered:

curl -X POST -d “number_of_new_meters=1” http://xxxxxxxxxxxxx:@plotwatt.com/api/v2/new_meters

and the result was "command not found. Any ideas as the number next to http:// is the number listed in the API

want me to do it for you? your new meter number will show up on the webpage. Also you’re going to want to edit your post to remove the house API ID so others dont see it long term.

Yes please and I will edit it out. Just tell me what to do after. Thanks.

Ok, you’re having the same Issue I did when I did this the first time too. My first “house” didn’t configure correctly for some reason. I say this is the issue because I just ran your code and I got no response back from plotwatt.

Is there a private messenger on this forum?

Yes just click my name and it comes up.

message sent.

For those looking for more detailed instructions, here ya go! I am hoping I didn’t forget something.

Things you will need to have done or know prior to starting:
create a plotwatt.com account
Know whether your version of windows is 32bit or 64bit
you will also need to install winrar or something that can open a CAB file (www.winrar.com)

  1. Log into Plotwatt.com

  2. At the top of the page you will see “Houses” Click it
    Select “Add House”

  3. Under house name type “house” enter your zipcode, country and set your time zone. Click Continue

  4. On the next screen click the button for Setup under “Web-Connected Energy Meter”

  5. On the next screen under the drop down select “PlotWatt API” and click Continue

  6. On the Next screen Click Proceed

  7. Fill out the House Survey

  8. Enter your billing day of the month and select your Utility Options and Click OK

  9. Now Go to this link: https://plotwatt.com/docs/api
    you will see a table with Three columns: House, house_id, API_KEY
    Keep the web page open and continue to the next step, we will come back here for the API_KEY

  10. Go to https://curl.haxx.se/download.html scroll to towards the bottom of the page for the section that says “Win32 - Generic” for 32bit windows or “win64 - Generic” for 64bit windows and download what you need in zip format so “Win32 CAB” or Win64 x86_64 CAB"

  11. Open the file you just downloaded, and if your computer is 32 bit, open the i386 directory if it is 64 bit open the AMD64 directory.

  12. Copy the files from the directory you just opened to a folder on your computer hard drive, I suggest C:\cURL because you will need to get to it using a command prompt later. These instructions asume this locatoin

  13. On your Windows computer press the windows key and x at the same time, this will bring up a menu, select “Command Prompt (Admin)” and click yes to the pop up window about User Account Control.

  14. This will bring up a black window that says “C:\Windows\System32”

  15. Type CD\ and hit enter the window will now say “C:”

  16. Type CD cURL and now you should see “C:\cURL” Do not close this window we will be coming back to it.

  17. Go back to the page we left open in step 9 or go back to that page and copy the field under where it says API_KEY to your computers clipboard (highlight it and hit Ctrl+c) it will look something like ZfYyNzQ2MTk9NWIz

  18. now edit the text below where it says YOURAPIKEYHERE paste (highlight and Ctrl+V) or type your API_ID

curl -X POST -d “number_of_new_meters=1” http://YOURAPIKEYHERE:@plotwatt.com/api/v2/new_meters

  1. Highlight the text above, and press Ctrl+C

  2. Go back to your Command Prompt window which we left open at step 16 and press Ctrl+V then hit Enter

  3. You should now see a number appear it will look like [123456] but be you unique to your system write this number down

  4. Create/publish and install the SmartApp from https://github.com/bdwilson/PlotWatt-SmartThings-Logger

  5. When installing the smart app you will need your API_Key from above and enter the number you wrote down to the Meter_ID field Please make note that the API_Key is CaSe Sensitive

Your HEM should now be reporting to PlotWatt.

Feel free to copy and share these instructions, Or feel free to update them if I missed something or if things change.

4 Likes

[quote=“Mike_Maxwell, post:229, topic:359, full:true”]
I ended up writing up one from scratch for my laundry monitor solution.
It currently presses button 1 when the washer wattage falls below the value configured in preferences.
And button 2 when the dryer falls below it’s preference wattage.
You’re looking for the opposite sort of thing, but this would give you a much better starting device type.
It includes the correct configuration settings to enable independent reporting for each probe.[/quote]

@Mike_Maxwell
I just tried to add this device handler in the IDE, but got this error…

“Org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: script14576460223841266419440.groovy: 155: expecting ‘]’, found ‘(’ @ line 155, column 9. Disable (=0) selective reporting ^ 1 error”

I know I must be missing something.
Any chance you could give me a hand?

Make sure that there’s a carriage return after the very last line.

Thanks.
Did that.
Same error.
Well, the only thing different was script14576460223841266419440.groovy instead of what it had before, and I assume that’s different every time, but if not…