Smart Power Outlet, configure/disable energy reporting?

Hi

I was hoping someone could let me what steps to follow to how to “reset and re-pair the device”. I attempted to make the changes proposed to the send-me-a-report line by creating my own custom device type (under My Device Types) and linking it to the Smartthings outlet - device (under My Devices). Ideally if I can get the min change in value to work as expected I would be ecstatic (i.e. the proposed example below). Unfortunately, no matter what I change, the outlet does not change it’s reporting frequency. Note - I have changed all of the last 3 values (i.e. min report time, max and change in value) with no success (not illustrated above) I even commented out the code and republished to see if no reporting would take place but still no change to the device.

I unplugged device for 2 min and replugged in but nothing. How do I reset and re-pair the device… (delete it from all smartapps, delete the device and start again??).

Original Code: “zcl global send-me-a-report 0x0B04 0x050B 0x29 1 600 {05 00}”,
Proposed Code: “zcl global send-me-a-report 0x0B04 0x050B 0x29 1 600 {100}”,

I would greatly appreciate some assistance in this matter.

I have attempted to follow the instructions in FAQ: An Overview of Using Custom Code in SmartThings to no avail.

Hi Kennet

One quick fix for your new code line. Instead of {100} at the end, you’ll want to use {64 0000}. The zigbee code uses hex formatting, so 100 = 64 and you need the zeros after because there’s a 2nd payload input for timeout period.

To reset, unplug the outlet. Then while holding the button, plug the outlet in. When the LED comes on, release the button. It should now be reset. Start the Connect New Device procedure in the app and give it a few minutes. It probably won’t register that a new device is connected since the outlet already exists in your setup. (If you have Live Logging in the IDE up while the app searches for new devices, you should be able to see it rejoin.)

Below is the manual for the outlet mentions the reset procedure, although doesn’t call it that.
https://support.smartthings.com/hc/en-us/article_attachments/203008000/Outlet_Booklet_US.pdf

Thanks Scott! I think I finally got it working thanks to your assistance. I am getting significantly less activities in my “Recently” section. I will continue to tweak to try and reduce it further.

Here is the code to only display once an hour, Go to IDE and add device handler.
Then delete your connected smart outlet and re connect it and it should connect using the new device handler

https://graph.api.smartthings.com/ide/devices

to reset/reconnect device:
from sticks18 “To reset, unplug the outlet. Then while holding the button, plug the outlet in. When the LED comes on, release the button. It should now be reset. Start the Connect New Device procedure in the app and give it a few minutes. It probably won’t register that a new device is connected since the outlet already exists in your setup. (If you have Live Logging in the IDE up while the app searches for new devices, you should be able to see it rejoin.)”

/**
 *  Copyright 2015 SmartThings
 *
 *  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.
 *
 *	SmartPower Outlet (CentraLite)
 *
 *	Author: SmartThings
 *	Date: 2015-08-23
 */
metadata {
	// Automatically generated. Make future change here.
	definition (name: "SmartPower Outlet", namespace: "smartthings", author: "SmartThings") {
		capability "Actuator"
		capability "Switch"
		capability "Power Meter"
		capability "Configuration"
		capability "Refresh"
		capability "Sensor"

		// indicates that device keeps track of heartbeat (in state.heartbeat)
		attribute "heartbeat", "string"

		fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019", manufacturer: "CentraLite",  model: "3200", deviceJoinName: "Outlet"
		fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019", manufacturer: "CentraLite",  model: "3200-Sgb", deviceJoinName: "Outlet"
		fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019", manufacturer: "CentraLite",  model: "4257050-RZHAC", deviceJoinName: "Outlet"
		fingerprint profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0B04,0B05", outClusters: "0019"
	}

	// simulator metadata
	simulator {
		// status messages
		status "on": "on/off: 1"
		status "off": "on/off: 0"

		// reply messages
		reply "zcl on-off on": "on/off: 1"
		reply "zcl on-off off": "on/off: 0"
	}

	preferences {
		section {
			image(name: 'educationalcontent', multiple: true, images: [
				"http://cdn.device-gse.smartthings.com/Outlet/US/OutletUS1.jpg",
				"http://cdn.device-gse.smartthings.com/Outlet/US/OutletUS2.jpg"
				])
		}
	}

	// UI tile definitions
	tiles(scale: 2) {
		multiAttributeTile(name:"switch", type: "lighting", width: 6, height: 4, canChangeIcon: true){
			tileAttribute ("device.switch", key: "PRIMARY_CONTROL") {
				attributeState "on", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821", nextState: "turningOff"
				attributeState "off", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff", nextState: "turningOn"
				attributeState "turningOn", label: '${name}', action: "switch.off", icon: "st.switches.switch.on", backgroundColor: "#79b821", nextState: "turningOff"
				attributeState "turningOff", label: '${name}', action: "switch.on", icon: "st.switches.switch.off", backgroundColor: "#ffffff", nextState: "turningOn"
			}
			tileAttribute ("power", key: "SECONDARY_CONTROL") {
				attributeState "power", label:'${currentValue} W'
			}
		}

		standardTile("refresh", "device.power", inactiveLabel: false, decoration: "flat", width: 2, height: 2) {
			state "default", label:'', action:"refresh.refresh", icon:"st.secondary.refresh"
		}

		main "switch"
		details(["switch","refresh"])
	}
}

