[RELEASE] Fibaro KeyFob - 30 actions, Z-Wave Plus compatible, battery-powered, compact remote control



Fibaro KeyFob is a six button Z-Wave Plus remote that enables user to execute 30 action through the combination of single, double and triple presses, holding the buttons and 6 programmable 2 to 5 button sequences. The remote can also be protected against unauthorized use by 2 to 5 button sequence (check Lock Mode configuration section below).

This DTH exposes 30 buttons and 6 switches. They are assigned as follows:

  • Buttons 1-6 - “pushed” event on physical buttons 1-6 single press
  • Buttons 7-12 - “pushed” event on physical buttons 1-6 double press
  • Buttons 13-18 - “pushed” event on physical buttons 1-6 triple press
  • Buttons 19-24 - “pushed” event on physical buttons 1-6 hold
  • Buttons 25-30 - “pushed” event on execution of sequences 1 to 6
  • Switches 1-6 - “on” event on physical buttons 1-6 hold, “off” event on physical buttons 1-6 release

Steps to configure the KeyFob:

  1. Go the the settings and change them to your liking (people who used the previous version of the DTH have to go to the settings and set the button modes again)
  2. After clicking ‘Done’ the SYNC tile will change to ‘PENDING’
  3. Press Circle + Plus on the KeyFob
  4. SYNC tile will change to ‘SYNCING’ - this can take up to 30sec
  5. If the SYNC tile changes to ‘INCOMPLETE’ repeat step 3
  6. If the SYNC tile changes to ‘FAILED’ verify your settings.

if you want to force the sync of all of the settings tap the SYNC tile. It should change to ‘FORCE’ then proceed form step 3

Lock Mode configuration:
To activate it you have to:

  • Change ‘Protection State’ to ‘Protection by sequence’ in settings
  • Set the ‘Unlocking Sequence’ to value other than 0
  • Set one or both of ‘Time To Lock’ and ‘Locking Button’ to value other than 0 (if you want to lock the KeyFob only with a button, set ‘Time To Lock’ to 0 and set ‘Locking Button’ to the number of the button you want to use to lock the KeyFob etc)

[UPDATE] 2017-04-02:

  • Added new mainTile - the main menu now shows a push button instead of battery percentage. Pressing it activates the button which number can be configured in the settings menu (Button 1 by default).

[UPDATE] 2017-04-07:

DTH source link:


New Device - Fibaro Keyfob - 24 actions
Remote or KeyFob to Arm/Disarm?
FAQ: Full list of buttons and remotes confirmed to work with SmartThings
Hogar Touch Panel Switch - Has anyone written a device handler for this?
(Robin) #2

All features working perfectly… if ST were still allowing submission of code this would be ready to go!

I had a bit of trouble upgrading from previous handler though, battery immediately reported at 20% (was reporting null before), sync tile wouldn’t go to ‘pending’ after clicking done and force sync wouldn’t sync anything. Removed, reset, re-added and now all is good in the world! (And 100% battery).

Nice work!


[UPDATE] 2017-04-02:

  • Added new mainTile - the main menu now shows a push button instead of battery percentage. Pressing it activates the button which number can be configured in the settings menu (Button 1 by default).

(Robin) #4

I guess I need to figure out a use for this thing now lol…

I have motion and contact sensors / automations / physical switches / ActionTiles / iOS widget / Alexa / ZRC 90’s etc., so all bases are covered already really.

Not sure if other half will approve but I might set it up for my 4 year old daughter coz she can’t reach the light switches yet! Bathroom, hallway and her bedroom lights me thinks…

I can see this device replacing the purchase of ZRC 90’s and many of the other button controllers.

It’s so tiny it would also work nicely inside vehicles for remote garage doors, SHM etc.

I can also see this making a fun drinking game, CoRE can randomly select truth, dare, drink, strip etc. based on button presses lol!.. I see a custom smartapp coming! :tada::cocktail::fireworks::beer:


[UPDATE] 2017-04-07:

(Martin) #7

Fibaro Keyfob now available in US format. Tweet below from Fibaro USA. Ordered one :slight_smile:

Yes it is! Here is the link -> Fibaro FGKF-601 ZW5 KeyFob Z-Wave Scene Controller, White https://t.co/GgpKgPlZVN

(Lee Wilkinson) #8


Firstly many thanks for the device handler it works great, really appreciated.

I have been playing around using core to trigger events and no matter what I do I cant get an action to run on button held.

I have configured the DTH with each of the 6 buttons configured as 1,2,3 Click and Hold.

