Withings Health Binding [5.0.0.0;6.0.0.0)

Key Value
uid withings
type binding
author Nanna Agesen
version range [5.0.0;6.0.0)
download org.openhab.binding.withings-5.2.0-SNAPSHOT.jar

Withings Health Binding

A comprehensive openHAB binding for Withings health devices — smart scales, blood pressure monitors, activity trackers, sleep monitors, and thermometers. Retrieves body measurements, cardiovascular data, activity metrics, and sleep analysis via the Withings Cloud API v2 with full OAuth2 authorization.

Features

  • Body Composition — Weight, fat ratio, fat mass, fat-free mass, muscle mass, bone mass, hydration, wrist skin temperature (ScanWatch 2)
  • Cardiovascular Monitoring — Heart rate, systolic/diastolic blood pressure, SpO2, pulse wave velocity, VO2 max, vascular age, body temperature, ECG Afib classification (ScanWatch 2)
  • Activity Tracking — Steps, distance, calories, elevation, light/moderate/intense activity durations, active duration, heart rate zones (0–3)
  • Sleep Analysis — Total sleep, deep/light/REM duration, wakeup count, sleep score, snoring episodes, breathing disturbances, heart rate and respiration during sleep, HRV (RMSSD, SDNN, quality) and skin temperature from sleep summary (ScanWatch 2)
  • Device Status — Battery level, model name, last session timestamp — per individual physical device
  • Device Auto-Discovery — Physical devices appear in the openHAB Inbox under the person bridge
  • OAuth2 Web Authorization — Built-in servlet at /withings for browser-based authorization (modeled after HomeConnect binding)
  • Automatic Token Refresh — Tokens refreshed transparently before expiry, persisted via StorageService (survives reboots — even with .things file configuration)
  • Multi-Person Support — Multiple person bridges per account, filtered by Withings user ID
  • Configurable Polling — Separate intervals for body (15 min), activity (30 min), sleep (60 min), and device info (60 min)

:warning: Upgrading from v1.x — Breaking Changes

withings:person is now a Bridge (was a Thing). The device status channels have moved to a dedicated withings:device thing.

Required changes to your configuration:

  1. Change Thing personBridge person in your .things file
  2. Add a nested Thing device for each physical device (or discover via Inbox — see Quick Start)
  3. Update items linking device channels:
    • Old: withings:person:home:john:device#battery
    • New: withings:device:home:john:body_plus:device#battery
  4. No re-authorization needed — existing OAuth2 tokens remain valid

Full step-by-step migration guide: README — Upgrading from v1.x


Supported Things

Thing Type Description
account (Bridge) Withings API account — manages OAuth2 tokens
person (Bridge) Individual user — polls measurements by user ID, parent of physical devices
device A physical Withings device — battery, model, last sync (new in v2.0.0)

Channels

Body Measurements

Channel Type Description
body#weight Number:Mass Body weight (kg)
body#fatRatio Number Body fat percentage (%)
body#fatMass Number:Mass Fat mass (kg)
body#fatFreeMass Number:Mass Fat-free / lean body mass (kg)
body#muscleMass Number:Mass Muscle mass (kg)
body#boneMass Number:Mass Bone mass (kg)
body#hydration Number:Mass Body hydration (kg)
body#lastMeasurement DateTime Timestamp of most recent measurement
body#skinTemperature Number:Temperature Wrist skin temperature from sleep summary (°C) (ScanWatch 2, v3.0.0)

Devices: Body, Body+, Body Comp, Body Scan

Cardiovascular

Channel Type Description
cardiovascular#heartPulse Number Heart rate (bpm)
cardiovascular#systolicBP Number:Pressure Systolic blood pressure (mmHg)
cardiovascular#diastolicBP Number:Pressure Diastolic blood pressure (mmHg)
cardiovascular#pulseWaveVelocity Number Pulse wave velocity (m/s)
cardiovascular#vo2Max Number VO2 Max (ml/min/kg)
cardiovascular#vascularAge Number Estimated vascular age (years)
cardiovascular#spo2 Number Blood oxygen saturation (%)
cardiovascular#temperature Number:Temperature Body temperature (°C)
cardiovascular#afib Number ECG Afib classification: 0=sinus rhythm, 1=Afib detected, 2=inconclusive (ScanWatch 2, v3.0.0)

