def test_mode_from_knx(self): """Test parsing DPTHVACMode from KNX.""" assert DPTHVACMode.from_knx((0x00,)) == HVACOperationMode.AUTO assert DPTHVACMode.from_knx((0x01,)) == HVACOperationMode.COMFORT assert DPTHVACMode.from_knx((0x02,)) == HVACOperationMode.STANDBY assert DPTHVACMode.from_knx((0x03,)) == HVACOperationMode.NIGHT assert DPTHVACMode.from_knx((0x04,)) == HVACOperationMode.FROST_PROTECTION
def test_mode_to_knx(self): """Test parsing DPTHVACMode to KNX.""" assert DPTHVACMode.to_knx(HVACOperationMode.AUTO) == (0x00,) assert DPTHVACMode.to_knx(HVACOperationMode.COMFORT) == (0x01,) assert DPTHVACMode.to_knx(HVACOperationMode.STANDBY) == (0x02,) assert DPTHVACMode.to_knx(HVACOperationMode.NIGHT) == (0x03,) assert DPTHVACMode.to_knx(HVACOperationMode.FROST_PROTECTION) == (0x04,)
def test_mode_from_knx(self): """Test parsing DPTHVACMode from KNX.""" self.assertEqual(DPTHVACMode.from_knx((0x00,)), HVACOperationMode.AUTO) self.assertEqual(DPTHVACMode.from_knx((0x01,)), HVACOperationMode.COMFORT) self.assertEqual(DPTHVACMode.from_knx((0x02,)), HVACOperationMode.STANDBY) self.assertEqual(DPTHVACMode.from_knx((0x03,)), HVACOperationMode.NIGHT) self.assertEqual( DPTHVACMode.from_knx((0x04,)), HVACOperationMode.FROST_PROTECTION )
def test_mode_to_knx(self): """Test parsing DPTHVACMode to KNX.""" self.assertEqual(DPTHVACMode.to_knx(HVACOperationMode.AUTO), (0x00,)) self.assertEqual(DPTHVACMode.to_knx(HVACOperationMode.COMFORT), (0x01,)) self.assertEqual(DPTHVACMode.to_knx(HVACOperationMode.STANDBY), (0x02,)) self.assertEqual(DPTHVACMode.to_knx(HVACOperationMode.NIGHT), (0x03,)) self.assertEqual( DPTHVACMode.to_knx(HVACOperationMode.FROST_PROTECTION), (0x04,) )
async def _process_operation_mode(self, telegram): """Process incoming telegram for operation mode.""" if not isinstance(telegram.payload, DPTArray) \ or len(telegram.payload.value) != 1: raise CouldNotParseTelegram("invalid payload", payload=telegram.payload, device_name=self.name) operation_mode = DPTHVACMode.from_knx(telegram.payload.value) await self._set_internal_operation_mode(operation_mode)
async def set_operation_mode(self, operation_mode): """Set the operation mode of a thermostat. Send new operation_mode to BUS and update internal state.""" if not self.supports_operation_mode: raise DeviceIllegalValue("operation mode not supported", operation_mode) if self.group_address_operation_mode is not None: await self.send( self.group_address_operation_mode, DPTArray(DPTHVACMode.to_knx(operation_mode))) if self.group_address_operation_mode_protection is not None: protection_mode = operation_mode == HVACOperationMode.FROST_PROTECTION await self.send( self.group_address_operation_mode_protection, DPTBinary(protection_mode)) if self.group_address_operation_mode_night is not None: night_mode = operation_mode == HVACOperationMode.NIGHT await self.send( self.group_address_operation_mode_night, DPTBinary(night_mode)) if self.group_address_operation_mode_comfort is not None: comfort_mode = operation_mode == HVACOperationMode.COMFORT await self.send( self.group_address_operation_mode_comfort, DPTBinary(comfort_mode)) if self.group_address_controller_status is not None: await self.send( self.group_address_controller_status, DPTArray(DPTControllerStatus.to_knx(operation_mode))) if self.group_address_controller_mode is not None: await self.send( self.group_address_controller_mode, DPTArray(DPTHVACContrMode.to_knx(operation_mode))) await self._set_internal_operation_mode(operation_mode)
def test_set_operation_mode(self): """Test set_operation_mode.""" xknx = XKNX(loop=self.loop) climate_mode = ClimateMode(xknx, 'TestClimate', group_address_operation_mode='1/2/4') for operation_mode in DPT_20102_MODES: self.loop.run_until_complete( asyncio.Task(climate_mode.set_operation_mode(operation_mode))) self.assertEqual(xknx.telegrams.qsize(), 1) telegram = xknx.telegrams.get_nowait() self.assertEqual( telegram, Telegram(GroupAddress('1/2/4'), payload=DPTArray(DPTHVACMode.to_knx(operation_mode))))
def test_process_operation_mode(self): """Test process / reading telegrams from telegram queue. Test if setpoint is processed correctly.""" xknx = XKNX(loop=self.loop) climate_mode = ClimateMode(xknx, 'TestClimate', group_address_operation_mode='1/2/5', group_address_controller_status='1/2/3') for operation_mode in DPT_20102_MODES: telegram = Telegram(GroupAddress('1/2/5')) telegram.payload = DPTArray(DPTHVACMode.to_knx(operation_mode)) self.loop.run_until_complete( asyncio.Task(climate_mode.process(telegram))) self.assertEqual(climate_mode.operation_mode, operation_mode) for operation_mode in DPT_20102_MODES: if operation_mode == HVACOperationMode.AUTO: continue telegram = Telegram(GroupAddress('1/2/3')) telegram.payload = DPTArray( DPTControllerStatus.to_knx(operation_mode)) self.loop.run_until_complete( asyncio.Task(climate_mode.process(telegram))) self.assertEqual(climate_mode.operation_mode, operation_mode)
def test_mode_from_knx_wrong_code(self): """Test parsing of DPTHVACMode with wrong code.""" with pytest.raises(ConversionError): DPTHVACMode.from_knx((0x05, ))
def test_mode_from_knx_wrong_value(self): """Test parsing of DPTControllerStatus with wrong value).""" with pytest.raises(ConversionError): DPTHVACMode.from_knx((1, 2))
def test_mode_to_knx_wrong_value(self): """Test serializing DPTHVACMode to KNX with wrong value.""" with pytest.raises(ConversionError): DPTHVACMode.to_knx(5)
def test_mode_from_knx_wrong_code(self): """Test parsing of DPTHVACMode with wrong code.""" with pytest.raises(CouldNotParseKNXIP): DPTHVACMode.from_knx((0x05,))