diff --git a/greeclimate/device.py b/greeclimate/device.py index 9756565..58d7f02 100644 --- a/greeclimate/device.py +++ b/greeclimate/device.py @@ -179,6 +179,7 @@ def __init__(self, device_info: DeviceInfo, timeout: int = 120, bind_timeout: in self.check_version = True self._properties = {} self._dirty = [] + self._buzzer = True self._valid_state: asyncio.Event = asyncio.Event() self._valid_state.clear() @@ -331,6 +332,10 @@ async def push_state_update(self): Props.TEMP_UNIT.value ) + if not self._buzzer: + self._logger.debug("Disabling buzzer for command") + props["Buzzer_ON_OFF"] = 1 + try: await self.send(self.create_command_message(self.device_info, **props)) @@ -591,3 +596,11 @@ def clean_filter(self) -> Optional[bool]: def water_full(self) -> Optional[bool]: prop = self.get_property(Props.WATER_FULL) return bool(prop) if prop is not None else None + + @property + def buzzer(self) -> bool: + return self._buzzer + + @buzzer.setter + def buzzer(self, value: bool): + self._buzzer = bool(value) diff --git a/tests/test_device.py b/tests/test_device.py index 5a88b6d..b3339ad 100644 --- a/tests/test_device.py +++ b/tests/test_device.py @@ -743,7 +743,53 @@ def test_device_key_set_get(): device.device_key = "fake_key" assert device.device_key == "fake_key" - + +@pytest.mark.asyncio +async def test_buzzer_default(cipher, send): + """Check that buzzer is enabled by default.""" + device = await generate_device_mock_async() + assert device.buzzer is True + + +@pytest.mark.asyncio +async def test_buzzer_disabled(cipher, send): + """Check that disabling buzzer injects Buzzer_ON_OFF into commands.""" + device = await generate_device_mock_async() + + device.power = True + device.buzzer = False + await device.push_state_update() + assert send.call_count == 1 + assert "Buzzer_ON_OFF" in send.call_args_list[0].args[0]["pack"]["opt"] + assert not device.buzzer + + send.reset_mock() + + device.power = False + device.buzzer = True + await device.push_state_update() + assert send.call_count == 1 + assert "Buzzer_ON_OFF" not in send.call_args_list[0].args[0]["pack"]["opt"] + assert device.buzzer + + +@pytest.mark.asyncio +async def test_buzzer_disabled_every_command(cipher, send): + """Check that Buzzer_ON_OFF is sent with every command when disabled.""" + device = await generate_device_mock_async() + device.buzzer = False + + device.power = True + await device.push_state_update() + assert "Buzzer_ON_OFF" in send.call_args_list[0].args[0]["pack"]["opt"] + + send.reset_mock() + + device.mode = 1 + await device.push_state_update() + assert "Buzzer_ON_OFF" in send.call_args_list[0].args[0]["pack"]["opt"] + + @pytest.mark.asyncio async def has_valid_state_with_valid_properties(cipher, send): """Check that the device has a valid state with valid properties."""