QN-Scale and Renpho ES-CS20M Unable to Record Measurements
Describe the bug The beta 3.0.0 app is able to pair with the scale, but does not appear to pull any data from the scale when attempting to take a measurement.
To Reproduce Steps to reproduce the behavior:
- Pair normally via bluetooth
- Start connecting to scale via app
- Step onto scale
- Wait until measurement settles
- Step off
Reproduced with latest dev version: b440cf9
Expected behavior
- measurements show up in UI
Additional context Attached a debug log.
Debug log Attach a debug log (see Settings -> About -> Save debug log to file) that is captured while reproducing the issue.
I also verified that the scale itself works by using the Renpho companion app (and deleted all configuration before/after attempting to use open scale too).
And I tried the non-beta version too.
Can confirm the same issue.
Same issue. Openscale says it is connected but renfro scale does not show the Bluetooth connected light and no data is transferred. I am on 3.0 (70)
I will leave this issue here open for reference of other issues.
If somebody with a scale are able to fix this problem please send a PR if not I will have to disable the support for this scale at all.
For guidance on how to add a new scale handler into openScale, see the updated wiki page: How to support a new scale
Any idea why the previous configuration doesn't work with the new app? Some direction would be appealing if possible as it seems more likely updates to openscale are the culprit not changes from the scale.
The underlying Bluetooth manager was changed in the rewrite of the app. That was at least my last touch point with this project.
The sub classes where chosen by the name of the scale.
Now, we had multiple scales with the same name identifier and needed a new procedure to choose the right algorithms on a new basis (mac address ranges??).
When now old working scales are broken too, then this means to me that the new selecting algorithm is not properly working?
I have a fitting scale but no knowledge about Android (debugging).
Is it possible to roll back to 2.5.4 or was this a one-way upgrade?
I tried to roll back, no chance. The database changed. So I already lost a week of results, guess I drop the app, it does not make sense anymore. Additionally as any support for my scales is not on the horizon. A pity, such a major change must be reversible.
I tried to roll back, no chance. The database changed. So I already lost a week of results, guess I drop the app, it does not make sense anymore. Additionally as any support for my scales is not on the horizon. A pity, such a major change must be reversible.
Don't give up on it yet. I will probably take a run at the BT comms over Christmas; I have 5 years of data into this app and I'd like to make it work.
The scale saves the last results as well as the Renpho app which works fine still. openScale could never read out historic results.
The scale saves the last results as well as the Renpho app which works fine still. openScale could never read out historic results.
Why would it need to read out historic results from the scale? It stores them directly in the app. I have 5 years of history available in the app.
When your mobile is not in reach when you use the scale or in this case. There are cases and if the scale offers the data, one can match them and check whether all results are already in the app. That's how the Renpho app does it.
I can provide BT sniff and some additional logging if it's any use to anyone. Turns out I have no idea how to make this work... The scale I got should be handled by type 1, judging by what I understood from Wireshark. Reach out if anyone likes me to share what I got.
So I ended up having a LLM do the things I just couldn't do myself. Created PR #1243 and I hope it's good enough for pulling it in. :-)
Thank you @Stullemon!! @oliexdev when should we expect to see this as an update to the app? Sorry I just don't know what to expect in that regard.
Coming here to ask the same question about when the fix would be live. I also have 5 years of data in the app and it previously worked without issues. Version 3.0 did change all my measurements from imperial to metric, but when I went to change them, it seems to have updated the database without issues. The only remaining issue is that it's no longer connecting to my previously very reliable scale.
The scale itself only displays the weight. It doesn't display the body fat percentage or anything. Those have only ever shown up in the connected app, so this update makes the scale less useful.
I suppose the good news is that I have a fairly recent backup of the database from the previous version that I could restore to an old version of the app if absolutely necessary, but obviously I'd rather this work correctly again!
Working again for me. Thank you Oli and Stull. No data lost
I'm still having issues on my end -
| Field | Value |
|---|---|
| Time | 2026-01-06 23:09:45.902 |
| Timezone | America/Los_Angeles (UTC -8h) |
| Session ID | 19b974a462e |
| App | openScale |
| Version | 3.0.1 (71) |
| Package | com.health.openscale |
| Build Type | release |
| Device | Google Pixel 9 Pro XL |
| Android | 16 (API 36) |
| Build ID | 2025122501 |
| Build Time | 2026-01-03T09:42:51Z |
| Git SHA | 4a88820f |
? 2026-01-06 23:10:10.461 D/BluetoothTopBar: User clicked bluetooth icon connect → trying to connect to saved device ES-CS20M
+ 2026-01-06 23:10:10.462 I/BleConnector: Attempting to connect to ES-CS20M
? 2026-01-06 23:10:10.462 D/BleConnector: Switching to new device: Releasing active communicator: null
? 2026-01-06 23:10:10.463 D/BleConnector: Switching to new device: Active communicator released and set to null.
? 2026-01-06 23:10:10.463 D/ScaleHandlerFactory: createCommunicator: Searching for communicator for 'ES-CS20M' (CF:E9:02:17:6F:81). Handler hint: 'ES-CS20M'
+ 2026-01-06 23:10:10.463 I/ScaleHandlerFactory: Modern handler 'ES-CS20M' supports 'ES-CS20M'.
+ 2026-01-06 23:10:10.464 I/ScaleHandlerFactory: Modern communicator 'GattScaleAdapter' created for 'ES-CS20M' with linkMode=CONNECT_GATT.
+ 2026-01-06 23:10:10.464 I/BleConnector: ActiveCommunicator successfully created: GattScaleAdapter. Starting observation job...
? 2026-01-06 23:10:10.465 D/BleConnector: Adapter isConnected: false for ES-CS20M (Status: CONNECTING)
+ 2026-01-06 23:10:10.465 I/BleConnector: Adapter no longer reports connected for ES-CS20M. Current status: CONNECTING. Expecting Disconnected Event.
+ 2026-01-06 23:10:15.490 I/GattScaleAdapter: Found CF:E9:02:17:6F:81 → stop scan + connect
? 2026-01-06 23:10:17.767 D/GattScaleAdapter: Services discovered for CF:E9:02:17:6F:81
? 2026-01-06 23:10:17.768 D/ESCS20mHandler: attach()
? 2026-01-06 23:10:17.769 D/ESCS20mHandler: handleConnected(userId=1, height=170.17992, age=31)
? 2026-01-06 23:10:17.769 D/GattScaleAdapter: → set notify on chr=00002a11-0000-1000-8000-00805f9b34fb svc=00001a10-0000-1000-8000-00805f9b34fb
+ 2026-01-06 23:10:17.769 I/ESCS20mHandler: Session started; waiting for frames…
? 2026-01-06 23:10:17.770 D/BleConnector: Adapter isConnected: true for ES-CS20M (Status: CONNECTING)
+ 2026-01-06 23:10:17.770 I/BleConnector: Successfully connected to ES-CS20M via adapter's isConnected flow.
- 2026-01-06 23:10:17.772 E/GattScaleAdapter: BLE operation failed
java.lang.IllegalArgumentException: could not get CCC descriptor for characteristic 00002a11-0000-1000-8000-00805f9b34fb
at com.welie.blessed.BluetoothPeripheral.setNotify(BluetoothPeripheral.kt:1138)
at com.welie.blessed.BluetoothPeripheral.setNotify(BluetoothPeripheral.kt:1119)
at com.welie.blessed.BluetoothPeripheral.startNotify(BluetoothPeripheral.kt:1093)
at com.health.openscale.core.bluetooth.scales.GattScaleAdapter$transport$1$setNotifyOn$1.invokeSuspend(GattScaleAdapter.kt:237)
at com.health.openscale.core.bluetooth.scales.GattScaleAdapter$transport$1$setNotifyOn$1.invoke(Unknown Source:8)
at com.health.openscale.core.bluetooth.scales.GattScaleAdapter$transport$1$setNotifyOn$1.invoke(Unknown Source:2)
at com.health.openscale.core.bluetooth.scales.GattScaleAdapter$1.invokeSuspend(GattScaleAdapter.kt:80)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:34)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:586)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:829)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:717)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:704)