Supports HRM, notifications + calls, sleep tracking and alarms. Its pretty cheap as well.
+1
Watch looks great but the app is very poor.
+1
Watch is pretty awesome but the app is a mess.
Looks like @f3z is looking to add support for it. :+1: :+1: Just yell if you need help somewhere.
Anyone know much about BLE pairing in terms of gadget bridge? I've managed to find the UUIDs needed for comms
Have a look at https://github.com/Freeyourgadget/Gadgetbridge/wiki/New-Device-Tutorial where we describe discovery and pairing, among others.
@f3z I really want to help, I have a device too and I following the guide to add a new device, I didn't managed to find the UUIDs, is there anything that I can do to help? Maybe together we can finish this faster...
@cpfeiffer I have read through the tutorial and have managed to get the app at least see the device but haven't had much luck with pairing. The watch requires the button to be pressed to complete the pairing process.
Hi @f3z, would be possible for you to share the UUIDs? Thanks.
0000a800-0000-1000-8000-00805f9b34fb
0000a801-0000-1000-8000-00805f9b34fb
0000a802-0000-1000-8000-00805f9b34fb
0000a803-0000-1000-8000-00805f9b34fb
@f3z But pressing the button does not do anything? I had added some bits to the tutorial regarding pairing yesterday (getBondingStyle()). What does your DeviceCoordinator#getBondingStyle() method return?
Hi @cpfeiffer maybe I'm passing through the same problem as @f3z. We can see the watch but after we try to connect, on the original app it vibrates the watch twice so we can press the button or shake it to confirm the pairing and it's not doing this. I tested with BONDING_STYLE_ASK and BONDING_STYLE_NONE, the comments are saying not to use BONDING_STYLE_BOND but any of them were able to make the connection, I believe that we need to specify something more. With BONDING_STYLE_NONE app tries to connect but says that can't create device support, is there any doc showing how to do this? Thanks.
If I could have a look at code, I could say something, but I think you need to find out how to authenticate to the watch, e.g. implement the connectFirstTime() method of your DeviceSupport class. This "first-time" connection will be done after the discovery.
The watch probably expects a specifc write to one of the characteristics, maybe a key exchange or something else in order to display the pairing button.
@cpfeiffer it helped a lot! I going to check how to do this, right now I changed something in the device support class and it can make a connection even if I don't press the button, but I'm going to check how I can implement this connectFirstTime. Thanks again.