Devices: BPM Connect, BPM Core, Body Scan, ScanWatch, Thermo

Activity

Channel Type Description
activity#steps Number Steps taken today
activity#distance Number:Length Distance travelled (m)
activity#calories Number:Energy Active calories burned (kcal)
activity#totalCalories Number:Energy Total calories — active + passive (kcal)
activity#elevation Number Floors climbed
activity#softActivity Number:Time Light activity duration (min)
activity#moderateActivity Number:Time Moderate activity duration (min)
activity#intenseActivity Number:Time Intense activity duration (min)
activity#activeDuration Number:Time Total active duration (min)
activity#hrAverage Number Average heart rate (bpm)
activity#hrMin Number Minimum heart rate (bpm)
activity#hrMax Number Maximum heart rate (bpm)
activity#hrZone0 Number:Time Time in HR zone 0 — rest (min)
activity#hrZone1 Number:Time Time in HR zone 1 — light (min)
activity#hrZone2 Number:Time Time in HR zone 2 — moderate (min)
activity#hrZone3 Number:Time Time in HR zone 3 — intense (min)

Devices: ScanWatch, Steel HR, Move, Go

Sleep

Channel Type Description
sleep#totalSleepTime Number:Time Total time asleep (min)
sleep#totalTimeInBed Number:Time Total time in bed (min)
sleep#deepSleepDuration Number:Time Deep sleep duration (min)
sleep#lightSleepDuration Number:Time Light sleep duration (min)
sleep#remSleepDuration Number:Time REM sleep duration (min)
sleep#nbRemEpisodes Number Number of REM episodes
sleep#wakeupCount Number Wakeup count
sleep#wakeupDuration Number:Time Time awake during night (min)
sleep#outOfBedCount Number Number of out-of-bed events
sleep#timeToSleep Number:Time Time to fall asleep (min)
sleep#sleepLatency Number:Time Sleep latency (min)
sleep#wakeupLatency Number:Time Time in bed after waking (min)
sleep#sleepScore Number Sleep quality score (0–100)
sleep#sleepEfficiency Number Sleep efficiency (%)
sleep#snoring Number:Time Snoring duration (min)
sleep#snoringEpisodes Number Number of snoring episodes
sleep#breathingDisturbances Number Breathing disturbance index
sleep#nightEvents Number Total night events
sleep#sleepHrAverage Number Average HR during sleep (bpm)
sleep#sleepHrMin Number Min HR during sleep (bpm)
sleep#sleepHrMax Number Max HR during sleep (bpm)
sleep#sleepRrAverage Number Average respiration rate (brpm)
sleep#sleepRrMin Number Min respiration rate (brpm)
sleep#sleepRrMax Number Max respiration rate (brpm)
sleep#sleepHrvRmssd Number HRV RMSSD (ms) (ScanWatch 2, v3.0.0)
sleep#sleepHrvSdnn Number HRV SDNN (ms) (ScanWatch 2, v3.0.0)
sleep#sleepHrvQuality Number HRV quality score (ScanWatch 2, v3.0.0)
sleep#sleepSkinTemperature Number:Temperature Wrist skin temperature from sleep (°C) (ScanWatch 2, v3.0.0)

Devices: Sleep Analyzer, ScanWatch, Steel HR

Device Status (new in v2.0.0)

Channel Type Description
device#battery String Battery level (high / medium / low)
device#model String Device model name (e.g. Body+, ScanWatch)
device#lastSession DateTime Timestamp of last recorded session

Multiple devices? Each physical device gets its own withings:device thing under the person bridge. Devices are auto-discovered via the openHAB Inbox — just scan from the person bridge. (new in v2.0.0)

Devices: All Withings devices

Quick Start

withings.things

