Smart Bike Lights (Data Field) / Bike Lights Control (Widget)

I've made two open source CIQ applications to control ANT+ lights:

- Smart Bike Lights (data field): https://apps.garmin.com/en-US/apps/0d9fd828-c932-4470-9c37-fd2828881888 

      Configurator: https://maca88.github.io/SmartBikeLights/ 

- Bike Lights Control (widget): https://apps.garmin.com/en-US/apps/fa3c2332-76e3-4ba1-8528-32a0fd617ab1 

     Configurator: https://maca88.github.io/BikeLightsControl/ 

Smart Bike Lights features:
- Automatic light control (Smart mode) based on the configured filters (sunset, sunlight, speed, ...)
- Manual light control (only for Edge devices with a touch screen or devices with CIQ 3.2 and more than 32KB memory)
- Records lights modes that are displayed in Garmin Connect

Bike Lights Control features:
- Manual light control (available to all devices)

Both applications can be installed on the same device, which can be useful for low end devices (e.g. Edge 520) where "Bike Lights Control" can be used to change light modes manually and "Smart Bike Lights" for automatic light control.

Currently registered ANT+ lights:
- Bontrager Ion Pro RT
- Bontrager Ion 200 RT
- Bontrager Flare RT
- Garmin Varia RTL500
- Garmin Varia RTL510
- Garmin Varia RTL515
- Garmin Varia HL500
- Garmin Varia UT800

in case your ANT+ light is not on the list you can help by doing the following:

1. Install Bike Lights Control
2. Pair your bike light with your Garmin device
3. Open the widget:
- Edge with a touch screen: post which numbers are displayed on the buttons and what mode each button represents when pressed
- Other devices: Select the "Light modes" menu and post which numbers are displayed in the menu and what mode each menu item represents when selected

Example for Bontrager Ion Pro RT:


1 -> High steady beam
2 -> Medium steady beam
5 -> Low steady beam
63 -> Day flash
62 -> Night flash

There are some features that could be possible to add in the future, but would require Garmin to add them to the CIQ api. In case you are interested in any of the below features, consider upvoting their feature request thread:

