Move ADS supported types to a StrEnum (#125824)

This commit is contained in:
epenet 2024-09-13 10:12:24 +02:00 committed by GitHub
parent f311198da0
commit 6d17ad4da6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 68 additions and 81 deletions

View File

@ -15,49 +15,30 @@ from homeassistant.core import HomeAssistant, ServiceCall
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.typing import ConfigType 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 from .hub import AdsHub
_LOGGER = logging.getLogger(__name__) _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 = { ADS_TYPEMAP = {
ADSTYPE_BOOL: pyads.PLCTYPE_BOOL, AdsType.BOOL: pyads.PLCTYPE_BOOL,
ADSTYPE_BYTE: pyads.PLCTYPE_BYTE, AdsType.BYTE: pyads.PLCTYPE_BYTE,
ADSTYPE_INT: pyads.PLCTYPE_INT, AdsType.INT: pyads.PLCTYPE_INT,
ADSTYPE_UINT: pyads.PLCTYPE_UINT, AdsType.UINT: pyads.PLCTYPE_UINT,
ADSTYPE_SINT: pyads.PLCTYPE_SINT, AdsType.SINT: pyads.PLCTYPE_SINT,
ADSTYPE_USINT: pyads.PLCTYPE_USINT, AdsType.USINT: pyads.PLCTYPE_USINT,
ADSTYPE_DINT: pyads.PLCTYPE_DINT, AdsType.DINT: pyads.PLCTYPE_DINT,
ADSTYPE_UDINT: pyads.PLCTYPE_UDINT, AdsType.UDINT: pyads.PLCTYPE_UDINT,
ADSTYPE_WORD: pyads.PLCTYPE_WORD, AdsType.WORD: pyads.PLCTYPE_WORD,
ADSTYPE_DWORD: pyads.PLCTYPE_DWORD, AdsType.DWORD: pyads.PLCTYPE_DWORD,
ADSTYPE_REAL: pyads.PLCTYPE_REAL, AdsType.REAL: pyads.PLCTYPE_REAL,
ADSTYPE_LREAL: pyads.PLCTYPE_LREAL, AdsType.LREAL: pyads.PLCTYPE_LREAL,
ADSTYPE_STRING: pyads.PLCTYPE_STRING, AdsType.STRING: pyads.PLCTYPE_STRING,
ADSTYPE_TIME: pyads.PLCTYPE_TIME, AdsType.TIME: pyads.PLCTYPE_TIME,
ADSTYPE_DATE: pyads.PLCTYPE_DATE, AdsType.DATE: pyads.PLCTYPE_DATE,
ADSTYPE_DATE_AND_TIME: pyads.PLCTYPE_DT, AdsType.DATE_AND_TIME: pyads.PLCTYPE_DT,
ADSTYPE_TOD: pyads.PLCTYPE_TOD, AdsType.TOD: pyads.PLCTYPE_TOD,
} }
CONF_ADS_FACTOR = "factor" CONF_ADS_FACTOR = "factor"
@ -82,27 +63,7 @@ CONFIG_SCHEMA = vol.Schema(
SCHEMA_SERVICE_WRITE_DATA_BY_NAME = vol.Schema( SCHEMA_SERVICE_WRITE_DATA_BY_NAME = vol.Schema(
{ {
vol.Required(CONF_ADS_TYPE): vol.In( vol.Required(CONF_ADS_TYPE): vol.Coerce(AdsType),
[
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_VALUE): vol.Coerce(int), vol.Required(CONF_ADS_VALUE): vol.Coerce(int),
vol.Required(CONF_ADS_VAR): cv.string, 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: def handle_write_data_by_name(call: ServiceCall) -> None:
"""Write a value to the connected ADS device.""" """Write a value to the connected ADS device."""
ads_var = call.data[CONF_ADS_VAR] ads_var: str = call.data[CONF_ADS_VAR]
ads_type = call.data[CONF_ADS_TYPE] ads_type: AdsType = call.data[CONF_ADS_TYPE]
value = call.data[CONF_ADS_VALUE] value: int = call.data[CONF_ADS_VALUE]
try: try:
ads.write_by_name(ads_var, value, ADS_TYPEMAP[ads_type]) ads.write_by_name(ads_var, value, ADS_TYPEMAP[ads_type])

View File

@ -2,6 +2,7 @@
from __future__ import annotations from __future__ import annotations
from enum import StrEnum
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
from homeassistant.util.hass_dict import HassKey from homeassistant.util.hass_dict import HassKey
@ -16,3 +17,25 @@ DATA_ADS: HassKey[AdsHub] = HassKey(DOMAIN)
CONF_ADS_VAR = "adsvar" CONF_ADS_VAR = "adsvar"
STATE_KEY_STATE = "state" 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"

View File

@ -19,10 +19,10 @@ import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.entity_platform import AddEntitiesCallback from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType, StateType
from .. import ads
from . import ADS_TYPEMAP, CONF_ADS_FACTOR, CONF_ADS_TYPE 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 .entity import AdsEntity
from .hub import AdsHub
DEFAULT_NAME = "ADS sensor" DEFAULT_NAME = "ADS sensor"
@ -30,21 +30,24 @@ PLATFORM_SCHEMA = SENSOR_PLATFORM_SCHEMA.extend(
{ {
vol.Required(CONF_ADS_VAR): cv.string, vol.Required(CONF_ADS_VAR): cv.string,
vol.Optional(CONF_ADS_FACTOR): cv.positive_int, vol.Optional(CONF_ADS_FACTOR): cv.positive_int,
vol.Optional(CONF_ADS_TYPE, default=ads.ADSTYPE_INT): vol.In( vol.Optional(CONF_ADS_TYPE, default=AdsType.INT): vol.All(
[ vol.Coerce(AdsType),
ads.ADSTYPE_BOOL, vol.In(
ads.ADSTYPE_BYTE, [
ads.ADSTYPE_INT, AdsType.BOOL,
ads.ADSTYPE_UINT, AdsType.BYTE,
ads.ADSTYPE_SINT, AdsType.INT,
ads.ADSTYPE_USINT, AdsType.UINT,
ads.ADSTYPE_DINT, AdsType.SINT,
ads.ADSTYPE_UDINT, AdsType.USINT,
ads.ADSTYPE_WORD, AdsType.DINT,
ads.ADSTYPE_DWORD, AdsType.UDINT,
ads.ADSTYPE_LREAL, AdsType.WORD,
ads.ADSTYPE_REAL, AdsType.DWORD,
] AdsType.LREAL,
AdsType.REAL,
]
),
), ),
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA, vol.Optional(CONF_DEVICE_CLASS): SENSOR_DEVICE_CLASSES_SCHEMA,
@ -64,7 +67,7 @@ def setup_platform(
ads_hub = hass.data[DATA_ADS] ads_hub = hass.data[DATA_ADS]
ads_var: str = config[CONF_ADS_VAR] 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] name: str = config[CONF_NAME]
factor: int | None = config.get(CONF_ADS_FACTOR) factor: int | None = config.get(CONF_ADS_FACTOR)
device_class: SensorDeviceClass | None = config.get(CONF_DEVICE_CLASS) device_class: SensorDeviceClass | None = config.get(CONF_DEVICE_CLASS)
@ -90,9 +93,9 @@ class AdsSensor(AdsEntity, SensorEntity):
def __init__( def __init__(
self, self,
ads_hub: ads.AdsHub, ads_hub: AdsHub,
ads_var: str, ads_var: str,
ads_type: str, ads_type: AdsType,
name: str, name: str,
factor: int | None, factor: int | None,
device_class: SensorDeviceClass | None, device_class: SensorDeviceClass | None,