From 6d17ad4da6fb863200c889cdb0b80fcccfa6a1e7 Mon Sep 17 00:00:00 2001 From: epenet <6771947+epenet@users.noreply.github.com> Date: Fri, 13 Sep 2024 10:12:24 +0200 Subject: [PATCH] Move ADS supported types to a StrEnum (#125824) --- homeassistant/components/ads/__init__.py | 83 +++++++----------------- homeassistant/components/ads/const.py | 23 +++++++ homeassistant/components/ads/sensor.py | 43 ++++++------ 3 files changed, 68 insertions(+), 81 deletions(-) diff --git a/homeassistant/components/ads/__init__.py b/homeassistant/components/ads/__init__.py index da855fb7228..892390a91eb 100644 --- a/homeassistant/components/ads/__init__.py +++ b/homeassistant/components/ads/__init__.py @@ -15,49 +15,30 @@ from homeassistant.core import HomeAssistant, ServiceCall import homeassistant.helpers.config_validation as cv from homeassistant.helpers.typing import ConfigType -from .const import CONF_ADS_VAR, DATA_ADS, DOMAIN +from .const import CONF_ADS_VAR, DATA_ADS, DOMAIN, AdsType from .hub import AdsHub _LOGGER = logging.getLogger(__name__) -# Supported Types -ADSTYPE_BOOL = "bool" -ADSTYPE_BYTE = "byte" -ADSTYPE_INT = "int" -ADSTYPE_UINT = "uint" -ADSTYPE_SINT = "sint" -ADSTYPE_USINT = "usint" -ADSTYPE_DINT = "dint" -ADSTYPE_UDINT = "udint" -ADSTYPE_WORD = "word" -ADSTYPE_DWORD = "dword" -ADSTYPE_LREAL = "lreal" -ADSTYPE_REAL = "real" -ADSTYPE_STRING = "string" -ADSTYPE_TIME = "time" -ADSTYPE_DATE = "date" -ADSTYPE_DATE_AND_TIME = "dt" -ADSTYPE_TOD = "tod" - ADS_TYPEMAP = { - ADSTYPE_BOOL: pyads.PLCTYPE_BOOL, - ADSTYPE_BYTE: pyads.PLCTYPE_BYTE, - ADSTYPE_INT: pyads.PLCTYPE_INT, - ADSTYPE_UINT: pyads.PLCTYPE_UINT, - ADSTYPE_SINT: pyads.PLCTYPE_SINT, - ADSTYPE_USINT: pyads.PLCTYPE_USINT, - ADSTYPE_DINT: pyads.PLCTYPE_DINT, - ADSTYPE_UDINT: pyads.PLCTYPE_UDINT, - ADSTYPE_WORD: pyads.PLCTYPE_WORD, - ADSTYPE_DWORD: pyads.PLCTYPE_DWORD, - ADSTYPE_REAL: pyads.PLCTYPE_REAL, - ADSTYPE_LREAL: pyads.PLCTYPE_LREAL, - ADSTYPE_STRING: pyads.PLCTYPE_STRING, - ADSTYPE_TIME: pyads.PLCTYPE_TIME, - ADSTYPE_DATE: pyads.PLCTYPE_DATE, - ADSTYPE_DATE_AND_TIME: pyads.PLCTYPE_DT, - ADSTYPE_TOD: pyads.PLCTYPE_TOD, + AdsType.BOOL: pyads.PLCTYPE_BOOL, + AdsType.BYTE: pyads.PLCTYPE_BYTE, + AdsType.INT: pyads.PLCTYPE_INT, + AdsType.UINT: pyads.PLCTYPE_UINT, + AdsType.SINT: pyads.PLCTYPE_SINT, + AdsType.USINT: pyads.PLCTYPE_USINT, + AdsType.DINT: pyads.PLCTYPE_DINT, + AdsType.UDINT: pyads.PLCTYPE_UDINT, + AdsType.WORD: pyads.PLCTYPE_WORD, + AdsType.DWORD: pyads.PLCTYPE_DWORD, + AdsType.REAL: pyads.PLCTYPE_REAL, + AdsType.LREAL: pyads.PLCTYPE_LREAL, + AdsType.STRING: pyads.PLCTYPE_STRING, + AdsType.TIME: pyads.PLCTYPE_TIME, + AdsType.DATE: pyads.PLCTYPE_DATE, + AdsType.DATE_AND_TIME: pyads.PLCTYPE_DT, + AdsType.TOD: pyads.PLCTYPE_TOD, } CONF_ADS_FACTOR = "factor" @@ -82,27 +63,7 @@ CONFIG_SCHEMA = vol.Schema( SCHEMA_SERVICE_WRITE_DATA_BY_NAME = vol.Schema( { - vol.Required(CONF_ADS_TYPE): vol.In( - [ - ADSTYPE_BOOL, - ADSTYPE_BYTE, - ADSTYPE_INT, - ADSTYPE_UINT, - ADSTYPE_SINT, - ADSTYPE_USINT, - ADSTYPE_DINT, - ADSTYPE_UDINT, - ADSTYPE_WORD, - ADSTYPE_DWORD, - ADSTYPE_REAL, - ADSTYPE_LREAL, - ADSTYPE_STRING, - ADSTYPE_TIME, - ADSTYPE_DATE, - ADSTYPE_DATE_AND_TIME, - ADSTYPE_TOD, - ] - ), + vol.Required(CONF_ADS_TYPE): vol.Coerce(AdsType), vol.Required(CONF_ADS_VALUE): vol.Coerce(int), vol.Required(CONF_ADS_VAR): cv.string, } @@ -136,9 +97,9 @@ def setup(hass: HomeAssistant, config: ConfigType) -> bool: def handle_write_data_by_name(call: ServiceCall) -> None: """Write a value to the connected ADS device.""" - ads_var = call.data[CONF_ADS_VAR] - ads_type = call.data[CONF_ADS_TYPE] - value = call.data[CONF_ADS_VALUE] + ads_var: str = call.data[CONF_ADS_VAR] + ads_type: AdsType = call.data[CONF_ADS_TYPE] + value: int = call.data[CONF_ADS_VALUE] try: ads.write_by_name(ads_var, value, ADS_TYPEMAP[ads_type]) diff --git a/homeassistant/components/ads/const.py b/homeassistant/components/ads/const.py index 5683077e023..ea78fb41785 100644 --- a/homeassistant/components/ads/const.py +++ b/homeassistant/components/ads/const.py @@ -2,6 +2,7 @@ from __future__ import annotations +from enum import StrEnum from typing import TYPE_CHECKING from homeassistant.util.hass_dict import HassKey @@ -16,3 +17,25 @@ DATA_ADS: HassKey[AdsHub] = HassKey(DOMAIN) CONF_ADS_VAR = "adsvar" STATE_KEY_STATE = "state" + + +class AdsType(StrEnum): + """Supported Types.""" + + BOOL = "bool" + BYTE = "byte" + INT = "int" + UINT = "uint" + SINT = "sint" + USINT = "usint" + DINT = "dint" + UDINT = "udint" + WORD = "word" + DWORD = "dword" + LREAL = "lreal" + REAL = "real" + STRING = "string" + TIME = "time" + DATE = "date" + DATE_AND_TIME = "dt" + TOD = "tod" diff --git a/homeassistant/components/ads/sensor.py b/homeassistant/components/ads/sensor.py index 9dea722e864..09579161a94 100644 --- a/homeassistant/components/ads/sensor.py +++ b/homeassistant/components/ads/sensor.py @@ -19,10 +19,10 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType -from .. import ads from . import ADS_TYPEMAP, CONF_ADS_FACTOR, CONF_ADS_TYPE -from .const import CONF_ADS_VAR, DATA_ADS, STATE_KEY_STATE +from .const import CONF_ADS_VAR, DATA_ADS, STATE_KEY_STATE, AdsType from .entity import AdsEntity +from .hub import AdsHub DEFAULT_NAME = "ADS sensor" @@ -30,21 +30,24 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend( { vol.Required(CONF_ADS_VAR): cv.string, vol.Optional(CONF_ADS_FACTOR): cv.positive_int, - vol.Optional(CONF_ADS_TYPE, default=ads.ADSTYPE_INT): vol.In( - [ - ads.ADSTYPE_BOOL, - ads.ADSTYPE_BYTE, - ads.ADSTYPE_INT, - ads.ADSTYPE_UINT, - ads.ADSTYPE_SINT, - ads.ADSTYPE_USINT, - ads.ADSTYPE_DINT, - ads.ADSTYPE_UDINT, - ads.ADSTYPE_WORD, - ads.ADSTYPE_DWORD, - ads.ADSTYPE_LREAL, - ads.ADSTYPE_REAL, - ] + vol.Optional(CONF_ADS_TYPE, default=AdsType.INT): vol.All( + vol.Coerce(AdsType), + vol.In( + [ + AdsType.BOOL, + AdsType.BYTE, + AdsType.INT, + AdsType.UINT, + AdsType.SINT, + AdsType.USINT, + AdsType.DINT, + AdsType.UDINT, + AdsType.WORD, + AdsType.DWORD, + AdsType.LREAL, + AdsType.REAL, + ] + ), ), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, @@ -64,7 +67,7 @@ def setup_platform( ads_hub = hass.data[DATA_ADS] ads_var: str = config[CONF_ADS_VAR] - ads_type: str = config[CONF_ADS_TYPE] + ads_type: AdsType = config[CONF_ADS_TYPE] name: str = config[CONF_NAME] factor: int | None = config.get(CONF_ADS_FACTOR) device_class: SensorDeviceClass | None = config.get(CONF_DEVICE_CLASS) @@ -90,9 +93,9 @@ class AdsSensor(AdsEntity, SensorEntity): def __init__( self, - ads_hub: ads.AdsHub, + ads_hub: AdsHub, ads_var: str, - ads_type: str, + ads_type: AdsType, name: str, factor: int | None, device_class: SensorDeviceClass | None,