Skip to content

[bluetooth.generic] Preserve decimals when writing integer fields with a DecimalExponent - #21528

Open
vkolotov wants to merge 1 commit into
openhab:mainfrom
vkolotov:vkolotov/bluetooth-generic-decimal-exponent
Open

[bluetooth.generic] Preserve decimals when writing integer fields with a DecimalExponent#21528
vkolotov wants to merge 1 commit into
openhab:mainfrom
vkolotov:vkolotov/bluetooth-generic-decimal-exponent

Conversation

@vkolotov

Copy link
Copy Markdown
Contributor

A GATT integer field can carry a DecimalExponent, which makes it represent a fractional real-world value. The Temperature characteristic (0x2A6E) is a sint16 in units of 0.01 degrees C.

When writing such a field, the state was converted with DecimalType#longValue(), which truncates the fraction before the field multiplier is applied. Writing 21.5 degrees serialized to a raw 2100 (21.00 degrees) instead of 2150, so everything after the decimal point was silently lost.

The fix is to use DecimalType#doubleValue() instead. GattRequest#setField(String, Double) divides by the field multiplier before encoding, so the fractional part survives into the raw integer written to the device.

Added a regression test that serializes 21.5 degrees through the Temperature characteristic.

…h a DecimalExponent

A GATT integer field can carry a DecimalExponent, which makes it represent
a fractional real-world value: the Temperature characteristic (0x2A6E), for
example, is a sint16 in units of 0.01 degrees C.

When writing such a field, the state was converted with DecimalType#longValue(),
which truncates the fraction before the field multiplier is applied. Writing
21.5 degrees therefore serialized to a raw 2100 (21.00 degrees) instead of 2150,
silently losing everything after the decimal point.

Use DecimalType#doubleValue() instead. GattRequest#setField(String, Double)
divides by the field multiplier before encoding, so the fractional part
survives into the raw integer value that is written to the device.

Signed-off-by: Vlad Kolotoff <vkolotoff@pm.me>
@vkolotov
vkolotov marked this pull request as ready for review August 28, 2026 23:12
@vkolotov
vkolotov requested a review from cpmeister as a code owner August 28, 2026 23:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant