1
mirror of https://github.com/home-assistant/core synced 2024-08-28 03:36:46 +02:00

Fix Shelly missing Gen value for older devices (#107294)

This commit is contained in:
Shay Levy 2024-01-06 01:32:04 +02:00 committed by GitHub
parent 2ed9397611
commit ad3c78f848
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 8 deletions

View File

@ -36,6 +36,7 @@ from .coordinator import async_reconnect_soon
from .utils import ( from .utils import (
get_block_device_sleep_period, get_block_device_sleep_period,
get_coap_context, get_coap_context,
get_device_entry_gen,
get_info_auth, get_info_auth,
get_info_gen, get_info_gen,
get_model_name, get_model_name,
@ -322,7 +323,7 @@ class ShellyConfigFlow(ConfigFlow, domain=DOMAIN):
except (DeviceConnectionError, InvalidAuthError, FirmwareUnsupported): except (DeviceConnectionError, InvalidAuthError, FirmwareUnsupported):
return self.async_abort(reason="reauth_unsuccessful") return self.async_abort(reason="reauth_unsuccessful")
if self.entry.data.get(CONF_GEN, 1) != 1: if get_device_entry_gen(self.entry) != 1:
user_input[CONF_USERNAME] = "admin" user_input[CONF_USERNAME] = "admin"
try: try:
await validate_input(self.hass, host, info, user_input) await validate_input(self.hass, host, info, user_input)
@ -335,7 +336,7 @@ class ShellyConfigFlow(ConfigFlow, domain=DOMAIN):
await self.hass.config_entries.async_reload(self.entry.entry_id) await self.hass.config_entries.async_reload(self.entry.entry_id)
return self.async_abort(reason="reauth_successful") return self.async_abort(reason="reauth_successful")
if self.entry.data.get(CONF_GEN, 1) in BLOCK_GENERATIONS: if get_device_entry_gen(self.entry) in BLOCK_GENERATIONS:
schema = { schema = {
vol.Required(CONF_USERNAME): str, vol.Required(CONF_USERNAME): str,
vol.Required(CONF_PASSWORD): str, vol.Required(CONF_PASSWORD): str,
@ -364,7 +365,7 @@ class ShellyConfigFlow(ConfigFlow, domain=DOMAIN):
def async_supports_options_flow(cls, config_entry: ConfigEntry) -> bool: def async_supports_options_flow(cls, config_entry: ConfigEntry) -> bool:
"""Return options flow support for this handler.""" """Return options flow support for this handler."""
return ( return (
config_entry.data.get(CONF_GEN) in RPC_GENERATIONS get_device_entry_gen(config_entry) in RPC_GENERATIONS
and not config_entry.data.get(CONF_SLEEP_PERIOD) and not config_entry.data.get(CONF_SLEEP_PERIOD)
and config_entry.data.get("model") != MODEL_WALL_DISPLAY and config_entry.data.get("model") != MODEL_WALL_DISPLAY
) )

View File

@ -33,7 +33,6 @@ from .const import (
ATTR_GENERATION, ATTR_GENERATION,
BATTERY_DEVICES_WITH_PERMANENT_CONNECTION, BATTERY_DEVICES_WITH_PERMANENT_CONNECTION,
CONF_BLE_SCANNER_MODE, CONF_BLE_SCANNER_MODE,
CONF_GEN,
CONF_SLEEP_PERIOD, CONF_SLEEP_PERIOD,
DATA_CONFIG_ENTRY, DATA_CONFIG_ENTRY,
DOMAIN, DOMAIN,
@ -58,7 +57,11 @@ from .const import (
UPDATE_PERIOD_MULTIPLIER, UPDATE_PERIOD_MULTIPLIER,
BLEScannerMode, BLEScannerMode,
) )
from .utils import get_rpc_device_wakeup_period, update_device_fw_info from .utils import (
get_device_entry_gen,
get_rpc_device_wakeup_period,
update_device_fw_info,
)
_DeviceT = TypeVar("_DeviceT", bound="BlockDevice|RpcDevice") _DeviceT = TypeVar("_DeviceT", bound="BlockDevice|RpcDevice")
@ -136,7 +139,7 @@ class ShellyCoordinatorBase(DataUpdateCoordinator[None], Generic[_DeviceT]):
manufacturer="Shelly", manufacturer="Shelly",
model=aioshelly.const.MODEL_NAMES.get(self.model, self.model), model=aioshelly.const.MODEL_NAMES.get(self.model, self.model),
sw_version=self.sw_version, sw_version=self.sw_version,
hw_version=f"gen{self.entry.data[CONF_GEN]} ({self.model})", hw_version=f"gen{get_device_entry_gen(self.entry)} ({self.model})",
configuration_url=f"http://{self.entry.data[CONF_HOST]}", configuration_url=f"http://{self.entry.data[CONF_HOST]}",
) )
self.device_id = device_entry.id self.device_id = device_entry.id

View File

@ -12,6 +12,7 @@ from freezegun.api import FrozenDateTimeFactory
import pytest import pytest
from homeassistant.components.shelly.const import ( from homeassistant.components.shelly.const import (
CONF_GEN,
CONF_SLEEP_PERIOD, CONF_SLEEP_PERIOD,
DOMAIN, DOMAIN,
REST_SENSORS_UPDATE_INTERVAL, REST_SENSORS_UPDATE_INTERVAL,
@ -30,7 +31,7 @@ MOCK_MAC = "123456789ABC"
async def init_integration( async def init_integration(
hass: HomeAssistant, hass: HomeAssistant,
gen: int, gen: int | None,
model=MODEL_25, model=MODEL_25,
sleep_period=0, sleep_period=0,
options: dict[str, Any] | None = None, options: dict[str, Any] | None = None,
@ -41,8 +42,9 @@ async def init_integration(
CONF_HOST: "192.168.1.37", CONF_HOST: "192.168.1.37",
CONF_SLEEP_PERIOD: sleep_period, CONF_SLEEP_PERIOD: sleep_period,
"model": model, "model": model,
"gen": gen,
} }
if gen is not None:
data[CONF_GEN] = gen
entry = MockConfigEntry( entry = MockConfigEntry(
domain=DOMAIN, data=data, unique_id=MOCK_MAC, options=options domain=DOMAIN, data=data, unique_id=MOCK_MAC, options=options

View File

@ -301,3 +301,11 @@ async def test_no_attempt_to_stop_scanner_with_sleepy_devices(
mock_rpc_device.mock_update() mock_rpc_device.mock_update()
await hass.async_block_till_done() await hass.async_block_till_done()
assert not mock_stop_scanner.call_count assert not mock_stop_scanner.call_count
async def test_entry_missing_gen(hass: HomeAssistant, mock_block_device) -> None:
"""Test successful Gen1 device init when gen is missing in entry data."""
entry = await init_integration(hass, None)
assert entry.state is ConfigEntryState.LOADED
assert hass.states.get("switch.test_name_channel_1").state is STATE_ON