Bridge withings:account:home "Withings Account" [
    clientId="YOUR_CLIENT_ID",
    clientSecret="YOUR_CLIENT_SECRET",
    redirectUri="https://your-openhab.example.com/callback"
] {
    Bridge person nanna "Nanna" [
        userId=17873009,
        pollingIntervalBody=15,
        pollingIntervalActivity=30,
        pollingIntervalSleep=60
    ] {
        Thing device body_plus "Withings Body+" [
            deviceId="YOUR_DEVICE_ID"
        ]
    }
}

Tip: Leave the device thing out initially. Authorize first, then go to Settings → Things → (person bridge) → Scan to discover devices automatically. Copy the deviceId from the Inbox entry.

withings.items

Group gWithings "Withings Health" <body>

// Body
Number:Mass   Withings_Weight         "Weight [%.1f kg]"                        (gWithings) { channel="withings:person:home:nanna:body#weight" }
Number        Withings_Fat_Ratio      "Fat Ratio [%.1f %%]"                     (gWithings) { channel="withings:person:home:nanna:body#fatRatio" }
Number:Mass   Withings_Muscle_Mass    "Muscle Mass [%.1f kg]"                   (gWithings) { channel="withings:person:home:nanna:body#muscleMass" }
DateTime      Withings_Last           "Last Measurement [%1$td-%1$tm-%1$tY]"    (gWithings) { channel="withings:person:home:nanna:body#lastMeasurement" }

// Device — note: withings:device thing, not withings:person
String        Withings_Battery        "Battery [%s]"                            (gWithings) { channel="withings:device:home:nanna:body_plus:device#battery" }
String        Withings_Model          "Device [%s]"                             (gWithings) { channel="withings:device:home:nanna:body_plus:device#model" }
DateTime      Withings_Last_Sync      "Last Sync [%1$td-%1$tm-%1$tY]"           (gWithings) { channel="withings:device:home:nanna:body_plus:device#lastSession" }

OAuth2 Authorization

  1. Configure bridge with clientId, clientSecret, and redirectUri
  2. Open http://your-openhab:8080/withings in a browser
  3. Click “Authorize with Withings” → log in → grant all permissions
  4. Note the User ID shown on success page → use for person bridge userId

Upgrading from v1.x? See the migration guide in the README. No re-authorization needed — existing tokens remain valid. Change Thing personBridge person in your .things file and update device channel items to the new withings:device UIDs.

What’s New in v3.0.1

  • Fix: sleep#sleepEfficiency now correctly reports percentage (0–100) — previously the raw API ratio (0.0–1.0) was returned without conversion

What’s New in v3.0.0

New Channel Type Device
cardiovascular#afib Number ECG Afib classification (0/1/2) — ScanWatch 2
sleep#sleepHrvRmssd Number HRV RMSSD during sleep (ms) — ScanWatch 2
sleep#sleepHrvSdnn Number HRV SDNN during sleep (ms) — ScanWatch 2
sleep#sleepHrvQuality Number HRV quality score — ScanWatch 2
body#skinTemperature Number:Temperature Wrist skin temperature from sleep summary (°C) — ScanWatch 2

See the full changelog on GitHub.


Prerequisites

  • Withings Developer Account with registered application
  • At least one Withings health device linked to your account
  • Public callback URL for OAuth2 (or use pre-configured tokens)
  • Required scopes: user.metrics, user.activity, user.sleepevents, user.info

Resources

Excellent - I have been waiting for this. Currently I have an Home Assistent instance running just for Withings, and polled from OpenHAB via http the Withings data. So this binding would be way more simple for me - thanks!

Only I am having OAuth issues… My OpenHAB is not accessible from the internet, so I am having issues with Redirect URI. I then thought, that the ‘OpenHAB Cloud’ could help: ‘https://home.myopenhab.org/config’. When using '../withings’ I landed with the right parameters in the Withings Authentication page, but when I allowed access I got ‘An error occurred while getting authorization: Invalid state’. In the OpenHAB logs the following was listed:

  • Couldn’t find a user with the provided authentication code pending
  • Token issuing failed: invalid_grant

