Skip to content

Commit 1f03875

Browse files
committed
Refine RoomControl enrichment handling
1 parent 79e61f3 commit 1f03875

4 files changed

Lines changed: 50 additions & 56 deletions

File tree

PyViCare/PyViCare.py

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from PyViCare.PyViCareOAuthManager import ViCareOAuthManager
99
from PyViCare.PyViCareRoomControl import RoomControl
1010
from PyViCare.PyViCareService import ViCareDeviceAccessor, ViCareService
11-
from PyViCare.PyViCareUtils import PyViCareInvalidDataError
11+
from PyViCare.PyViCareUtils import PyViCareInvalidDataError, PyViCareNotSupportedFeatureError
1212

1313
logger = logging.getLogger(__name__)
1414
logger.addHandler(logging.NullHandler())
@@ -73,23 +73,26 @@ def __enrichZigbeeDevices(self):
7373
mapping by cross-referencing RoomControl actors with Zigbee
7474
device IDs.
7575
"""
76+
devices_by_id = {device_config.device_id: device_config for device_config in self.devices}
77+
7678
for device_config in self.devices:
7779
if device_config.device_type != "roomControl":
7880
continue
7981

8082
room_control = RoomControl(device_config.service)
8183
try:
8284
actor_map = room_control.buildActorRoomMap()
83-
except Exception:
84-
logger.debug("Could not build actor map for %s", device_config.getModel())
85+
except (KeyError, IndexError, PyViCareNotSupportedFeatureError):
86+
logger.debug("Could not build actor map for %s", device_config.getModel(), exc_info=True)
8587
continue
8688

87-
for zigbee_config in self.devices:
88-
if zigbee_config.device_id in actor_map:
89-
room_id = actor_map[zigbee_config.device_id]
90-
zigbee_config.setRoomControlEnrichment(room_control, room_id)
91-
logger.info("Enriched %s with room %s data from %s",
92-
zigbee_config.device_id, room_id, device_config.getModel())
89+
for device_id, room_id in actor_map.items():
90+
zigbee_config = devices_by_id.get(device_id)
91+
if zigbee_config is None:
92+
continue
93+
zigbee_config.setRoomControlEnrichment(room_control, room_id)
94+
logger.info("Enriched %s with room %s data from %s",
95+
zigbee_config.device_id, room_id, device_config.getModel())
9396

9497

9598
class DictWrap(object):

PyViCare/PyViCareRoomControl.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import logging
2-
from typing import Any
32

43
from PyViCare.PyViCareDevice import Device
54
from PyViCare.PyViCareUtils import PyViCareNotSupportedFeatureError, handleNotSupported, handleAPICommandErrors

PyViCare/PyViCareRoomSensor.py

Lines changed: 21 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ def setRoomControl(self, room_control, room_id):
1414
self._room_control = room_control
1515
self._room_id = room_id
1616

17+
def _getRoomControl(self):
18+
if self._room_control is None:
19+
raise KeyError("roomControl")
20+
return self._room_control
21+
1722
@handleNotSupported
1823
def getSerial(self):
1924
return self.getProperty("device.sensors.temperature")["deviceId"]
@@ -34,99 +39,72 @@ def getHumidity(self):
3439

3540
@handleNotSupported
3641
def getCO2(self):
37-
if self._room_control is not None:
38-
return self._room_control.getRoomCO2(self._room_id)
39-
return None
42+
return self._getRoomControl().getRoomCO2(self._room_id)
4043

4144
@handleNotSupported
4245
def getRoomName(self):
43-
if self._room_control is not None:
44-
return self._room_control.getRoomName(self._room_id)
45-
return None
46+
return self._getRoomControl().getRoomName(self._room_id)
4647

4748
@handleNotSupported
4849
def getRoomType(self):
49-
if self._room_control is not None:
50-
return self._room_control.getRoomType(self._room_id)
51-
return None
50+
return self._getRoomControl().getRoomType(self._room_id)
5251

5352
@handleNotSupported
5453
def getCondensationRisk(self):
55-
if self._room_control is not None:
56-
return self._room_control.getRoomCondensationRisk(self._room_id)
57-
return None
54+
return self._getRoomControl().getRoomCondensationRisk(self._room_id)
5855

5956
# --- Operating state ---
6057

6158
@handleNotSupported
6259
def getOperatingStateLevel(self):
63-
if self._room_control is not None:
64-
return self._room_control.getRoomOperatingStateLevel(self._room_id)
65-
return None
60+
return self._getRoomControl().getRoomOperatingStateLevel(self._room_id)
6661

6762
@handleNotSupported
6863
def getOperatingStateDemand(self):
69-
if self._room_control is not None:
70-
return self._room_control.getRoomOperatingStateDemand(self._room_id)
71-
return None
64+
return self._getRoomControl().getRoomOperatingStateDemand(self._room_id)
7265

7366
# --- Heating programs ---
7467

7568
@handleNotSupported
7669
def getNormalHeatingTemperature(self):
77-
if self._room_control is not None:
78-
return self._room_control.getRoomNormalHeatingTemperature(self._room_id)
79-
return None
70+
return self._getRoomControl().getRoomNormalHeatingTemperature(self._room_id)
8071

8172
@handleAPICommandErrors
8273
def setNormalHeatingTemperature(self, temperature):
83-
if self._room_control is not None:
84-
return self._room_control.setRoomNormalHeatingTemperature(self._room_id, temperature)
74+
return self._getRoomControl().setRoomNormalHeatingTemperature(self._room_id, temperature)
8575

8676
@handleNotSupported
8777
def getReducedHeatingTemperature(self):
88-
if self._room_control is not None:
89-
return self._room_control.getRoomReducedHeatingTemperature(self._room_id)
90-
return None
78+
return self._getRoomControl().getRoomReducedHeatingTemperature(self._room_id)
9179

9280
@handleAPICommandErrors
9381
def setReducedHeatingTemperature(self, temperature):
94-
if self._room_control is not None:
95-
return self._room_control.setRoomReducedHeatingTemperature(self._room_id, temperature)
82+
return self._getRoomControl().setRoomReducedHeatingTemperature(self._room_id, temperature)
9683

9784
@handleNotSupported
9885
def getComfortHeatingTemperature(self):
99-
if self._room_control is not None:
100-
return self._room_control.getRoomComfortHeatingTemperature(self._room_id)
101-
return None
86+
return self._getRoomControl().getRoomComfortHeatingTemperature(self._room_id)
10287

10388
@handleAPICommandErrors
10489
def setComfortHeatingTemperature(self, temperature):
105-
if self._room_control is not None:
106-
return self._room_control.setRoomComfortHeatingTemperature(self._room_id, temperature)
90+
return self._getRoomControl().setRoomComfortHeatingTemperature(self._room_id, temperature)
10791

10892
# --- Quick modes ---
10993

11094
@handleNotSupported
11195
def getManualTillNextScheduleActive(self):
112-
if self._room_control is not None:
113-
return self._room_control.getRoomManualTillNextScheduleActive(self._room_id)
114-
return None
96+
return self._getRoomControl().getRoomManualTillNextScheduleActive(self._room_id)
11597

11698
@handleAPICommandErrors
11799
def activateManualTillNextSchedule(self, temperature):
118-
if self._room_control is not None:
119-
return self._room_control.activateRoomManualTillNextSchedule(self._room_id, temperature)
100+
return self._getRoomControl().activateRoomManualTillNextSchedule(self._room_id, temperature)
120101

121102
@handleAPICommandErrors
122103
def deactivateManualTillNextSchedule(self):
123-
if self._room_control is not None:
124-
return self._room_control.deactivateRoomManualTillNextSchedule(self._room_id)
104+
return self._getRoomControl().deactivateRoomManualTillNextSchedule(self._room_id)
125105

126106
# --- Schedule ---
127107

128108
@handleNotSupported
129109
def getSchedule(self):
130-
if self._room_control is not None:
131-
return self._room_control.getRoomSchedule(self._room_id)
132-
return None
110+
return self._getRoomControl().getRoomSchedule(self._room_id)

tests/test_RoomControl.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22

33
from PyViCare.PyViCareRoomControl import RoomControl
44
from PyViCare.PyViCareRoomSensor import RoomSensor
5+
from PyViCare.PyViCareUtils import (
6+
PyViCareCommandError,
7+
PyViCareNotSupportedFeatureError,
8+
isSupported,
9+
)
510
from tests.ViCareServiceMock import ViCareServiceMock
611

712

@@ -121,7 +126,16 @@ def test_getManualTillNextScheduleActive(self):
121126
result = self.sensor.getManualTillNextScheduleActive()
122127
self.assertIsInstance(result, bool)
123128

124-
def test_without_enrichment_returns_none(self):
129+
def test_without_enrichment_reports_not_supported(self):
125130
sensor = RoomSensor(self.sensor_service)
126-
self.assertIsNone(sensor.getRoomName())
127-
self.assertIsNone(sensor.getNormalHeatingTemperature())
131+
self.assertFalse(isSupported(sensor.getRoomName))
132+
self.assertFalse(isSupported(sensor.getNormalHeatingTemperature))
133+
134+
with self.assertRaises(PyViCareNotSupportedFeatureError):
135+
sensor.getRoomName()
136+
137+
with self.assertRaises(PyViCareNotSupportedFeatureError):
138+
sensor.getNormalHeatingTemperature()
139+
140+
with self.assertRaises(PyViCareCommandError):
141+
sensor.setNormalHeatingTemperature(20)

0 commit comments

Comments
 (0)