[OBSOLETE] LutronPro Caseta v1.0

fwiw, I just tried setting up the “Advanced Button Controller” smartapp to try this:
With the node server set to repeat-on-hold for the Pico (5:true)
With the ABC smartapp set to decrease 5% brightness of a particular lamp for every “held” of that Pico’s button 5 (v down)

That’s pretty much what it does: when I hold that button, it drops the selected lamp’s brightness by 5% every time the node server reports “interval ran”, every 1/3 of a second. Well, almost – it seems to repeat a level once in a while, like 75, 70, 65, 60, 60, 55, 50, 45… probably when the updated Lutron current brightness report doesn’t get back to the SmartThings notion of that lamp before the next “interval ran” tick. So the round trip is sometimes longer than the held-tick interval. (Guessing!)

Anyway, the brightness does decline monotonically, without flashing the light off or full on or anything weird like that. That said, my ST lashup is very lightly loaded, so if there are timing problems a busier system might exacerbate them.

Again, this is with the Advanced Button Controller smartapp, so the interactions with another smartapp might be different. Just one data point for you.

I think Lutron just broke this app for the bridge 2. I was messing with it to get my Pico to control other stuff. I was setting my Lutron hub IP to a static address and rebooted the thing and I think it installed an update. Everything seems to connect just fine, but I don’t see button presses on the remote in the console and no events are logged. Connecting it through the Lutron app to my blinds works just fine and I did see events from earlier in the day when I looked at my Pico in ST.

node runNodeServer.js
Listening on port 5000…
appCert exists! YEAH!!
192.168.10.51
connected at 1517157516469
data in listenSSL
Buffered data is proper json
{“CommuniqueType”:“ReadResponse”,“Header”:{“MessageBodyType”:“MultipleDeviceDefinition”,“StatusCode”:“200 OK”,“Url”:"/device"},“Body”:{“Devices”:[{“href”:"/device/1",“Name”:“Smart Bridge”,“FullyQualifiedName”:[“Smart Bridge”],“Parent”:{“href”:"/project"},“SerialNumber”:32513757,“ModelNumber”:“L-BDG2-WH”,“DeviceType”:“SmartBridge”,“RepeaterProperties”:{“IsRepeater”:true}},{“href”:"/device/2",“Name”:“Living Room South 2”,“FullyQualifiedName”:[“Living Room South 2”],“Parent”:{“href”:"/project"},“SerialNumber”:29543828,“ModelNumber”:“CSX-YJ-XX”,“DeviceType”:“SerenaHoneycombShade”,“LocalZones”:[{“href”:"/zone/1"}]},{“href”:"/device/3",“Name”:“Lights”,“FullyQualifiedName”:[“Back Patio”,“Lights”],“Parent”:{“href”:"/project"},“SerialNumber”:30900151,“ModelNumber”:“PJ2-3BRL-GXX-X01”,“DeviceType”:“Pico3ButtonRaiseLower”,“ButtonGroups”:[{“href”:"/buttongroup/2"}],“AssociatedArea”:{“href”:"/area/3"}}]}}

