Add number entities for screenlogic values used in SI calc (#117812)

This commit is contained in:
Kevin Worrel 2024-05-22 12:52:09 -07:00 committed by GitHub
parent be6598ea4f
commit 40fdc840ab
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 89 additions and 1 deletions

View File

@ -5,12 +5,14 @@ import logging
from screenlogicpy.const.common import ScreenLogicCommunicationError, ScreenLogicError from screenlogicpy.const.common import ScreenLogicCommunicationError, ScreenLogicError
from screenlogicpy.const.data import ATTR, DEVICE, GROUP, VALUE from screenlogicpy.const.data import ATTR, DEVICE, GROUP, VALUE
from screenlogicpy.const.msg import CODE
from screenlogicpy.device_const.system import EQUIPMENT_FLAG from screenlogicpy.device_const.system import EQUIPMENT_FLAG
from homeassistant.components.number import ( from homeassistant.components.number import (
DOMAIN, DOMAIN,
NumberEntity, NumberEntity,
NumberEntityDescription, NumberEntityDescription,
NumberMode,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory from homeassistant.const import EntityCategory
@ -20,7 +22,12 @@ from homeassistant.helpers.entity_platform import AddEntitiesCallback
from .const import DOMAIN as SL_DOMAIN from .const import DOMAIN as SL_DOMAIN
from .coordinator import ScreenlogicDataUpdateCoordinator from .coordinator import ScreenlogicDataUpdateCoordinator
from .entity import ScreenLogicEntity, ScreenLogicEntityDescription from .entity import (
ScreenLogicEntity,
ScreenLogicEntityDescription,
ScreenLogicPushEntity,
ScreenLogicPushEntityDescription,
)
from .util import cleanup_excluded_entity, get_ha_unit from .util import cleanup_excluded_entity, get_ha_unit
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -36,6 +43,45 @@ class ScreenLogicNumberDescription(
"""Describes a ScreenLogic number entity.""" """Describes a ScreenLogic number entity."""
@dataclass(frozen=True, kw_only=True)
class ScreenLogicPushNumberDescription(
ScreenLogicNumberDescription,
ScreenLogicPushEntityDescription,
):
"""Describes a ScreenLogic push number entity."""
SUPPORTED_INTELLICHEM_NUMBERS = [
ScreenLogicPushNumberDescription(
subscription_code=CODE.CHEMISTRY_CHANGED,
data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION),
key=VALUE.CALCIUM_HARDNESS,
entity_category=EntityCategory.CONFIG,
mode=NumberMode.BOX,
),
ScreenLogicPushNumberDescription(
subscription_code=CODE.CHEMISTRY_CHANGED,
data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION),
key=VALUE.CYA,
entity_category=EntityCategory.CONFIG,
mode=NumberMode.BOX,
),
ScreenLogicPushNumberDescription(
subscription_code=CODE.CHEMISTRY_CHANGED,
data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION),
key=VALUE.TOTAL_ALKALINITY,
entity_category=EntityCategory.CONFIG,
mode=NumberMode.BOX,
),
ScreenLogicPushNumberDescription(
subscription_code=CODE.CHEMISTRY_CHANGED,
data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION),
key=VALUE.SALT_TDS_PPM,
entity_category=EntityCategory.CONFIG,
mode=NumberMode.BOX,
),
]
SUPPORTED_SCG_NUMBERS = [ SUPPORTED_SCG_NUMBERS = [
ScreenLogicNumberDescription( ScreenLogicNumberDescription(
data_root=(DEVICE.SCG, GROUP.CONFIGURATION), data_root=(DEVICE.SCG, GROUP.CONFIGURATION),
@ -62,6 +108,19 @@ async def async_setup_entry(
] ]
gateway = coordinator.gateway gateway = coordinator.gateway
for chem_number_description in SUPPORTED_INTELLICHEM_NUMBERS:
chem_number_data_path = (
*chem_number_description.data_root,
chem_number_description.key,
)
if EQUIPMENT_FLAG.INTELLICHEM not in gateway.equipment_flags:
cleanup_excluded_entity(coordinator, DOMAIN, chem_number_data_path)
continue
if gateway.get_data(*chem_number_data_path):
entities.append(
ScreenLogicChemistryNumber(coordinator, chem_number_description)
)
for scg_number_description in SUPPORTED_SCG_NUMBERS: for scg_number_description in SUPPORTED_SCG_NUMBERS:
scg_number_data_path = ( scg_number_data_path = (
*scg_number_description.data_root, *scg_number_description.data_root,
@ -115,6 +174,31 @@ class ScreenLogicNumber(ScreenLogicEntity, NumberEntity):
raise NotImplementedError raise NotImplementedError
class ScreenLogicPushNumber(ScreenLogicPushEntity, ScreenLogicNumber):
"""Base class to preresent a ScreenLogic Push Number entity."""
entity_description: ScreenLogicPushNumberDescription
class ScreenLogicChemistryNumber(ScreenLogicPushNumber):
"""Class to represent a ScreenLogic Chemistry Number entity."""
async def async_set_native_value(self, value: float) -> None:
"""Update the current value."""
# Current API requires int values for the currently supported numbers.
value = int(value)
try:
await self.gateway.async_set_chem_data(**{self._data_key: value})
except (ScreenLogicCommunicationError, ScreenLogicError) as sle:
raise HomeAssistantError(
f"Failed to set '{self._data_key}' to {value}: {sle.msg}"
) from sle
_LOGGER.debug("Set '%s' to %s", self._data_key, value)
await self._async_refresh()
class ScreenLogicSCGNumber(ScreenLogicNumber): class ScreenLogicSCGNumber(ScreenLogicNumber):
"""Class to represent a ScreenLoigic SCG Number entity.""" """Class to represent a ScreenLoigic SCG Number entity."""

View File

@ -136,11 +136,13 @@ SUPPORTED_INTELLICHEM_SENSORS = [
subscription_code=CODE.CHEMISTRY_CHANGED, subscription_code=CODE.CHEMISTRY_CHANGED,
data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION), data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION),
key=VALUE.CALCIUM_HARDNESS, key=VALUE.CALCIUM_HARDNESS,
entity_registry_enabled_default=False, # Superseded by number entity
), ),
ScreenLogicPushSensorDescription( ScreenLogicPushSensorDescription(
subscription_code=CODE.CHEMISTRY_CHANGED, subscription_code=CODE.CHEMISTRY_CHANGED,
data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION), data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION),
key=VALUE.CYA, key=VALUE.CYA,
entity_registry_enabled_default=False, # Superseded by number entity
), ),
ScreenLogicPushSensorDescription( ScreenLogicPushSensorDescription(
subscription_code=CODE.CHEMISTRY_CHANGED, subscription_code=CODE.CHEMISTRY_CHANGED,
@ -156,11 +158,13 @@ SUPPORTED_INTELLICHEM_SENSORS = [
subscription_code=CODE.CHEMISTRY_CHANGED, subscription_code=CODE.CHEMISTRY_CHANGED,
data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION), data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION),
key=VALUE.TOTAL_ALKALINITY, key=VALUE.TOTAL_ALKALINITY,
entity_registry_enabled_default=False, # Superseded by number entity
), ),
ScreenLogicPushSensorDescription( ScreenLogicPushSensorDescription(
subscription_code=CODE.CHEMISTRY_CHANGED, subscription_code=CODE.CHEMISTRY_CHANGED,
data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION), data_root=(DEVICE.INTELLICHEM, GROUP.CONFIGURATION),
key=VALUE.SALT_TDS_PPM, key=VALUE.SALT_TDS_PPM,
entity_registry_enabled_default=False, # Superseded by number entity
), ),
ScreenLogicPushSensorDescription( ScreenLogicPushSensorDescription(
subscription_code=CODE.CHEMISTRY_CHANGED, subscription_code=CODE.CHEMISTRY_CHANGED,