// Parse incoming device messages to generate events
def parse(String description) {
	log.debug "description is $description"

	// save heartbeat (i.e. last time we got a message from device)
	state.heartbeat = Calendar.getInstance().getTimeInMillis()

	def finalResult = zigbee.getKnownDescription(description)

	//TODO: Remove this after getKnownDescription can parse it automatically
	if (!finalResult && description!="updated")
		finalResult = getPowerDescription(zigbee.parseDescriptionAsMap(description))

	if (finalResult) {
		log.info finalResult
		if (finalResult.type == "update") {
			log.info "$device updates: ${finalResult.value}"
		}
		else if (finalResult.type == "power") {
			def powerValue = (finalResult.value as Integer)/10
			sendEvent(name: "power", value: powerValue)
			/*
				Dividing by 10 as the Divisor is 10000 and unit is kW for the device. AttrId: 0302 and 0300. Simplifying to 10

				power level is an integer. The exact power level with correct units needs to be handled in the device type
				to account for the different Divisor value (AttrId: 0302) and POWER Unit (AttrId: 0300). CLUSTER for simple metering is 0702
			*/
		}
		else {
			sendEvent(name: finalResult.type, value: finalResult.value)
		}
	}
	else {
		log.warn "DID NOT PARSE MESSAGE for description : $description"
		log.debug zigbee.parseDescriptionAsMap(description)
	}
}

def off() {
	zigbee.off()
}

def on() {
	zigbee.on()
}

def refresh() {
	sendEvent(name: "heartbeat", value: "alive", displayed:false)
	zigbee.onOffRefresh() + zigbee.refreshData("0x0B04", "0x050B")
}

def configure() {
	zigbee.onOffConfig() + powerConfig() + refresh()
}

//power config for devices with min reporting interval as 1 seconds and reporting interval if no activity as 10min (600s)
//min change in value is 01
def powerConfig() {
	[
		"zdo bind 0x${device.deviceNetworkId} 1 ${endpointId} 0x0B04 {${device.zigbeeId}} {}", "delay 200",
		"zcl global send-me-a-report 0x0B04 0x050B 0x29 6400 6401 {64 0000}",				//The send-me-a-report is custom to the attribute type for CentraLite
		"send 0x${device.deviceNetworkId} 1 ${endpointId}", "delay 500"
	]
}

private getEndpointId() {
	new BigInteger(device.endpointId, 16).toString()
}

//TODO: Remove this after getKnownDescription can parse it automatically
def getPowerDescription(descMap) {
	def powerValue = "undefined"
	if (descMap.cluster == "0B04") {
		if (descMap.attrId == "050b") {
			if(descMap.value!="ffff")
				powerValue = zigbee.convertHexToInt(descMap.value)
		}
	}
	else if (descMap.clusterId == "0B04") {
		if(descMap.command=="07"){
			return	[type: "update", value : "power (0B04) capability configured successfully"]
		}
	}

	if (powerValue != "undefined"){
		return	[type: "power", value : powerValue]
	}
	else {
		return [:]
	}
}
2 Likes

Thanks, Bud…

But save me from diff-ing… What do did you change?

//power config for devices with min reporting interval as 1 seconds and reporting interval if no activity as 10min (600s)
//min change in value is 01
def powerConfig() {
[
“zdo bind 0x${device.deviceNetworkId} 1 ${endpointId} 0x0B04 {${device.zigbeeId}} {}”, “delay 200”,
“zcl global send-me-a-report 0x0B04 0x050B 0x29 6400 6401 {64 0000}”, //The send-me-a-report is custom to the attribute type for CentraLite
“send 0x${device.deviceNetworkId} 1 ${endpointId}”, “delay 500”
]
}

