diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 61f626fe22c3e3..6f128cafbee199 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -37,7 +37,7 @@ on: type: boolean env: - CACHE_VERSION: 8 + CACHE_VERSION: 9 UV_CACHE_VERSION: 1 MYPY_CACHE_VERSION: 1 HA_SHORT_VERSION: "2025.11" @@ -525,7 +525,7 @@ jobs: . venv/bin/activate python --version pip install "$(grep '^uv' < requirements.txt)" - uv pip install -U "pip>=21.3.1" setuptools wheel + uv pip install -U "pip>=25.2" uv pip install -r requirements.txt python -m script.gen_requirements_all ci uv pip install -r requirements_all_pytest.txt -r requirements_test.txt diff --git a/homeassistant/components/frontend/manifest.json b/homeassistant/components/frontend/manifest.json index 85ed62ef2e61eb..4589f8c67faef5 100644 --- a/homeassistant/components/frontend/manifest.json +++ b/homeassistant/components/frontend/manifest.json @@ -20,5 +20,5 @@ "documentation": "https://www.home-assistant.io/integrations/frontend", "integration_type": "system", "quality_scale": "internal", - "requirements": ["home-assistant-frontend==20251001.2"] + "requirements": ["home-assistant-frontend==20251001.4"] } diff --git a/homeassistant/components/kegtron/manifest.json b/homeassistant/components/kegtron/manifest.json index 38418c12d5c4b9..aa73cdd57db674 100644 --- a/homeassistant/components/kegtron/manifest.json +++ b/homeassistant/components/kegtron/manifest.json @@ -12,5 +12,5 @@ "dependencies": ["bluetooth_adapters"], "documentation": "https://www.home-assistant.io/integrations/kegtron", "iot_class": "local_push", - "requirements": ["kegtron-ble==0.4.0"] + "requirements": ["kegtron-ble==1.0.2"] } diff --git a/homeassistant/components/shelly/light.py b/homeassistant/components/shelly/light.py index 83e2544c084705..66d523ab20a901 100644 --- a/homeassistant/components/shelly/light.py +++ b/homeassistant/components/shelly/light.py @@ -40,14 +40,15 @@ ) from .coordinator import ShellyBlockCoordinator, ShellyConfigEntry, ShellyRpcCoordinator from .entity import ( + BlockEntityDescription, RpcEntityDescription, - ShellyBlockEntity, + ShellyBlockAttributeEntity, ShellyRpcAttributeEntity, + async_setup_entry_attribute_entities, async_setup_entry_rpc, ) from .utils import ( async_remove_orphaned_entities, - async_remove_shelly_entity, brightness_to_percentage, get_device_entry_gen, is_block_channel_type_light, @@ -58,6 +59,24 @@ PARALLEL_UPDATES = 0 +@dataclass(frozen=True, kw_only=True) +class BlockLightDescription(BlockEntityDescription, LightEntityDescription): + """Description for a Shelly BLOCK light entity.""" + + +BLOCK_LIGHTS = { + ("light", "output"): BlockLightDescription( + key="light|output", + ), + ("relay", "output"): BlockLightDescription( + key="relay|output", + removal_condition=lambda settings, block: not is_block_channel_type_light( + settings, block + ), + ), +} + + async def async_setup_entry( hass: HomeAssistant, config_entry: ShellyConfigEntry, @@ -79,36 +98,29 @@ def async_setup_block_entry( """Set up entities for block device.""" coordinator = config_entry.runtime_data.block assert coordinator - blocks = [] - assert coordinator.device.blocks - for block in coordinator.device.blocks: - if block.type == "light": - blocks.append(block) - elif block.type == "relay" and block.channel is not None: - if not is_block_channel_type_light( - coordinator.device.settings, int(block.channel) - ): - continue - blocks.append(block) - unique_id = f"{coordinator.mac}-{block.type}_{block.channel}" - async_remove_shelly_entity(hass, "switch", unique_id) - - if not blocks: - return - - async_add_entities(BlockShellyLight(coordinator, block) for block in blocks) + async_setup_entry_attribute_entities( + hass, config_entry, async_add_entities, BLOCK_LIGHTS, BlockShellyLight + ) -class BlockShellyLight(ShellyBlockEntity, LightEntity): +class BlockShellyLight(ShellyBlockAttributeEntity, LightEntity): """Entity that controls a light on block based Shelly devices.""" + entity_description: BlockLightDescription _attr_supported_color_modes: set[str] - def __init__(self, coordinator: ShellyBlockCoordinator, block: Block) -> None: - """Initialize light.""" - super().__init__(coordinator, block) + def __init__( + self, + coordinator: ShellyBlockCoordinator, + block: Block, + attribute: str, + description: BlockLightDescription, + ) -> None: + """Initialize block light.""" + super().__init__(coordinator, block, attribute, description) self.control_result: dict[str, Any] | None = None + self._attr_unique_id: str = f"{coordinator.mac}-{block.description}" self._attr_supported_color_modes = set() self._attr_min_color_temp_kelvin = KELVIN_MIN_VALUE_WHITE self._attr_max_color_temp_kelvin = KELVIN_MAX_VALUE @@ -347,7 +359,7 @@ def _update_callback(self) -> None: @dataclass(frozen=True, kw_only=True) class RpcLightDescription(RpcEntityDescription, LightEntityDescription): - """Description for a Shelly RPC number entity.""" + """Description for a Shelly RPC light entity.""" class RpcShellyLightBase(ShellyRpcAttributeEntity, LightEntity): diff --git a/homeassistant/components/shelly/utils.py b/homeassistant/components/shelly/utils.py index 22bb31d465b382..963494a30f3846 100644 --- a/homeassistant/components/shelly/utils.py +++ b/homeassistant/components/shelly/utils.py @@ -211,10 +211,7 @@ def is_block_exclude_from_relay(settings: dict[str, Any], block: Block) -> bool: if settings.get("mode") == "roller": return True - if TYPE_CHECKING: - assert block.channel is not None - - return is_block_channel_type_light(settings, int(block.channel)) + return is_block_channel_type_light(settings, block) def get_device_uptime(uptime: float, last_uptime: datetime | None) -> datetime: @@ -501,9 +498,12 @@ def is_rpc_momentary_input( return cast(bool, config[key]["type"] == "button") -def is_block_channel_type_light(settings: dict[str, Any], channel: int) -> bool: +def is_block_channel_type_light(settings: dict[str, Any], block: Block) -> bool: """Return true if block channel appliance type is set to light.""" - app_type = settings["relays"][channel].get("appliance_type") + if TYPE_CHECKING: + assert block.channel is not None + + app_type = settings["relays"][int(block.channel)].get("appliance_type") return app_type is not None and app_type.lower().startswith("light") diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index c1f38ee4a24f75..1fa7a280d4d014 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -39,7 +39,7 @@ habluetooth==5.7.0 hass-nabucasa==1.2.0 hassil==3.2.0 home-assistant-bluetooth==1.13.1 -home-assistant-frontend==20251001.2 +home-assistant-frontend==20251001.4 home-assistant-intents==2025.10.1 httpx==0.28.1 ifaddr==0.2.0 diff --git a/requirements_all.txt b/requirements_all.txt index 6c9b1525718097..13ace6eef68493 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -1186,7 +1186,7 @@ hole==0.9.0 holidays==0.82 # homeassistant.components.frontend -home-assistant-frontend==20251001.2 +home-assistant-frontend==20251001.4 # homeassistant.components.conversation home-assistant-intents==2025.10.1 @@ -1310,7 +1310,7 @@ kaiterra-async-client==1.0.0 keba-kecontact==1.3.0 # homeassistant.components.kegtron -kegtron-ble==0.4.0 +kegtron-ble==1.0.2 # homeassistant.components.kiwi kiwiki-client==0.1.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 807f4b56cdf128..b104958987be2d 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1035,7 +1035,7 @@ hole==0.9.0 holidays==0.82 # homeassistant.components.frontend -home-assistant-frontend==20251001.2 +home-assistant-frontend==20251001.4 # homeassistant.components.conversation home-assistant-intents==2025.10.1 @@ -1138,7 +1138,7 @@ jsonpath==0.82.2 justnimbus==0.7.4 # homeassistant.components.kegtron -kegtron-ble==0.4.0 +kegtron-ble==1.0.2 # homeassistant.components.knocki knocki==0.4.2 diff --git a/tests/components/matter/conftest.py b/tests/components/matter/conftest.py index b7f55ec2abde54..eaaf022d0ac4b7 100644 --- a/tests/components/matter/conftest.py +++ b/tests/components/matter/conftest.py @@ -119,7 +119,7 @@ async def integration_fixture( "silabs_refrigerator", "silabs_water_heater", "smoke_detector", - "solar_power", + "solar_inverter", "speaker", "switch_unit", "tado_smart_radiator_thermostat_x", diff --git a/tests/components/matter/fixtures/nodes/solar_power.json b/tests/components/matter/fixtures/nodes/solar_inverter.json similarity index 99% rename from tests/components/matter/fixtures/nodes/solar_power.json rename to tests/components/matter/fixtures/nodes/solar_inverter.json index 1147ff202ca863..5a4e04eacaf4c6 100644 --- a/tests/components/matter/fixtures/nodes/solar_power.json +++ b/tests/components/matter/fixtures/nodes/solar_inverter.json @@ -41,7 +41,7 @@ "0/40/0": 19, "0/40/1": "TEST_VENDOR", "0/40/2": 65521, - "0/40/3": "SolarPower", + "0/40/3": "Mock solar inverter", "0/40/4": 32768, "0/40/5": "", "0/40/6": "**REDACTED**", diff --git a/tests/components/matter/snapshots/test_sensor.ambr b/tests/components/matter/snapshots/test_sensor.ambr index 1f3fc5b0a35691..317969735fc238 100644 --- a/tests/components/matter/snapshots/test_sensor.ambr +++ b/tests/components/matter/snapshots/test_sensor.ambr @@ -6555,7 +6555,7 @@ 'state': '0.0', }) # --- -# name: test_sensors[solar_power][sensor.solarpower_active_current-entry] +# name: test_sensors[solar_inverter][sensor.mock_solar_inverter_active_current-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -6570,7 +6570,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': , - 'entity_id': 'sensor.solarpower_active_current', + 'entity_id': 'sensor.mock_solar_inverter_active_current', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -6598,23 +6598,23 @@ 'unit_of_measurement': , }) # --- -# name: test_sensors[solar_power][sensor.solarpower_active_current-state] +# name: test_sensors[solar_inverter][sensor.mock_solar_inverter_active_current-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'current', - 'friendly_name': 'SolarPower Active current', + 'friendly_name': 'Mock solar inverter Active current', 'state_class': , 'unit_of_measurement': , }), 'context': , - 'entity_id': 'sensor.solarpower_active_current', + 'entity_id': 'sensor.mock_solar_inverter_active_current', 'last_changed': , 'last_reported': , 'last_updated': , 'state': '-3.62', }) # --- -# name: test_sensors[solar_power][sensor.solarpower_energy_exported-entry] +# name: test_sensors[solar_inverter][sensor.mock_solar_inverter_energy_exported-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -6629,7 +6629,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': , - 'entity_id': 'sensor.solarpower_energy_exported', + 'entity_id': 'sensor.mock_solar_inverter_energy_exported', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -6657,23 +6657,23 @@ 'unit_of_measurement': , }) # --- -# name: test_sensors[solar_power][sensor.solarpower_energy_exported-state] +# name: test_sensors[solar_inverter][sensor.mock_solar_inverter_energy_exported-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'energy', - 'friendly_name': 'SolarPower Energy exported', + 'friendly_name': 'Mock solar inverter Energy exported', 'state_class': , 'unit_of_measurement': , }), 'context': , - 'entity_id': 'sensor.solarpower_energy_exported', + 'entity_id': 'sensor.mock_solar_inverter_energy_exported', 'last_changed': , 'last_reported': , 'last_updated': , 'state': '42.279', }) # --- -# name: test_sensors[solar_power][sensor.solarpower_power-entry] +# name: test_sensors[solar_inverter][sensor.mock_solar_inverter_power-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -6688,7 +6688,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': , - 'entity_id': 'sensor.solarpower_power', + 'entity_id': 'sensor.mock_solar_inverter_power', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -6716,23 +6716,23 @@ 'unit_of_measurement': , }) # --- -# name: test_sensors[solar_power][sensor.solarpower_power-state] +# name: test_sensors[solar_inverter][sensor.mock_solar_inverter_power-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'power', - 'friendly_name': 'SolarPower Power', + 'friendly_name': 'Mock solar inverter Power', 'state_class': , 'unit_of_measurement': , }), 'context': , - 'entity_id': 'sensor.solarpower_power', + 'entity_id': 'sensor.mock_solar_inverter_power', 'last_changed': , 'last_reported': , 'last_updated': , 'state': '-850.0', }) # --- -# name: test_sensors[solar_power][sensor.solarpower_voltage-entry] +# name: test_sensors[solar_inverter][sensor.mock_solar_inverter_voltage-entry] EntityRegistryEntrySnapshot({ 'aliases': set({ }), @@ -6747,7 +6747,7 @@ 'disabled_by': None, 'domain': 'sensor', 'entity_category': , - 'entity_id': 'sensor.solarpower_voltage', + 'entity_id': 'sensor.mock_solar_inverter_voltage', 'has_entity_name': True, 'hidden_by': None, 'icon': None, @@ -6775,16 +6775,16 @@ 'unit_of_measurement': , }) # --- -# name: test_sensors[solar_power][sensor.solarpower_voltage-state] +# name: test_sensors[solar_inverter][sensor.mock_solar_inverter_voltage-state] StateSnapshot({ 'attributes': ReadOnlyDict({ 'device_class': 'voltage', - 'friendly_name': 'SolarPower Voltage', + 'friendly_name': 'Mock solar inverter Voltage', 'state_class': , 'unit_of_measurement': , }), 'context': , - 'entity_id': 'sensor.solarpower_voltage', + 'entity_id': 'sensor.mock_solar_inverter_voltage', 'last_changed': , 'last_reported': , 'last_updated': , diff --git a/tests/components/mqtt/common.py b/tests/components/mqtt/common.py index dce45e207c3674..0451ef25d148c9 100644 --- a/tests/components/mqtt/common.py +++ b/tests/components/mqtt/common.py @@ -606,43 +606,43 @@ "components": MOCK_SUBENTRY_NOTIFY_COMPONENT1 | MOCK_SUBENTRY_NOTIFY_COMPONENT2, } | MOCK_SUBENTRY_AVAILABILITY_DATA -MOCK_ALARM_CONTROL_PANEL_LOCAL_CODE_SUBENTRY_DATA_SINGLE = { +MOCK_ALARM_CONTROL_PANEL_LOCAL_CODE_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_ALARM_CONTROL_PANEL_COMPONENT_LOCAL_CODE, } -MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_TEXT_SUBENTRY_DATA_SINGLE = { +MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_TEXT_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 1}}, "components": MOCK_SUBENTRY_ALARM_CONTROL_PANEL_COMPONENT_REMOTE_CODE_TEXT, } -MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_SUBENTRY_DATA_SINGLE = { +MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 1}}, "components": MOCK_SUBENTRY_ALARM_CONTROL_PANEL_COMPONENT_REMOTE_CODE, } -MOCK_BINARY_SENSOR_SUBENTRY_DATA_SINGLE = { +MOCK_BINARY_SENSOR_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 2}}, "components": MOCK_SUBENTRY_BINARY_SENSOR_COMPONENT, } -MOCK_BUTTON_SUBENTRY_DATA_SINGLE = { +MOCK_BUTTON_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 2}}, "components": MOCK_SUBENTRY_BUTTON_COMPONENT, } -MOCK_CLIMATE_SUBENTRY_DATA_SINGLE = { +MOCK_CLIMATE_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_CLIMATE_COMPONENT, } -MOCK_CLIMATE_HIGH_LOW_SUBENTRY_DATA_SINGLE = { +MOCK_CLIMATE_HIGH_LOW_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 1}}, "components": MOCK_SUBENTRY_CLIMATE_HIGH_LOW_COMPONENT, } -MOCK_CLIMATE_NO_TARGET_TEMP_SUBENTRY_DATA_SINGLE = { +MOCK_CLIMATE_NO_TARGET_TEMP_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 2}}, "components": MOCK_SUBENTRY_CLIMATE_NO_TARGET_TEMP_COMPONENT, } -MOCK_COVER_SUBENTRY_DATA_SINGLE = { +MOCK_COVER_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_COVER_COMPONENT, } -MOCK_FAN_SUBENTRY_DATA_SINGLE = { +MOCK_FAN_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_FAN_COMPONENT, } @@ -654,15 +654,15 @@ "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_IMAGE_COMPONENT_URL, } -MOCK_LIGHT_BASIC_KELVIN_SUBENTRY_DATA_SINGLE = { +MOCK_LIGHT_BASIC_KELVIN_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_LIGHT_BASIC_KELVIN_COMPONENT, } -MOCK_LOCK_SUBENTRY_DATA_SINGLE = { +MOCK_LOCK_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_LOCK_COMPONENT, } -MOCK_NOTIFY_SUBENTRY_DATA_SINGLE = { +MOCK_NOTIFY_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 1}}, "components": MOCK_SUBENTRY_NOTIFY_COMPONENT1, } @@ -686,19 +686,19 @@ "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_SELECT_COMPONENT, } -MOCK_SENSOR_SUBENTRY_DATA_SINGLE = { +MOCK_SENSOR_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_SENSOR_COMPONENT, } -MOCK_SENSOR_SUBENTRY_DATA_SINGLE_STATE_CLASS = { +MOCK_SENSOR_SUBENTRY_DATA_STATE_CLASS = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_SENSOR_COMPONENT_STATE_CLASS, } -MOCK_SENSOR_SUBENTRY_DATA_SINGLE_LAST_RESET_TEMPLATE = { +MOCK_SENSOR_SUBENTRY_DATA_LAST_RESET_TEMPLATE = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_SENSOR_COMPONENT_LAST_RESET, } -MOCK_SWITCH_SUBENTRY_DATA_SINGLE_STATE_CLASS = { +MOCK_SWITCH_SUBENTRY_DATA = { "device": MOCK_SUBENTRY_DEVICE_DATA | {"mqtt_settings": {"qos": 0}}, "components": MOCK_SUBENTRY_SWITCH_COMPONENT, } diff --git a/tests/components/mqtt/test_config_flow.py b/tests/components/mqtt/test_config_flow.py index 9dfc30091366f7..f0a6d89fa7a7bb 100644 --- a/tests/components/mqtt/test_config_flow.py +++ b/tests/components/mqtt/test_config_flow.py @@ -33,31 +33,31 @@ from homeassistant.helpers.service_info.hassio import HassioServiceInfo from .common import ( - MOCK_ALARM_CONTROL_PANEL_LOCAL_CODE_SUBENTRY_DATA_SINGLE, - MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_SUBENTRY_DATA_SINGLE, - MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_TEXT_SUBENTRY_DATA_SINGLE, - MOCK_BINARY_SENSOR_SUBENTRY_DATA_SINGLE, - MOCK_BUTTON_SUBENTRY_DATA_SINGLE, - MOCK_CLIMATE_HIGH_LOW_SUBENTRY_DATA_SINGLE, - MOCK_CLIMATE_NO_TARGET_TEMP_SUBENTRY_DATA_SINGLE, - MOCK_CLIMATE_SUBENTRY_DATA_SINGLE, - MOCK_COVER_SUBENTRY_DATA_SINGLE, - MOCK_FAN_SUBENTRY_DATA_SINGLE, + MOCK_ALARM_CONTROL_PANEL_LOCAL_CODE_SUBENTRY_DATA, + MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_SUBENTRY_DATA, + MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_TEXT_SUBENTRY_DATA, + MOCK_BINARY_SENSOR_SUBENTRY_DATA, + MOCK_BUTTON_SUBENTRY_DATA, + MOCK_CLIMATE_HIGH_LOW_SUBENTRY_DATA, + MOCK_CLIMATE_NO_TARGET_TEMP_SUBENTRY_DATA, + MOCK_CLIMATE_SUBENTRY_DATA, + MOCK_COVER_SUBENTRY_DATA, + MOCK_FAN_SUBENTRY_DATA, MOCK_IMAGE_SUBENTRY_DATA_IMAGE_DATA, MOCK_IMAGE_SUBENTRY_DATA_IMAGE_URL, - MOCK_LIGHT_BASIC_KELVIN_SUBENTRY_DATA_SINGLE, - MOCK_LOCK_SUBENTRY_DATA_SINGLE, + MOCK_LIGHT_BASIC_KELVIN_SUBENTRY_DATA, + MOCK_LOCK_SUBENTRY_DATA, + MOCK_NOTIFY_SUBENTRY_DATA, MOCK_NOTIFY_SUBENTRY_DATA_MULTI, MOCK_NOTIFY_SUBENTRY_DATA_NO_NAME, - MOCK_NOTIFY_SUBENTRY_DATA_SINGLE, MOCK_NUMBER_SUBENTRY_DATA_CUSTOM_UNIT, MOCK_NUMBER_SUBENTRY_DATA_DEVICE_CLASS_UNIT, MOCK_NUMBER_SUBENTRY_DATA_NO_UNIT, MOCK_SELECT_SUBENTRY_DATA, - MOCK_SENSOR_SUBENTRY_DATA_SINGLE, - MOCK_SENSOR_SUBENTRY_DATA_SINGLE_LAST_RESET_TEMPLATE, - MOCK_SENSOR_SUBENTRY_DATA_SINGLE_STATE_CLASS, - MOCK_SWITCH_SUBENTRY_DATA_SINGLE_STATE_CLASS, + MOCK_SENSOR_SUBENTRY_DATA, + MOCK_SENSOR_SUBENTRY_DATA_LAST_RESET_TEMPLATE, + MOCK_SENSOR_SUBENTRY_DATA_STATE_CLASS, + MOCK_SWITCH_SUBENTRY_DATA, ) from tests.common import MockConfigEntry, MockMqttReasonCode, get_schema_suggested_value @@ -2675,7 +2675,7 @@ async def test_migrate_of_incompatible_config_entry( ), [ pytest.param( - MOCK_ALARM_CONTROL_PANEL_LOCAL_CODE_SUBENTRY_DATA_SINGLE, + MOCK_ALARM_CONTROL_PANEL_LOCAL_CODE_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Alarm"}, { @@ -2723,7 +2723,7 @@ async def test_migrate_of_incompatible_config_entry( id="alarm_control_panel_local_code", ), pytest.param( - MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_SUBENTRY_DATA_SINGLE, + MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 1}}, {"name": "Alarm"}, { @@ -2754,7 +2754,7 @@ async def test_migrate_of_incompatible_config_entry( id="alarm_control_panel_remote_code", ), pytest.param( - MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_TEXT_SUBENTRY_DATA_SINGLE, + MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_TEXT_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 2}}, {"name": "Alarm"}, { @@ -2785,7 +2785,7 @@ async def test_migrate_of_incompatible_config_entry( id="alarm_control_panel_remote_code_text", ), pytest.param( - MOCK_BINARY_SENSOR_SUBENTRY_DATA_SINGLE, + MOCK_BINARY_SENSOR_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 2}}, {"name": "Hatch"}, {"device_class": "door"}, @@ -2805,7 +2805,7 @@ async def test_migrate_of_incompatible_config_entry( id="binary_sensor", ), pytest.param( - MOCK_BUTTON_SUBENTRY_DATA_SINGLE, + MOCK_BUTTON_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 2}}, {"name": "Restart"}, {"device_class": "restart"}, @@ -2826,7 +2826,7 @@ async def test_migrate_of_incompatible_config_entry( id="button", ), pytest.param( - MOCK_CLIMATE_HIGH_LOW_SUBENTRY_DATA_SINGLE, + MOCK_CLIMATE_HIGH_LOW_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Cooler"}, { @@ -2871,7 +2871,7 @@ async def test_migrate_of_incompatible_config_entry( id="climate_high_low", ), pytest.param( - MOCK_CLIMATE_NO_TARGET_TEMP_SUBENTRY_DATA_SINGLE, + MOCK_CLIMATE_NO_TARGET_TEMP_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Cooler"}, { @@ -2900,7 +2900,7 @@ async def test_migrate_of_incompatible_config_entry( id="climate_no_target_temp", ), pytest.param( - MOCK_CLIMATE_SUBENTRY_DATA_SINGLE, + MOCK_CLIMATE_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Cooler"}, { @@ -3047,7 +3047,7 @@ async def test_migrate_of_incompatible_config_entry( id="climate_single", ), pytest.param( - MOCK_COVER_SUBENTRY_DATA_SINGLE, + MOCK_COVER_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Blind"}, {"device_class": "blind"}, @@ -3134,7 +3134,7 @@ async def test_migrate_of_incompatible_config_entry( id="cover", ), pytest.param( - MOCK_FAN_SUBENTRY_DATA_SINGLE, + MOCK_FAN_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Breezer"}, { @@ -3325,7 +3325,7 @@ async def test_migrate_of_incompatible_config_entry( id="notify_image_url", ), pytest.param( - MOCK_LIGHT_BASIC_KELVIN_SUBENTRY_DATA_SINGLE, + MOCK_LIGHT_BASIC_KELVIN_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 1}}, {"name": "Basic light"}, {}, @@ -3371,7 +3371,7 @@ async def test_migrate_of_incompatible_config_entry( id="light_basic_kelvin", ), pytest.param( - MOCK_LOCK_SUBENTRY_DATA_SINGLE, + MOCK_LOCK_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Lock"}, {}, @@ -3440,7 +3440,7 @@ async def test_migrate_of_incompatible_config_entry( id="notify_no_entity_name", ), pytest.param( - MOCK_NOTIFY_SUBENTRY_DATA_SINGLE, + MOCK_NOTIFY_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 1}}, {"name": "Milkman alert"}, {}, @@ -3573,7 +3573,7 @@ async def test_migrate_of_incompatible_config_entry( id="select", ), pytest.param( - MOCK_SENSOR_SUBENTRY_DATA_SINGLE, + MOCK_SENSOR_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Energy"}, {"device_class": "enum", "options": ["low", "medium", "high"]}, @@ -3630,7 +3630,7 @@ async def test_migrate_of_incompatible_config_entry( id="sensor_options", ), pytest.param( - MOCK_SENSOR_SUBENTRY_DATA_SINGLE_STATE_CLASS, + MOCK_SENSOR_SUBENTRY_DATA_STATE_CLASS, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Energy"}, { @@ -3653,7 +3653,7 @@ async def test_migrate_of_incompatible_config_entry( id="sensor_total", ), pytest.param( - MOCK_SWITCH_SUBENTRY_DATA_SINGLE_STATE_CLASS, + MOCK_SWITCH_SUBENTRY_DATA, {"name": "Milk notifier", "mqtt_settings": {"qos": 0}}, {"name": "Outlet"}, {"device_class": "outlet"}, @@ -4101,7 +4101,7 @@ async def test_subentry_reconfigure_edit_entity_multi_entitites( pytest.param( ( ConfigSubentryData( - data=MOCK_ALARM_CONTROL_PANEL_LOCAL_CODE_SUBENTRY_DATA_SINGLE, + data=MOCK_ALARM_CONTROL_PANEL_LOCAL_CODE_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), @@ -4132,7 +4132,7 @@ async def test_subentry_reconfigure_edit_entity_multi_entitites( pytest.param( ( ConfigSubentryData( - data=MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_SUBENTRY_DATA_SINGLE, + data=MOCK_ALARM_CONTROL_PANEL_REMOTE_CODE_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), @@ -4164,7 +4164,7 @@ async def test_subentry_reconfigure_edit_entity_multi_entitites( pytest.param( ( ConfigSubentryData( - data=MOCK_CLIMATE_HIGH_LOW_SUBENTRY_DATA_SINGLE, + data=MOCK_CLIMATE_HIGH_LOW_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), @@ -4212,7 +4212,7 @@ async def test_subentry_reconfigure_edit_entity_multi_entitites( pytest.param( ( ConfigSubentryData( - data=MOCK_CLIMATE_SUBENTRY_DATA_SINGLE, + data=MOCK_CLIMATE_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), @@ -4302,7 +4302,7 @@ async def test_subentry_reconfigure_edit_entity_multi_entitites( pytest.param( ( ConfigSubentryData( - data=MOCK_LIGHT_BASIC_KELVIN_SUBENTRY_DATA_SINGLE, + data=MOCK_LIGHT_BASIC_KELVIN_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), @@ -4327,7 +4327,7 @@ async def test_subentry_reconfigure_edit_entity_multi_entitites( pytest.param( ( ConfigSubentryData( - data=MOCK_NOTIFY_SUBENTRY_DATA_SINGLE, + data=MOCK_NOTIFY_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), @@ -4350,7 +4350,7 @@ async def test_subentry_reconfigure_edit_entity_multi_entitites( pytest.param( ( ConfigSubentryData( - data=MOCK_SENSOR_SUBENTRY_DATA_SINGLE, + data=MOCK_SENSOR_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), @@ -4518,7 +4518,7 @@ async def test_subentry_reconfigure_edit_entity_single_entity( ( ( ConfigSubentryData( - data=MOCK_SENSOR_SUBENTRY_DATA_SINGLE_LAST_RESET_TEMPLATE, + data=MOCK_SENSOR_SUBENTRY_DATA_LAST_RESET_TEMPLATE, subentry_type="device", title="Mock subentry", ), @@ -4651,7 +4651,7 @@ async def test_subentry_reconfigure_edit_entity_reset_fields( ( ( ConfigSubentryData( - data=MOCK_NOTIFY_SUBENTRY_DATA_SINGLE, + data=MOCK_NOTIFY_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), diff --git a/tests/components/mqtt/test_mixins.py b/tests/components/mqtt/test_mixins.py index 23c63c9ba58b3a..68a001bb203e19 100644 --- a/tests/components/mqtt/test_mixins.py +++ b/tests/components/mqtt/test_mixins.py @@ -22,7 +22,7 @@ from homeassistant.util import slugify from .common import ( - MOCK_NOTIFY_SUBENTRY_DATA_SINGLE, + MOCK_NOTIFY_SUBENTRY_DATA, MOCK_SUBENTRY_DATA_BAD_COMPONENT_SCHEMA, MOCK_SUBENTRY_DATA_SET_MIX, ) @@ -592,7 +592,7 @@ async def test_loading_subentry_with_bad_component_schema( [ ( ConfigSubentryData( - data=MOCK_NOTIFY_SUBENTRY_DATA_SINGLE, + data=MOCK_NOTIFY_SUBENTRY_DATA, subentry_type="device", title="Mock subentry", ), diff --git a/tests/components/shelly/conftest.py b/tests/components/shelly/conftest.py index 7402d835ad1472..f709d4291adf93 100644 --- a/tests/components/shelly/conftest.py +++ b/tests/components/shelly/conftest.py @@ -127,7 +127,11 @@ def mock_white_light_set_state( ), ), Mock( - sensor_ids={"mode": "color", "effect": 0}, + sensor_ids={ + "output": mock_light_set_state()["ison"], + "mode": "color", + "effect": 0, + }, channel="0", output=mock_light_set_state()["ison"], colorTemp=mock_light_set_state()["temp"],