Skip to content

Commit f490e1a

Browse files
committed
Bug fix: Support negative temperature values for all inputs/outputs
1 parent 9e522de commit f490e1a

File tree

5 files changed

+49
-9
lines changed

5 files changed

+49
-9
lines changed

inelsmqtt/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ def on_connect(client, userdata, flags, rc):
195195
if rc != 0:
196196
self.__connection_error = rc
197197
else:
198-
self.__try_connect = True
198+
self.__try_connect = True
199199

200200
try:
201201
default_connect_handler = self.__client.on_connect

inelsmqtt/protocols/elanrf.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
WarmLight,
6767
new_object,
6868
trim_inels_status_values,
69+
twos_comp_1B,
6970
)
7071

7172

@@ -464,9 +465,9 @@ def create_command_payload(temp_required: int) -> str:
464465
def create_ha_value_object(cls, device_value: DeviceValue) -> Any:
465466
# fetches all the status values and compacts them into a new object
466467
temp_current_hex = trim_inels_status_values(device_value.inels_status_value, cls.DATA, CURRENT_TEMP, "")
467-
temp_current = int(temp_current_hex, 16) * 0.5
468+
temp_current = twos_comp_1B(int(temp_current_hex, 16)) * 0.5
468469
temp_required_hex = trim_inels_status_values(device_value.inels_status_value, cls.DATA, REQUIRED_TEMP, "")
469-
temp_required = int(temp_required_hex, 16) * 0.5
470+
temp_required = twos_comp_1B(int(temp_required_hex, 16)) * 0.5
470471
battery = int(trim_inels_status_values(device_value.inels_status_value, cls.DATA, BATTERY, ""), 16)
471472
open_to_hex = trim_inels_status_values(device_value.inels_status_value, cls.DATA, OPEN_IN_PERCENTAGE, "")
472473
open_to_percentage = int(open_to_hex, 16) * 0.5
@@ -520,7 +521,10 @@ class DT_12(CommTest):
520521

521522
@classmethod
522523
def create_ha_value_object(cls, device_value: DeviceValue) -> Any:
523-
temp_in = int(trim_inels_status_values(device_value.inels_status_value, cls.DATA, TEMP_IN, ""), 16) * 0.5
524+
temp_in = (
525+
twos_comp_1B(int(trim_inels_status_values(device_value.inels_status_value, cls.DATA, TEMP_IN, ""), 16))
526+
* 0.5
527+
)
524528
battery = int(trim_inels_status_values(device_value.inels_status_value, cls.DATA, BATTERY, ""), 16)
525529

