[RELEASE] H801 & Other ESP8266 Based RGBW Controllers (SmartLife)

This has been out in the community for a while, but I'm posting this as the official source for information regarding my RGBW firmware, App, Drivers, etc.

Firmware
https://raw.githubusercontent.com/erocm123/SmartThingsPublic/master/devicetypes/erocm123/smartlife-rgbw-controller.src/SmartLifeRGBWController.ino.generic.bin

App
Used to discover devices that have been joined to your Wifi network and to create user defined "programs". Programs give you the ability to flash and fade the RGBW colors in patterns and sequences to make some entertaining light shows.

https://github.com/erocm123/Hubitat/blob/master/Apps/smartlife-rgbw-light-connect.src/smartlife-rgbw-light-connect.groovy

Driver
This is the driver that interacts with the RGBW controller. It is what allows you to turn the LEDs on / off, dim them, change their color, or start a program.

https://github.com/erocm123/Hubitat/blob/master/Drivers/smartlife-rgbw-controller.src/smartlife-rgbw-controller.groovy

Child Drivers
Install these to be able to create child devices that can be used by other apps to start your LED programs or easily change the individual device channels.

Channel child device
https://github.com/erocm123/Hubitat/blob/master/Drivers/switch-level-child-device.src/switch-level-child-device.groovy

Program child device
https://github.com/erocm123/Hubitat/blob/master/Drivers/switch-child-device.src/switch-child-device.groovy

There is more info that I will be posting later.

6 Likes

I have made it so you can choose which child devices you want enabled. If you enable one and then later disable it, the driver will try to delete the device. If it is in use by an app it will probably fail and you will have to delete it manually.

5 Likes

Thanks @ericm for getting this modification out so quickly. Worked out great for me in my Kitchen Cabinet lighting. :smiley: This allowed me to delete the Virtual Device Sync app.

Really like the ability to choose which child's I want to enable or delete the child devices by just unselecting them within the parent driver. This also made it easy for me to rename all the children by unselecting them (delete's them) , change the name of the parent the way I liked it then recreating the children which they all then took on the new modified name.

1 Like

@ericm Did you catch this post in a different thread?

@dcoffing I didn't see that, but I'll take a look. Is the same thing happening to you?

I'll check again. It wasn't a problem with me because I trigger all the child devices via wall switch that is already is Alexa setup plus has a rule to switch my child devices on.

I thought part of the issue could be is when Alexa looks to see the new devices created. I tried the typical "Alexa, discover" and 20 seconds later it says "I couldn't find any new smart home devices"

Update: I do not see the devices created in Alexa either the parent or the child. Let me run this is issue where it belongs over in the Alexa integration.

I think the problem is the guy may have been like me, He needed to open the Amazon Echo Skill and manually select the new device's to be available to Amazon Echo?

I've been using this app on ST for a while so was excited to see it here as I begin trying to port over my stuff. One question with respect to discovery - when I try to discover my controller 0 devices are found. I use the same discovery on the ST version of the app which discovers the H801 no prob. Does discovery work for others here or does everybody just manually configure the IP address (which I did, and that works.)

I ask not so much about this app (manual config workaround is fine) but I have another important app I use on ST that uses the same discovery method (and also fails.)

Works for me. Takes a bit to scan but should work.

Like @aaron mentions, it seems that compared to ST discovery on HE it seems to take a few seconds longer to find all the devices so just after it starts the discovery just give it a max 5 minute window to find everything.

Just to be sure here are some reminders about H801 firmware operational tips if you need to do a manual reset (like I did because I changed routers DHCP server. My devices were not on the same WiFi network after my router change.)

Modified instructions from post #194 by erocm1231

The firmware has two methods of accomplishing a factory reset.

Method 1.) This method requires you to cycle power on the H801. The H801’s green terminal blocks can be easily unplugged from the H801 while leaving any field wiring intact. So this is an easy way to cycle the H801 power by unplugging the green terminal block where your 12v power is connected. . Unplug controller and plug back in. Within 2 - 5 seconds after plugging in, unplug and plug back in. Repeat this process 4 times. You can know you are doing it correctly because on the second plug in the LED Strip will light up GREEN, the third it will light up BLUE, and the fourth it will light up RED. After it turns RED, you can just leave it alone. The H801 GREEN LED2 will remain on and RED LED1 will slowly blink 5 times as the storage is being wiped. After the 5 flashes, the H801 will reboot and begin broadcasting as a local AP with espRGBW.[mac address]

