Skip to content

Commit 67096d5

Browse files
committed
Return API values even if they are hidden, as they are usable
1 parent b3b629a commit 67096d5

File tree

4 files changed

+48
-94
lines changed

4 files changed

+48
-94
lines changed

ThermiaOnlineAPI/api/ThermiaAPI.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
4646
}
4747

48+
# Fix for multiple operation modes with the same value
49+
REG_OPERATIONMODE_SKIP_VALUES = ["REG_VALUE_OPERATION_MODE_SERVICE"]
50+
4851

4952
class ThermiaAPI:
5053
def __init__(self, email, password):
@@ -302,7 +305,7 @@ def __get_group_operational_operation_from_register_group(
302305
"REG_VALUE_OPERATION_MODE_"
303306
)[1],
304307
}
305-
if values.get("visible")
308+
if values.get("name") not in REG_OPERATIONMODE_SKIP_VALUES
306309
else {}
307310
),
308311
operation_modes_data,

ThermiaOnlineAPI/model/HeatPump.py

Lines changed: 12 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,10 @@ def __init__(self, device_data: dict, api_interface: "ThermiaAPI"):
8686

8787
self.__operational_statuses = None
8888
self.__all_operational_statuses_map = None
89-
self.__visible_operational_statuses_map = None
9089
self.__running_operational_statuses = None
9190

9291
self.__power_statuses = None
9392
self.__all_power_statuses_map = None
94-
self.__visible_power_statuses_map = None
9593
self.__running_power_statuses = None
9694

9795
self.update_data()
@@ -131,18 +129,12 @@ def update_data(self):
131129
self.__all_operational_statuses_map = (
132130
self.__get_all_operational_statuses_from_operational_status()
133131
)
134-
self.__visible_operational_statuses_map = (
135-
self.__get_all_visible_operational_statuses_from_operational_status()
136-
)
137132
self.__running_operational_statuses = self.__get_running_operational_statuses()
138133

139134
self.__power_statuses = self.__get_power_statuses_from_operational_status()
140135
self.__all_power_statuses_map = (
141136
self.__get_all_power_statuses_from_power_status()
142137
)
143-
self.__visible_power_statuses_map = (
144-
self.__get_all_visible_power_statuses_from_power_status()
145-
)
146138
self.__running_power_statuses = self.__get_running_power_statuses()
147139

