GE Launches Seriously Cheap Wink Connected Bulb

Makes sense. I remember reading of folks having trouble pairing Hue bulbs from other starter kits to their bridge due to them being pre-paired to the kit’s bridge.

Google “lampstealer” for an app that can force re-pairing of the bulb to your bridge. Note that you may need to get the bulb VERY close to your bridge to re-pair it.

Tony,

This is exactly the app you need to force the pairing. Amazon had a free BR30 bulb offer last month with their starter kits and that bulb refused to pair until i ran lamp stealer.

I managed to snag a 6 pack of these this morning at my local HD. No one had a clue what I was talking about when I asked for them but store showed 11 in stock. Somehow I got lucky enough to have a manager up front who said “I think there’s a UPS box in the back office with a few samples”… it had a sticker that said “Q3 Home Automation Promo” and they let me grab whatever I wanted. The box really only contained the A19 GE Link bulbs and the Leviton Z-Wave Dimmer model DZMX1. I decided to grab two of those, however those appear easy to find at places like Amazon and others.

Like the other reports above I decided to pair directly with my ST hub and it worked perfectly. It paired as a Zigbee switch and rather than change the device type to Zigbee Dimmer I changed it to “Zigbee Hue Bulb” and it worked flawlessly. On/Off as well as dimming work perfectly. Obviously there is a useless color swatch in the device info page but I’ll throw together a quick device handler which contains the commands for on/off/dim and dump the color picker. If anyone is interested just let me know and I can post a copy here.

Overall for $15 these appear to be great bulbs on the surface. They feel heavy and seem to be made from quality material. I primarily bought them to use in some new exterior ligh fixtures that are going in and they are very shallow meaning the bulb needs to be short. While Hue bulbs are a bit shorter overall, the light emits from the bottom of the Hue so a Hue bulb looked ugly in the fixture. The GE bulbs are a tiny bit longer but it’s mainly the glass to keep the bulb rounded. The actual LEDs where light emits from is 1-2in higher. Now instead of light flooding out the bottom of my fixture it can only be seen through the glass surrounding the fixture which looks much more clean. I’ll have a better idea tonight if I like the color temperature but at first glance it looks great. I know Philips just released the Hue lux but the price point is still double the GE @ $30 vs $15. I think the GE has potential to be the new go-to bulb for simple applications as it’s priced very well.

1 Like

@cmonroe thanks that straighten up my GE bulbs and they are working correctly dimming etc. I would be interested in the device handler.

Hey guys,

Give this a try as a device handler for the GE Link bulbs. There are still a couple of issues with it remembering the dimmer level between on/off cycles but works other than that. Improvements and/or fixes appreciated :smile:

/**
 *  ZigBee GE Link Bulb
 *
 *  Copyright 2014 Chad Monroe
 *
 *  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.
 *
 *  capabilities:
 *    actuator
 *    configuration
 *    polling
 *    pefresh
 *    sensor
 *    switch
 *    switch level
 */
