Use EntityDescription - rainmachine (#55021)

This commit is contained in:
Marc Mueller 2021-08-23 19:23:35 +02:00 committed by GitHub
parent ee3e27c82a
commit 8522538d8f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 64 additions and 64 deletions

View File

@ -1,9 +1,12 @@
"""This platform provides support for sensor data from RainMachine."""
from __future__ import annotations
from dataclasses import dataclass
from functools import partial
from regenmaschine.controller import Controller
from homeassistant.components.sensor import SensorEntity
from homeassistant.components.sensor import SensorEntity, SensorEntityDescription
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import (
DEVICE_CLASS_TEMPERATURE,
@ -29,48 +32,64 @@ TYPE_FLOW_SENSOR_START_INDEX = "flow_sensor_start_index"
TYPE_FLOW_SENSOR_WATERING_CLICKS = "flow_sensor_watering_clicks"
TYPE_FREEZE_TEMP = "freeze_protect_temp"
SENSORS = {
TYPE_FLOW_SENSOR_CLICK_M3: (
"Flow Sensor Clicks",
"mdi:water-pump",
f"clicks/{VOLUME_CUBIC_METERS}",
None,
False,
DATA_PROVISION_SETTINGS,
@dataclass
class RainmachineRequiredKeysMixin:
"""Mixin for required keys."""
api_category: str
@dataclass
class RainmachineSensorEntityDescription(
SensorEntityDescription, RainmachineRequiredKeysMixin
):
"""Describes Rainmachine sensor entity."""
SENSOR_TYPES: tuple[RainmachineSensorEntityDescription, ...] = (
RainmachineSensorEntityDescription(
key=TYPE_FLOW_SENSOR_CLICK_M3,
name="Flow Sensor Clicks",
icon="mdi:water-pump",
native_unit_of_measurement=f"clicks/{VOLUME_CUBIC_METERS}",
entity_registry_enabled_default=False,
api_category=DATA_PROVISION_SETTINGS,
),
TYPE_FLOW_SENSOR_CONSUMED_LITERS: (
"Flow Sensor Consumed Liters",
"mdi:water-pump",
"liter",
None,
False,
DATA_PROVISION_SETTINGS,
RainmachineSensorEntityDescription(
key=TYPE_FLOW_SENSOR_CONSUMED_LITERS,
name="Flow Sensor Consumed Liters",
icon="mdi:water-pump",
native_unit_of_measurement="liter",
entity_registry_enabled_default=False,
api_category=DATA_PROVISION_SETTINGS,
),
TYPE_FLOW_SENSOR_START_INDEX: (
"Flow Sensor Start Index",
"mdi:water-pump",
"index",
None,
False,
DATA_PROVISION_SETTINGS,
RainmachineSensorEntityDescription(
key=TYPE_FLOW_SENSOR_START_INDEX,
name="Flow Sensor Start Index",
icon="mdi:water-pump",
native_unit_of_measurement="index",
entity_registry_enabled_default=False,
api_category=DATA_PROVISION_SETTINGS,
),
TYPE_FLOW_SENSOR_WATERING_CLICKS: (
"Flow Sensor Clicks",
"mdi:water-pump",
"clicks",
None,
False,
DATA_PROVISION_SETTINGS,
RainmachineSensorEntityDescription(
key=TYPE_FLOW_SENSOR_WATERING_CLICKS,
name="Flow Sensor Clicks",
icon="mdi:water-pump",
native_unit_of_measurement="clicks",
entity_registry_enabled_default=False,
api_category=DATA_PROVISION_SETTINGS,
),
TYPE_FREEZE_TEMP: (
"Freeze Protect Temperature",
"mdi:thermometer",
TEMP_CELSIUS,
DEVICE_CLASS_TEMPERATURE,
True,
DATA_RESTRICTIONS_UNIVERSAL,
RainmachineSensorEntityDescription(
key=TYPE_FREEZE_TEMP,
name="Freeze Protect Temperature",
icon="mdi:thermometer",
native_unit_of_measurement=TEMP_CELSIUS,
device_class=DEVICE_CLASS_TEMPERATURE,
entity_registry_enabled_default=True,
api_category=DATA_RESTRICTIONS_UNIVERSAL,
),
}
)
async def async_setup_entry(
@ -96,19 +115,8 @@ async def async_setup_entry(
async_add_entities(
[
async_get_sensor(api_category)(
controller,
sensor_type,
name,
icon,
unit,
device_class,
enabled_by_default,
)
for (
sensor_type,
(name, icon, unit, device_class, enabled_by_default, api_category),
) in SENSORS.items()
async_get_sensor(description.api_category)(controller, description)
for description in SENSOR_TYPES
]
)
@ -116,25 +124,17 @@ async def async_setup_entry(
class RainMachineSensor(RainMachineEntity, SensorEntity):
"""Define a general RainMachine sensor."""
entity_description: RainmachineSensorEntityDescription
def __init__(
self,
coordinator: DataUpdateCoordinator,
controller: Controller,
sensor_type: str,
name: str,
icon: str,
unit: str,
device_class: str,
enabled_by_default: bool,
description: RainmachineSensorEntityDescription,
) -> None:
"""Initialize."""
super().__init__(coordinator, controller, sensor_type)
self._attr_device_class = device_class
self._attr_entity_registry_enabled_default = enabled_by_default
self._attr_icon = icon
self._attr_name = name
self._attr_native_unit_of_measurement = unit
super().__init__(coordinator, controller, description.key)
self.entity_description = description
class ProvisionSettingsSensor(RainMachineSensor):