I then tried entering ‘www.google.com’ for Redirect URI in both, the bridge-binding and the Withings Dev Account. As a result I then received an code, but only one… so this was not sufficient for the bridge binding.

My OpenHAB 5.1.3 runs on RPI on Docker.

~~~~~~~~~~~

Update: Solved :slight_smile:

I then tried as callback URL ‘http://192.168.178.135:8083/withings‘ . So it seems the ‘withings’ in the end made the difference. Then the flow ended with Success!!!
Small observation: in the success window the ‘User ID’ is mentioned, it is required to add an OpenHAB Thing for the User. I have ScanWatch and Body+, waiting now for the values to arrive :-). Thanks again, great binding!

Now that the authorization is working fine the binding starts polling. Here is what I found, seems format mismatch:

2026-04-10 12:11:34.931 [ERROR] [g.withings.handler.WithingsApiClient] - Error fetching sleep summary: java.lang.NumberFormatException: Expected an int but was 0.96 at line 1 column 357 path $.body.series[0].data.sleep_efficiency
com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Expected an int but was 0.96 at line 1 column 357 path $.body.series[0].data.sleep_efficiency
        at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:267) ~[?:?]
        at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:257) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:561) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:519) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:561) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:519) ~[?:?]
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:40) ~[?:?]
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:84) ~[?:?]
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:64) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:561) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:519) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.readIntoField(ReflectiveTypeAdapterFactory.java:271) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$FieldReflectionAdapter.readField(ReflectiveTypeAdapterFactory.java:561) ~[?:?]
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:519) ~[?:?]
        at com.google.gson.Gson.fromJson(Gson.java:1359) ~[?:?]
        at com.google.gson.Gson.fromJson(Gson.java:1260) ~[?:?]
        at com.google.gson.Gson.fromJson(Gson.java:1170) ~[?:?]
        at com.google.gson.Gson.fromJson(Gson.java:1107) ~[?:?]
        at org.openhab.binding.withings.handler.WithingsApiClient.getSleepSummary(WithingsApiClient.java:254) ~[?:?]
        at org.openhab.binding.withings.handler.WithingsPersonHandler.pollSleep(WithingsPersonHandler.java:409) ~[?:?]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[?:?]
        at java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[?:?]
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[?:?]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[?:?]
        at java.lang.Thread.run(Thread.java:1583) [?:?]
Caused by: java.lang.NumberFormatException: Expected an int but was 0.96 at line 1 column 357 path $.body.series[0].data.sleep_efficiency
        at com.google.gson.stream.JsonReader.nextInt(JsonReader.java:1353) ~[?:?]
        at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:265) ~[?:?]
        ... 28 more

Yes, same format error here as well.

for completeness, I have also created an GitHub issue: Error 'NumberFormatException' · Issue #1 · Prinsessen/openhab-withings-binding · GitHub

I will have a look at it, in a day or two :blush:

Hi, thanks for reporting this!

I’ve identified and fixed the issue. The sleep_efficiency field in the DTO was declared as int, but the Withings API returns it as a float (e.g. 0.96 representing 96%), causing Gson to throw a NumberFormatException.

Fix: Changed public int sleep_efficiency → public double sleep_efficiency in WithingsApiResponse.java.

The fix is available now — you can grab the updated JAR from the GitHub repository.

Sorry for the inconvenience!

Thanks a lot! Works perfectly now! Also the OAuth flow did work fine in the last weeks. In my opinion it should become an ‘official’ AddOn…

I don’t know if you noticed, I made a couple of defensive fix while I was at it, so I hope it will run nice and smooth now :ok_hand::ok_hand:

  • Defensive fix: rr_average, rr_min, rr_max — Respiration rate fields changed from int
    to double as the Withings API may return decimal values for these measurements.

  • Defensive fix: breathing_disturbances_intensity — Changed from int to double
    for the same reason — intensity values can be fractional.

These are precautionary fixes following the same root cause as v1.1.1 (sleep_efficiency
NumberFormatException). No crashes have been reported for these fields yet, but better
safe than sorry!

Thanks for the fix!

Is there any chance to add more channels, specifically battery level for ScanWatch?

