mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Remove scan_interval and manual options from speedtestdotnet (#84295)
This commit is contained in:
parent
63807e443a
commit
78cc547782
@ -1,21 +1,16 @@
|
|||||||
"""Support for testing internet speed via Speedtest.net."""
|
"""Support for testing internet speed via Speedtest.net."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from datetime import timedelta
|
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
import speedtest
|
import speedtest
|
||||||
|
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import EVENT_HOMEASSISTANT_STARTED, Platform
|
||||||
CONF_SCAN_INTERVAL,
|
|
||||||
EVENT_HOMEASSISTANT_STARTED,
|
|
||||||
Platform,
|
|
||||||
)
|
|
||||||
from homeassistant.core import CoreState, Event, HomeAssistant
|
from homeassistant.core import CoreState, Event, HomeAssistant
|
||||||
from homeassistant.exceptions import ConfigEntryNotReady
|
from homeassistant.exceptions import ConfigEntryNotReady
|
||||||
|
|
||||||
from .const import CONF_MANUAL, DEFAULT_SCAN_INTERVAL, DOMAIN
|
from .const import DOMAIN
|
||||||
from .coordinator import SpeedTestDataCoordinator
|
from .coordinator import SpeedTestDataCoordinator
|
||||||
|
|
||||||
PLATFORMS = [Platform.SENSOR]
|
PLATFORMS = [Platform.SENSOR]
|
||||||
@ -32,32 +27,22 @@ async def async_setup_entry(hass: HomeAssistant, config_entry: ConfigEntry) -> b
|
|||||||
except speedtest.SpeedtestException as err:
|
except speedtest.SpeedtestException as err:
|
||||||
raise ConfigEntryNotReady from err
|
raise ConfigEntryNotReady from err
|
||||||
|
|
||||||
async def _enable_scheduled_speedtests(event: Event | None = None) -> None:
|
async def _request_refresh(event: Event) -> None:
|
||||||
"""Activate the data update coordinator."""
|
"""Request a refresh."""
|
||||||
coordinator.update_interval = timedelta(
|
await coordinator.async_request_refresh()
|
||||||
minutes=config_entry.options.get(CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL)
|
|
||||||
)
|
|
||||||
await coordinator.async_refresh()
|
|
||||||
|
|
||||||
if not config_entry.options.get(CONF_MANUAL, False):
|
|
||||||
if hass.state == CoreState.running:
|
if hass.state == CoreState.running:
|
||||||
await _enable_scheduled_speedtests()
|
await coordinator.async_config_entry_first_refresh()
|
||||||
else:
|
else:
|
||||||
# Running a speed test during startup can prevent
|
# Running a speed test during startup can prevent
|
||||||
# integrations from being able to setup because it
|
# integrations from being able to setup because it
|
||||||
# can saturate the network interface.
|
# can saturate the network interface.
|
||||||
hass.bus.async_listen_once(
|
hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STARTED, _request_refresh)
|
||||||
EVENT_HOMEASSISTANT_STARTED, _enable_scheduled_speedtests
|
|
||||||
)
|
|
||||||
|
|
||||||
hass.data[DOMAIN] = coordinator
|
hass.data[DOMAIN] = coordinator
|
||||||
|
|
||||||
await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
|
await hass.config_entries.async_forward_entry_setups(config_entry, PLATFORMS)
|
||||||
|
|
||||||
config_entry.async_on_unload(
|
|
||||||
config_entry.add_update_listener(options_updated_listener)
|
|
||||||
)
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
@ -68,14 +53,3 @@ async def async_unload_entry(hass: HomeAssistant, config_entry: ConfigEntry) ->
|
|||||||
):
|
):
|
||||||
hass.data.pop(DOMAIN)
|
hass.data.pop(DOMAIN)
|
||||||
return unload_ok
|
return unload_ok
|
||||||
|
|
||||||
|
|
||||||
async def options_updated_listener(hass: HomeAssistant, entry: ConfigEntry) -> None:
|
|
||||||
"""Handle options update."""
|
|
||||||
coordinator: SpeedTestDataCoordinator = hass.data[DOMAIN]
|
|
||||||
if entry.options[CONF_MANUAL]:
|
|
||||||
coordinator.update_interval = None
|
|
||||||
return
|
|
||||||
|
|
||||||
coordinator.update_interval = timedelta(minutes=entry.options[CONF_SCAN_INTERVAL])
|
|
||||||
await coordinator.async_request_refresh()
|
|
||||||
|
@ -6,16 +6,13 @@ from typing import Any
|
|||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
from homeassistant.const import CONF_SCAN_INTERVAL
|
|
||||||
from homeassistant.core import callback
|
from homeassistant.core import callback
|
||||||
from homeassistant.data_entry_flow import FlowResult
|
from homeassistant.data_entry_flow import FlowResult
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
CONF_MANUAL,
|
|
||||||
CONF_SERVER_ID,
|
CONF_SERVER_ID,
|
||||||
CONF_SERVER_NAME,
|
CONF_SERVER_NAME,
|
||||||
DEFAULT_NAME,
|
DEFAULT_NAME,
|
||||||
DEFAULT_SCAN_INTERVAL,
|
|
||||||
DEFAULT_SERVER,
|
DEFAULT_SERVER,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
)
|
)
|
||||||
@ -78,15 +75,6 @@ class SpeedTestOptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
CONF_SERVER_NAME,
|
CONF_SERVER_NAME,
|
||||||
default=self.config_entry.options.get(CONF_SERVER_NAME, DEFAULT_SERVER),
|
default=self.config_entry.options.get(CONF_SERVER_NAME, DEFAULT_SERVER),
|
||||||
): vol.In(self._servers.keys()),
|
): vol.In(self._servers.keys()),
|
||||||
vol.Optional(
|
|
||||||
CONF_SCAN_INTERVAL,
|
|
||||||
default=self.config_entry.options.get(
|
|
||||||
CONF_SCAN_INTERVAL, DEFAULT_SCAN_INTERVAL
|
|
||||||
),
|
|
||||||
): int,
|
|
||||||
vol.Optional(
|
|
||||||
CONF_MANUAL, default=self.config_entry.options.get(CONF_MANUAL, False)
|
|
||||||
): bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return self.async_show_form(
|
return self.async_show_form(
|
||||||
|
@ -7,7 +7,6 @@ DOMAIN: Final = "speedtestdotnet"
|
|||||||
|
|
||||||
CONF_SERVER_NAME: Final = "server_name"
|
CONF_SERVER_NAME: Final = "server_name"
|
||||||
CONF_SERVER_ID: Final = "server_id"
|
CONF_SERVER_ID: Final = "server_id"
|
||||||
CONF_MANUAL: Final = "manual"
|
|
||||||
|
|
||||||
ATTR_BYTES_RECEIVED: Final = "bytes_received"
|
ATTR_BYTES_RECEIVED: Final = "bytes_received"
|
||||||
ATTR_BYTES_SENT: Final = "bytes_sent"
|
ATTR_BYTES_SENT: Final = "bytes_sent"
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
"""Coordinator for speedtestdotnet."""
|
"""Coordinator for speedtestdotnet."""
|
||||||
|
|
||||||
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
@ -9,7 +10,7 @@ from homeassistant.config_entries import ConfigEntry
|
|||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
from homeassistant.helpers.update_coordinator import DataUpdateCoordinator, UpdateFailed
|
||||||
|
|
||||||
from .const import CONF_SERVER_ID, DEFAULT_SERVER, DOMAIN
|
from .const import CONF_SERVER_ID, DEFAULT_SCAN_INTERVAL, DEFAULT_SERVER, DOMAIN
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -31,6 +32,7 @@ class SpeedTestDataCoordinator(DataUpdateCoordinator[dict[str, Any]]):
|
|||||||
self.hass,
|
self.hass,
|
||||||
_LOGGER,
|
_LOGGER,
|
||||||
name=DOMAIN,
|
name=DOMAIN,
|
||||||
|
update_interval=timedelta(minutes=DEFAULT_SCAN_INTERVAL),
|
||||||
)
|
)
|
||||||
|
|
||||||
def update_servers(self) -> None:
|
def update_servers(self) -> None:
|
||||||
|
@ -13,8 +13,6 @@
|
|||||||
"step": {
|
"step": {
|
||||||
"init": {
|
"init": {
|
||||||
"data": {
|
"data": {
|
||||||
"scan_interval": "Update frequency (minutes)",
|
|
||||||
"manual": "Disable auto update",
|
|
||||||
"server_name": "Select test server"
|
"server_name": "Select test server"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,8 +13,6 @@
|
|||||||
"step": {
|
"step": {
|
||||||
"init": {
|
"init": {
|
||||||
"data": {
|
"data": {
|
||||||
"manual": "Disable auto update",
|
|
||||||
"scan_interval": "Update frequency (minutes)",
|
|
||||||
"server_name": "Select test server"
|
"server_name": "Select test server"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,15 @@
|
|||||||
"""Tests for SpeedTest config flow."""
|
"""Tests for SpeedTest config flow."""
|
||||||
from datetime import timedelta
|
|
||||||
from unittest.mock import MagicMock
|
from unittest.mock import MagicMock
|
||||||
|
|
||||||
from homeassistant import config_entries, data_entry_flow
|
from homeassistant import config_entries
|
||||||
from homeassistant.components import speedtestdotnet
|
from homeassistant.components import speedtestdotnet
|
||||||
from homeassistant.components.speedtestdotnet.const import (
|
from homeassistant.components.speedtestdotnet.const import (
|
||||||
CONF_MANUAL,
|
|
||||||
CONF_SERVER_ID,
|
CONF_SERVER_ID,
|
||||||
CONF_SERVER_NAME,
|
CONF_SERVER_NAME,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
)
|
)
|
||||||
from homeassistant.const import CONF_SCAN_INTERVAL
|
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.data_entry_flow import FlowResultType
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
@ -21,13 +19,13 @@ async def test_flow_works(hass: HomeAssistant) -> None:
|
|||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
speedtestdotnet.DOMAIN, context={"source": config_entries.SOURCE_USER}
|
speedtestdotnet.DOMAIN, context={"source": config_entries.SOURCE_USER}
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.FORM
|
assert result["type"] == FlowResultType.FORM
|
||||||
assert result["step_id"] == "user"
|
assert result["step_id"] == "user"
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_configure(
|
result = await hass.config_entries.flow.async_configure(
|
||||||
result["flow_id"], user_input={}
|
result["flow_id"], user_input={}
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
assert result["type"] == FlowResultType.CREATE_ENTRY
|
||||||
|
|
||||||
|
|
||||||
async def test_options(hass: HomeAssistant, mock_api: MagicMock) -> None:
|
async def test_options(hass: HomeAssistant, mock_api: MagicMock) -> None:
|
||||||
@ -42,68 +40,41 @@ async def test_options(hass: HomeAssistant, mock_api: MagicMock) -> None:
|
|||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
result = await hass.config_entries.options.async_init(entry.entry_id)
|
result = await hass.config_entries.options.async_init(entry.entry_id)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.FORM
|
assert result["type"] == FlowResultType.FORM
|
||||||
assert result["step_id"] == "init"
|
assert result["step_id"] == "init"
|
||||||
|
|
||||||
result = await hass.config_entries.options.async_configure(
|
result = await hass.config_entries.options.async_configure(
|
||||||
result["flow_id"],
|
result["flow_id"],
|
||||||
user_input={
|
user_input={
|
||||||
CONF_SERVER_NAME: "Country1 - Sponsor1 - Server1",
|
CONF_SERVER_NAME: "Country1 - Sponsor1 - Server1",
|
||||||
CONF_SCAN_INTERVAL: 30,
|
|
||||||
CONF_MANUAL: True,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
assert result["type"] == FlowResultType.CREATE_ENTRY
|
||||||
assert result["data"] == {
|
assert result["data"] == {
|
||||||
CONF_SERVER_NAME: "Country1 - Sponsor1 - Server1",
|
CONF_SERVER_NAME: "Country1 - Sponsor1 - Server1",
|
||||||
CONF_SERVER_ID: "1",
|
CONF_SERVER_ID: "1",
|
||||||
CONF_SCAN_INTERVAL: 30,
|
|
||||||
CONF_MANUAL: True,
|
|
||||||
}
|
}
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert hass.data[DOMAIN].update_interval is None
|
|
||||||
|
|
||||||
# test setting server name to "*Auto Detect"
|
# test setting server name to "*Auto Detect"
|
||||||
result = await hass.config_entries.options.async_init(entry.entry_id)
|
result = await hass.config_entries.options.async_init(entry.entry_id)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.FORM
|
assert result["type"] == FlowResultType.FORM
|
||||||
assert result["step_id"] == "init"
|
assert result["step_id"] == "init"
|
||||||
|
|
||||||
result = await hass.config_entries.options.async_configure(
|
result = await hass.config_entries.options.async_configure(
|
||||||
result["flow_id"],
|
result["flow_id"],
|
||||||
user_input={
|
user_input={
|
||||||
CONF_SERVER_NAME: "*Auto Detect",
|
CONF_SERVER_NAME: "*Auto Detect",
|
||||||
CONF_SCAN_INTERVAL: 30,
|
|
||||||
CONF_MANUAL: True,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.CREATE_ENTRY
|
assert result["type"] == FlowResultType.CREATE_ENTRY
|
||||||
assert result["data"] == {
|
assert result["data"] == {
|
||||||
CONF_SERVER_NAME: "*Auto Detect",
|
CONF_SERVER_NAME: "*Auto Detect",
|
||||||
CONF_SERVER_ID: None,
|
CONF_SERVER_ID: None,
|
||||||
CONF_SCAN_INTERVAL: 30,
|
|
||||||
CONF_MANUAL: True,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# test setting the option to update periodically
|
|
||||||
result2 = await hass.config_entries.options.async_init(entry.entry_id)
|
|
||||||
assert result2["type"] == data_entry_flow.FlowResultType.FORM
|
|
||||||
assert result2["step_id"] == "init"
|
|
||||||
|
|
||||||
result2 = await hass.config_entries.options.async_configure(
|
|
||||||
result2["flow_id"],
|
|
||||||
user_input={
|
|
||||||
CONF_SERVER_NAME: "Country1 - Sponsor1 - Server1",
|
|
||||||
CONF_SCAN_INTERVAL: 30,
|
|
||||||
CONF_MANUAL: False,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
await hass.async_block_till_done()
|
|
||||||
|
|
||||||
assert hass.data[DOMAIN].update_interval == timedelta(minutes=30)
|
|
||||||
|
|
||||||
|
|
||||||
async def test_integration_already_configured(hass: HomeAssistant) -> None:
|
async def test_integration_already_configured(hass: HomeAssistant) -> None:
|
||||||
"""Test integration is already configured."""
|
"""Test integration is already configured."""
|
||||||
@ -114,5 +85,5 @@ async def test_integration_already_configured(hass: HomeAssistant) -> None:
|
|||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
speedtestdotnet.DOMAIN, context={"source": config_entries.SOURCE_USER}
|
speedtestdotnet.DOMAIN, context={"source": config_entries.SOURCE_USER}
|
||||||
)
|
)
|
||||||
assert result["type"] == data_entry_flow.FlowResultType.ABORT
|
assert result["type"] == FlowResultType.ABORT
|
||||||
assert result["reason"] == "single_instance_allowed"
|
assert result["reason"] == "single_instance_allowed"
|
||||||
|
@ -6,13 +6,12 @@ from unittest.mock import MagicMock
|
|||||||
import speedtest
|
import speedtest
|
||||||
|
|
||||||
from homeassistant.components.speedtestdotnet.const import (
|
from homeassistant.components.speedtestdotnet.const import (
|
||||||
CONF_MANUAL,
|
|
||||||
CONF_SERVER_ID,
|
CONF_SERVER_ID,
|
||||||
CONF_SERVER_NAME,
|
CONF_SERVER_NAME,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
)
|
)
|
||||||
from homeassistant.config_entries import ConfigEntryState
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
from homeassistant.const import CONF_SCAN_INTERVAL, STATE_UNAVAILABLE
|
from homeassistant.const import STATE_UNAVAILABLE
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
import homeassistant.util.dt as dt_util
|
import homeassistant.util.dt as dt_util
|
||||||
|
|
||||||
@ -28,8 +27,6 @@ async def test_successful_config_entry(hass: HomeAssistant) -> None:
|
|||||||
options={
|
options={
|
||||||
CONF_SERVER_NAME: "Country1 - Sponsor1 - Server1",
|
CONF_SERVER_NAME: "Country1 - Sponsor1 - Server1",
|
||||||
CONF_SERVER_ID: "1",
|
CONF_SERVER_ID: "1",
|
||||||
CONF_SCAN_INTERVAL: 30,
|
|
||||||
CONF_MANUAL: False,
|
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
@ -75,10 +72,7 @@ async def test_server_not_found(hass: HomeAssistant, mock_api: MagicMock) -> Non
|
|||||||
|
|
||||||
entry = MockConfigEntry(
|
entry = MockConfigEntry(
|
||||||
domain=DOMAIN,
|
domain=DOMAIN,
|
||||||
options={
|
options={},
|
||||||
CONF_MANUAL: False,
|
|
||||||
CONF_SCAN_INTERVAL: 60,
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
|
|
||||||
@ -89,7 +83,7 @@ async def test_server_not_found(hass: HomeAssistant, mock_api: MagicMock) -> Non
|
|||||||
mock_api.return_value.get_servers.side_effect = speedtest.NoMatchedServers
|
mock_api.return_value.get_servers.side_effect = speedtest.NoMatchedServers
|
||||||
async_fire_time_changed(
|
async_fire_time_changed(
|
||||||
hass,
|
hass,
|
||||||
dt_util.utcnow() + timedelta(minutes=entry.options[CONF_SCAN_INTERVAL] + 1),
|
dt_util.utcnow() + timedelta(minutes=61),
|
||||||
)
|
)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
state = hass.states.get("sensor.speedtest_ping")
|
state = hass.states.get("sensor.speedtest_ping")
|
||||||
|
@ -3,7 +3,7 @@ from unittest.mock import MagicMock
|
|||||||
|
|
||||||
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN
|
||||||
from homeassistant.components.speedtestdotnet import DOMAIN
|
from homeassistant.components.speedtestdotnet import DOMAIN
|
||||||
from homeassistant.components.speedtestdotnet.const import CONF_MANUAL, DEFAULT_NAME
|
from homeassistant.components.speedtestdotnet.const import DEFAULT_NAME
|
||||||
from homeassistant.components.speedtestdotnet.sensor import SENSOR_TYPES
|
from homeassistant.components.speedtestdotnet.sensor import SENSOR_TYPES
|
||||||
from homeassistant.core import HomeAssistant, State
|
from homeassistant.core import HomeAssistant, State
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ async def test_restore_last_state(hass: HomeAssistant, mock_api: MagicMock) -> N
|
|||||||
for sensor, state in MOCK_STATES.items()
|
for sensor, state in MOCK_STATES.items()
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
entry = MockConfigEntry(domain=DOMAIN, data={}, options={CONF_MANUAL: True})
|
entry = MockConfigEntry(domain=DOMAIN)
|
||||||
entry.add_to_hass(hass)
|
entry.add_to_hass(hass)
|
||||||
|
|
||||||
await hass.config_entries.async_setup(entry.entry_id)
|
await hass.config_entries.async_setup(entry.entry_id)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user