def async_wifi_bulb_for_host( host: str, discovery: FluxLEDDiscovery | None ) -> AIOWifiLedBulb: """Create a AIOWifiLedBulb from a host.""" return AIOWifiLedBulb(host, discovery=discovery)
def async_wifi_bulb_for_host(host: str) -> AIOWifiLedBulb: """Create a AIOWifiLedBulb from a host.""" return AIOWifiLedBulb(host)
async def async_mock_device_turn_on(hass: HomeAssistant, bulb: AIOWifiLedBulb) -> None: """Mock the device being on.""" bulb.is_on = True bulb.raw_state._replace(power_state=0x23) bulb.data_receive_callback() await hass.async_block_till_done()
async def test_turn_on_off(mock_aio_protocol, caplog: pytest.LogCaptureFixture): """Test we can turn on and off.""" light = AIOWifiLedBulb("192.168.1.166") def _updated_callback(*args, **kwargs): pass task = asyncio.create_task(light.async_setup(_updated_callback)) await mock_aio_protocol() light._aio_protocol.data_received( b"\x81\x25\x23\x61\x05\x10\xb6\x00\x98\x19\x04\x25\x0f\xde") await task task = asyncio.create_task(light.async_turn_off()) # Wait for the future to get added await asyncio.sleep(0) light._aio_protocol.data_received( b"\x81\x25\x24\x61\x05\x10\xb6\x00\x98\x19\x04\x25\x0f\xdf") await asyncio.sleep(0) assert light.is_on is False await task task = asyncio.create_task(light.async_turn_on()) await asyncio.sleep(0) light._aio_protocol.data_received( b"\x81\x25\x23\x61\x05\x10\xb6\x00\x98\x19\x04\x25\x0f\xde") await asyncio.sleep(0) assert light.is_on is True await task await asyncio.sleep(0) caplog.clear() caplog.set_level(logging.DEBUG) # Handle the failure case with patch.object(aiodevice, "POWER_STATE_TIMEOUT", 0.05): await asyncio.create_task(light.async_turn_off()) assert light.is_on is True assert "Failed to turn off (1/3)" in caplog.text assert "Failed to turn off (2/3)" in caplog.text assert "Failed to turn off (3/3)" in caplog.text with patch.object(aiodevice, "POWER_STATE_TIMEOUT", 0.05): task = asyncio.create_task(light.async_turn_off()) # Do NOT wait for the future to get added, we know the retry logic works light._aio_protocol.data_received( b"\x81\x25\x24\x61\x05\x10\xb6\x00\x98\x19\x04\x25\x0f\xdf") await asyncio.sleep(0) assert light.is_on is False await task await asyncio.sleep(0) caplog.clear() caplog.set_level(logging.DEBUG) # Handle the failure case with patch.object(aiodevice, "POWER_STATE_TIMEOUT", 0.05): await asyncio.create_task(light.async_turn_on()) assert light.is_on is False assert "Failed to turn on (1/3)" in caplog.text assert "Failed to turn on (2/3)" in caplog.text assert "Failed to turn on (3/3)" in caplog.text