Add entity name translations to Pi-hole (#90713)

pull/90855/head
Michael 2023-04-03 14:00:27 +02:00 committed by Paulus Schoutsen
parent 601498617d
commit 28983bca85
6 changed files with 57 additions and 36 deletions

View File

@ -77,7 +77,7 @@ BINARY_SENSOR_TYPES: tuple[PiHoleBinarySensorEntityDescription, ...] = (
),
PiHoleBinarySensorEntityDescription(
key="status",
name="Status",
translation_key="status",
icon="mdi:pi-hole",
state_value=lambda api: bool(api.data.get("status") == "enabled"),
),
@ -109,6 +109,7 @@ class PiHoleBinarySensor(PiHoleEntity, BinarySensorEntity):
"""Representation of a Pi-hole binary sensor."""
entity_description: PiHoleBinarySensorEntityDescription
_attr_has_entity_name = True
def __init__(
self,
@ -123,10 +124,9 @@ class PiHoleBinarySensor(PiHoleEntity, BinarySensorEntity):
self.entity_description = description
if description.key == "status":
self._attr_has_entity_name = False
self._attr_name = f"{name}"
else:
self._attr_name = f"{name} {description.name}"
self._attr_unique_id = f"{self._server_unique_id}/{description.name}"
self._attr_unique_id = f"{self._server_unique_id}/{description.key}"
@property
def is_on(self) -> bool:

View File

@ -17,55 +17,55 @@ from .const import DATA_KEY_API, DATA_KEY_COORDINATOR, DOMAIN as PIHOLE_DOMAIN
SENSOR_TYPES: tuple[SensorEntityDescription, ...] = (
SensorEntityDescription(
key="ads_blocked_today",
name="Ads Blocked Today",
translation_key="ads_blocked_today",
native_unit_of_measurement="ads",
icon="mdi:close-octagon-outline",
),
SensorEntityDescription(
key="ads_percentage_today",
name="Ads Percentage Blocked Today",
translation_key="ads_percentage_today",
native_unit_of_measurement=PERCENTAGE,
icon="mdi:close-octagon-outline",
),
SensorEntityDescription(
key="clients_ever_seen",
name="Seen Clients",
translation_key="clients_ever_seen",
native_unit_of_measurement="clients",
icon="mdi:account-outline",
),
SensorEntityDescription(
key="dns_queries_today",
name="DNS Queries Today",
translation_key="dns_queries_today",
native_unit_of_measurement="queries",
icon="mdi:comment-question-outline",
),
SensorEntityDescription(
key="domains_being_blocked",
name="Domains Blocked",
translation_key="domains_being_blocked",
native_unit_of_measurement="domains",
icon="mdi:block-helper",
),
SensorEntityDescription(
key="queries_cached",
name="DNS Queries Cached",
translation_key="queries_cached",
native_unit_of_measurement="queries",
icon="mdi:comment-question-outline",
),
SensorEntityDescription(
key="queries_forwarded",
name="DNS Queries Forwarded",
translation_key="queries_forwarded",
native_unit_of_measurement="queries",
icon="mdi:comment-question-outline",
),
SensorEntityDescription(
key="unique_clients",
name="DNS Unique Clients",
translation_key="unique_clients",
native_unit_of_measurement="clients",
icon="mdi:account-outline",
),
SensorEntityDescription(
key="unique_domains",
name="DNS Unique Domains",
translation_key="unique_domains",
native_unit_of_measurement="domains",
icon="mdi:domain",
),
@ -95,6 +95,7 @@ class PiHoleSensor(PiHoleEntity, SensorEntity):
"""Representation of a Pi-hole sensor."""
entity_description: SensorEntityDescription
_attr_has_entity_name = True
def __init__(
self,
@ -108,8 +109,7 @@ class PiHoleSensor(PiHoleEntity, SensorEntity):
super().__init__(api, coordinator, name, server_unique_id)
self.entity_description = description
self._attr_name = f"{name} {description.name}"
self._attr_unique_id = f"{self._server_unique_id}/{description.name}"
self._attr_unique_id = f"{self._server_unique_id}/{description.key}"
@property
def native_value(self) -> StateType:

View File

@ -32,5 +32,26 @@
"already_configured": "[%key:common::config_flow::abort::already_configured_service%]",
"reauth_successful": "[%key:common::config_flow::abort::reauth_successful%]"
}
},
"entity": {
"binary_sensor": {
"status": { "name": "Status" }
},
"sensor": {
"ads_blocked_today": { "name": "Ads blocked today" },
"ads_percentage_today": { "name": "Ads percentage blocked today" },
"clients_ever_seen": { "name": "Seen clients" },
"dns_queries_today": { "name": "DNS queries today" },
"domains_being_blocked": { "name": "Domains blocked" },
"queries_cached": { "name": "DNS queries cached" },
"queries_forwarded": { "name": "DNS queries forwarded" },
"unique_clients": { "name": "DNS unique clients" },
"unique_domains": { "name": "DNS unique domains" }
},
"update": {
"core_update_available": { "name": "Core update available" },
"ftl_update_available": { "name": "FTL update available" },
"web_update_available": { "name": "Web update available" }
}
}
}

View File

@ -30,7 +30,7 @@ class PiHoleUpdateEntityDescription(UpdateEntityDescription):
UPDATE_ENTITY_TYPES: tuple[PiHoleUpdateEntityDescription, ...] = (
PiHoleUpdateEntityDescription(
key="core_update_available",
name="Core Update Available",
translation_key="core_update_available",
title="Pi-hole Core",
entity_category=EntityCategory.DIAGNOSTIC,
installed_version=lambda versions: versions.get("core_current"),
@ -39,7 +39,7 @@ UPDATE_ENTITY_TYPES: tuple[PiHoleUpdateEntityDescription, ...] = (
),
PiHoleUpdateEntityDescription(
key="web_update_available",
name="Web Update Available",
translation_key="web_update_available",
title="Pi-hole Web interface",
entity_category=EntityCategory.DIAGNOSTIC,
installed_version=lambda versions: versions.get("web_current"),
@ -48,7 +48,7 @@ UPDATE_ENTITY_TYPES: tuple[PiHoleUpdateEntityDescription, ...] = (
),
PiHoleUpdateEntityDescription(
key="ftl_update_available",
name="FTL Update Available",
translation_key="ftl_update_available",
title="Pi-hole FTL DNS",
entity_category=EntityCategory.DIAGNOSTIC,
installed_version=lambda versions: versions.get("FTL_current"),
@ -81,6 +81,7 @@ class PiHoleUpdateEntity(PiHoleEntity, UpdateEntity):
"""Representation of a Pi-hole update entity."""
entity_description: PiHoleUpdateEntityDescription
_attr_has_entity_name = True
def __init__(
self,
@ -94,8 +95,7 @@ class PiHoleUpdateEntity(PiHoleEntity, UpdateEntity):
super().__init__(api, coordinator, name, server_unique_id)
self.entity_description = description
self._attr_name = f"{name} {description.name}"
self._attr_unique_id = f"{self._server_unique_id}/{description.name}"
self._attr_unique_id = f"{self._server_unique_id}/{description.key}"
self._attr_title = description.title
@property

View File

@ -36,39 +36,39 @@ async def test_setup_with_defaults(hass: HomeAssistant) -> None:
assert await hass.config_entries.async_setup(entry.entry_id)
state = hass.states.get("sensor.pi_hole_ads_blocked_today")
assert state.name == "Pi-Hole Ads Blocked Today"
assert state.name == "Pi-Hole Ads blocked today"
assert state.state == "0"
state = hass.states.get("sensor.pi_hole_ads_percentage_blocked_today")
assert state.name == "Pi-Hole Ads Percentage Blocked Today"
assert state.name == "Pi-Hole Ads percentage blocked today"
assert state.state == "0"
state = hass.states.get("sensor.pi_hole_dns_queries_cached")
assert state.name == "Pi-Hole DNS Queries Cached"
assert state.name == "Pi-Hole DNS queries cached"
assert state.state == "0"
state = hass.states.get("sensor.pi_hole_dns_queries_forwarded")
assert state.name == "Pi-Hole DNS Queries Forwarded"
assert state.name == "Pi-Hole DNS queries forwarded"
assert state.state == "0"
state = hass.states.get("sensor.pi_hole_dns_queries_today")
assert state.name == "Pi-Hole DNS Queries Today"
assert state.name == "Pi-Hole DNS queries today"
assert state.state == "0"
state = hass.states.get("sensor.pi_hole_dns_unique_clients")
assert state.name == "Pi-Hole DNS Unique Clients"
assert state.name == "Pi-Hole DNS unique clients"
assert state.state == "0"
state = hass.states.get("sensor.pi_hole_dns_unique_domains")
assert state.name == "Pi-Hole DNS Unique Domains"
assert state.name == "Pi-Hole DNS unique domains"
assert state.state == "0"
state = hass.states.get("sensor.pi_hole_domains_blocked")
assert state.name == "Pi-Hole Domains Blocked"
assert state.name == "Pi-Hole Domains blocked"
assert state.state == "0"
state = hass.states.get("sensor.pi_hole_seen_clients")
assert state.name == "Pi-Hole Seen Clients"
assert state.name == "Pi-Hole Seen clients"
assert state.state == "0"
state = hass.states.get("binary_sensor.pi_hole")
@ -90,7 +90,7 @@ async def test_setup_name_config(hass: HomeAssistant) -> None:
assert (
hass.states.get("sensor.custom_ads_blocked_today").name
== "Custom Ads Blocked Today"
== "Custom Ads blocked today"
)

View File

@ -20,7 +20,7 @@ async def test_update(hass: HomeAssistant) -> None:
await hass.async_block_till_done()
state = hass.states.get("update.pi_hole_core_update_available")
assert state.name == "Pi-Hole Core Update Available"
assert state.name == "Pi-Hole Core update available"
assert state.state == STATE_ON
assert state.attributes["installed_version"] == "v5.5"
assert state.attributes["latest_version"] == "v5.6"
@ -30,7 +30,7 @@ async def test_update(hass: HomeAssistant) -> None:
)
state = hass.states.get("update.pi_hole_ftl_update_available")
assert state.name == "Pi-Hole FTL Update Available"
assert state.name == "Pi-Hole FTL update available"
assert state.state == STATE_ON
assert state.attributes["installed_version"] == "v5.10"
assert state.attributes["latest_version"] == "v5.11"
@ -40,7 +40,7 @@ async def test_update(hass: HomeAssistant) -> None:
)
state = hass.states.get("update.pi_hole_web_update_available")
assert state.name == "Pi-Hole Web Update Available"
assert state.name == "Pi-Hole Web update available"
assert state.state == STATE_ON
assert state.attributes["installed_version"] == "v5.7"
assert state.attributes["latest_version"] == "v5.8"
@ -61,21 +61,21 @@ async def test_update_no_versions(hass: HomeAssistant) -> None:
await hass.async_block_till_done()
state = hass.states.get("update.pi_hole_core_update_available")
assert state.name == "Pi-Hole Core Update Available"
assert state.name == "Pi-Hole Core update available"
assert state.state == STATE_UNKNOWN
assert state.attributes["installed_version"] is None
assert state.attributes["latest_version"] is None
assert state.attributes["release_url"] is None
state = hass.states.get("update.pi_hole_ftl_update_available")
assert state.name == "Pi-Hole FTL Update Available"
assert state.name == "Pi-Hole FTL update available"
assert state.state == STATE_UNKNOWN
assert state.attributes["installed_version"] is None
assert state.attributes["latest_version"] is None
assert state.attributes["release_url"] is None
state = hass.states.get("update.pi_hole_web_update_available")
assert state.name == "Pi-Hole Web Update Available"
assert state.name == "Pi-Hole Web update available"
assert state.state == STATE_UNKNOWN
assert state.attributes["installed_version"] is None
assert state.attributes["latest_version"] is None