mirror of
https://github.com/home-assistant/core.git
synced 2025-07-24 21:57:51 +00:00
Bump pysma version to 0.5.0 (#51098)
* Use new get_sensors method * Update pysma requirement * Update primary codeowner * Update device_info handling * Fix LEGACY_MAP * Updated tests * Fix pysma references * Fix pylint raise-missing-from * Better import of Sensors * Remove software version related changes * Revert codeowners change
This commit is contained in:
parent
cede36d91c
commit
65f2fe9c01
@ -40,7 +40,9 @@ from .const import (
|
|||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def _parse_legacy_options(entry: ConfigEntry, sensor_def: pysma.Sensors) -> list[str]:
|
def _parse_legacy_options(
|
||||||
|
entry: ConfigEntry, sensor_def: pysma.sensor.Sensors
|
||||||
|
) -> list[str]:
|
||||||
"""Parse legacy configuration options.
|
"""Parse legacy configuration options.
|
||||||
|
|
||||||
This will parse the legacy CONF_SENSORS and CONF_CUSTOM configuration options
|
This will parse the legacy CONF_SENSORS and CONF_CUSTOM configuration options
|
||||||
@ -50,7 +52,9 @@ def _parse_legacy_options(entry: ConfigEntry, sensor_def: pysma.Sensors) -> list
|
|||||||
# Add sensors from the custom config
|
# Add sensors from the custom config
|
||||||
sensor_def.add(
|
sensor_def.add(
|
||||||
[
|
[
|
||||||
pysma.Sensor(o[CONF_KEY], n, o[CONF_UNIT], o[CONF_FACTOR], o.get(CONF_PATH))
|
pysma.sensor.Sensor(
|
||||||
|
o[CONF_KEY], n, o[CONF_UNIT], o[CONF_FACTOR], o.get(CONF_PATH)
|
||||||
|
)
|
||||||
for n, o in entry.data.get(CONF_CUSTOM).items()
|
for n, o in entry.data.get(CONF_CUSTOM).items()
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
@ -74,9 +78,9 @@ def _parse_legacy_options(entry: ConfigEntry, sensor_def: pysma.Sensors) -> list
|
|||||||
# Find and replace sensors removed from pysma
|
# Find and replace sensors removed from pysma
|
||||||
# This only alters the config, the actual sensor migration takes place in _migrate_old_unique_ids
|
# This only alters the config, the actual sensor migration takes place in _migrate_old_unique_ids
|
||||||
for sensor in config_sensors.copy():
|
for sensor in config_sensors.copy():
|
||||||
if sensor in pysma.LEGACY_MAP:
|
if sensor in pysma.const.LEGACY_MAP:
|
||||||
config_sensors.remove(sensor)
|
config_sensors.remove(sensor)
|
||||||
config_sensors.append(pysma.LEGACY_MAP[sensor]["new_sensor"])
|
config_sensors.append(pysma.const.LEGACY_MAP[sensor]["new_sensor"])
|
||||||
|
|
||||||
# Only sensors from config should be enabled
|
# Only sensors from config should be enabled
|
||||||
for sensor in sensor_def:
|
for sensor in sensor_def:
|
||||||
@ -88,7 +92,7 @@ def _parse_legacy_options(entry: ConfigEntry, sensor_def: pysma.Sensors) -> list
|
|||||||
def _migrate_old_unique_ids(
|
def _migrate_old_unique_ids(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
entry: ConfigEntry,
|
entry: ConfigEntry,
|
||||||
sensor_def: pysma.Sensors,
|
sensor_def: pysma.sensor.Sensors,
|
||||||
config_sensors: list[str],
|
config_sensors: list[str],
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Migrate legacy sensor entity_id format to new format."""
|
"""Migrate legacy sensor entity_id format to new format."""
|
||||||
@ -96,16 +100,16 @@ def _migrate_old_unique_ids(
|
|||||||
|
|
||||||
# Create list of all possible sensor names
|
# Create list of all possible sensor names
|
||||||
possible_sensors = set(
|
possible_sensors = set(
|
||||||
config_sensors + [s.name for s in sensor_def] + list(pysma.LEGACY_MAP)
|
config_sensors + [s.name for s in sensor_def] + list(pysma.const.LEGACY_MAP)
|
||||||
)
|
)
|
||||||
|
|
||||||
for sensor in possible_sensors:
|
for sensor in possible_sensors:
|
||||||
if sensor in sensor_def:
|
if sensor in sensor_def:
|
||||||
pysma_sensor = sensor_def[sensor]
|
pysma_sensor = sensor_def[sensor]
|
||||||
original_key = pysma_sensor.key
|
original_key = pysma_sensor.key
|
||||||
elif sensor in pysma.LEGACY_MAP:
|
elif sensor in pysma.const.LEGACY_MAP:
|
||||||
# If sensor was removed from pysma we will remap it to the new sensor
|
# If sensor was removed from pysma we will remap it to the new sensor
|
||||||
legacy_sensor = pysma.LEGACY_MAP[sensor]
|
legacy_sensor = pysma.const.LEGACY_MAP[sensor]
|
||||||
pysma_sensor = sensor_def[legacy_sensor["new_sensor"]]
|
pysma_sensor = sensor_def[legacy_sensor["new_sensor"]]
|
||||||
original_key = legacy_sensor["old_key"]
|
original_key = legacy_sensor["old_key"]
|
||||||
else:
|
else:
|
||||||
@ -127,13 +131,6 @@ def _migrate_old_unique_ids(
|
|||||||
|
|
||||||
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
||||||
"""Set up sma from a config entry."""
|
"""Set up sma from a config entry."""
|
||||||
# Init all default sensors
|
|
||||||
sensor_def = pysma.Sensors()
|
|
||||||
|
|
||||||
if entry.source == SOURCE_IMPORT:
|
|
||||||
config_sensors = _parse_legacy_options(entry, sensor_def)
|
|
||||||
_migrate_old_unique_ids(hass, entry, sensor_def, config_sensors)
|
|
||||||
|
|
||||||
# Init the SMA interface
|
# Init the SMA interface
|
||||||
protocol = "https" if entry.data[CONF_SSL] else "http"
|
protocol = "https" if entry.data[CONF_SSL] else "http"
|
||||||
url = f"{protocol}://{entry.data[CONF_HOST]}"
|
url = f"{protocol}://{entry.data[CONF_HOST]}"
|
||||||
@ -144,6 +141,14 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
|
|||||||
session = async_get_clientsession(hass, verify_ssl=verify_ssl)
|
session = async_get_clientsession(hass, verify_ssl=verify_ssl)
|
||||||
sma = pysma.SMA(session, url, password, group)
|
sma = pysma.SMA(session, url, password, group)
|
||||||
|
|
||||||
|
# Get all device sensors
|
||||||
|
sensor_def = await sma.get_sensors()
|
||||||
|
|
||||||
|
# Parse legacy options if initial setup was done from yaml
|
||||||
|
if entry.source == SOURCE_IMPORT:
|
||||||
|
config_sensors = _parse_legacy_options(entry, sensor_def)
|
||||||
|
_migrate_old_unique_ids(hass, entry, sensor_def, config_sensors)
|
||||||
|
|
||||||
# Define the coordinator
|
# Define the coordinator
|
||||||
async def async_update_data():
|
async def async_update_data():
|
||||||
"""Update the used SMA sensors."""
|
"""Update the used SMA sensors."""
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
"name": "SMA Solar",
|
"name": "SMA Solar",
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/sma",
|
"documentation": "https://www.home-assistant.io/integrations/sma",
|
||||||
"requirements": ["pysma==0.4.3"],
|
"requirements": ["pysma==0.5.0"],
|
||||||
"codeowners": ["@kellerza", "@rklomp"],
|
"codeowners": ["@kellerza", "@rklomp"],
|
||||||
"iot_class": "local_polling"
|
"iot_class": "local_polling"
|
||||||
}
|
}
|
||||||
|
@ -46,8 +46,8 @@ _LOGGER = logging.getLogger(__name__)
|
|||||||
def _check_sensor_schema(conf: dict[str, Any]) -> dict[str, Any]:
|
def _check_sensor_schema(conf: dict[str, Any]) -> dict[str, Any]:
|
||||||
"""Check sensors and attributes are valid."""
|
"""Check sensors and attributes are valid."""
|
||||||
try:
|
try:
|
||||||
valid = [s.name for s in pysma.Sensors()]
|
valid = [s.name for s in pysma.sensor.Sensors()]
|
||||||
valid += pysma.LEGACY_MAP.keys()
|
valid += pysma.const.LEGACY_MAP.keys()
|
||||||
except (ImportError, AttributeError):
|
except (ImportError, AttributeError):
|
||||||
return conf
|
return conf
|
||||||
|
|
||||||
@ -147,7 +147,7 @@ class SMAsensor(CoordinatorEntity, SensorEntity):
|
|||||||
coordinator: DataUpdateCoordinator,
|
coordinator: DataUpdateCoordinator,
|
||||||
config_entry_unique_id: str,
|
config_entry_unique_id: str,
|
||||||
device_info: dict[str, Any],
|
device_info: dict[str, Any],
|
||||||
pysma_sensor: pysma.Sensor,
|
pysma_sensor: pysma.sensor.Sensor,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Initialize the sensor."""
|
"""Initialize the sensor."""
|
||||||
super().__init__(coordinator)
|
super().__init__(coordinator)
|
||||||
|
@ -1732,7 +1732,7 @@ pysignalclirestapi==0.3.4
|
|||||||
pyskyqhub==0.1.3
|
pyskyqhub==0.1.3
|
||||||
|
|
||||||
# homeassistant.components.sma
|
# homeassistant.components.sma
|
||||||
pysma==0.4.3
|
pysma==0.5.0
|
||||||
|
|
||||||
# homeassistant.components.smappee
|
# homeassistant.components.smappee
|
||||||
pysmappee==0.2.25
|
pysmappee==0.2.25
|
||||||
|
@ -968,7 +968,7 @@ pysiaalarm==3.0.0
|
|||||||
pysignalclirestapi==0.3.4
|
pysignalclirestapi==0.3.4
|
||||||
|
|
||||||
# homeassistant.components.sma
|
# homeassistant.components.sma
|
||||||
pysma==0.4.3
|
pysma==0.5.0
|
||||||
|
|
||||||
# homeassistant.components.smappee
|
# homeassistant.components.smappee
|
||||||
pysmappee==0.2.25
|
pysmappee==0.2.25
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
"""Fixtures for sma tests."""
|
"""Fixtures for sma tests."""
|
||||||
from unittest.mock import patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
|
from pysma.const import DEVCLASS_INVERTER
|
||||||
|
from pysma.definitions import sensor_map
|
||||||
|
from pysma.sensor import Sensors
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant import config_entries
|
from homeassistant import config_entries
|
||||||
@ -28,7 +31,9 @@ async def init_integration(hass, mock_config_entry):
|
|||||||
"""Create a fake SMA Config Entry."""
|
"""Create a fake SMA Config Entry."""
|
||||||
mock_config_entry.add_to_hass(hass)
|
mock_config_entry.add_to_hass(hass)
|
||||||
|
|
||||||
with patch("pysma.SMA.read"):
|
with patch("pysma.SMA.read"), patch(
|
||||||
|
"pysma.SMA.get_sensors", return_value=Sensors(sensor_map[DEVCLASS_INVERTER])
|
||||||
|
):
|
||||||
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
return mock_config_entry
|
return mock_config_entry
|
||||||
|
@ -10,7 +10,7 @@ from . import MOCK_CUSTOM_SENSOR
|
|||||||
|
|
||||||
async def test_sensors(hass, init_integration):
|
async def test_sensors(hass, init_integration):
|
||||||
"""Test states of the sensors."""
|
"""Test states of the sensors."""
|
||||||
state = hass.states.get("sensor.current_consumption")
|
state = hass.states.get("sensor.grid_power")
|
||||||
assert state
|
assert state
|
||||||
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == POWER_WATT
|
assert state.attributes.get(ATTR_UNIT_OF_MEASUREMENT) == POWER_WATT
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user