mirror of
https://github.com/home-assistant/core.git
synced 2025-07-25 06:07:17 +00:00
Stop Speedtest sensors update on startup if manual option is enabled (#37403)
Co-authored-by: Paulus Schoutsen <paulus@home-assistant.io>
This commit is contained in:
parent
b826970b16
commit
f8651d9faa
@ -70,9 +70,10 @@ async def async_setup_entry(hass, config_entry):
|
|||||||
coordinator = SpeedTestDataCoordinator(hass, config_entry)
|
coordinator = SpeedTestDataCoordinator(hass, config_entry)
|
||||||
await coordinator.async_setup()
|
await coordinator.async_setup()
|
||||||
|
|
||||||
await coordinator.async_refresh()
|
if not config_entry.options[CONF_MANUAL]:
|
||||||
if not coordinator.last_update_success:
|
await coordinator.async_refresh()
|
||||||
raise ConfigEntryNotReady
|
if not coordinator.last_update_success:
|
||||||
|
raise ConfigEntryNotReady
|
||||||
|
|
||||||
hass.data[DOMAIN] = coordinator
|
hass.data[DOMAIN] = coordinator
|
||||||
|
|
||||||
@ -115,9 +116,12 @@ class SpeedTestDataCoordinator(DataUpdateCoordinator):
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
def update_data(self):
|
def update_servers(self):
|
||||||
"""Get the latest data from speedtest.net."""
|
"""Update list of test servers."""
|
||||||
server_list = self.api.get_servers()
|
try:
|
||||||
|
server_list = self.api.get_servers()
|
||||||
|
except speedtest.ConfigRetrievalError:
|
||||||
|
return
|
||||||
|
|
||||||
self.servers[DEFAULT_SERVER] = {}
|
self.servers[DEFAULT_SERVER] = {}
|
||||||
for server in sorted(
|
for server in sorted(
|
||||||
@ -125,14 +129,20 @@ class SpeedTestDataCoordinator(DataUpdateCoordinator):
|
|||||||
):
|
):
|
||||||
self.servers[f"{server[0]['country']} - {server[0]['sponsor']}"] = server[0]
|
self.servers[f"{server[0]['country']} - {server[0]['sponsor']}"] = server[0]
|
||||||
|
|
||||||
|
def update_data(self):
|
||||||
|
"""Get the latest data from speedtest.net."""
|
||||||
|
self.update_servers()
|
||||||
|
|
||||||
|
self.api.closest.clear()
|
||||||
if self.config_entry.options.get(CONF_SERVER_ID):
|
if self.config_entry.options.get(CONF_SERVER_ID):
|
||||||
server_id = self.config_entry.options.get(CONF_SERVER_ID)
|
server_id = self.config_entry.options.get(CONF_SERVER_ID)
|
||||||
self.api.closest.clear()
|
|
||||||
self.api.get_servers(servers=[server_id])
|
self.api.get_servers(servers=[server_id])
|
||||||
|
|
||||||
|
self.api.get_best_server()
|
||||||
_LOGGER.debug(
|
_LOGGER.debug(
|
||||||
"Executing speedtest.net speed test with server_id: %s", self.api.best["id"]
|
"Executing speedtest.net speed test with server_id: %s", self.api.best["id"]
|
||||||
)
|
)
|
||||||
self.api.get_best_server()
|
|
||||||
self.api.download()
|
self.api.download()
|
||||||
self.api.upload()
|
self.api.upload()
|
||||||
return self.api.results.dict()
|
return self.api.results.dict()
|
||||||
@ -170,6 +180,8 @@ class SpeedTestDataCoordinator(DataUpdateCoordinator):
|
|||||||
|
|
||||||
await self.async_set_options()
|
await self.async_set_options()
|
||||||
|
|
||||||
|
await self.hass.async_add_executor_job(self.update_servers)
|
||||||
|
|
||||||
self.hass.services.async_register(DOMAIN, SPEED_TEST_SERVICE, request_update)
|
self.hass.services.async_register(DOMAIN, SPEED_TEST_SERVICE, request_update)
|
||||||
|
|
||||||
self.config_entry.add_update_listener(options_updated_listener)
|
self.config_entry.add_update_listener(options_updated_listener)
|
||||||
|
@ -85,7 +85,7 @@ class SpeedTestOptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
|
|
||||||
self._servers = self.hass.data[DOMAIN].servers
|
self._servers = self.hass.data[DOMAIN].servers
|
||||||
|
|
||||||
server_name = DEFAULT_SERVER
|
server = []
|
||||||
if self.config_entry.options.get(
|
if self.config_entry.options.get(
|
||||||
CONF_SERVER_ID
|
CONF_SERVER_ID
|
||||||
) and not self.config_entry.options.get(CONF_SERVER_NAME):
|
) and not self.config_entry.options.get(CONF_SERVER_NAME):
|
||||||
@ -94,7 +94,7 @@ class SpeedTestOptionsFlowHandler(config_entries.OptionsFlow):
|
|||||||
for (key, value) in self._servers.items()
|
for (key, value) in self._servers.items()
|
||||||
if value.get("id") == self.config_entry.options[CONF_SERVER_ID]
|
if value.get("id") == self.config_entry.options[CONF_SERVER_ID]
|
||||||
]
|
]
|
||||||
server_name = server[0] if server else ""
|
server_name = server[0] if server else DEFAULT_SERVER
|
||||||
|
|
||||||
options = {
|
options = {
|
||||||
vol.Optional(
|
vol.Optional(
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from homeassistant.const import ATTR_ATTRIBUTION
|
from homeassistant.const import ATTR_ATTRIBUTION
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.core import callback
|
||||||
|
from homeassistant.helpers.restore_state import RestoreEntity
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
ATTR_BYTES_RECEIVED,
|
ATTR_BYTES_RECEIVED,
|
||||||
@ -11,6 +12,7 @@ from .const import (
|
|||||||
ATTR_SERVER_ID,
|
ATTR_SERVER_ID,
|
||||||
ATTR_SERVER_NAME,
|
ATTR_SERVER_NAME,
|
||||||
ATTRIBUTION,
|
ATTRIBUTION,
|
||||||
|
CONF_MANUAL,
|
||||||
DEFAULT_NAME,
|
DEFAULT_NAME,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
ICON,
|
ICON,
|
||||||
@ -32,7 +34,7 @@ async def async_setup_entry(hass, config_entry, async_add_entities):
|
|||||||
async_add_entities(entities)
|
async_add_entities(entities)
|
||||||
|
|
||||||
|
|
||||||
class SpeedtestSensor(Entity):
|
class SpeedtestSensor(RestoreEntity):
|
||||||
"""Implementation of a speedtest.net sensor."""
|
"""Implementation of a speedtest.net sensor."""
|
||||||
|
|
||||||
def __init__(self, coordinator, sensor_type):
|
def __init__(self, coordinator, sensor_type):
|
||||||
@ -41,6 +43,7 @@ class SpeedtestSensor(Entity):
|
|||||||
self.coordinator = coordinator
|
self.coordinator = coordinator
|
||||||
self.type = sensor_type
|
self.type = sensor_type
|
||||||
self._unit_of_measurement = SENSOR_TYPES[self.type][1]
|
self._unit_of_measurement = SENSOR_TYPES[self.type][1]
|
||||||
|
self._state = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
@ -55,14 +58,7 @@ class SpeedtestSensor(Entity):
|
|||||||
@property
|
@property
|
||||||
def state(self):
|
def state(self):
|
||||||
"""Return the state of the device."""
|
"""Return the state of the device."""
|
||||||
state = None
|
return self._state
|
||||||
if self.type == "ping":
|
|
||||||
state = self.coordinator.data["ping"]
|
|
||||||
elif self.type == "download":
|
|
||||||
state = round(self.coordinator.data["download"] / 10 ** 6, 2)
|
|
||||||
elif self.type == "upload":
|
|
||||||
state = round(self.coordinator.data["upload"] / 10 ** 6, 2)
|
|
||||||
return state
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def unit_of_measurement(self):
|
def unit_of_measurement(self):
|
||||||
@ -82,6 +78,8 @@ class SpeedtestSensor(Entity):
|
|||||||
@property
|
@property
|
||||||
def device_state_attributes(self):
|
def device_state_attributes(self):
|
||||||
"""Return the state attributes."""
|
"""Return the state attributes."""
|
||||||
|
if not self.coordinator.data:
|
||||||
|
return None
|
||||||
attributes = {
|
attributes = {
|
||||||
ATTR_ATTRIBUTION: ATTRIBUTION,
|
ATTR_ATTRIBUTION: ATTRIBUTION,
|
||||||
ATTR_SERVER_NAME: self.coordinator.data["server"]["name"],
|
ATTR_SERVER_NAME: self.coordinator.data["server"]["name"],
|
||||||
@ -98,10 +96,30 @@ class SpeedtestSensor(Entity):
|
|||||||
|
|
||||||
async def async_added_to_hass(self):
|
async def async_added_to_hass(self):
|
||||||
"""Handle entity which will be added."""
|
"""Handle entity which will be added."""
|
||||||
|
await super().async_added_to_hass()
|
||||||
|
if self.coordinator.config_entry.options[CONF_MANUAL]:
|
||||||
|
state = await self.async_get_last_state()
|
||||||
|
if state:
|
||||||
|
self._state = state.state
|
||||||
|
|
||||||
self.async_on_remove(
|
@callback
|
||||||
self.coordinator.async_add_listener(self.async_write_ha_state)
|
def update():
|
||||||
)
|
"""Update state."""
|
||||||
|
self._update_state()
|
||||||
|
self.async_write_ha_state()
|
||||||
|
|
||||||
|
self.async_on_remove(self.coordinator.async_add_listener(update))
|
||||||
|
self._update_state()
|
||||||
|
|
||||||
|
def _update_state(self):
|
||||||
|
"""Update sensors state."""
|
||||||
|
if self.coordinator.data:
|
||||||
|
if self.type == "ping":
|
||||||
|
self._state = self.coordinator.data["ping"]
|
||||||
|
elif self.type == "download":
|
||||||
|
self._state = round(self.coordinator.data["download"] / 10 ** 6, 2)
|
||||||
|
elif self.type == "upload":
|
||||||
|
self._state = round(self.coordinator.data["upload"] / 10 ** 6, 2)
|
||||||
|
|
||||||
async def async_update(self):
|
async def async_update(self):
|
||||||
"""Request coordinator to update data."""
|
"""Request coordinator to update data."""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user