I'll post up my hci Snoop log and logcat when I'm near my laptop. The default Lenovo app spits out some debug info which might help.
@joelbars can you please push your changes so I can have a look
Yes, heres the link of my fork: https://github.com/joelbars/Gadgetbridge/tree/LenovoWatch9 everything I did so far is there, much is copy from the other classes of the app. Seems that the app writes a wake lock and expects the button to be pressed to confirm the connection, at least is what I seemed to notice on the logcat.
Thanks @joelbars
07-28 23:22:53.136 13129-13129/? D/LogUtils: addBleScanCallBack
07-28 23:22:53.136 13129-13129/? D/BluetoothAdapter: startLeScan(): null
07-28 23:22:53.140 13129-13129/? D/BluetoothAdapter: isLeEnabled(): ON
07-28 23:22:53.146 13129-13141/? D/BluetoothLeScanner: onScannerRegistered() - status=0 scannerId=8 mScannerId=0
07-28 23:22:57.041 13129-13129/? I/AppCompatDelegate: The Activity's LayoutInflater already has a Factory installed so we can not install AppCompat's
07-28 23:22:57.069 13129-13187/? I/LogUtils.java: [2018-07-28 23:22:57 com.pmpd.core.util.LogUtils f Line:60] - BleHelper:Bluetooth device cache: start connecting devices, clear device cache
07-28 23:22:57.071 13129-13187/? I/LogUtils.java: [2018-07-28 23:22:57 com.pmpd.core.util.LogUtils f Line:60] - BleHelper:Bluetooth device cache: save device mac address
07-28 23:22:57.072 13129-13187/? D/BluetoothGatt: close()
07-28 23:22:57.073 13129-13187/? D/BluetoothGatt: unregisterApp() - mClientIf=0
cancelOpen() - device: 1C:87:79:2E:10:B5
07-28 23:22:57.073 13129-13187/? V/LogUtils: Connecting without reflection
07-28 23:22:57.074 13129-13187/? D/BluetoothGatt: connect() - device: 1C:87:79:2E:10:B5, auto: false
registerApp()
registerApp() - UUID=c9dfeaeb-cdec-47f7-8c4b-78e094e3fa3d
07-28 23:22:57.078 13129-13141/? D/BluetoothGatt: onClientRegistered() - status=0 clientIf=9
07-28 23:22:58.365 13129-13141/? D/BluetoothGatt: onClientConnectionState() - status=0 clientIf=9 device=1C:87:79:2E:10:B5
07-28 23:22:58.365 13129-13141/? W/Connect: onConnectionStateChange::0 or 2
07-28 23:22:58.374 13129-13129/? I/LogUtils.java: [2018-07-28 23:22:58 com.pmpd.core.util.LogUtils f Line:60] - BleHelper:BroadcastReceiver:: onReceiveandroid.bluetooth.device.action.ACL_CONNECTED
07-28 23:22:58.703 13129-13141/? D/BluetoothGatt: onConnectionUpdated() - Device=1C:87:79:2E:10:B5 interval=6 latency=0 timeout=500 status=0
07-28 23:22:58.967 13129-13187/? D/BluetoothGatt: discoverServices() - device: 1C:87:79:2E:10:B5
07-28 23:22:58.971 13129-13141/? D/BluetoothGatt: onSearchComplete() = Device=1C:87:79:2E:10:B5 Status=0
07-28 23:22:58.971 13129-13141/? W/Connect: onServicesDiscovered::0
07-28 23:22:58.973 13129-13187/? I/LogUtils.java: [2018-07-28 23:22:58 com.pmpd.core.util.LogUtils f Line:60] - BleHelper:Bluetooth device cache: save device mac address1C:87:79:2E:10:B5
07-28 23:22:58.993 13129-13187/? D/写入: device = 0201060EFF03A350313031351C87792E10B5080957617463682039030300A800000000000000000000000000000000000000000000000000000000000000
07-28 23:22:59.002 13129-13141/? D/BluetoothGatt: onConnectionUpdated() - Device=1C:87:79:2E:10:B5 interval=39 latency=0 timeout=500 status=0
07-28 23:22:59.034 13129-13187/? D/LogUtils: addOnDataAvailableListener
07-28 23:22:59.035 13129-13187/? D/BluetoothGatt: setCharacteristicNotification() - uuid: 0000a801-0000-1000-8000-00805f9b34fb enable: true
07-28 23:22:59.041 13129-13187/? D/LogUtils: setNotification : true
07-28 23:22:59.141 13129-13141/? I/BleHelper: onDescriptorWrite: status=0,getCharacteristic0000a801-0000-1000-8000-00805f9b34fb,getUuid:00002902-0000-1000-8000-00805f9b34fb
07-28 23:22:59.142 13129-13187/? D/LogUtils: Write command:2301043155-040105-00BE
07-28 23:22:59.143 13129-13187/? D/LogUtils: Successfully written: 2301043155-040105-00BE
07-28 23:22:59.239 13129-13187/? D/LogUtils: Write return: 2301011355-008C
07-28 23:23:05.821 13129-13187/? D/LogUtils: Write return: 2301041313-010105-0166
removeOnDataAvailableListener
That's the logcat when doing the initial scan and pairing on the official app. These lines here are once the watch is discovered and clicked on for pairing:
07-28 23:22:59.142 13129-13187/? D/LogUtils: Write command:2301043155-040105-00BE
07-28 23:22:59.143 13129-13187/? D/LogUtils: Successfully written: 2301043155-040105-00BE
07-28 23:22:59.239 13129-13187/? D/LogUtils: Write return: 2301011355-008C
Once the button is pressed on the watch the next line is shown. The numbers 23010431xx-040105-00xx never change when doing the write command from the app. The xx's represent numbers which change for each consecutive request to pair with the watch.
Hy guys!
there are news about the app integration?
Do you still think to be possible the watch pairing or we should forget forever it? :(
Hi @Username83, we are still working on this.
Oh Great!
Thanks!!!!
Hey guys, i think i mostly understood how the device communication is working, at least for the basic stuff. I will finish some initial implementation and then push it, so you can take a look on it.
Well done @maxirnilian ! I have tested your code with two Watch 9's and both are working fine. Any plans to add steps tracking?
Not yet, no. I think this needs some further investigation of the device communication. Feel free to take a look :blush:. I really can recommend doing BT HCI snoop logs on your phone while using the original app and playing with something like gatttool on your PC afterwards. You perhaps take a look at Watch9Constants.java, I "tried" to categorize those commands/responses I could identify (in a more or less useful way), maybe that's somehow helpful to you.
If you have any questions, I will try to help :+1: .
Thanks @maxirnilian. Have forked the latest merge. Will have a look and see if I can implement the steps. I have seen some comms related to steps so will see how it goes.
Could you list the steps needed to pair the watch? I build the app and ran it on my LineageOS Xiaomi. The app lists the W9 device but watch never vibrates to finish up the pairing process.
Did you use the Lenovo/iPowerful app on the same installation? If yes, make
sure the watch is not paired with the phone in the Bluetooth settings. The
pairing from the lenovo app stays even after uninstallation.
That worked for my LG G2 on LineageOS 14.1
Force stopping Lenovo app before pairing helped. Works great but shows -1% battery at all times - hardly a problem for now. 👍
As LizardWithHat already mentioned, you can't connect both apps simultaneously (to be honest, didn't had that scenario in mind, maybe it's possible to implement that somehow)
Yep, the battery issue is related to #1197. If I didn't made a mistake in handling battery info, this should be a more general problem.
No, please don't worry about such scenarios.
Does anyone know if this will work with Lenovo's Watch X as well (pretty similar device), or is it unlikely (different device id or something)?
Haven't seen anyone post a device request for the X, so either that watch is too new, or no one simply cares :)
Hi @acyrul . It most likely won't work for the Watch X.
Hey @acyrul, did you already tried to find/pair it with gadgetbridge? Does it perhaps show up as "Watch 9"? From watching some yt reviews the watch looks quite the same as the watch9 (except the little screen and the hr sensor). So maybe it's not that hard to get it working.
@maxirnilian No, haven't even got to installing the app, since I figured it wouldn't work with my watch (later kinda confirmed by @f3z), but I might try it out in the evening.
UPDATE: Ok, so... It DOES work :D Well, partially.
The app found my "Watch X" BT device in an instant and connected to it without a hitch. Time calibration works fine, so does synchronizing the alarms from the app.
Can't get the call/message notifications to work, but (for SOME reason) I got them to work only a couple of times with Lenovo Watch (tried keeping it in the background, foreground, closed completely, with the screen locked...). However, on the device list the watch doesn't have that "shaky clock" icon, so maybe this Watch 9 function just doesn't work with Watch X.
The weather status doesn't work as well (how do you configure that btw?), but that ALSO doesn't work in Lenovo's app (can't get any weather info in my location, apparently).
And the heart rate sensor doesn't work (obviously).
But, overall, I think that is a solid base for adding support for Watch X.
@acyrul Good news! Thanks for the feedback. Support for the watch 9 is not yet feature complete, just time calibration, alarms, low battery, step goal and notifications are working at the moment. So following your results, quite most of it is working for the watch x too. I guess the notifications fail because the X will display those on the screen (correct me if my guess is wrong :sweat_smile: ) instead of rotating the second hand.
As you mentioned, it looks like a good point to start from. But nonetheless, to support watch x only features it's maybe required to have some devs owning it to take a look for.
@danielpinto8zz6 if you want I can email you, but the hx03f seems to be a completely different device (except the name "lenovo" :smile: )
@maxirnilian Ahh, that explains it. I forgot the Watch 9 didn't have a screen.
I've cloned the repository to take a look at the code, but with my limited experience with coding in Android and BT device communication I'm pretty sure someome else would have to be the main force behind Watch X support. I could probably help A BIT and do some testing :smiley:
Btw, we should probably set up a device request with a separate thread, so that we don't hijack this one. :laughing:
Hi there. I am pretty sure that is better than Lenovo Watch app. But do you think that step and sleep tracking will be available soon on this app? Is the only thing that make me to not switch
@acyrul If you would like you can try to make a bluetooth log while receiving a message (using the lenovo app of course) and afterwards see if you can find that message in there (e.g. using wireshark). Maybe it is not too hard to add notification feature if you can find some information.
In case you open a new device request, maybe add a reference to this issue, since progress in activity tracking and maybe some other features will (hopefully) affect both devices.
@frankoprifti Do not expect that happening soon :disappointed: It is not difficult to get the steps for the current day, but I am not sure if this is very useful, since this would mean you have to take care to sync your steps every single day. So until someone finds a way to get a step history from the watch... no, not soon.
@maxirnilian even lenovo watch app is not doing it anymore when it past midnight the step counter reset to 0 and is not saved. And the graph about the steps shows the waves unrelated. And the sleep is not being tracked anymore.
Using the debug tool I've discovered that my watch freezes when I send a test message via WhatsApp.
If I can be of any help just @ me and I'll help however I can.
@FK78 I was facing the same Problem, didn't found a solution for it and finally my watch died. Checking the Battery voltage I got arround 2.9V. Thought this should be enough (and the watch maybe thought the same), but after trying (just to be sure) a new battery the watch is fully working again. Maybe that's a solution for you too?
Some additional facts: Opening the watch shows that Lenovo is using the C001S watch model manufactured by Smart Movt. Maybe this info is helpful for any future development.
Hello,
Just one thing, can I download the code to learn how to make a app for this watch? I'm very interesting about how to comunicate the phone with the watch, how send notifications to the watch. I want to help you about this development :) (lenovo's app is horrible and basic...). Do you have a Lenovo's API or something similar for this watch?
Thanks and regards.
EDIT: Ok, I'm reading the code... is not easy XD
Any way to implement find my device feature, like when you press watch 9 button it will alarm the phone, as this is the only feature missing for me, all others work awesome. Thank you for this app.
Sorry for the belated answer @luissmo. There's no api, but you can take a look at the Watch9Constants.java file (first referenced snipped below), where you can find information about some gatt commands (mostly basic stuff).
@grapeba Feel free to take a look on it. Pressing the button should already be recognized (more or less). In theory you could implement what ever behavior you want in the below lines of code :wink:
Observing source code of original Lenovo app give me this hints
get day steps
CMD_DAY_STEPS = new byte[]{0x10, 0x03};
RESP_DAY_STEPS = new byte[]{0x08, 0x10, 0x03};
steps are in byte[8] and byte[9]
long sit reminder get settings time
READ_VALUE
CMD_LONG_SIT_TIME = new byte[]{0x3, 0x52};
RESP_LONG_SIT_TIME = new byte[]{0x08, 0x3, 0x52};
long sit reminder get status (on or off)
READ_VALUE
CMD_LONG_SIT_STATUS = new byte[]{0x3, 0x51};
RESP_LONG_SIT_STATUS = new byte[]{0x08, 0x3, 0x51};
result in byte[8]
long sit reminder set status (on or off)
WRITE_VALUE
CMD_LONG_SIT_SET_STATUS = new byte[]{0x3, 0x51};
set byte[8] to 1 or 0
disconnect reminder get status (on or off)
READ_VALUE
CMD_DISCONNECT_STATUS = new byte[]{0x0, 0x11};
RESP_DISCONNECT_STATUS = new byte[]{0x08, 0x0, 0x11};
result in byte[8]
disconnect reminder set status (on or off)
WRITE_VALUE
CMD_DISCONNECT_SET = new byte[]{0x0, 0x11};
set byte[8] to 1 or 0
Hi all,
Interested to read about developments for Watch 9 support in GB - is this still being worked on at all? The stock Lenovo app has now stopped functioning and no longer maintains step history or tracks sleep, so a solution would be very welcome.
I am aware this watch is basic/low-end, but I actually really like it - it has all the features I want, and is quite pretty in its 'constellation' version. I'd really rather not upgrade to a more expensive watch that isn't as pretty just due to the app!
I installed GB and could connect to the watch successfully. I notice calibration, alarms and setting of goals is already supported. If there is any way step and sleep history could be implemented, and maybe also notifications if possible, that would be amazing - leaving just the 'remote camera control' and 'find my phone' features on the wish list for full support. I don't code myself, but am more than happy to help out any way I can - testing, research, etc. - and would be totally happy to donate towards development costs.
Thanks for all your work so far, and I'm crossing my fingers my watch can live on! 😊
Most helpful comment
+1
Watch looks great but the app is very poor.