diff --git a/homeassistant/components/ipp/config_flow.py b/homeassistant/components/ipp/config_flow.py index 11757792aad2..7c86a2ef9240 100644 --- a/homeassistant/components/ipp/config_flow.py +++ b/homeassistant/components/ipp/config_flow.py @@ -27,7 +27,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.service_info.zeroconf import ZeroconfServiceInfo -from .const import CONF_BASE_PATH, CONF_SERIAL, DOMAIN +from .const import CONF_BASE_PATH, CONF_SERIAL, DOMAIN, REQUEST_TIMEOUT _LOGGER = logging.getLogger(__name__) @@ -45,6 +45,7 @@ async def validate_input(hass: HomeAssistant, data: dict) -> dict[str, Any]: tls=data[CONF_SSL], verify_ssl=data[CONF_VERIFY_SSL], session=session, + request_timeout=REQUEST_TIMEOUT, ) printer = await ipp.printer() diff --git a/homeassistant/components/ipp/const.py b/homeassistant/components/ipp/const.py index 642898385430..d1ad3e73fc8f 100644 --- a/homeassistant/components/ipp/const.py +++ b/homeassistant/components/ipp/const.py @@ -14,6 +14,9 @@ ATTR_STATE_MESSAGE = "state_message" ATTR_STATE_REASON = "state_reason" ATTR_URI_SUPPORTED = "uri_supported" +# Printers waking from sleep can take well over pyipp's own default +REQUEST_TIMEOUT = 30 + # Config Keys CONF_BASE_PATH = "base_path" CONF_SERIAL = "serial" diff --git a/homeassistant/components/ipp/coordinator.py b/homeassistant/components/ipp/coordinator.py index 84d54e7b8a5c..c9c56bd5464f 100644 --- a/homeassistant/components/ipp/coordinator.py +++ b/homeassistant/components/ipp/coordinator.py @@ -12,7 +12,7 @@ from homeassistant.core import HomeAssistant from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed -from .const import CONF_BASE_PATH, DOMAIN +from .const import CONF_BASE_PATH, DOMAIN, REQUEST_TIMEOUT SCAN_INTERVAL = timedelta(seconds=60) @@ -36,6 +36,7 @@ class IPPDataUpdateCoordinator(DataUpdateCoordinator[IPPPrinter]): tls=config_entry.data[CONF_SSL], verify_ssl=config_entry.data[CONF_VERIFY_SSL], session=async_get_clientsession(hass, config_entry.data[CONF_VERIFY_SSL]), + request_timeout=REQUEST_TIMEOUT, ) super().__init__( diff --git a/tests/components/ipp/test_init.py b/tests/components/ipp/test_init.py index e1050bc5c218..7edd0f8494e1 100644 --- a/tests/components/ipp/test_init.py +++ b/tests/components/ipp/test_init.py @@ -4,6 +4,7 @@ from unittest.mock import AsyncMock, MagicMock, patch from pyipp import IPPConnectionError +from homeassistant.components.ipp.const import REQUEST_TIMEOUT from homeassistant.components.ipp.coordinator import IPPDataUpdateCoordinator from homeassistant.config_entries import ConfigEntryState from homeassistant.core import HomeAssistant @@ -43,3 +44,12 @@ async def test_load_unload_config_entry( await hass.config_entries.async_unload(mock_config_entry.entry_id) await hass.async_block_till_done() assert mock_config_entry.state is ConfigEntryState.NOT_LOADED + + +async def test_request_timeout( + hass: HomeAssistant, mock_config_entry: MockConfigEntry +) -> None: + """Test a printer gets time to wake up before we give up on it.""" + coordinator = IPPDataUpdateCoordinator(hass, mock_config_entry) + + assert coordinator.ipp.request_timeout == REQUEST_TIMEOUT