I have tested the core setup with button 1 using a button pushed (When Fibaro Keyfob button #1 changes to pushed) it turns on my office lights. This works great.
I have setup button 2 to do the same but turn off the office lights (again works great).

I have setup a core basic piston that checks for button 1 being held as follows (Fibaro Keyfox Button #1 Comparison is value held to turn off the office light) When I run this nothing happens and it does not turn off the office lights.

I think I must be doing something wrong here but i’m not sure what?

Can anyone help me with my understanding of how to use this device handler with core properly?

I would like to be able to setup:

Single click actions for each button
Double click actions for each button
Press and hold actions for each button

Please can you guys help?




The first post contains information on how actions on the remote are mapped.

the point you are interested in in this case is: Buttons 19-24 - “pushed” event on physical buttons 1-6 hold

So for button 1 hold Core will receive “button 19 pushed” event. So just assign your action to that button in Core :stuck_out_tongue:

Just to explain why I did this this way. Not everyone uses Core and some SmartApps don’t allow you to configure buttons pushed and hold separately. By exposing all of the remote action as separate buttons I make it possible to use all 30 of the available actions even in the simplest SmartApps.

(Lee Wilkinson) #10

I knew it would be me doing something stupid.

Just changed and it works a treat. I get it now, Thanks.

(Hendre) #11

I’m having trouble to set up this Keyfob in webCoRE.
If I select “button”, it works fine, apart from the fact that the Piston fires regardless of the button I press:

I’ve also tried this to use button 2 e.g., but that does not work:

Thanks in advance.

(Robin) #12

I get a button number option after selecting attribute ‘button’…

It’s odd that you don’t, are you on the latest handler?

I would then use a switch case for each action, as per the following example:


The issue can be that I set the number of buttons just during the initialization that not always executes (especially if you didn’t install DTH before you added the remote to network).

I just updated the DTH with one that sets the number of buttons every time you click ‘Done’ in settings. Try that.

(Hendre) #14

Thanks for you help guys.
I installed the updated Device Handler from Github (copied code, saved and published (I have not been able to work out when a Device Handler should be published and when not.)
I went into the settings of the KeyFob in the app on my mobile and without changing anything, clicked Done. The app asked me if I wish to changes and I tabbed yes.
Went back into webCore interface on my laptop and opened the settings of the keyfob in a piston, but unfortunately still don’t get the button numbers:

Next I tried to remove / exlude the Keyfob from the hub with the idea of adding it again, but that failed - even the “remove forcefully” option. (After executing the remove command in the app, I tried the key combination which is according to the manual necessary to exclude the device.)

I took a brand new KeyFob (as keyfob 2) out of its box; added it to the hub, checked that the correct handler was assigned;

accessed the settings in the app; added the Keyfob to webCore, added keyFob 2 as a trigger and setting the command, I still get this:

Any further ideas please?

(Robin) #15

In webCoRE, try selecting switch (or anything else) and then returning to button.

Try a brand new piston, rather than editing the existing one.

Also try a hard reload of webCoRE:

In Chrome, hold Ctrl whilst pressing the refresh button.

(Hendre) #16

Thanks for the suggestions. I tried all, with no luck.

Updated the handler from https://raw.githubusercontent.com/ClassicGOD/SmartThingsPublic/master/devicetypes/classicgod/fibaro-keyfob.src/fibaro-keyfob.groovy again so make sure I’ve got the latest version. Still the same.


Edit: I rebooted the Smartthings hub and that solved the issue. I’m now have the option to select on of the other buttons of the keyfob.


Good to hear! :slight_smile:

(Niels Petter) #18


I’m having some trouble with this DTH. Any idea what the following symptoms indicate?

  1. I get this message in the logs when clicking circle/plus to sync: java.lang.NullPointerException: Cannot get property ‘value’ on null object @ line 189

  2. When trying to use a button in a routine or smart app the screen of the smartthings app just goes blank after choosing the keyfob (instead of showing a list of buttons).

I’ll try to tinker some more.

Edit: This is what is logged when the smartthings app fails to show buttons when configuring the routine:

groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.getAt() is applicable for argument types: (java.math.BigDecimal) values: [2]
Possible solutions: getAt(groovy.lang.EmptyRange), getAt(java.lang.String), getAt(int), getAt(java.lang.String), getAt(groovy.lang.Range), getAt(int) @ line 123


Please make sure you copied the DTH code in it’s entirety and then go to settings, check if all the fields are filled and click Done.

(Niels Petter) #20

Hi, thanks for the quick reply! Tried all of that, still no luck. Only thing I can think of is that I copied the code on cell phone, maybe it got messed up somehow. I’ll try again from my dev box later.

(Niels Petter) #21

Just a quick update. After excluding and including the device, the config sync now works. Unfortunately the issue with using the device in any automation still lingers:

groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.getAt() is applicable for argument types: (java.math.BigDecimal) values: [2]
Possible solutions: getAt(java.lang.String), getAt(groovy.lang.EmptyRange), getAt(int), getAt(groovy.lang.Range), getAt(int), getAt(java.util.Collection) @ line 1516