2 Likes

Excellent!

Easy enough to also add parameters to the DTH and call “config”, right?

I’ll put together a pull request on the official one … only if you @Mike_Maxwell and @simi510 don’t plan on doing so yourselves???

Go for it, It’s all you baby!
Be bold, make it a preference option, as it should be…

1 Like

please do. it was driving me nuts all the spam.

1 Like

Hi,

I can’t see any “600” or “01” within this part. How can I configure a different setting ?
Btw, has anyone made a configurable version of this ?

Thanks.

Last I tried to do that exact same change for the same exact devices, I ended up using some back channels and nothing came out of that either ;( It’s interesting to note that the official DTH defaults the device to very noisy, possibly affecting the ST cloud but the relevant people in ST didn’t really seem interested. Good luck :wink:

1 Like

Yup, I posted my code in a different thread… This gives you settings in the app to turn power logging on/off entirely or change the threshold required for reported changes.

What i really want is the ability to have the live updated “tile” but just only show the larger more important changes in the “recent activity”. If anyone knows how to send events in such a way, that’d be amazing :wink:

Hi,

I am trying your dev. handler.
But even though I select to show changes the app does not show any changes.
when I trun back to original code it shows updates. (too frequently)

where is the complete code for your dev. handler ?

thx.

Sure. It’s here:

Ok. I installed this and updated my device with this dev. handler. Then I used the settings to enable “show power in activity feed” and "only if power changes by 2"
However, now it does not show any changes , neither in activity feed nor the device interface
Why ?

I dunno, i just tested it again and it works for me. This is my first DTH hack so admittedly I might not have done it right. I’d love feedback from anyone who’s more advanced than I am…

well, the dev. handler works for turning on/off the device.
However, it does not show the power on the device interface and it does not report power on notification feed.
but here in this case I did not install it from zero. I just replaced the original device handler with this one on device page.
then I edited the device for setting up :

  1. “show power in activity feed”
  2. “only if power changes by 2”

what might I be doing wrong ?

btw my device is from UK , so its not the US type.

That’s the same way I installed it. Edit the device and pick my “published for me” DTH. I don’t see how anything I did would make a difference between UK/US. The IDE simulator and testing doesn’t work worth a darn, so I don’t have much I can do to figure out why it’s not working for you.

I’m having the exact same issue and also in the UK. Probably coincidence…

Is there any debugging we can add to the code to see how far the code is getting? It just seems to stop reporting Event Type: Power as soon as I switch to your code.

I had a bit of a fiddle and moved the event generation back into the main IF block and it only seems to generate an event if I press the refresh tile in the app. So it looks to be something supressing the event creation?

else if (finalResult.type == "power") {
		def powerValue = (finalResult.value as Integer)/10
        event = createEvent(name: "power", value: powerValue, displayed: true, descriptionText: '{{ device.displayName }} power is {{ value }} Watts', translatable: true)
        def changeValue = powerValue - state.lastPowerValue

		if (changeValue < 0) {
        	changeValue = -changeValue
		}
        
        if (prefLogPower == true) {
        	if (changeValue > prefLogPowerDelta || powerValue == 0 || state.lastPowerValue == 0) {
	            event = createEvent(name: "power", value: powerValue, displayed: true, descriptionText: '{{ device.displayName }} power is {{ value }} Watts', translatable: true)
                state.lastPowerValue = powerValue
            } else {
            	event = createEvent(name: "power", value: powerValue, displayed: false, descriptionText: '{{ device.displayName }} power is {{ value }} Watts', translatable: true)
            }
        } else {
            event = createEvent(name: "power", value: powerValue, displayed: false, descriptionText: '{{ device.displayName }} power is {{ value }} Watts', translatable: true)
        }

I was having the same problem and I checked the live logging and noticed an exception on line 99 where the value of state.lastPowerValue is used. I added a debug statement there and found that it’s value was null.

I’m completely new to device handlers (just got my hub a couple of days ago) but I’m suspecting that the configure() method (where you first initialize the value of state.lastPowerValue) isn’t being called when we just change the device handler in the developer tools. Is it maybe only called when the switch is first added to the network or initialized?

In any case, I added an extra statement at the beginning of parse() which checks if state.lastPowerValue is null, and if so, initializes it to zero. Now, I’m not getting the exception in the logs, the events are only showing when the change exceeds my configured value, and the tile is updating normally.