From d79fc2c5066cd6235d2d21936ad1751b68d8a292 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Mon, 9 Aug 2021 23:38:58 +0200 Subject: [PATCH] Use EntityDescription - pi_hole (#54319) --- homeassistant/components/pi_hole/const.py | 83 +++++++++++++++------- homeassistant/components/pi_hole/sensor.py | 44 +++--------- 2 files changed, 69 insertions(+), 58 deletions(-) diff --git a/homeassistant/components/pi_hole/const.py b/homeassistant/components/pi_hole/const.py index f1871bf27c8..40a3a16de3a 100644 --- a/homeassistant/components/pi_hole/const.py +++ b/homeassistant/components/pi_hole/const.py @@ -1,6 +1,9 @@ """Constants for the pi_hole integration.""" +from __future__ import annotations + from datetime import timedelta +from homeassistant.components.sensor import SensorEntityDescription from homeassistant.const import PERCENTAGE DOMAIN = "pi_hole" @@ -25,28 +28,60 @@ MIN_TIME_BETWEEN_UPDATES = timedelta(minutes=5) DATA_KEY_API = "api" DATA_KEY_COORDINATOR = "coordinator" -SENSOR_DICT = { - "ads_blocked_today": ["Ads Blocked Today", "ads", "mdi:close-octagon-outline"], - "ads_percentage_today": [ - "Ads Percentage Blocked Today", - PERCENTAGE, - "mdi:close-octagon-outline", - ], - "clients_ever_seen": ["Seen Clients", "clients", "mdi:account-outline"], - "dns_queries_today": [ - "DNS Queries Today", - "queries", - "mdi:comment-question-outline", - ], - "domains_being_blocked": ["Domains Blocked", "domains", "mdi:block-helper"], - "queries_cached": ["DNS Queries Cached", "queries", "mdi:comment-question-outline"], - "queries_forwarded": [ - "DNS Queries Forwarded", - "queries", - "mdi:comment-question-outline", - ], - "unique_clients": ["DNS Unique Clients", "clients", "mdi:account-outline"], - "unique_domains": ["DNS Unique Domains", "domains", "mdi:domain"], -} -SENSOR_LIST = list(SENSOR_DICT) +SENSOR_TYPES: tuple[SensorEntityDescription, ...] = ( + SensorEntityDescription( + key="ads_blocked_today", + name="Ads Blocked Today", + unit_of_measurement="ads", + icon="mdi:close-octagon-outline", + ), + SensorEntityDescription( + key="ads_percentage_today", + name="Ads Percentage Blocked Today", + unit_of_measurement=PERCENTAGE, + icon="mdi:close-octagon-outline", + ), + SensorEntityDescription( + key="clients_ever_seen", + name="Seen Clients", + unit_of_measurement="clients", + icon="mdi:account-outline", + ), + SensorEntityDescription( + key="dns_queries_today", + name="DNS Queries Today", + unit_of_measurement="queries", + icon="mdi:comment-question-outline", + ), + SensorEntityDescription( + key="domains_being_blocked", + name="Domains Blocked", + unit_of_measurement="domains", + icon="mdi:block-helper", + ), + SensorEntityDescription( + key="queries_cached", + name="DNS Queries Cached", + unit_of_measurement="queries", + icon="mdi:comment-question-outline", + ), + SensorEntityDescription( + key="queries_forwarded", + name="DNS Queries Forwarded", + unit_of_measurement="queries", + icon="mdi:comment-question-outline", + ), + SensorEntityDescription( + key="unique_clients", + name="DNS Unique Clients", + unit_of_measurement="clients", + icon="mdi:account-outline", + ), + SensorEntityDescription( + key="unique_domains", + name="DNS Unique Domains", + unit_of_measurement="domains", + icon="mdi:domain", + ), +) diff --git a/homeassistant/components/pi_hole/sensor.py b/homeassistant/components/pi_hole/sensor.py index 95aee56f7cc..38b0b192e14 100644 --- a/homeassistant/components/pi_hole/sensor.py +++ b/homeassistant/components/pi_hole/sensor.py @@ -5,7 +5,7 @@ from typing import Any from hole import Hole -from homeassistant.components.sensor import SensorEntity +from homeassistant.components.sensor import SensorEntity, SensorEntityDescription from homeassistant.config_entries import ConfigEntry from homeassistant.const import CONF_NAME from homeassistant.core import HomeAssistant @@ -18,8 +18,7 @@ from .const import ( DATA_KEY_API, DATA_KEY_COORDINATOR, DOMAIN as PIHOLE_DOMAIN, - SENSOR_DICT, - SENSOR_LIST, + SENSOR_TYPES, ) @@ -34,10 +33,10 @@ async def async_setup_entry( hole_data[DATA_KEY_API], hole_data[DATA_KEY_COORDINATOR], name, - sensor_name, entry.entry_id, + description, ) - for sensor_name in SENSOR_LIST + for description in SENSOR_TYPES ] async_add_entities(sensors, True) @@ -50,46 +49,23 @@ class PiHoleSensor(PiHoleEntity, SensorEntity): api: Hole, coordinator: DataUpdateCoordinator, name: str, - sensor_name: str, server_unique_id: str, + description: SensorEntityDescription, ) -> None: """Initialize a Pi-hole sensor.""" super().__init__(api, coordinator, name, server_unique_id) + self.entity_description = description - self._condition = sensor_name - - variable_info = SENSOR_DICT[sensor_name] - self._condition_name = variable_info[0] - self._unit_of_measurement = variable_info[1] - self._icon = variable_info[2] - - @property - def name(self) -> str: - """Return the name of the sensor.""" - return f"{self._name} {self._condition_name}" - - @property - def unique_id(self) -> str: - """Return the unique id of the sensor.""" - return f"{self._server_unique_id}/{self._condition_name}" - - @property - def icon(self) -> str: - """Icon to use in the frontend, if any.""" - return self._icon - - @property - def unit_of_measurement(self) -> str: - """Return the unit the value is expressed in.""" - return self._unit_of_measurement + self._attr_name = f"{name} {description.name}" + self._attr_unique_id = f"{self._server_unique_id}/{description.name}" @property def state(self) -> Any: """Return the state of the device.""" try: - return round(self.api.data[self._condition], 2) + return round(self.api.data[self.entity_description.key], 2) except TypeError: - return self.api.data[self._condition] + return self.api.data[self.entity_description.key] @property def extra_state_attributes(self) -> dict[str, Any]: