mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 20:57:21 +00:00
Update sleep period for Shelly devices with buggy fw (#107961)
* update sleep period for Shelly devices with buggy fw * code quality * update model list * add test * Apply review comments * fix test * use costant
This commit is contained in:
parent
b0adaece25
commit
ef8d394c16
@ -30,12 +30,15 @@ from homeassistant.helpers.device_registry import (
|
|||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
|
|
||||||
from .const import (
|
from .const import (
|
||||||
|
BLOCK_EXPECTED_SLEEP_PERIOD,
|
||||||
|
BLOCK_WRONG_SLEEP_PERIOD,
|
||||||
CONF_COAP_PORT,
|
CONF_COAP_PORT,
|
||||||
CONF_SLEEP_PERIOD,
|
CONF_SLEEP_PERIOD,
|
||||||
DATA_CONFIG_ENTRY,
|
DATA_CONFIG_ENTRY,
|
||||||
DEFAULT_COAP_PORT,
|
DEFAULT_COAP_PORT,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
LOGGER,
|
LOGGER,
|
||||||
|
MODELS_WITH_WRONG_SLEEP_PERIOD,
|
||||||
PUSH_UPDATE_ISSUE_ID,
|
PUSH_UPDATE_ISSUE_ID,
|
||||||
)
|
)
|
||||||
from .coordinator import (
|
from .coordinator import (
|
||||||
@ -162,6 +165,22 @@ async def _async_setup_block_entry(hass: HomeAssistant, entry: ConfigEntry) -> b
|
|||||||
sleep_period = entry.data.get(CONF_SLEEP_PERIOD)
|
sleep_period = entry.data.get(CONF_SLEEP_PERIOD)
|
||||||
shelly_entry_data = get_entry_data(hass)[entry.entry_id]
|
shelly_entry_data = get_entry_data(hass)[entry.entry_id]
|
||||||
|
|
||||||
|
# Some old firmware have a wrong sleep period hardcoded value.
|
||||||
|
# Following code block will force the right value for affected devices
|
||||||
|
if (
|
||||||
|
sleep_period == BLOCK_WRONG_SLEEP_PERIOD
|
||||||
|
and entry.data["model"] in MODELS_WITH_WRONG_SLEEP_PERIOD
|
||||||
|
):
|
||||||
|
LOGGER.warning(
|
||||||
|
"Updating stored sleep period for %s: from %s to %s",
|
||||||
|
entry.title,
|
||||||
|
sleep_period,
|
||||||
|
BLOCK_EXPECTED_SLEEP_PERIOD,
|
||||||
|
)
|
||||||
|
data = {**entry.data}
|
||||||
|
data[CONF_SLEEP_PERIOD] = sleep_period = BLOCK_EXPECTED_SLEEP_PERIOD
|
||||||
|
hass.config_entries.async_update_entry(entry, data=data)
|
||||||
|
|
||||||
async def _async_block_device_setup() -> None:
|
async def _async_block_device_setup() -> None:
|
||||||
"""Set up a block based device that is online."""
|
"""Set up a block based device that is online."""
|
||||||
shelly_entry_data.block = ShellyBlockCoordinator(hass, entry, device)
|
shelly_entry_data.block = ShellyBlockCoordinator(hass, entry, device)
|
||||||
|
@ -14,7 +14,10 @@ from aioshelly.const import (
|
|||||||
MODEL_DIMMER,
|
MODEL_DIMMER,
|
||||||
MODEL_DIMMER_2,
|
MODEL_DIMMER_2,
|
||||||
MODEL_DUO,
|
MODEL_DUO,
|
||||||
|
MODEL_DW,
|
||||||
|
MODEL_DW_2,
|
||||||
MODEL_GAS,
|
MODEL_GAS,
|
||||||
|
MODEL_HT,
|
||||||
MODEL_MOTION,
|
MODEL_MOTION,
|
||||||
MODEL_MOTION_2,
|
MODEL_MOTION_2,
|
||||||
MODEL_RGBW2,
|
MODEL_RGBW2,
|
||||||
@ -55,6 +58,12 @@ MODELS_SUPPORTING_LIGHT_EFFECTS: Final = (
|
|||||||
MODEL_RGBW2,
|
MODEL_RGBW2,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
MODELS_WITH_WRONG_SLEEP_PERIOD: Final = (
|
||||||
|
MODEL_DW,
|
||||||
|
MODEL_DW_2,
|
||||||
|
MODEL_HT,
|
||||||
|
)
|
||||||
|
|
||||||
# Bulbs that support white & color modes
|
# Bulbs that support white & color modes
|
||||||
DUAL_MODE_LIGHT_MODELS: Final = (
|
DUAL_MODE_LIGHT_MODELS: Final = (
|
||||||
MODEL_BULB,
|
MODEL_BULB,
|
||||||
@ -176,6 +185,10 @@ KELVIN_MAX_VALUE: Final = 6500
|
|||||||
KELVIN_MIN_VALUE_WHITE: Final = 2700
|
KELVIN_MIN_VALUE_WHITE: Final = 2700
|
||||||
KELVIN_MIN_VALUE_COLOR: Final = 3000
|
KELVIN_MIN_VALUE_COLOR: Final = 3000
|
||||||
|
|
||||||
|
# Sleep period
|
||||||
|
BLOCK_WRONG_SLEEP_PERIOD = 21600
|
||||||
|
BLOCK_EXPECTED_SLEEP_PERIOD = 43200
|
||||||
|
|
||||||
UPTIME_DEVIATION: Final = 5
|
UPTIME_DEVIATION: Final = 5
|
||||||
|
|
||||||
# Time to wait before reloading entry upon device config change
|
# Time to wait before reloading entry upon device config change
|
||||||
|
@ -11,8 +11,12 @@ from aioshelly.exceptions import (
|
|||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components.shelly.const import (
|
from homeassistant.components.shelly.const import (
|
||||||
|
BLOCK_EXPECTED_SLEEP_PERIOD,
|
||||||
|
BLOCK_WRONG_SLEEP_PERIOD,
|
||||||
CONF_BLE_SCANNER_MODE,
|
CONF_BLE_SCANNER_MODE,
|
||||||
|
CONF_SLEEP_PERIOD,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
MODELS_WITH_WRONG_SLEEP_PERIOD,
|
||||||
BLEScannerMode,
|
BLEScannerMode,
|
||||||
)
|
)
|
||||||
from homeassistant.config_entries import SOURCE_REAUTH, ConfigEntryState
|
from homeassistant.config_entries import SOURCE_REAUTH, ConfigEntryState
|
||||||
@ -309,3 +313,17 @@ async def test_entry_missing_gen(hass: HomeAssistant, mock_block_device) -> None
|
|||||||
|
|
||||||
assert entry.state is ConfigEntryState.LOADED
|
assert entry.state is ConfigEntryState.LOADED
|
||||||
assert hass.states.get("switch.test_name_channel_1").state is STATE_ON
|
assert hass.states.get("switch.test_name_channel_1").state is STATE_ON
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(("model"), MODELS_WITH_WRONG_SLEEP_PERIOD)
|
||||||
|
async def test_sleeping_block_device_wrong_sleep_period(
|
||||||
|
hass: HomeAssistant, mock_block_device, model
|
||||||
|
) -> None:
|
||||||
|
"""Test sleeping block device with wrong sleep period."""
|
||||||
|
entry = await init_integration(
|
||||||
|
hass, 1, model=model, sleep_period=BLOCK_WRONG_SLEEP_PERIOD, skip_setup=True
|
||||||
|
)
|
||||||
|
assert entry.data[CONF_SLEEP_PERIOD] == BLOCK_WRONG_SLEEP_PERIOD
|
||||||
|
await hass.config_entries.async_setup(entry.entry_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert entry.data[CONF_SLEEP_PERIOD] == BLOCK_EXPECTED_SLEEP_PERIOD
|
||||||
|
Loading…
x
Reference in New Issue
Block a user