Add Manual Charge Switch for Installers for Kostal Plenticore (#146932)

* Add Manual Charge Switch for Installers

* Update stale docstring

* Installer config fixture

* fix ruff
This commit is contained in:
Maximilian Arzberger 2025-06-26 19:50:27 +02:00 committed by GitHub
parent 35478e3162
commit bf88fcd5bf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 104 additions and 1 deletions

View File

@ -14,6 +14,7 @@ from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
from homeassistant.helpers.update_coordinator import CoordinatorEntity
from .const import CONF_SERVICE_CODE
from .coordinator import PlenticoreConfigEntry, SettingDataUpdateCoordinator
_LOGGER = logging.getLogger(__name__)
@ -29,6 +30,7 @@ class PlenticoreSwitchEntityDescription(SwitchEntityDescription):
on_label: str
off_value: str
off_label: str
installer_required: bool = False
SWITCH_SETTINGS_DATA = [
@ -42,6 +44,17 @@ SWITCH_SETTINGS_DATA = [
off_value="2",
off_label="Automatic economical",
),
PlenticoreSwitchEntityDescription(
module_id="devices:local",
key="Battery:ManualCharge",
name="Battery Manual Charge",
is_on="1",
on_value="1",
on_label="On",
off_value="0",
off_label="Off",
installer_required=True,
),
]
@ -73,7 +86,13 @@ async def async_setup_entry(
description.key,
)
continue
if entry.data.get(CONF_SERVICE_CODE) is None and description.installer_required:
_LOGGER.debug(
"Skipping installer required setting data %s/%s",
description.module_id,
description.key,
)
continue
entities.append(
PlenticoreDataSwitch(
settings_data_update_coordinator,

View File

@ -26,6 +26,21 @@ def mock_config_entry() -> MockConfigEntry:
)
@pytest.fixture
def mock_installer_config_entry() -> MockConfigEntry:
"""Return a mocked ConfigEntry for testing with installer login."""
return MockConfigEntry(
entry_id="2ab8dd92a62787ddfe213a67e09406bd",
title="scb",
domain="kostal_plenticore",
data={
"host": "192.168.1.2",
"password": "secret_password",
"service_code": "12345",
},
)
@pytest.fixture
def mock_plenticore() -> Generator[Plenticore]:
"""Set up a Plenticore mock with some default values."""

View File

@ -0,0 +1,69 @@
"""Test the Kostal Plenticore Solar Inverter switch platform."""
from pykoplenti import SettingsData
from homeassistant.components.kostal_plenticore.coordinator import Plenticore
from homeassistant.core import HomeAssistant
from homeassistant.helpers import entity_registry as er
from tests.common import MockConfigEntry
async def test_installer_setting_not_available(
hass: HomeAssistant,
mock_plenticore: Plenticore,
mock_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
) -> None:
"""Test that the manual charge setting is not available when not using the installer login."""
mock_plenticore.client.get_settings.return_value = {
"devices:local": [
SettingsData(
min=None,
max=None,
default=None,
access="readwrite",
unit=None,
id="Battery:ManualCharge",
type="bool",
)
]
}
mock_config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(mock_config_entry.entry_id)
await hass.async_block_till_done()
assert not entity_registry.async_is_registered("switch.scb_battery_manual_charge")
async def test_installer_setting_available(
hass: HomeAssistant,
mock_plenticore: Plenticore,
mock_installer_config_entry: MockConfigEntry,
entity_registry: er.EntityRegistry,
) -> None:
"""Test that the manual charge setting is available when using the installer login."""
mock_plenticore.client.get_settings.return_value = {
"devices:local": [
SettingsData(
min=None,
max=None,
default=None,
access="readwrite",
unit=None,
id="Battery:ManualCharge",
type="bool",
)
]
}
mock_installer_config_entry.add_to_hass(hass)
await hass.config_entries.async_setup(mock_installer_config_entry.entry_id)
await hass.async_block_till_done()
assert entity_registry.async_is_registered("switch.scb_battery_manual_charge")