Skip to content

Commit d0b161a

Browse files
[knx] Adapt to core, temperature differences (openhab#15573)
Special handling for temperature differences in °F and °F/%, DPT 9.002 and 9.003, needs to be adapted due to change in core. Refs openhab/openhab-core#3792. Implementation is valid for 4.0 and 4.x snapshot. Fixes openhab#15567. Signed-off-by: Holger Friedrich <mail@holger-friedrich.de>
1 parent 7da3012 commit d0b161a

File tree

2 files changed

+11
-7
lines changed
  • bundles/org.openhab.binding.knx/src

2 files changed

+11
-7
lines changed

bundles/org.openhab.binding.knx/src/main/java/org/openhab/binding/knx/internal/dpt/ValueEncoder.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.openhab.core.library.types.StringType;
3434
import org.openhab.core.library.types.UpDownType;
3535
import org.openhab.core.library.unit.SIUnits;
36+
import org.openhab.core.library.unit.Units;
3637
import org.openhab.core.types.Type;
3738
import org.openhab.core.util.ColorUtil;
3839
import org.slf4j.Logger;
@@ -192,10 +193,15 @@ private static String handleNumericTypes(String dptId, String mainNumber, DPT dp
192193
unit = unit.replace("K", "°C");
193194
}
194195
} else if (value.toString().contains("°F")) {
195-
if (unit != null) {
196-
unit = unit.replace("K", "°F");
196+
// an new approach to handle temperature differences was introduced to core
197+
// after 4.0, stripping the unit and and creating a new QuantityType works
198+
// both with core release 4.0 and current snapshot
199+
boolean perPercent = value.toString().contains("/%");
200+
value = new QuantityType<>(((QuantityType<?>) value).doubleValue() * 5.0 / 9.0, Units.KELVIN);
201+
// PercentType needs to be adapted
202+
if (perPercent) {
203+
value = ((QuantityType<?>) value).multiply(BigDecimal.valueOf(100));
197204
}
198-
value = ((QuantityType<?>) value).multiply(BigDecimal.valueOf(5.0 / 9.0));
199205
}
200206
} else if (DPTXlator4ByteFloat.DPT_LIGHT_QUANTITY.getID().equals(dptId)) {
201207
if (!value.toString().contains("J")) {

bundles/org.openhab.binding.knx/src/test/java/org/openhab/binding/knx/internal/dpt/DPTTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,7 @@ void testToDPT9ValueFromQuantityType() {
109109
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1 K"), "9.002"));
110110
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1000 mK"), "9.002"));
111111
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1 °C"), "9.002"));
112-
// TODO
113-
// assertTrue(ValueEncoder.encode(new QuantityType<>("1 °F"), "9.002").startsWith("0.55"));
112+
assertTrue(ValueEncoder.encode(new QuantityType<>("1 °F"), "9.002").startsWith("0.55"));
114113
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1 K/h"), "9.003"));
115114
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1 °C/h"), "9.003"));
116115
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1000 mK/h"), "9.003"));
@@ -134,8 +133,7 @@ void testToDPT9ValueFromQuantityType() {
134133
assertEquals("12", ValueEncoder.encode(new QuantityType<>("12 W/m²"), "9.022"));
135134
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1 K/%"), "9.023"));
136135
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1 °C/%"), "9.023"));
137-
// TODO
138-
// assertTrue(ValueEncoder.encode(new QuantityType<>("1 °F/%"), "9.023").startsWith("0.55"));
136+
assertTrue(ValueEncoder.encode(new QuantityType<>("1 °F/%"), "9.023").startsWith("0.55"));
139137
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1 kW"), "9.024"));
140138
assertEquals("1", ValueEncoder.encode(new QuantityType<>("1 l/h"), "9.025"));
141139
assertEquals("60", ValueEncoder.encode(new QuantityType<>("1 l/min"), "9.025"));

0 commit comments

Comments
 (0)