Thanks for the suggestion — and great timing!

I just released v1.2.0 which includes exactly what you asked for. There’s now a device channel group with three channels per person:

Channel Type Description
device#battery String Battery level (high / medium / low)
device#model String Device model name (e.g. ScanWatch)
device#lastSession DateTime Timestamp of last recorded session
The release also adds a bunch of new sleep channels (REM, light/deep durations, breathing disturbances, snoring, HR during sleep) and HR zone activity channels — full details in the release notes.

Download: Release v1.2.0 — Device channels, extended sleep & activity · Prinsessen/openhab-withings-binding · GitHub

:warning: Re-authorization required if upgrading — this version adds the user.info scope which wasn’t requested before. Just open http(s)://your-openhab:8080/withings and click Authorize with Withings again. Takes 30 seconds.

Since I don’t have a ScanWatch myself to test against, it would be great to hear whether device#battery populates correctly on yours. Let me know how it goes!

:package: Note: This version isn’t on the marketplace yet — I want to validate it against a few more device types (including ScanWatch) before pushing a wider release. The JAR above is the fastest way to get it right now.

Battery level for ScanWatch is working fine for me! Thanks for the improvement.

Did you read my reply on GitHub ?

Thanks Martin, great to hear! Based on feedback like yours I’ve just published the binding to the openHAB community Marketplace — If you know others with Withings devices, feel free to point them there. Always appreciate the testing! :raising_hands:

I have made some refactoring of the binding, to address what you asked for. Better handeling of multible devices.

In v2.0.0, withings:person is changed from a Thing to a Bridge (so physical devices can be its children).

In your .things file, change Thing personBridge person and add a nested Thing device:

// BEFORE (v1.x)
Bridge withings:account:home [...] {
    Thing person nanna "Nanna" [userId=17873009, ...]
}

// AFTER (v2.0)
Bridge withings:account:home [...] {
    Bridge person nanna "Nanna" [userId=17873009, ...] {
        Thing device body_plus "Withings Body+" [deviceId="YOUR_DEVICE_ID"]
    }
}

I successfully installed the new V2.0 binding from the Marketplace and almost all works well with my ScanWatch 2!

The only issue I see so far : There is no data from the BodyTemperature channel.

withings:person:xxxxxx:cardiovascular#temperature

The linked item (Number:Temperature) shows always NULL.

The Withings app however does show the temperature values, so the device seems to report them.

Hi DietmarNusch,

Thanks for the report and for testing with ScanWatch 2 — this is helpful!

I’ve traced through the code and both measure type 12 (wrist/skin temperature) and 71 (body temperature) are included in the API request and handled in the handler. So it’s not a missing implementation — but there is a likely cause.

The binding filters out measurement groups where category != 1 (to exclude estimated/goal data). The ScanWatch 2 may report temperature measurements with a different category or attrib value compared to other Withings devices, which would cause them to be silently skipped.

To confirm, please enable DEBUG logging for the binding. In the OpenHAB console run: log:set DEBUG org.openhab.binding.withings

Then wait for the next poll cycle (up to 5 minutes) and look for lines containing either “Skipping measure group” or “Received measure type=71”.

If temperature groups are being skipped, please share the relevant log lines and I can push a targeted fix immediately. This is already on my list for the next patch release.

Thanks again for taking the time to report this!

Unfortunately I see none of the patterns you mentioned, even with log level set to TRACE :frowning:
I see traces from these API requests every few minutes.


Withings API https://wbsapi.withings.net/measure response
Withings API https://wbsapi.withings.net/v2/measure response
Withings API https://wbsapi.withings.net/v2/sleep response
Withings API https://wbsapi.withings.net/v2/user response

If you need more details from one of those, let me know.

Thanks,
Dietmar

Hi DietmarNusch,

I’ve found and fixed the root cause!

The binding was sending category=1 as a parameter in the API request itself, which tells the Withings backend to filter out non-device measurements before returning data. On ScanWatch 2, temperature readings (types 12 and 71) appear to be classified under a different category — so they were stripped server-side and never reached the binding. That’s why you saw no log lines even at TRACE level — the data simply wasn’t in the API response.

To test the fix, download the patched JAR directly:

https://github.com/Prinsessen/openhab-withings-binding/raw/fix/temperature-category-filter/org.openhab.binding.withings-5.2.0-SNAPSHOT.jar

Replace your existing JAR in the addons/ folder and wait ~60 seconds for OpenHAB to hot-reload. No restart needed.

Please let me know if temperature data starts appearing — if so, I’ll merge and tag this as v2.1.0 for the Marketplace. If not, we’ll dig deeper into whether ScanWatch 2 reports temperature via a different API endpoint entirely.

Thanks again for the thorough debugging!

Hm, no luck so far.

This is now the active bundle:

373 │ Active │  80 │ 5.2.0.202605010346    │ openHAB Add-ons :: Bundles :: Withings Health Binding

But still no temperature values…

Two observations form the logs:

  1. When I disable/enable the withings:person Thing, I see this right after the first
    Withings API https://wbsapi.withings.net/measure response
2026-05-01 09:28:50.475 \[DEBUG\] \[things.handler.WithingsPersonHandler\] - Processing 7 measurement groups
2026-05-01 09:28:50.475 \[DEBUG\] \[things.handler.WithingsPersonHandler\] - Received measure type=54 value=98 unit=0 (group date=1777070427 category=1 attrib=0)
2026-05-01 09:28:50.475 \[DEBUG\] \[things.handler.WithingsPersonHandler\] - Received measure type=54 value=100 unit=0 (group date=1777070505 category=1 attrib=0)
2026-05-01 09:28:50.476 \[DEBUG\] \[things.handler.WithingsPersonHandler\] - Received measure type=54 value=100 unit=0 (group date=1777070547 category=1 attrib=0)
2026-05-01 09:28:50.476 \[DEBUG\] \[things.handler.WithingsPersonHandler\] - Received measure type=11 value=96 unit=0 (group date=1777217865 category=1 attrib=0)
2026-05-01 09:28:50.476 \[DEBUG\] \[things.handler.WithingsPersonHandler\] - Received measure type=54 value=97 unit=0 (group date=1777217930 category=1 attrib=0)
2026-05-01 09:28:50.476 \[DEBUG\] \[things.handler.WithingsPersonHandler\] - Received measure type=11 value=83 unit=0 (group date=1777493424 category=1 attrib=0)
2026-05-01 09:28:50.476 \[DEBUG\] \[things.handler.WithingsPersonHandler\] - Received measure type=54 value=97 unit=0 (group date=1777493490 category=1 attrib=0)
  1. When I link a new item to the

withings:person:da426a4256:cardiovascular#temperature

channel. I see this message in the log:

2026-05-01 09:25:43.516 [TRACE] [g.withings.handler.WithingsApiClient] - Withings API https://wbsapi.withings.net/measure response (200): {"status":0,"body":{"updatetime":1777493495,"timezone":"Europe\/Berlin","measuregrps":[{"grpid":7681648221,"attrib":0,"date":1777493490,"created":1777493495,"modified":1777493495,"category":1,"deviceid":"xxxxxxxxxx","hash_deviceid":"xxxxxxxxx","measures":[{"value":97,"type":54,"unit":0,"algo":285343749,"fm":3,"apppfmid":9,"appliver":3411,"algo_params":{"1":0,"2":3}}],"modelid":94,"model":"ScanWatch 2","comment":null,"timezone":"Europe\/Berlin","is_inconclusive":false}]}}
2026-05-01 09:25:43.517 [DEBUG] [things.handler.WithingsPersonHandler] - Processing 1 measurement groups
2026-05-01 09:25:43.517 [DEBUG] [things.handler.WithingsPersonHandler] - Received measure type=54 value=97 unit=0 (group date=1777493490 category=1 attrib=0)
2026-05-01 09:25:43.518 [DEBUG] [things.handler.WithingsPersonHandler] - Withings body updated: 1 measure types from 1 groups (accepted=1, skipped=0)



Maybe this gives some hint?