Method 2) After the device is turned on, jump J3 for
a) between 10-20 seconds will reset the WiFi . If you reset the wifi correctly the little H801 RED LED1 will blink 3 times quickly.
b) between 20-60 seconds will reset everything. If you reset all the device settings correctly the little H801 RED LED1 will blink 5 times slowly. After the 5 flashes, the H801 reboots and may ask for a password; use "configme"
https://youtu.be/XmD8di-gkgg

Yeah, as mentioned, it takes a few minutes. I'm not sure if the page refresh is working anymore (it used to). Last time I had to wait a few minutes and then manually refresh the page. They all have shown up for me though.

1 Like

@ericm

Hey Eric - latest update causes errors with Smartlife devices.

@mike.maxwell - any idea what changed in 2.0.6->2.0.7 for this to stop working?

 5392019-03-18 07:30:18.961 pm errororg.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
General error during canonicalization: Expression [DeclarationExpression] is not allowed: (c = s.charAt(i)) at line number: 967

java.lang.SecurityException: Expression [DeclarationExpression] is not allowed: (c = s.charAt(i)) at line number: 967
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
	at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77)
	at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247)
	at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.assertExpressionAuthorized(SecureASTCustomizerHub.groovy:641)
	at sun.reflect.GeneratedMethodAccessor434.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitDeclarationExpression(SecureASTCustomizerHub.groovy:976)
	at org.codehaus.groovy.ast.expr.DeclarationExpression.visit(DeclarationExpression.java:89)
	at org.codehaus.groovy.ast.expr.DeclarationExpression$visit.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	at org.codehaus.groovy.ast.expr.MethodCallExpression$visit.call(Unknown Source)
	at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitExpressionStatement(SecureASTCustomizerHub.groovy:728)
	at org.codehaus.groovy.ast.stmt.ExpressionStatement.visit(ExpressionStatement.java:42)
	at org.codehaus.groovy.ast.stmt.ExpressionStatement$visit.call(Unknown Source)
	at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitBlockStatement(SecureASTCustomizerHub.groovy:688)
	at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
	at org.codehaus.groovy.ast.stmt.BlockStatement$visit.call(Unknown Source)
	at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitForLoop(SecureASTCustomizerHub.groovy:696)
	at org.codehaus.groovy.ast.stmt.ForStatement.visit(ForStatement.java:49)
	at org.codehaus.groovy.ast.stmt.ForStatement$visit.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	at org.codehaus.groovy.ast.stmt.ExpressionStatement$visit.call(Unknown Source)
	at com.hubitat.hub.executor.SecureASTCustomizerHub$SecuringCodeVisitor.visitBlockStatement(SecureASTCustomizerHub.groovy:688)
	at org.codehaus.groovy.ast.stmt.BlockStatement.visit(BlockStatement.java:71)
	at org.codehaus.groovy.ast.stmt.BlockStatement$visit.call(Unknown Source)
	at com.hubitat.hub.executor.SecureASTCustomizerHub.call(SecureASTCustomizerHub.groovy:518)
	at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1065)
	at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:603)
	at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:581)
	at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:558)
	at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
	at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
	at groovy.lang.GroovyClassLoader$parseClass$1.call(Unknown Source)
	at com.hubitat.hub.executor.ExecutorHelper.parseDevClass(ExecutorHelper.groovy:274)
	at sun.reflect.GeneratedMethodAccessor858.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)
	at com.hubitat.hub.executor.ExecutorHelper.loadDriverClass(ExecutorHelper.groovy:322)
	at com.hubitat.hub.executor.ExecutorHelper.getCachedDeviceClass(ExecutorHelper.groovy:302)
	at sun.reflect.GeneratedMethodAccessor520.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at com.hubitat.hub.executor.ExecutorHelper.getDeviceExecutorScript(ExecutorHelper.groovy:247)
	at com.hubitat.hub.executor.ExecutorHelper$getDeviceExecutorScript$0.call(Unknown Source)
	at com.hubitat.handler.BaseDeviceHandler.getDeviceExecutor(BaseDeviceHandler.groovy:355)
	at sun.reflect.GeneratedMethodAccessor531.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at com.hubitat.handler.BaseDeviceHandler.runDeviceMethod(BaseDeviceHandler.groovy:133)
	at com.hubitat.handler.BaseDeviceHandler$runDeviceMethod.call(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
	at com.hubitat.handler.BaseDeviceHandler$runDeviceMethod.call(Unknown Source)
	at com.hubitat.app.DeviceWrapper.methodMissing(DeviceWrapper.groovy:64)
	at com.hubitat.app.DeviceWrapper$methodMissing$2.call(Unknown Source)
	at com.hubitat.app.DeviceWrapperList$_methodMissing_closure2.doCall(DeviceWrapperList.groovy:19)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
	at groovy.lang.Closure.call(Closure.java:414)
	at groovy.lang.Closure.call(Closure.java:430)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2030)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2015)
	at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2056)
	at org.codehaus.groovy.runtime.dgm$162.invoke(Unknown Source)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoMetaMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:251)
	at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
	at com.hubitat.app.DeviceWrapperList.methodMissing(DeviceWrapperList.groovy:18)
	at sun.reflect.GeneratedMethodAccessor2362.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaClassImpl.invokeMissingMethod(MetaClassImpl.java:944)
	at groovy.lang.MetaClassImpl.invokePropertyOrMissing(MetaClassImpl.java:1267)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1220)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callSafe(AbstractCallSite.java:80)
	at ruleApp25.switchModes(ruleApp25.groovy:3800)
	at ruleApp25$switchModes$17.callCurrent(Unknown Source)
	at ruleApp25.takeAction(ruleApp25.groovy:4311)
	at ruleApp25$takeAction$7.callCurrent(Unknown Source)
	at ruleApp25.runRule(ruleApp25.groovy:4386)
	at ruleApp25$runRule.callCurrent(Unknown Source)
	at ruleApp25.allHandler(ruleApp25.groovy:4455)
	at sun.reflect.GeneratedMethodAccessor3682.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1218)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:817)
	at groovy.lang.GroovyObjectSupport.invokeMethod(GroovyObjectSupport.java:46)
	at groovy.lang.Script.invokeMethod(Script.java:80)
	at groovy.util.DelegatingScript.invokeMethod(DelegatingScript.java:116)
	at groovy.lang.GroovyObject$invokeMethod$5.call(Unknown Source)
	at com.hubitat.handler.AppHandler.runAppMethod(AppHandler.groovy:45)
	at com.hubitat.handler.AppHandler$runAppMethod.call(Unknown Source)
	at com.hubitat.hub.controller.EventController$EventProcessThread$2.run(EventController.groovy:404)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