1. Control lights based on the ambient light sensor available on some devices:
https://forums.garmin.com/developer/connect-iq/i/bug-reports/ambient-light-sensor-api-access 

  • No worries. Both light modes and the order are now changed as you specified. 

  • Hello, I try to setup my explore 2 with varia 515, but every time when I generate a code, I get error 4 in Bike Light Controll. It is working in the DataField.

    I just select the hardwares with default setting, try to upload this without change anything.


    ###0,73535488::1#1,1!:1:7:0:0D=1##6,5:Varia 515:0:16777215!2,:-1,Off:0!1,Solid:4!1,Peloton:5!1,Day Flash:7!1,Night Flash:6#0::#0:0#123!:123!#0#B4169##3#0#0

    It is working when the configuration line is empty, I see 4, 5, 6, 7

  • Hi,

    the configuration that you provided is not compatible with Bike Lights Control widget. The provided configuration works only with Smart Bike Lights data field. In order configure the Bike Lights Control widget you need to use the following configurator:

    https://maca88.github.io/BikeLightsControl/

    or you can use the following configuration (generated by using the above link):

    ###0,73535488::1###6,5:Varia 515:0:16777215!2,:-1,Off:0!1,Solid:4!1,Peloton:5!1,Day Flash:7!1,Night Flash:6#0::#0:0#B4169##3#0#0

  • Hi

    I can't get Cycliq Fly12CE to work...  The screen display either "Error 3" or "No Network".  Some further details.

    • I have two lights - Fly12CE and Varia RCL715.  GPS unit is Edge 830
    • I used the individual light network option and have correct device IDs for both lights.
    • I tried both having both lights added to the Edge (with light network disable) as well as removed them altogether.
    • In both cases, the lights turns on when I switch the Edge on.  I can see the screen comes up briefly with the RCT715 controls, but it soon change to error once the Fly12CE is switched on/detected...

    I can get the RCL715 working properly, but can't get Fly12CE to.  Any helps is much appreciated.

    Config as per below:

    #415312,71303969::1##0,73535488::1##11,10:Fly12 CE:0:16777215!2,:-1,Off:0!1,Constant High:1!1,Constant Medium:2!1,Constant Low:3!1,Flash High:7!1,Flash Medium:61!1,Flash Low:62!1,Pulse High:6!1,Pulse Medium:59!1,Pulse Low:60#6,5:Varia 715:0:16777215!2,:-1,Off:0!1,Solid:4!1,Peloton:5!1,Day Flash:7!1,Night Flash:6#1:53567:224808#0:0#123!:123!#0#B3122#5#11#0#1

  • Managed to fix this now by removing and shorten some buttons name. 

  • Hi, congrats on the good work and great support that I see here.

    I don't have a problem but wanted to ask if there's a way to to a global filter to set the light control when the activity is paused (like you pause it while stopping to fix a flat or buy a coffee ;^)). 

    I've setup for my network based on what you've shared before, but can't see how to add that filter - like is there a Timer State of "Paused" that I'm just not seeing?

    1,1!:1H]0#4587520,196641::1#4,4!BRAKE:1:63:0:0A[-20!DAY:1:63:0:0Er0,s600!NIGHT:1:2:0:0Es600,r0!:1:0:0:0D=1#6291461,1409482753::1#4,4!BRAKE:1:7:0:0A[-20!DAY:1:8:0:0Er0,s600!NIGHT:1:63:0:0Es600,r0!:1:0:0:0D=1#6:Head!Off:0!High:1!Medium:2!Low:5!Day Flash:63!Night Flash:62#5:Tail!Off:0!All Day Flash:8!Day Flash:7!Night Flash:63!Night Steady:5#0::#0:0#0#B3291#2#1#1#0

  • Hi,

    you can use the "Timer state" filter and set it to "Equal to Recording paused". If you want to turn off the lights when paused then you can either modify the current global filter from "Timer state > Not recording" to "Timer state > Recording paused". With this will also turn off the lights when the timer is stopped. In case you want to change the light mode only when paused, then you need to add a new filter group for each lights with the "Timer state" filter. Example for turning off the lights only when the timer is paused:

    1,1!:1H]0#4587520,196641::1#5,5!PAUSE:1:0:0:0H=2!BRAKE:1:63:0:0A[-20!DAY:1:63:0:0Er0,s600!NIGHT:1:2:0:0Es600,r0!:1:0:0:0D=1#6291461,1409482753::1#5,5!PAUSE:1:0:0:0H=2!BRAKE:1:7:0:0A[-20!DAY:1:8:0:0Er0,s600!NIGHT:1:63:0:0Es600,r0!:1:0:0:0D=1#6:Head!Off:0!High:1!Medium:2!Low:5!Day Flash:63!Night Flash:62#5:Tail!Off:0!All Day Flash:8!Day Flash:7!Night Flash:63!Night Steady:5#0::#0:0#0#B3291#2#1#1#0

  • For what it's worth,  I got desired behavior by changing the global filter to State equal to Recording.

    1,1!:1H=3#4587520,196641::1#4,4!BRAKE:1:63:0:0A[-20!DAY:1:63:0:0Er0,s600!NIGHT:1:62:0:0Es600,r0!:1:0:0:0D=1#6291461,1409482753::1#4,4!BRAKE:1:7:0:0A[-20!DAY:1:8:0:0Er0,s600!NIGHT:1:63:0:0Es600,r0!:1:0:0:0D=1#6:Ion 200 RT!Off:0!High:1!Medium:2!Low:5!Day Flash:63!Night Flash:62#5:Flare RT!Off:0!All Day Flash:8!Day Flash:7!Night Flash:63!Night Steady:5#0::#0:0#0#B3291#2#1#1#0

    Thanks

  • One more question - I have 2 different 'cycling' activities on my Fenix that are customized copies of the stock activities. "Trail Bike" that was made from "MTB" and "Road Bike" that was made from "Bike" ... i'm trying to set a filter so that only "Road Bike" will have the Smart Lights active, for all the rest (and all other activities, such as trail riding, trail racing, etc) the lights will be kept Off.

    So I set a global filter as follows, and it does not work.

    2,1!:2H=3K=Road Bike:#4587520,196641::1#4,4!BRAKE:1:63:0:0A[-20!DAY:1:63:0:0Er0,s600!NIGHT:1:62:0:0Es600,r0!:1:0:0:0D=1#6291461,1409482753::1#4,4!BRAKE:1:7:0:0A[-20!DAY:1:8:0:0Er0,s600!NIGHT:1:63:0:0Es600,r0!:1:0:0:0D=1#6:Ion 200 RT!Off:0!High:1!Medium:2!Low:5!Day Flash:63!Night Flash:62#5:Flare RT!Off:0!All Day Flash:8!Day Flash:7!Night Flash:63!Night Steady:5#0::#1:1#0#B3291#2#1#1#0

    Note that the activity name is "Road Bike".

    If I copy my "Road Bike" activity and name the copy "Road" and change the filter to only look for "Road" it works as expected. This doesn't really work for me because I have other "Road" based activities.

    Feels like, from a programming perspective, the data field isn't handling a space character in the filter ... but I really can't know.

    Thoughts?

    Thanks for your time!

  • I tried to use a global filter with a space "Road Bike" and for me, it works fine on my Forerunner 245 and on the simulator for Fenix 6XPro. Make sure that the configuration string is properly copied to the app setting (the space should be there after pasting the value). If that doesn't work, try to create a simple configuration to test only the "Profile name" filter, example:

    1,1!:1K=Road Bike:#4587520,196641::1#1,1!:1:62:0:0D=1#6291461,1409482753::1#1,1!:1:63:0:0D=1#6:Ion 200 RT!Off:0!High:1!Medium:2!Low:5!Day Flash:63!Night Flash:62#5:Flare RT!Off:0!All Day Flash:8!Day Flash:7!Night Flash:63!Night Steady:5#0::#1:1#0#B3291#2#1#1#0

    Try use the "Rename" option in the activity to see how it behaves when renamed to "Road Bike".