148140
def get_register_indexes(self):
@@ -369,27 +361,6 @@ def __get_register_from_operational_status(
369361

370362
return data[0]
371363

372-
def __get_value_by_key_and_register_name_from_operational_status(
373-
self, register_name: str, value_key: str
374-
):
375-
data_from_register = self.__get_register_from_operational_status(register_name)
376-
377-
if data_from_register is None:
378-
return None
379-
380-
register_values_list = data_from_register.get("valueNames", [])
381-
values_list: list = [d for d in register_values_list if d["name"] == value_key]
382-
383-
if len(values_list) != 1:
384-
return None
385-
386-
value: dict = values_list[0]
387-
388-
if value.get("visible"):
389-
return value.get("value")
390-
391-
return None
392-
393364
def __get_operational_statuses_from_operational_status(self) -> Optional[Dict]:
394365
if self.__device_config["operational_status_register"] is not None:
395366
data = self.__get_register_from_operational_status(
@@ -449,39 +420,16 @@ def __get_all_operational_statuses_from_operational_status(
449420

450421
operation_statuses_map = map(
451422
lambda values: {
452-
values.get("value"): {
453-
"name": values.get("name").split(
454-
self.__device_config["operational_status_valueNamePrefix"]
455-
)[1],
456-
"visible": values.get("visible"),
457-
}
423+
values.get("value"): values.get("name").split(
424+
self.__device_config["operational_status_valueNamePrefix"]
425+
)[1],
458426
},
459427
data,
460428
)
461429

462430
operation_statuses_list = list(operation_statuses_map)
463431
return ChainMap(*operation_statuses_list)
464432

465-
def __get_all_visible_operational_statuses_from_operational_status(
466-
self,
467-
) -> Optional[ChainMap]:
468-
data = self.__all_operational_statuses_map
469-
470-
if data is None:
471-
return ChainMap()
472-
473-
operation_statuses_map = map(
474-
lambda item: (
475-
{item[0]: item[1].get("name")} if item[1].get("visible") else {}
476-
),
477-
data.items(),
478-
)
479-
480-
operation_statuses_list = list(
481-
filter(lambda x: x != {}, operation_statuses_map)
482-
)
483-
return ChainMap(*operation_statuses_list)
484-
485433
def __get_running_operational_statuses(
486434
self,
487435
) -> List[str]:
@@ -505,9 +453,7 @@ def __get_running_operational_statuses(
505453
data_items_list = list(data.items())
506454

507455
current_operation_mode = [
508-
value.get("name")
509-
for key, value in data_items_list
510-
if key == current_register_value
456+
value for key, value in data_items_list if key == current_register_value
511457
]
512458

513459
if len(current_operation_mode) == 1:
@@ -530,8 +476,7 @@ def __get_running_operational_statuses(
530476
for key, value in data_items_list:
531477
if key <= current_register_value:
532478
current_register_value -= key
533-
if value.get("visible"):
534-
list_of_current_operation_statuses.append(value.get("name"))
479+
list_of_current_operation_statuses.append(value)
535480

536481
if current_register_value == 0:
537482
return list_of_current_operation_statuses
@@ -556,35 +501,14 @@ def __get_all_power_statuses_from_power_status(
556501

557502
power_statuses_map = map(
558503
lambda values: {
559-
values.get("value"): {
560-
"name": values.get("name").split("COMP_VALUE_STEP_")[1],
561-
"visible": values.get("visible"),
562-
}
504+
values.get("value"): values.get("name").split("COMP_VALUE_STEP_")[1],
563505
},
564506
data,
565507
)
566508

567509
power_statuses_list = list(power_statuses_map)
568510
return ChainMap(*power_statuses_list)
569511

570-
def __get_all_visible_power_statuses_from_power_status(
571-
self,
572-
) -> Optional[ChainMap]:
573-
data = self.__all_power_statuses_map
574-
575-
if data is None:
576-
return ChainMap()
577-
578-
power_statuses_map = map(
579-
lambda item: (
580-
{item[0]: item[1].get("name")} if item[1].get("visible") else {}
581-
),
582-
data.items(),
583-
)
584-
585-
power_statuses_list = list(filter(lambda x: x != {}, power_statuses_map))
586-
return ChainMap(*power_statuses_list)
587-
588512
def __get_running_power_statuses(
589513
self,
590514
) -> List[str]:
@@ -603,9 +527,7 @@ def __get_running_power_statuses(
603527
data_items_list = list(data.items())
604528

605529
current_power_status = [
606-
value.get("name")
607-
for key, value in data_items_list
608-
if key == current_register_value
530+
value for key, value in data_items_list if key == current_register_value
609531
]
610532

611533
if len(current_power_status) == 1:
@@ -623,8 +545,7 @@ def __get_running_power_statuses(
623545
for key, value in data_items_list:
624546
if key <= current_register_value:
625547
current_register_value -= key
626-
if value.get("visible"):
627-
list_of_current_power_statuses.append(value.get("name"))
548+
list_of_current_power_statuses.append(value)
628549

629550
if current_register_value == 0:
630551
return list_of_current_power_statuses
@@ -801,7 +722,7 @@ def running_operational_statuses(self) -> List[str]:
801722

802723
@property
803724
def available_operational_statuses(self) -> Optional[List[str]]:
804-
data = self.__visible_operational_statuses_map
725+
data = self.__all_operational_statuses_map
805726

806727
if data is None:
807728
return []
@@ -810,7 +731,7 @@ def available_operational_statuses(self) -> Optional[List[str]]:
810731

811732
@property
812733
def available_operational_statuses_map(self) -> Optional[ChainMap]:
813-
return self.__visible_operational_statuses_map
734+
return self.__all_operational_statuses_map
814735

815736
@property
816737
def running_power_statuses(self) -> List[str]:
@@ -823,7 +744,7 @@ def running_power_statuses(self) -> List[str]:
823744

824745
@property
825746
def available_power_statuses(self) -> Optional[List[str]]:
826-
data = self.__visible_power_statuses_map
747+
data = self.__all_power_statuses_map
827748

828749
if data is None:
829750
return []
@@ -832,7 +753,7 @@ def available_power_statuses(self) -> Optional[List[str]]:
832753

833754
@property
834755
def available_power_statuses_map(self) -> Optional[ChainMap]:
835-
return self.__visible_power_statuses_map
756+
return self.__all_power_statuses_map
836757

837758
@property
838759
def operational_status_integral(self):

ThermiaOnlineAPI/tests/setup.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,16 +99,27 @@ def setup_thermia_and_perform_basic_tests(
9999

100100
heat_pump = thermia.heat_pumps[0]
101101

102+
print(heat_pump.model)
102103
assert heat_pump.model == expected_model
104+
105+
print(heat_pump.model_id)
103106
assert heat_pump.model_id == expected_model_id
107+
108+
print(heat_pump.available_operation_modes)
104109
assert match_lists_in_any_order(
105110
heat_pump.available_operation_modes, expected_available_operational_modes
106111
)
112+
113+
print(heat_pump.is_operation_mode_read_only)
107114
assert heat_pump.is_operation_mode_read_only == expected_is_operation_mode_read_only
115+
116+
print(heat_pump.available_operational_statuses)
108117
assert match_lists_in_any_order(
109118
heat_pump.available_operational_statuses,
110119
expected_available_operational_statuses,
111120
)
121+
122+
print(heat_pump.available_power_statuses)
112123
assert match_lists_in_any_order(
113124
heat_pump.available_power_statuses, expected_available_power_statuses
114125
)

ThermiaOnlineAPI/tests/test_heat_pumps.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,18 @@ def test_diplomat_duo_921(requests_mock):
1717
expected_available_operational_statuses=[
1818
"COMPR",
1919
"BRINEPUMP",
20+
"RADIATORPUMP",
21+
"COOLING",
2022
"HOT_WATER",
2123
"HEATING",
2224
],
23-
expected_available_power_statuses=["3KW", "6KW"],
25+
expected_available_power_statuses=[
26+
"3KW",
27+
"6KW",
28+
"9KW",
29+
"12KW",
30+
"15KW",
31+
],
2432
)
2533

2634

@@ -30,11 +38,20 @@ def test_itec_iq(requests_mock):
3038
"iTec_IQ.txt",
3139
expected_model="iTec",
3240
expected_model_id="IQ",
33-
expected_available_operational_modes=["OFF", "AUTO", "COMPRESSOR", "AUXILIARY"],
41+
expected_available_operational_modes=[
42+
"OFF",
43+
"AUTO",
44+
"COMPRESSOR",
45+
"AUXILIARY",
46+
"HOT_WATER",
47+
],
3448
expected_available_operational_statuses=[
3549
"COMPR",
50+
"RADIATORPUMP",
51+
"HOT_WATER",
3652
"HEATING",
3753
"DEFROST",
54+
"POOL",
3855
"COOLING",
3956
],
4057
expected_available_power_statuses=[],
@@ -51,6 +68,7 @@ def test_ncp_1024(requests_mock):
5168
expected_is_operation_mode_read_only=True,
5269
expected_available_operational_statuses=[
5370
"STATUS_MANUAL",
71+
"STATUS_DEFROST",
5472
"STATUS_HOTWATER",
5573
"STATUS_HEAT",
5674
"STATUS_COOL",
@@ -75,6 +93,7 @@ def test_ncp_1028(requests_mock):
7593
expected_is_operation_mode_read_only=True,
7694
expected_available_operational_statuses=[
7795
"STATUS_MANUAL",
96+
"STATUS_DEFROST",
7897
"STATUS_HOTWATER",
7998
"STATUS_HEAT",
8099
"STATUS_COOL",

0 commit comments

Comments
 (0)