526530
return new_object(

inelsmqtt/utils/common.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@ def new_object(**kwargs: Any) -> Any:
108108
return cls
109109

110110

111+
def twos_comp_1B(b):
112+
return -(b & 0b10000000) | (b & 0b01111111)
113+
114+
115+
def twos_comp_2B(h):
116+
return -(h & 0b1000000000000000) | (h & 0b0111111111111111)
117+
118+
111119
def twos_comp_4B(i):
112120
return -(i & 0b10000000000000000000000000000000) | (i & 0b01111111111111111111111111111111)
113121

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
setup(
66
name="elkoep-mqtt",
7-
version="0.2.33.beta.19",
7+
version="0.2.33.beta.20",
88
url="https://github.com/epdevlab/elkoep-mqtt",
99
license="MIT",
1010
author="Elko EP s.r.o.",

tests/test_device_value.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -372,13 +372,24 @@ class Test_RF_DEVICE_TYPE_09(BaseDeviceTestClass):
372372
def device_value(self):
373373
return self.create_device_value(inels_value="64\n3C\n08\n40\n00\n")
374374

375+
@pytest.fixture
376+
def device_value_negative(self):
377+
return self.create_device_value(inels_value="64\nC4\n08\nC0\n00\n")
378+
375379
def test_create_ha_value_object(self, device_value):
376380
assert device_value.ha_value.low_battery == True
377381
assert device_value.ha_value.thermovalve.current == 30
378382
assert device_value.ha_value.thermovalve.required == 32
379383
assert device_value.ha_value.thermovalve.climate_mode == 1
380384
assert device_value.ha_value.thermovalve.open_in_percentage == 50
381385

386+
def test_create_ha_value_object_negative(self, device_value_negative):
387+
assert device_value_negative.ha_value.low_battery == True
388+
assert device_value_negative.ha_value.thermovalve.current == -30
389+
assert device_value_negative.ha_value.thermovalve.required == -32
390+
assert device_value_negative.ha_value.thermovalve.climate_mode == 0
391+
assert device_value_negative.ha_value.thermovalve.open_in_percentage == 50
392+
382393
def test_format_inels_set_value(self, device_value):
383394
device_value.ha_value.thermovalve.required = 25
384395
device_value = self.create_device_value(
@@ -413,10 +424,18 @@ class Test_RF_DEVICE_TYPE_12(BaseDeviceTestClass):
413424
def device_value(self):
414425
return self.create_device_value(inels_value="30\n00\n81\n00\n00\n")
415426

427+
@pytest.fixture
428+
def device_value_negative(self):
429+
return self.create_device_value(inels_value="F2\n00\n80\n00\n00\n")
430+
416431
def test_create_ha_value_object(self, device_value):
417432
assert device_value.ha_value.low_battery == True
418433
assert device_value.ha_value.temp_in == 24.0
419434

435+
def test_create_ha_value_object_negative(self, device_value_negative):
436+
assert device_value_negative.ha_value.low_battery == False
437+
assert device_value_negative.ha_value.temp_in == -7.0
438+
420439

421440
class Test_RF_DEVICE_TYPE_13(BaseDeviceTestClass):
422441
DEVICE_TYPE_ID = "13"
@@ -611,11 +630,20 @@ class Test_RF_DEVICE_TYPE_30(BaseDeviceTestClass):
611630
def device_value(self):
612631
return self.create_device_value(inels_value="01\nD8\n09\n24\n00")
613632

633+
@pytest.fixture
634+
def device_value_negative(self):
635+
return self.create_device_value(inels_value="01\nF6\nFF\n24\n00")
636+
614637
def test_create_ha_value_object(self, device_value):
615638
assert device_value.ha_value.low_battery
616639
assert device_value.ha_value.temp_in == "09D8"
617640
assert device_value.ha_value.humidity == 36
618641

642+
def test_create_ha_value_object_negative(self, device_value_negative):
643+
assert device_value_negative.ha_value.low_battery
644+
assert device_value_negative.ha_value.temp_in == "FFF6"
645+
assert device_value_negative.ha_value.humidity == 36
646+
619647

620648
class Test_CU_DEVICE_TYPE_100(BaseDeviceTestClass):
621649
DEVICE_TYPE_ID = "100"
@@ -1070,27 +1098,27 @@ class Test_CU_DEVICE_TYPE_112(BaseDeviceTestClass):
10701098
@pytest.fixture
10711099
def device_value_all_on(self):
10721100
return self.create_device_value(
1073-
inels_value="07\n07\n07\n07\n07\n07\n07\n07\n7F\nFF\nFF\nFF\n7F\nFF\nFF\nFF\n00\n00\n00\n00\n00\n00\n00\n00\nFF\nFF\nFF\n"
1101+
inels_value="07\n07\n07\n07\n07\n07\n07\n07\n00\n00\n12\n33\n7F\nFF\nFF\nFF\n00\n00\n00\n00\n00\n00\n00\n00\nFF\nFF\nFF\n"
10741102
)
10751103

10761104
@pytest.fixture
10771105
def device_value_all_off(self):
10781106
return self.create_device_value(
1079-
inels_value="06\n06\n06\n06\n06\n06\n06\n06\n7F\nFF\nFF\nFF\n7F\nFF\nFF\nFF\n00\n00\n00\n00\n00\n00\n00\n00\n00\n00\n00\n"
1107+
inels_value="06\n06\n06\n06\n06\n06\n06\n06\nFF\nFF\nFB\n33\n7F\nFF\nFF\nFF\n00\n00\n00\n00\n00\n00\n00\n00\n00\n00\n00\n"
10801108
)
10811109

10821110
def test_create_ha_value_object_all_on(self, device_value_all_on):
10831111
assert isinstance(device_value_all_on.ha_value.relay[0], Relay)
10841112
assert device_value_all_on.ha_value.din == [True] * 8
1085-
assert device_value_all_on.ha_value.temps == ["7FFFFFFF", "7FFFFFFF"]
1113+
assert device_value_all_on.ha_value.temps == ["00001233", "7FFFFFFF"]
10861114
for r in device_value_all_on.ha_value.relay:
10871115
assert r.is_on
10881116
assert r.overflow
10891117

10901118
def test_create_ha_value_object_all_off(self, device_value_all_off):
10911119
assert isinstance(device_value_all_off.ha_value.relay[0], Relay)
10921120
assert device_value_all_off.ha_value.din == [False] * 8
1093-
assert device_value_all_off.ha_value.temps == ["7FFFFFFF", "7FFFFFFF"]
1121+
assert device_value_all_off.ha_value.temps == ["FFFFFB33", "7FFFFFFF"]
10941122
for r in device_value_all_off.ha_value.relay:
10951123
assert not r.is_on
10961124
assert not r.overflow

0 commit comments

Comments
 (0)