Vesternet 12-button Remote Control -- Node Red flow to get use of all buttons

Has anyone bought and used one of these? I just got it and downloaded the driver for Hubitat provided by Vesternet. Unfortunately, when button A is pushed, HE registers that buttons 1, 3, 5, & 7 were pushed consecutively. When button B is pushed, HE registers buttons 2, 4, 6, & 8 were pushed consecutively.

Vesternet provides the Hubitat driver. Anyone know if it is possible to change A to Button 11 and B to Button 12 instead in a Zigbee driver? If anyone is willing to take a look, the driver is here:

Thank you.

I got a response from their Customer Service:

Zigbee button controllers such as this work with the concept of Groups, they are really designed to be paired directly to other Zigbee devices such as bulbs and sockets. The four rows of buttons are a pair on / off per Group, the lower row of buttons are for recalling Scenes and the top two buttons are master buttons that control all the Groups.

When these types of device are used within a Smart Hub such as Hubitat or SmartThings, the Smart Hub "pretends" to be a Zigbee device so it joins each Group on the device. When you push the buttons, the device is essentially sending commands to the Smart Hub to "turn on" or "raise brightness", or "load Scene". The Smart Hub translates those into usable events for triggering logic where possible, so "Group One - On" becomes "button 1 pushed", "Group Four - Raise Brightness" becomes "button 8 held", etc.

In the case of the top two buttons the device is sending multiple commands to the Smart Hub - "Group One - On", "Group Two - On", etc, so those get translated the exact same way.

We do mention this on the product page by stating that the device has up to 26 unique events when used as a "Button Controller" in a supported Smart Hub. There is also a reference to the supported events under the FAQ at "Can I use this device to trigger logic in my Zigbee Hub?".

Hope that helps!

Regards,
Martyn

My fault for not reading their FAQs and assuming that this operates like every other button controller I own. :frowning_face: Fortunately, I can make it work with just the 10 buttons.

1 Like

If you factory reset this remote, do buttons 1 and 2 switch all your Zigbee plugs / sockets on and off (without any rules on HE )?

I haven't given up. Since I use Node Red, I am trying to figure out a set of nodes that will add the sum of payload.value coming from device over a narrow time window. Since the top button pushes buttons 1,3,5,& 7, then the sum is 16. The next button pushes 2,4,6,& 8, the sum is 20. I already found the Totaliser node that does it but it operates continuously and sends a total every second. Ultimately, I want it to start the running sum when it receives a message and then sends a total after 1 second then resets to zero and waits for next message. Now I just consider it a challenge :grinning:

1 Like

I know that I may be the only one reading this but in case someone in the future buys this device without reading or completely understanding the FAQs on their website like I did, I was able to create a workaround using a Node Red flow. The part circled in red is the important part:

And this is the simple Function Node:
image

It basically does a running sum for 250 milliseconds after receiving any button push then sends that value as the equivalent of msg.payload.value coming from a typical single button push. Next it then zeros the running sum. Because the device registers the four button pushes in about 30/1000 of a second, there is no noticeable delay.

I PM'd @erktrek privately for some help because of his multi-tap Pico flow and he was able to get me going in right direction. BIG thanks to him for helping instead of telling me to pound sand.

I have all 12 buttons working as I wanted!!!!! :grinning:

3 Likes

Here's a subflow I wrote to encapsulate the ideas we were discussing if anyones interested - I switched to using a stored array instead of an accumulator.

This is now generic enough that you can translate any button or button combinations to a predefined button press (or any output!) by simply editing the BTN_TABLE "property" (environment variable) of the subflow.

Thanks to @stephen_nutt for bringing this up! Was a fun exercise and excellent distraction.

Button Press Translator Example