metadata 
{
	definition( name: "ZigBee GE Link Bulb", namespace: "cmonroe", author: "Chad Monroe" ) 
	{
		capability "Switch Level"
		capability "Actuator"
		capability "Switch"
		capability "Configuration"
		capability "Polling"
		capability "Refresh"
		capability "Sensor"

		fingerprint( profileId: "0104", inClusters: "0000,0003,0004,0005,0006,0008,1000", 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"
	}

	/* ui tile definitions */
	tiles 
	{
		standardTile( "switch", "device.switch", width: 2, height: 2, canChangeIcon: true ) 
		{
			state "off", label: '${name}', action: "switch.on", icon: "st.Lighting.light13", backgroundColor: "#ffffff"
			state "on", label: '${name}', action: "switch.off", icon: "st.Lighting.light11", backgroundColor: "#79b821"
		}
		
		standardTile( "refresh", "device.switch", inactiveLabel: false, decoration: "flat" ) 
		{
			state "default", label:"", action:"refresh.refresh", icon:"st.secondary.refresh"
		}
		
		controlTile( "levelSliderControl", "device.level", "slider", height: 1, width: 3, inactiveLabel: false ) 
		{
			state "level", action: "switch level.setLevel"
		}
		
		valueTile( "level", "device.level", inactiveLabel: false, decoration: "flat" ) 
		{
			state "level", label:'${currentValue} %', unit:"%", backgroundColor:"#ffffff"
		}

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

/* parse incoming device messages to generate events */
def parse(String description) 
{
	/* log.trace description */
	if ( description?.startsWith("catchall:") ) 
	{
		def msg = zigbee.parse(description)
		log.trace "catchall"
		log.trace msg
		log.trace "data: $msg.data"
	}
	else 
	{
		def name = description?.startsWith( "on/off: " ) ? "switch" : null
		def value = name == "switch" ? ( description?.endsWith( " 1" ) ? "on" : "off" ) : null
		def result = createEvent( name: name, value: value )
		
		log.debug "parse returned ${result?.descriptionText}"
		return result
	}
}

def on() 
{
	def cmds = []
    def level = device.latestValue( "level" ) as Integer ?: 0
	
    log.trace "on(): lastLevel=${level}"

    if ( ( level > 0 ) && ( level < 100 ) )
    {
    	def levelHex = new BigInteger( Math.round( level * 255 / 100 ).toString()).toString( 16 )

    	log.trace "on(): lastLevel=${level} valid, restoring to level=${levelHex}"

		sendEvent( name: "level", value: level )
		sendEvent( name: "switch.setLevel", value: level )

    	//cmds << "st cmd 0x${device.deviceNetworkId} ${endpointId} 6 1 {}"
		cmds << "st cmd 0x${device.deviceNetworkId} ${endpointId} 8 4 {${levelHex} 0000}"
	}
	else
	{
		sendEvent( name: "level", value: 99 )
		sendEvent( name: "switch.setLevel", value: 99 )

		cmds << "st cmd 0x${device.deviceNetworkId} ${endpointId} 6 1 {}"
	}

	log.debug "on(): zigbee cmds: ${cmds}"
	cmds
}

def off() 
{
	def cmds = []
	
	log.trace "off()"
	
	sendEvent( name: "switch", value: "off" )

	cmds << "st cmd 0x${device.deviceNetworkId} ${endpointId} 6 0 {}"
	
	log.debug "off(): zigbee cmds: ${cmds}"
	cmds
}

def refresh() 
{
	def cmds = []
    
	log.trace "refresh()"
	
	cmds << "st rattr 0x${device.deviceNetworkId} 1 6 0"
    
    log.debug "refresh(): zigbee cmds: ${cmds}"
	cmds
}

def poll()
{
	log.debug "poll(): calling refresh()"
	refresh()
}

def setLevel(value) 
{
	def cmds = []
	def level = value as Integer

	log.trace "setLevel($level)"

	if ( value == 0 ) 
	{
		sendEvent( name: "switch", value: "off" )

		cmds << "st cmd 0x${device.deviceNetworkId} ${endpointId} 6 0 {}"
	}
	else if ( device.latestValue( "switch" ) == "off" ) 
	{
		sendEvent( name: "switch", value: "on" )
		sendEvent( name: "level", value: level )
		sendEvent( name: "switch.setLevel", value: level )
	}
	
	def levelHex = new BigInteger( Math.round( level * 255 / 100 ).toString()).toString( 16 )
	cmds << "st cmd 0x${device.deviceNetworkId} ${endpointId} 8 4 {${levelHex} 0000}"

	log.debug "setLevel(): zigbee cmds: ${cmds}"
	cmds
}

private hex(value, width=2) 
{
	def s = new BigInteger(Math.round(value).toString()).toString(16)
	
	while ( s.size() < width ) 
	{
		s = "0" + s
	}
    
	s
}

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

@cmonroe Thanks the device works good and I didn’t notice the dimmer seems ok. Thanks

There is a post on the Home Depot site indicating that this bulb won’t work with Wink hub until Sept 3. It is interesting that SmartThings platform works with it before its native platform.

I tried picking this up at my local Home Depot and they were clueless to availability though the web site said there are five.

The site should tell you what aisle and bay they’re in. In my case, it indicated there were 5 in aisle 0, bay 1. There were 4 on the very top shelf (almost unreachable), and 2 more on an endcap were Hue and Wink was.

@beckwith wink has already updated there hub so that the GE bulbs will work. Home Depot has a sale on that if you buy two wink branded items you can get the hub for .99 so I did it and it’s not on the same par as Smartthings. 99 cents couldn’t go wrong. Just wanted to see what it would do and i’m not impressed.

@scottinpollock

Here is what it says now:

“Visit or call your local Home Depot store to confirm availability.
Item must be purchased in store”

@llcanada

Where do I find this deal?

Off to Home Depot. I’ll buy them out of the 5 the website says they have…

I have already brought two bulbs and I like it better with the Smartthings hub. When you go to the Home Depot at the register that have the bar codes just tell the cashier and they will give you a 49.00 discount I got it by buying two GE link bulbs.

I just bought 2 bulbs and got the wink hub free too. Only 1 bulb left at my store, sorry for the next guy!

now lets see if it pairs to ST

Bought all 6 bulbs the maple Grove mn store had. Didn’t bother with the wink hub.

Hmmmm, getting this error after pairing the 2nd bulb:

groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method java.math.BigInteger#. Cannot resolve which method to invoke for [null, class java.lang.Integer] due to overlapping prototypes between: [class [I, int] [class [B, int] [class java.lang.String, int] @ line 177

I had this same thing with my control4 dimmer. Seems something to do getting the endpointId

Anyone with any thoughts?

Anyone notice the packaging? For help go to www.gelinkbulbs.com and that doesn’t even have a site on it?

Zero docs in the box, no idea how to unpair and repair?

Based on @cmonroe initial code, I fixed the fingerprint so they pair to this devicetype…

Also put in a git repo so the world can access.

FYI, unpairing is simple, just delete from app or IDE and power cycle the bulb and re-pair.

https://github.com/pstuart/smartthings/blob/master/GE%20Link%20Bulb.groovy

1 Like

I love these cheap zigbee bulbs… A couple of “flaws” but no idea how to get around them…

If the bulbs lose power then regain power, they automatically turn on, so they have no knowledge of their last state, they turn on to 100%

There doesn’t seem to be any type of broadcast on power up to intercept either. Other then this:

2a775e86-76af-4c80-9d28-28519e8e5f64
2:48:01 PM:
trace
cp desc: ps_GE Link Bulb updated

2a775e86-76af-4c80-9d28-28519e8e5f64
2:48:01 PM:
trace
cp desc: desc: 01 0104 0101 02 07 0000 0003 0004 0005 0006 0008 1000 01 0019

But this was traced in my sonos connect app? WTF?

So it appears on power up these bulbs issue a join but the hub doesn’t know what to do with it.

I think there needs to be some sort of refresh or poll to get their status so when you open things, they show the right status… For whatever reason that is out of sync.

Mine seemed to pair and map to the driver just fine with the fingerprint in my original post. It looks like the only change you made was the addition of the endpointId set to 1 which from my understanding was the default so no need to set; also no need to expose the getClusters command.

Regarding power on after power failure this is somewhat an annoyance and somewhat a feature. All Philips Hue bulbs behave the exact same way. It’s nice in some ways because you can flip a switch at night and have the lights come on, but sucks to come home after a power outage with all lights on.

There is a working refresh method in the original code I posted, I think we just need to update the device driver to store the last state and poll on an interval (5, 10, whatever minutes). As long as you are OK with the hub being the “master” it can easily then poll for state and on detection of state change (e.g. on when it really should be off) it’d be very simple to send the off command when an event like this occurs which I think would be ideal. I never investigated this with Hue but assume it could be easily done in the Hue integration layer as well. Maybe add a check box in the config/preferences for each bulb that specifies what to do when a state mismatch is detected; I assume some prefer the existing behavior while others would prefer their ST hub detect lights turned on due to power loss and turn them off.