def test_controller_status_from_knx_other_bits_set(self): """Test parsing DPTControllerStatus from KNX.""" assert DPTControllerStatus.from_knx((0x21,)) == HVACOperationMode.COMFORT assert DPTControllerStatus.from_knx((0x23,)) == HVACOperationMode.STANDBY assert DPTControllerStatus.from_knx((0x27,)) == HVACOperationMode.NIGHT assert ( DPTControllerStatus.from_knx((0x2F,)) == HVACOperationMode.FROST_PROTECTION )
def test_controller_status_from_knx(self): """Test parsing DPTControllerStatus from KNX.""" self.assertEqual(DPTControllerStatus.from_knx((0x21, )), HVACOperationMode.COMFORT) self.assertEqual(DPTControllerStatus.from_knx((0x22, )), HVACOperationMode.STANDBY) self.assertEqual(DPTControllerStatus.from_knx((0x24, )), HVACOperationMode.NIGHT) self.assertEqual(DPTControllerStatus.from_knx((0x28, )), HVACOperationMode.FROST_PROTECTION)
async def _process_controller_status(self, telegram): """Process incoming telegram for controller status.""" 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 = DPTControllerStatus.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_controller_status_to_knx(self): """Test serializing DPTControllerStatus to KNX.""" with pytest.raises(ConversionError): DPTControllerStatus.to_knx(HVACOperationMode.AUTO) assert DPTControllerStatus.to_knx(HVACOperationMode.COMFORT) == (0x21,) assert DPTControllerStatus.to_knx(HVACOperationMode.STANDBY) == (0x22,) assert DPTControllerStatus.to_knx(HVACOperationMode.NIGHT) == (0x24,) assert DPTControllerStatus.to_knx(HVACOperationMode.FROST_PROTECTION) == (0x28,)
def test_set_operation_mode_with_controller_status(self): """Test set_operation_mode with controller status adddressedefined.""" xknx = XKNX(loop=self.loop) climate_mode = ClimateMode(xknx, 'TestClimate', group_address_controller_status='1/2/4') for operation_mode in DPT_20102_MODES: if operation_mode == HVACOperationMode.AUTO: continue 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( DPTControllerStatus.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_controller_status_from_knx_wrong_code(self): """Test parsing of DPTControllerStatus with wrong code.""" with pytest.raises(ConversionError): DPTControllerStatus.from_knx((0x00, ))
def test_controller_status_from_knx_wrong_value(self): """Test parsing of DPTControllerStatus with wrong value).""" with pytest.raises(ConversionError): DPTControllerStatus.from_knx((1, 2))
def test_controller_status_to_knx_wrong_value(self): """Test serializing DPTControllerStatus to KNX with wrong value.""" with pytest.raises(ConversionError): DPTControllerStatus.to_knx(5)
def test_controller_status_from_knx_wrong_code(self): """Test parsing of DPTControllerStatus with wrong code.""" with pytest.raises(CouldNotParseKNXIP): DPTControllerStatus.from_knx((0x00,))