[{"id":"3b59914daaad2161","type":"subflow","name":"Button Press Translator","info":"","category":"","in":[{"x":40,"y":40,"wires":[{"id":"f4a31b548b18b7f0"}]}],"out":[{"x":740,"y":100,"wires":[{"id":"14dc4f13e03c8ecf","port":0}]}],"env":[{"name":"BTN_TABLE","type":"json","value":"[{\"buttonInput\":\"1/3/5/7\",\"buttonOutput\":11},{\"buttonInput\":\"2/4/6/8\",\"buttonOutput\":12}]"},{"name":"DELAYMS","type":"num","value":"250"}],"meta":{},"color":"#FFCC66","icon":"node-red-dashboard/ui_button.png","status":{"x":740,"y":200,"wires":[{"id":"c1a0f431fda7ce6b","port":0}]}},{"id":"f4a31b548b18b7f0","type":"function","z":"3b59914daaad2161","name":"accumulate presses","func":"var presses = flow.get(\"presses\");\n\nif (!presses) {\n  presses = [];\n}\n\npresses.push(msg.payload.value);\n\nflow.set(\"presses\",presses)\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"// Code added here will be run once\n// whenever the node is started.\ncontext.set(\"presses\",undefined)","finalize":"","libs":[],"x":240,"y":60,"wires":[["207f439b5db01e9a"]]},{"id":"207f439b5db01e9a","type":"timed-counter","z":"3b59914daaad2161","name":"","timelimit":"${DELAYMS}","timeunit":1,"withhold":true,"fixedtimeout":false,"pertopic":false,"x":220,"y":140,"wires":[["14dc4f13e03c8ecf"]]},{"id":"14dc4f13e03c8ecf","type":"function","z":"3b59914daaad2161","name":"set press","func":"var presses = flow.get(\"presses\");\nvar btnChecker = env.get(\"BTN_TABLE\");\n\nfor (var i=0;i<btnChecker.length;i++){\n    btnInput = btnChecker[i].buttonInput.split(\"/\");\n    if ( checkArrays(btnInput, presses) ) {\n        presses = [];\n        presses.push(btnChecker[i].buttonOutput);\n        break;\n    }\n}\nmsg.payload.value = presses[0];\n\nflow.set(\"presses\",undefined);\n\nreturn msg;\n\nfunction checkArrays(arr1, arr2){\n\n    var matchCnt = 0;\n    for (var i=0;i<arr1.length;i++){\n        for (var j=0;j<arr2.length;j++){\n            if (arr1[i] == arr2[j]){\n                matchCnt++;\n            }\n        }\n    }\n    \n    matched = (matchCnt === arr1.length);\n\n    return matched;\n}","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":140,"wires":[["c1a0f431fda7ce6b"]]},{"id":"c1a0f431fda7ce6b","type":"change","z":"3b59914daaad2161","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"\"pressed:\" & payload.value","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":520,"y":200,"wires":[[]]},{"id":"5b92a30a881fb575","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":120,"y":2720,"wires":[["91ae50c491d266d4","edfb7332ab5a993c","94b8e1f5ae382133","3db9809a304abea3"]]},{"id":"91ae50c491d266d4","type":"change","z":"b38ec3180db9ae33","name":"Press 2","rules":[{"t":"set","p":"payload.value","pt":"msg","to":"2","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2600,"wires":[["597710c16b111e3b"]]},{"id":"edfb7332ab5a993c","type":"change","z":"b38ec3180db9ae33","name":"Press 4","rules":[{"t":"set","p":"payload.value","pt":"msg","to":"4","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2700,"wires":[["80ceba24addb5ded"]]},{"id":"94b8e1f5ae382133","type":"change","z":"b38ec3180db9ae33","name":"Press 6","rules":[{"t":"set","p":"payload.value","pt":"msg","to":"6","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2780,"wires":[["ae21cc7d8292821c"]]},{"id":"3db9809a304abea3","type":"change","z":"b38ec3180db9ae33","name":"Press 8","rules":[{"t":"set","p":"payload.value","pt":"msg","to":"8","tot":"num"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":2860,"wires":[["4efa689786a6dc47"]]},{"id":"33b28698d5222fe3","type":"debug","z":"b38ec3180db9ae33","name":"debug 4","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":900,"y":2600,"wires":[]},{"id":"80ceba24addb5ded","type":"delay","z":"b38ec3180db9ae33","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":650,"y":2720,"wires":[["597710c16b111e3b"]]},{"id":"ae21cc7d8292821c","type":"delay","z":"b38ec3180db9ae33","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":650,"y":2780,"wires":[["80ceba24addb5ded"]]},{"id":"4efa689786a6dc47","type":"delay","z":"b38ec3180db9ae33","name":"","pauseType":"delay","timeout":"1","timeoutUnits":"milliseconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"outputs":1,"x":650,"y":2860,"wires":[["ae21cc7d8292821c"]]},{"id":"597710c16b111e3b","type":"subflow:3b59914daaad2161","z":"b38ec3180db9ae33","name":"","x":680,"y":2600,"wires":[["33b28698d5222fe3"]]},{"id":"1c1a8263cc551205","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":160,"y":2600,"wires":[["91ae50c491d266d4"]]},{"id":"82f98f6f9f239453","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":160,"y":2660,"wires":[["edfb7332ab5a993c"]]},{"id":"b09db359cb08630f","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":160,"y":2780,"wires":[["94b8e1f5ae382133"]]},{"id":"2493e46bc560ee8a","type":"inject","z":"b38ec3180db9ae33","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"test","payload":"{\"value\":\"\"}","payloadType":"json","x":160,"y":2860,"wires":[["3db9809a304abea3"]]}]

edit: You DO need the "node-red-contrib-timed-counter" installed...

1 Like

This device looks a lot like the RGB Genie 2 scene remote. Does anyone know if it's the same device with different branding?

It looks pretty similar and the description of the buttons also similar.

Sorry to bump an old thread - but I thought it was preferrable to creating a new one?

I bought the Vesternet 12 button Z-wave controller, and have installed the "Vesternet VES-ZW-REM-013 4 Channel Remote Control" driver - the item shows in my Hubitat devices, with 4 'child' devices underneath, "RGBgenie Wireless Dimmer Switch EP1" which use the 'Generic Component Dimmer' driver.

I can't figure out how to configure this device (or child devices), and what drivers to use etc.

If I try to set up a Basic Button Controller, it only has 2 channels to assign.

Sorry, can anyone advise please.

Thanks