diff --git a/homeassistant/components/openevse/config_flow.py b/homeassistant/components/openevse/config_flow.py index 0af019e9ca2c..3b5c4cbf586f 100644 --- a/homeassistant/components/openevse/config_flow.py +++ b/homeassistant/components/openevse/config_flow.py @@ -114,24 +114,6 @@ class OpenEVSEConfigFlow(ConfigFlow, domain=DOMAIN): errors=errors, ) - async def async_step_import(self, data: dict[str, str]) -> ConfigFlowResult: - """Handle the initial step.""" - - self._async_abort_entries_match({CONF_HOST: data[CONF_HOST]}) - errors, serial = await self.check_status(data[CONF_HOST]) - - if not errors: - if serial is not None: - await self.async_set_unique_id(serial) - self._abort_if_unique_id_configured() - else: - return self.async_abort(reason="unavailable_host") - - return self.async_create_entry( - title=f"OpenEVSE {data[CONF_HOST]}", - data=data, - ) - @override async def async_step_zeroconf( self, discovery_info: zeroconf.ZeroconfServiceInfo diff --git a/homeassistant/components/openevse/const.py b/homeassistant/components/openevse/const.py index b9381f21e12b..8008fb5d49ca 100644 --- a/homeassistant/components/openevse/const.py +++ b/homeassistant/components/openevse/const.py @@ -2,4 +2,3 @@ CONF_SERIAL = "serial" DOMAIN = "openevse" -INTEGRATION_TITLE = "OpenEVSE" diff --git a/homeassistant/components/openevse/quality_scale.yaml b/homeassistant/components/openevse/quality_scale.yaml index 89b0319c0b66..998b2cad86db 100644 --- a/homeassistant/components/openevse/quality_scale.yaml +++ b/homeassistant/components/openevse/quality_scale.yaml @@ -68,8 +68,8 @@ rules: icon-translations: done reconfiguration-flow: done repair-issues: - status: done - comment: Integration creates repair issues for YAML deprecation. + status: exempt + comment: Integration does not raise repair issues. stale-devices: status: exempt comment: Integration supports a single device per config entry. diff --git a/homeassistant/components/openevse/sensor.py b/homeassistant/components/openevse/sensor.py index 62e9f1f49bed..9876144aa3b6 100644 --- a/homeassistant/components/openevse/sensor.py +++ b/homeassistant/components/openevse/sensor.py @@ -7,19 +7,14 @@ import logging from typing import override from openevsehttp.__main__ import OpenEVSE -import probatio from homeassistant.components.sensor import ( - PLATFORM_SCHEMA as SENSOR_PLATFORM_SCHEMA, SensorDeviceClass, SensorEntity, SensorEntityDescription, SensorStateClass, ) -from homeassistant.config_entries import SOURCE_IMPORT from homeassistant.const import ( - CONF_HOST, - CONF_MONITORED_VARIABLES, PERCENTAGE, SIGNAL_STRENGTH_DECIBELS, EntityCategory, @@ -32,17 +27,11 @@ from homeassistant.const import ( UnitOfTemperature, UnitOfTime, ) -from homeassistant.core import DOMAIN as HOMEASSISTANT_DOMAIN, HomeAssistant -from homeassistant.data_entry_flow import FlowResultType -from homeassistant.helpers import config_validation as cv, issue_registry as ir -from homeassistant.helpers.entity_platform import ( - AddConfigEntryEntitiesCallback, - AddEntitiesCallback, -) -from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType +from homeassistant.core import HomeAssistant +from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback +from homeassistant.helpers.typing import StateType from homeassistant.util import slugify -from .const import DOMAIN, INTEGRATION_TITLE from .coordinator import OpenEVSEConfigEntry from .entity import OpenEVSEEntity @@ -380,66 +369,6 @@ SENSOR_TYPES: tuple[OpenEVSESensorDescription, ...] = ( ), ) -SENSOR_KEYS: list[str] = [desc.key for desc in SENSOR_TYPES] - -PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( - { - probatio.Required(CONF_HOST): cv.string, - probatio.Optional(CONF_MONITORED_VARIABLES, default=["status"]): probatio.All( - cv.ensure_list, [probatio.In(SENSOR_KEYS)] - ), - } -) - - -async def async_setup_platform( - hass: HomeAssistant, - config: ConfigType, - async_add_entities: AddEntitiesCallback, - discovery_info: DiscoveryInfoType | None = None, -) -> None: - """Set up the openevse platform.""" - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={"source": SOURCE_IMPORT}, - data=config, - ) - - if ( - result.get("type") is FlowResultType.ABORT - and result.get("reason") != "already_configured" - ): - ir.async_create_issue( - hass, - DOMAIN, - f"deprecated_yaml_import_issue_{result.get('reason')}", - breaks_in_ha_version="2026.6.0", - is_fixable=False, - issue_domain=DOMAIN, - severity=ir.IssueSeverity.WARNING, - translation_key=f"deprecated_yaml_import_issue_{result.get('reason')}", - translation_placeholders={ - "domain": DOMAIN, - "integration_title": INTEGRATION_TITLE, - }, - ) - return - - ir.async_create_issue( - hass, - HOMEASSISTANT_DOMAIN, - "deprecated_yaml", - breaks_in_ha_version="2026.7.0", - is_fixable=False, - issue_domain=DOMAIN, - severity=ir.IssueSeverity.WARNING, - translation_key="deprecated_yaml", - translation_placeholders={ - "domain": DOMAIN, - "integration_title": INTEGRATION_TITLE, - }, - ) - async def async_setup_entry( hass: HomeAssistant, diff --git a/homeassistant/components/openevse/strings.json b/homeassistant/components/openevse/strings.json index 2d72923a4e0e..2f1f03f87320 100644 --- a/homeassistant/components/openevse/strings.json +++ b/homeassistant/components/openevse/strings.json @@ -255,15 +255,5 @@ "unsupported_feature": { "message": "The charger does not support this feature." } - }, - "issues": { - "deprecated_yaml_import_issue_unavailable_host": { - "description": "Configuring {integration_title} using YAML is being removed but there was a connection error while trying to import the YAML configuration.\n\nEnsure your OpenEVSE charger is accessible and restart Home Assistant to try again.", - "title": "The {integration_title} YAML configuration import failed" - }, - "yaml_deprecated": { - "description": "Configuring OpenEVSE using YAML is being removed. Your existing YAML configuration has been imported into the UI automatically. Remove the `openevse` configuration from your configuration.yaml file and restart Home Assistant to fix this issue.", - "title": "OpenEVSE YAML configuration is deprecated" - } } } diff --git a/tests/components/openevse/test_config_flow.py b/tests/components/openevse/test_config_flow.py index c2b59475975f..7d3ef419686d 100644 --- a/tests/components/openevse/test_config_flow.py +++ b/tests/components/openevse/test_config_flow.py @@ -8,7 +8,6 @@ import pytest from homeassistant.components.openevse.const import DOMAIN from homeassistant.config_entries import ( - SOURCE_IMPORT, SOURCE_RECONFIGURE, SOURCE_USER, SOURCE_ZEROCONF, @@ -104,23 +103,6 @@ async def test_user_flow_no_serial( assert result["result"].unique_id is None -@pytest.mark.usefixtures("mock_setup_entry") -async def test_import_flow_no_serial( - hass: HomeAssistant, mock_charger: MagicMock -) -> None: - """Test import flow handles missing serial gracefully.""" - mock_charger.test_and_get.side_effect = [{}, MissingSerial] - - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_IMPORT}, data={CONF_HOST: "10.0.0.131"} - ) - - # Assert the flow continued to create the entry - assert result["type"] is FlowResultType.CREATE_ENTRY - assert result["title"] == "OpenEVSE 10.0.0.131" - assert result["result"].unique_id is None - - @pytest.mark.usefixtures("mock_setup_entry") async def test_user_flow_with_auth( hass: HomeAssistant, mock_charger: MagicMock @@ -223,46 +205,6 @@ async def test_user_flow_with_missing_serial( assert result["result"].unique_id is None -@pytest.mark.usefixtures("mock_setup_entry") -async def test_import_flow(hass: HomeAssistant, mock_charger: MagicMock) -> None: - """Test import flow.""" - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_IMPORT}, data={CONF_HOST: "10.0.0.131"} - ) - assert result["type"] is FlowResultType.CREATE_ENTRY - assert result["title"] == "OpenEVSE 10.0.0.131" - assert result["data"] == {CONF_HOST: "10.0.0.131"} - assert result["result"].unique_id == "deadbeeffeed" - - -@pytest.mark.usefixtures("mock_setup_entry") -async def test_import_flow_bad(hass: HomeAssistant, mock_charger: MagicMock) -> None: - """Test import flow with bad charger.""" - mock_charger.test_and_get.side_effect = TimeoutError - - result = await hass.config_entries.flow.async_init( - DOMAIN, context={"source": SOURCE_IMPORT}, data={CONF_HOST: "10.0.0.131"} - ) - assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "unavailable_host" - - -@pytest.mark.usefixtures("mock_setup_entry") -async def test_import_flow_duplicate( - hass: HomeAssistant, mock_config_entry: MagicMock, mock_charger: MagicMock -) -> None: - """Test import flow aborts when config entry already exists.""" - mock_config_entry.add_to_hass(hass) - - result = await hass.config_entries.flow.async_init( - DOMAIN, - context={"source": SOURCE_IMPORT}, - data={CONF_HOST: "192.168.1.100"}, - ) - assert result["type"] is FlowResultType.ABORT - assert result["reason"] == "already_configured" - - @pytest.mark.usefixtures("mock_setup_entry") async def test_zeroconf_discovery(hass: HomeAssistant, mock_charger: MagicMock) -> None: """Test zeroconf discovery.""" diff --git a/tests/components/openevse/test_sensor.py b/tests/components/openevse/test_sensor.py index 7ee8ac8273cc..022bb82b14eb 100644 --- a/tests/components/openevse/test_sensor.py +++ b/tests/components/openevse/test_sensor.py @@ -5,12 +5,9 @@ from unittest.mock import MagicMock, patch import pytest from syrupy.assertion import SnapshotAssertion -from homeassistant.components.openevse.const import DOMAIN -from homeassistant.components.sensor import DOMAIN as SENSOR_DOMAIN -from homeassistant.const import CONF_HOST, STATE_UNAVAILABLE, STATE_UNKNOWN, Platform +from homeassistant.const import STATE_UNAVAILABLE, STATE_UNKNOWN, Platform from homeassistant.core import HomeAssistant -from homeassistant.helpers import entity_registry as er, issue_registry as ir -from homeassistant.setup import async_setup_component +from homeassistant.helpers import entity_registry as er from tests.common import MockConfigEntry, snapshot_platform @@ -126,69 +123,6 @@ async def test_sensor_unavailable_on_coordinator_timeout( assert state.state == STATE_UNAVAILABLE -async def test_yaml_import_success( - hass: HomeAssistant, - mock_charger: MagicMock, - issue_registry: ir.IssueRegistry, -) -> None: - """Test successful YAML import creates deprecated_yaml issue.""" - assert await async_setup_component( - hass, - SENSOR_DOMAIN, - {SENSOR_DOMAIN: {"platform": DOMAIN, CONF_HOST: "192.168.1.100"}}, - ) - await hass.async_block_till_done() - - issue = issue_registry.async_get_issue("homeassistant", "deprecated_yaml") - assert issue is not None - assert issue.issue_domain == DOMAIN - - -async def test_yaml_import_unavailable_host( - hass: HomeAssistant, - mock_charger: MagicMock, - issue_registry: ir.IssueRegistry, -) -> None: - """Test YAML import with unavailable host creates domain-specific issue.""" - mock_charger.test_and_get.side_effect = TimeoutError("Connection timed out") - - assert await async_setup_component( - hass, - SENSOR_DOMAIN, - {SENSOR_DOMAIN: {"platform": DOMAIN, CONF_HOST: "192.168.1.100"}}, - ) - await hass.async_block_till_done() - - issue = issue_registry.async_get_issue( - DOMAIN, "deprecated_yaml_import_issue_unavailable_host" - ) - assert issue is not None - - -async def test_yaml_import_already_configured( - hass: HomeAssistant, - mock_config_entry: MockConfigEntry, - mock_charger: MagicMock, - issue_registry: ir.IssueRegistry, -) -> None: - """Test YAML import when already configured creates deprecated_yaml issue.""" - # Only add the entry, don't set it up - this allows the YAML platform setup - # to run while the config flow will still see the existing entry - mock_config_entry.add_to_hass(hass) - - assert await async_setup_component( - hass, - SENSOR_DOMAIN, - {SENSOR_DOMAIN: {"platform": DOMAIN, CONF_HOST: "192.168.1.100"}}, - ) - await hass.async_block_till_done() - - # When already configured, it should still create deprecated_yaml issue - issue = issue_registry.async_get_issue("homeassistant", "deprecated_yaml") - assert issue is not None - assert issue.issue_domain == DOMAIN - - @pytest.mark.parametrize( ("raw_status", "expected_state"), [