Leap Data was recieved and sent to parser
false
data in listenSSL
json not valid, probably don’t have it all yet
[SyntaxError: Unexpected end of input]
data in listenSSL
json not valid, probably don’t have it all yet
[SyntaxError: Unexpected token P]
data in listenSSL
json not valid, probably don’t have it all yet
[SyntaxError: Unexpected token P]
data in listenSSL
json not valid, probably don’t have it all yet
[SyntaxError: Unexpected end of input]
data in listenSSL
Buffered data is proper json
{“CommuniqueType”:“ReadResponse”,“Header”:{“MessageBodyType”:“MultipleVirtualButtonDefinition”,“StatusCode”:“200 OK”,“Url”:"/virtualbutton"},“Body”:{“VirtualButtons”:[{“href”:"/virtualbutton/1",“Name”:“Arriving Home”,“ButtonNumber”:0,“ProgrammingModel”:{“href”:"/programmingmodel/1"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/2",“Name”:“Leaving Home”,“ButtonNumber”:1,“ProgrammingModel”:{“href”:"/programmingmodel/2"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/3",“Name”:“Button 3”,“ButtonNumber”:2,“ProgrammingModel”:{“href”:"/programmingmodel/3"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/4",“Name”:“Button 4”,“ButtonNumber”:3,“ProgrammingModel”:{“href”:"/programmingmodel/4"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/5",“Name”:“Button 5”,“ButtonNumber”:4,“ProgrammingModel”:{“href”:"/programmingmodel/5"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/6",“Name”:“Button 6”,“ButtonNumber”:5,“ProgrammingModel”:{“href”:"/programmingmodel/6"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/7",“Name”:“Button 7”,“ButtonNumber”:6,“ProgrammingModel”:{“href”:"/programmingmodel/7"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/8",“Name”:“Button 8”,“ButtonNumber”:7,“ProgrammingModel”:{“href”:"/programmingmodel/8"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/9",“Name”:“Button 9”,“ButtonNumber”:8,“ProgrammingModel”:{“href”:"/programmingmodel/9"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/10",“Name”:“Button 10”,“ButtonNumber”:9,“ProgrammingModel”:{“href”:"/programmingmodel/10"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/11",“Name”:“Button 11”,“ButtonNumber”:10,“ProgrammingModel”:{“href”:"/programmingmodel/11"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/12",“Name”:“Button 12”,“ButtonNumber”:11,“ProgrammingModel”:{“href”:"/programmingmodel/12"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/13",“Name”:“Button 13”,“ButtonNumber”:12,“ProgrammingModel”:{“href”:"/programmingmodel/13"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/14",“Name”:“Button 14”,“ButtonNumber”:13,“ProgrammingModel”:{“href”:"/programmingmodel/14"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/15",“Name”:“Button 15”,“ButtonNumber”:14,“ProgrammingModel”:{“href”:"/programmingmodel/15"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/16",“Name”:“Button 16”,“ButtonNumber”:15,“ProgrammingModel”:{“href”:"/programmingmodel/16"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/17",“Name”:“Button 17”,“ButtonNumber”:16,“ProgrammingModel”:{“href”:"/programmingmodel/17"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/18",“Name”:“Button 18”,“ButtonNumber”:17,“ProgrammingModel”:{“href”:"/programmingmodel/18"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/19",“Name”:“Button 19”,“ButtonNumber”:18,“ProgrammingModel”:{“href”:"/programmingmodel/19"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/20",“Name”:“Button 20”,“ButtonNumber”:19,“ProgrammingModel”:{“href”:"/programmingmodel/20"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/21",“Name”:“Button 21”,“ButtonNumber”:20,“ProgrammingModel”:{“href”:"/programmingmodel/21"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/22",“Name”:“Button 22”,“ButtonNumber”:21,“ProgrammingModel”:{“href”:"/programmingmodel/22"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/23",“Name”:“Button 23”,“ButtonNumber”:22,“ProgrammingModel”:{“href”:"/programmingmodel/23"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/24",“Name”:“Button 24”,“ButtonNumber”:23,“ProgrammingModel”:{“href”:"/programmingmodel/24"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/25",“Name”:“Button 25”,“ButtonNumber”:24,“ProgrammingModel”:{“href”:"/programmingmodel/25"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/26",“Name”:“Button 26”,“ButtonNumber”:25,“ProgrammingModel”:{“href”:"/programmingmodel/26"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/27",“Name”:“Button 27”,“ButtonNumber”:26,“ProgrammingModel”:{“href”:"/programmingmodel/27"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/28",“Name”:“Button 28”,“ButtonNumber”:27,“ProgrammingModel”:{“href”:"/programmingmodel/28"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/29",“Name”:“Button 29”,“ButtonNumber”:28,“ProgrammingModel”:{“href”:"/programmingmodel/29"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/30",“Name”:“Button 30”,“ButtonNumber”:29,“ProgrammingModel”:{“href”:"/programmingmodel/30"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/31",“Name”:“Button 31”,“ButtonNumber”:30,“ProgrammingModel”:{“href”:"/programmingmodel/31"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/32",“Name”:“Button 32”,“ButtonNumber”:31,“ProgrammingModel”:{“href”:"/programmingmodel/32"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/33",“Name”:“Button 33”,“ButtonNumber”:32,“ProgrammingModel”:{“href”:"/programmingmodel/33"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/34",“Name”:“Button 34”,“ButtonNumber”:33,“ProgrammingModel”:{“href”:"/programmingmodel/34"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/35",“Name”:“Button 35”,“ButtonNumber”:34,“ProgrammingModel”:{“href”:"/programmingmodel/35"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/36",“Name”:“Button 36”,“ButtonNumber”:35,“ProgrammingModel”:{“href”:"/programmingmodel/36"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/37",“Name”:“Button 37”,“ButtonNumber”:36,“ProgrammingModel”:{“href”:"/programmingmodel/37"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/38",“Name”:“Button 38”,“ButtonNumber”:37,“ProgrammingModel”:{“href”:"/programmingmodel/38"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/39",“Name”:“Button 39”,“ButtonNumber”:38,“ProgrammingModel”:{“href”:"/programmingmodel/39"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/40",“Name”:“Button 40”,“ButtonNumber”:39,“ProgrammingModel”:{“href”:"/programmingmodel/40"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/41",“Name”:“Button 41”,“ButtonNumber”:40,“ProgrammingModel”:{“href”:"/programmingmodel/41"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/42",“Name”:“Button 42”,“ButtonNumber”:41,“ProgrammingModel”:{“href”:"/programmingmodel/42"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/43",“Name”:“Button 43”,“ButtonNumber”:42,“ProgrammingModel”:{“href”:"/programmingmodel/43"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/44",“Name”:“Button 44”,“ButtonNumber”:43,“ProgrammingModel”:{“href”:"/programmingmodel/44"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/45",“Name”:“Button 45”,“ButtonNumber”:44,“ProgrammingModel”:{“href”:"/programmingmodel/45"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/46",“Name”:“Button 46”,“ButtonNumber”:45,“ProgrammingModel”:{“href”:"/programmingmodel/46"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/47",“Name”:“Button 47”,“ButtonNumber”:46,“ProgrammingModel”:{“href”:"/programmingmodel/47"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/48",“Name”:“Button 48”,“ButtonNumber”:47,“ProgrammingModel”:{“href”:"/programmingmodel/48"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/49",“Name”:“Button 49”,“ButtonNumber”:48,“ProgrammingModel”:{“href”:"/programmingmodel/49"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/50",“Name”:“Button 50”,“ButtonNumber”:49,“ProgrammingModel”:{“href”:"/programmingmodel/50"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/51",“Name”:“Button 51”,“ButtonNumber”:50,“ProgrammingModel”:{“href”:"/programmingmodel/51"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/52",“Name”:“Button 52”,“ButtonNumber”:51,“ProgrammingModel”:{“href”:"/programmingmodel/52"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/53",“Name”:“Button 53”,“ButtonNumber”:52,“ProgrammingModel”:{“href”:"/programmingmodel/53"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/54",“Name”:“Button 54”,“ButtonNumber”:53,“ProgrammingModel”:{“href”:"/programmingmodel/54"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/55",“Name”:“Button 55”,“ButtonNumber”:54,“ProgrammingModel”:{“href”:"/programmingmodel/55"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/56",“Name”:“Button 56”,“ButtonNumber”:55,“ProgrammingModel”:{“href”:"/programmingmodel/56"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/57",“Name”:“Button 57”,“ButtonNumber”:56,“ProgrammingModel”:{“href”:"/programmingmodel/57"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/58",“Name”:“Button 58”,“ButtonNumber”:57,“ProgrammingModel”:{“href”:"/programmingmodel/58"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/59",“Name”:“Button 59”,“ButtonNumber”:58,“ProgrammingModel”:{“href”:"/programmingmodel/59"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/60",“Name”:“Button 60”,“ButtonNumber”:59,“ProgrammingModel”:{“href”:"/programmingmodel/60"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/61",“Name”:“Button 61”,“ButtonNumber”:60,“ProgrammingModel”:{“href”:"/programmingmodel/61"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/62",“Name”:“Button 62”,“ButtonNumber”:61,“ProgrammingModel”:{“href”:"/programmingmodel/62"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/63",“Name”:“Button 63”,“ButtonNumber”:62,“ProgrammingModel”:{“href”:"/programmingmodel/63"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/64",“Name”:“Button 64”,“ButtonNumber”:63,“ProgrammingModel”:{“href”:"/programmingmodel/64"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/65",“Name”:“Button 65”,“ButtonNumber”:64,“ProgrammingModel”:{“href”:"/programmingmodel/65"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/66",“Name”:“Button 66”,“ButtonNumber”:65,“ProgrammingModel”:{“href”:"/programmingmodel/66"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/67",“Name”:“Button 67”,“ButtonNumber”:66,“ProgrammingModel”:{“href”:"/programmingmodel/67"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/68",“Name”:“Button 68”,“ButtonNumber”:67,“ProgrammingModel”:{“href”:"/programmingmodel/68"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/69",“Name”:“Button 69”,“ButtonNumber”:68,“ProgrammingModel”:{“href”:"/programmingmodel/69"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/70",“Name”:“Button 70”,“ButtonNumber”:69,“ProgrammingModel”:{“href”:"/programmingmodel/70"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/71",“Name”:“Button 71”,“ButtonNumber”:70,“ProgrammingModel”:{“href”:"/programmingmodel/71"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/72",“Name”:“Button 72”,“ButtonNumber”:71,“ProgrammingModel”:{“href”:"/programmingmodel/72"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/73",“Name”:“Button 73”,“ButtonNumber”:72,“ProgrammingModel”:{“href”:"/programmingmodel/73"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/74",“Name”:“Button 74”,“ButtonNumber”:73,“ProgrammingModel”:{“href”:"/programmingmodel/74"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/75",“Name”:“Button 75”,“ButtonNumber”:74,“ProgrammingModel”:{“href”:"/programmingmodel/75"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/76",“Name”:“Button 76”,“ButtonNumber”:75,“ProgrammingModel”:{“href”:"/programmingmodel/76"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/77",“Name”:“Button 77”,“ButtonNumber”:76,“ProgrammingModel”:{“href”:"/programmingmodel/77"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/78",“Name”:“Button 78”,“ButtonNumber”:77,“ProgrammingModel”:{“href”:"/programmingmodel/78"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/79",“Name”:“Button 79”,“ButtonNumber”:78,“ProgrammingModel”:{“href”:"/programmingmodel/79"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/80",“Name”:“Button 80”,“ButtonNumber”:79,“ProgrammingModel”:{“href”:"/programmingmodel/80"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/81",“Name”:“Button 81”,“ButtonNumber”:80,“ProgrammingModel”:{“href”:"/programmingmodel/81"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/82",“Name”:“Button 82”,“ButtonNumber”:81,“ProgrammingModel”:{“href”:"/programmingmodel/82"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/83",“Name”:“Button 83”,“ButtonNumber”:82,“ProgrammingModel”:{“href”:"/programmingmodel/83"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/84",“Name”:“Button 84”,“ButtonNumber”:83,“ProgrammingModel”:{“href”:"/programmingmodel/84"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/85",“Name”:“Button 85”,“ButtonNumber”:84,“ProgrammingModel”:{“href”:"/programmingmodel/85"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/86",“Name”:“Button 86”,“ButtonNumber”:85,“ProgrammingModel”:{“href”:"/programmingmodel/86"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/87",“Name”:“Button 87”,“ButtonNumber”:86,“ProgrammingModel”:{“href”:"/programmingmodel/87"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/88",“Name”:“Button 88”,“ButtonNumber”:87,“ProgrammingModel”:{“href”:"/programmingmodel/88"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/89",“Name”:“Button 89”,“ButtonNumber”:88,“ProgrammingModel”:{“href”:"/programmingmodel/89"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/90",“Name”:“Button 90”,“ButtonNumber”:89,“ProgrammingModel”:{“href”:"/programmingmodel/90"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/91",“Name”:“Button 91”,“ButtonNumber”:90,“ProgrammingModel”:{“href”:"/programmingmodel/91"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/92",“Name”:“Button 92”,“ButtonNumber”:91,“ProgrammingModel”:{“href”:"/programmingmodel/92"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/93",“Name”:“Button 93”,“ButtonNumber”:92,“ProgrammingModel”:{“href”:"/programmingmodel/93"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/94",“Name”:“Button 94”,“ButtonNumber”:93,“ProgrammingModel”:{“href”:"/programmingmodel/94"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/95",“Name”:“Button 95”,“ButtonNumber”:94,“ProgrammingModel”:{“href”:"/programmingmodel/95"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/96",“Name”:“Button 96”,“ButtonNumber”:95,“ProgrammingModel”:{“href”:"/programmingmodel/96"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/97",“Name”:“Button 97”,“ButtonNumber”:96,“ProgrammingModel”:{“href”:"/programmingmodel/97"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/98",“Name”:“Button 98”,“ButtonNumber”:97,“ProgrammingModel”:{“href”:"/programmingmodel/98"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/99",“Name”:“Button 99”,“ButtonNumber”:98,“ProgrammingModel”:{“href”:"/programmingmodel/99"},“Parent”:{“href”:"/project"},“IsProgrammed”:false},{“href”:"/virtualbutton/100",“Name”:“Button 100”,“ButtonNumber”:99,“ProgrammingModel”:{“href”:"/programmingmodel/100"},“Parent”:{“href”:"/project"},“IsProgrammed”:false}]}}

Scene Data Recieved
[]

Nevermind, I saw the note that the Pico doesn’t work with the standard bridge. I guess I hit the buttons in the device in ST which triggered the events. I guess I’ll just resort to using the Pico as a remote for the shades only and buy one of the Eaton switches for lights. Sucks because the Picos are nice and they’re cheap, but buying a Pro bridge is not.

Hey @Doerfler I had reported to you “no ramping problems” at least with my use of the Advanced Button Controller… but I just realized that it may be because I fixed a bug in the dimmer device handler earlier a few weeks ago, on my lashup. I kind of recall that it would cause weird lamp on/off problems kind of like what you were describing, which stopped after the fix (here, anyway).

So I finally got to sending @njschwartz Nate a pull request (dimmerlimitfix) with that change to lutron-virtual-dimmer.groovy – maybe he can take a look and see if it’s worth committing.

In the meantime, if you’re feeling adventurous, you could try editing your repository copy of that file in your Device Handlers by replacing with: https://github.com/billhinkle/lutronpro/blob/dimmerlimitfix/devicetypes/njschwartz/lutron-virtual-dimmer.src/lutron-virtual-dimmer.groovy – you can always revert to Nick’s current version if necessary. But I’ve been using my patched version for a month or so, a-ok.

Edit: Found the "Telnet Support” switch in the Caseta app. No more error.

Just tried loading this on node.js 6.10.2 on a Mac. I find the server in the smart app, finds my pico, but then I get the following error when it tries to find my scenes. I swapped out lutronpro.js with the modified version from @BHO, but the error is the same.

I know nothing about javascript. Any suggestions of where to start in resolving this would be greatly appreciated. I’m using a Pro bridge I just purchased in hopes of getting this to work using a Mac as the server.

starting telnet connection
Request for Scenes
192.168.1.101
Request for Scenes
192.168.1.101
Request for Scenes
192.168.1.101
About to exit with code: 1
events.js:160
throw er; // Unhandled ‘error’ event
^

Error: connect ETIMEDOUT 192.168.1.101:23
at Object.exports._errnoException (util.js:1018:11)
at exports._exceptionWithHostPort (util.js:1041:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1090:14)

Wow! Thank you @njschwartz, @BHO, @stephack, @dalec and @bravenel for the awesome work and dedication that went into the development to make this work. It was a steep climb to get this setup, but it’s working really well!

I spent $51 on a Lutron Smart Bridge Pro, $20 on a Pico remote and a few hours of my time to configure and troubleshoot my mistakes in order to get this running on a 2008 MacBook I was given. This is a great alternative to the Lutron Connected Bulb Remotes that I can’t get at a reasonable price any longer, and a much less expensive, but significantly more powerful alternative to Flic buttons.

I did run into some points in the instructions where I missed steps. As my thanks for the hard work all of you have put into this, I’d like to offer revised step by step and combined instructions to include both the LutronPro Caseta v1.0 and Advance Button Controller in a single post at some point.

I do have one question though. Does it make sense to change the Client ID and Secret in the lutron.js file? It works if I change it to match the Lutron Pro Service Manager SmartApp, and it works if I do not change it. Any advantage to changing it to match the SmartApp?

A comprehensive how to would be very welcome I think. Just documenting the requirement to turn on the Lutron app’s telnet feature would save a lot of angst!

1 Like

@SmartHomePrimer - I’m curious about this too.

Unrelated (or is it??), I don’t know how it happened, but I ended up with 2 pico remotes with the same creative name… “Pico”. What’s annoying is that regardless of changing it in the Lutron app or the ST app, in the list of ‘Select Pico’s’, they always show up as “Pico”. I pulled this out of the ST installed apps state info:

{
30736646={
	deviceType=Pico3ButtonRaiseLower,
	name=BedroomPico,
	deviceID=9,
	hub=80687123-79c6-4880-b63a-1064b0e2d107,
	dni=30736646,
	hubIP=null
},
29941572={
	deviceType=Pico3ButtonRaiseLower,
	name=LRPico,
	deviceID=6,
	hub=80687123-79c6-4880-b63a-1064b0e2d107,
	dni=29941572,
	hubIP=null
},
28749349={
	deviceType=Pico3ButtonRaiseLower,
	name=Pico,
	deviceID=10,
	hub=80687123-79c6-4880-b63a-1064b0e2d107,
	dni=28749349,
	hubIP=null
},
11923899={
	deviceType=Pico3ButtonRaiseLower,
	deviceID=8,
	name=ALLPico,
	hub=80687123-79c6-4880-b63a-1064b0e2d107,
	dni=11923899,
	hubIP=null
},
11799027={
	deviceType=Pico3ButtonRaiseLower,
	deviceID=7,
	name=Pico,
	hub=80687123-79c6-4880-b63a-1064b0e2d107,
	dni=11799027,
	hubIP=null
}

}

For a while I was getting this error, but I think it may be unrelated as I was having some issues and ultimately ended up needing to reboot the SBPro:

Error: This socket has been ended by the other party
at TLSSocket.writeAfterFIN [as write] (net.js:365:12)
at /usr/local/lib/node_modules/lutronpro/lutronpro.js:626:30
at Layer.handle [as handle_request] (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/layer.js:95:5)
at next (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/layer.js:95:5)
at /usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/index.js:335:12)
at next (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/index.js:275:10)
at jsonParser (/usr/local/lib/node_modules/lutronpro/node_modules/body-parser/lib/types/json.js:109:7)
at Layer.handle [as handle_request] (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/index.js:317:13)
at /usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/index.js:335:12)
at next (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/router/index.js:275:10)
at expressInit (/usr/local/lib/node_modules/lutronpro/node_modules/express/lib/middleware/init.js:40:5) 

In any case, the pico naming is (apparently) my “squeaky wheel” at the moment as the above error stopped occuring. I did a little searching and it doesn’t like like I can directly edit the app data without adding some code to the app to let me change it etc.

Any idea why the names wouldn’t update? Or is that on purpose and I just did something dumb after not reading all of the posts (wouldn’t be the first time…)

All in one step by step guide for LutronPro Caséta v1.0 and Advanced Button Controller is now available here

Please let me know if there are errors and/or omissions

2 Likes

So… about those picos…

@njschwartz its been awhile since I configured this since I have had it working ok, minus the ramping haven’t had time to test that. But I was wondering if there were any improvements made to the nodejs server like not having to restart the server when adding new picos.

Jeff, I saw a similar thing happen during my initial setup and testing. I can’t tell you either exactly how it happened, but I can tell you that if you follow the directions I wrote here under troubleshooting, your duplicate Pico remotes will disappear and if you first head over to your Lutron bridge and name the Pico remotes there, when you bring them in again, they will have the correct names. Not sure if you’re using ABC to program them or WebCore, but I can tell you that you don’t have to worry about your configuration if you’re using ABC. When you bring them back in, you just open ABC, select the appropriate Pico for the mapping and everything is there and working again.

Mr. @SmartHomePrimer has it from a practical sense: currently the only way to reflect (within SmartThings) a device name change made within the Lutron app is to remove the Lutron device as listed in the SmartApp discovery page (un-checkmark it and then next/save/etc. all the way out), and then re-discover/re-select it the same way. (I think this is true for any of the Lutron devices, not just the Picos.) Just re-discovering it won’t do the trick, even though you see the new Lutron name on the device (PIco, here) discovery page.

The underlying reason is pretty simple: that’s just the way Nate wrote the code, at least for the moment. The SmartApp just doesn’t take into account the possibility that the name has changed (or the device ID, for that matter) – if the same physical device is re-discovered and still selected, it’s ignored rather than updated. That issue is certainly a good candidate for a future SmartApp update.

I don’t seem to have any trouble changing the name of a Pico within SmartThings, and it seems to “stick” ok and is used by (say) Advanced Button Controller SmartApp. But that name change doesn’t reflect back to this SmartApps’s discovery page (because the device handler + SmartApp code just plain doesn’t do it, as above), nor does it reflect back to the node server (again, just not implemented) nor to the Lutron app/bridge itself for that matter. I’m not aware that anyone’s figured out how to do that latter, as yet.

Handling name changes originating at the Lutron end is pretty feasible – just a SMOP as we used to say :stuck_out_tongue: – but then some decision would have to be made about those stomping on name changes made at the SmartThings end to the same device.

1 Like

I’m patiently waiting for this to work for RA2 Select to work with Pico, the switches works already.
Fingers crossed @njschwartz.

What does the logging from the node server look like when connected to the RA2 Select, as far as Picos are concerned? Do they show up in the device list? Do the Picos show up in the SmartApp discovery and can be selected, but just don’t do anything? Is there any logging activity on the node server when you press a Pico button; if so, what?

(btw, any chance the Pico issue is just a matter of turning on the Lutron app’s Telnet Support? Setup(Gear) -> Advanced -> Integration -> Telnet Support = ON has to be done for Picos with the Caseta bridges, at least, probably the RA2 Select also)

@BHO
RA2 Select is basically a Caseta Pro with a RadioRA2 radio. It uses the same apps, same apis/integrations, and has telnet.

My telnet support is already on.
The issue, however, seems to be that @njschwartz has the pico remote enabled only if it identifies the main repeater to be a Caseta Pro. So Caseta (retail) and RA2 Select is set to not support pico with his logic.

I don’t know where in the code to change it to accomidate the RA2 Select repeaters.
@njschwartz mentioned that he can make the other keypads work as well (since RA2 Select supports many scene specific keypads).

Hopefully, he’ll have some time soon to help me out. I’d appreaciate your assistance @BHO if you want to tackle it.

Just purchased a Lutron PJ2-2BRL to test 4 button picos with Stringify integration, but they don’t show up in the Lutron Caseta Service Manager. I see it in the Node.js when I restart the Node.js server, but cannot see it in the SmartApp. What am I missing?

@thegilbertchan - I knocked together a quick patch to my earlier patched version of Nate’s node server, which MAY let the RA+/Select be recognized as a pseudo-Caseta-Pro hub and so let the Picos work. If you are feeling brave…

FIRST make sure you save your current almost-working copy of node_modules/lutronpro/lutronpro.js
THEN replace that with a copy of my current patched version, found here:

And I’ll be interested in your results. Just be sure you can roll it back if necessary!

@SmartHomePrimer – Nate’s current SmartApp and Device Handlers just plain do not take the 4-button Picos into account at all. Complete support would require modifying the SmartApp and adding a new (or modified) Device Handler… maybe several, since I gather that there are several types of 4-button Picos that work slightly differently from each other (Pico4ButtonScene vs. Pico4ButtonZone, etc.)

BUT in the meantime, while I was messing with the RA+/Select issue, I added a patch to lutronpro.js that may be ‘good enough’ for the moment. It just fakes 4-button Picos to appear as 3RaiseLower (5-button) Picos to the SmartApp/Device Handler. Seems to work OK with my Pico4ButtonZone I have here, at least insofar as I can make the Advanced Button Controller SmartApp work with it. The button mappings are, from the top of the 4-button Pico: 1st=3-Button “ON”; 2nd=3-Button “RAISE”, 3rd=3-Button “LOWER”; 4th=3-Button “OFF”.

If you are feeling adventurous, you might grab my patched version of lutronpro.js and try it (and do keep a copy of your working lutronpro.js to fall back to if necessary!). See my reply to @thegilbertchan just above for the link. I’ll be interested to know if it works for you, and if not, what the logging looks like.

p.s. because of a quirk in Nate’s original device discovery code, it may be necessary to discover the Picos (or really, ANY new device) TWICE before they appear for selection. That’s because the node server code returns the OLD list of devices to the SmartApp before it gets the NEW list.