@aaron Seems to be a problem with this line:

char c = s.charAt(i);

You can actually delete the entire toAscii method. It isn't being used anymore. Open the code and delete these lines:

def toAscii(s){
        StringBuilder sb = new StringBuilder();
        String ascString = null;
        long asciiInt;
                for (int i = 0; i < s.length(); i++){
                    sb.append((int)s.charAt(i));
                    sb.append("|");
                    char c = s.charAt(i);
                }
                ascString = sb.toString();
                asciiInt = Long.parseLong(ascString);
                return asciiInt;
}
1 Like

Thanks, that got my strips working again from Hubitat.

1 Like

Got an interesting loss of communication with HE? Everything was working great for months then after my last HE update and I also rebooted my router, I lost all my automation with H801 RGBW Controllers.

I can control all my H801 directly with the IP address, I can do a scan and the scan sees all the devices already exist in HE yet I can't control any of them through the devices individually, yet I can control them all from a browser window using the IP address that is in HE? Help please on getting these to "talk" again. FYI: the router has reserved IP's for all these devices.

Hi @dcoffing, a couple posts up is the solution. Or you can grab the latest driver from github.

1 Like

Thanks! I did the update and everything is working again.

So I see the Smart app has been changed a little as well. So I reloaded it too in the Apps Code.

But what do I do now to update the App itself running in HE? Do I have to delete the existing app and then do another "Add User App" to complete the update for the app? Or does it act similar like the driver code update where the Devices know to reference the latest code?

You just copy the app code from github and paste it over top of the old code and hit save. Nothing else to do other than that.

1 Like

Great Job Eric, Thank you.
Note to self-don't try to load stuff after midnight, you'll do silly things

1 Like

Hi Eric,

I have a couple of Smartlife compatible GU10 RGB lights which I believe I should be able to connect to. The scanner can't find them on my network so I decided to try and find their IP address and enter them manually. From within the Smartlife app I can see that their IP Address is an address which is not in my internal home network format - 81.159.###.### instead of 192.168.###.###.

Can you advise how I can connect please.

I also have some Smartlife Switches and Dimmer Switches. Do you know of any apps which facilitate the connection of these to HE?

1 Like