1 """Support for update entities of a Pi-hole system."""
3 from __future__
import annotations
5 from collections.abc
import Callable
6 from dataclasses
import dataclass
16 from .
import PiHoleConfigEntry
17 from .entity
import PiHoleEntity
20 @dataclass(frozen=True)
22 """Describes PiHole update entity."""
24 installed_version: Callable[[dict], str |
None] =
lambda api:
None
25 latest_version: Callable[[dict], str |
None] =
lambda api:
None
26 has_update: Callable[[dict], bool |
None] =
lambda api:
None
27 release_base_url: str |
None =
None
28 title: str |
None =
None
31 UPDATE_ENTITY_TYPES: tuple[PiHoleUpdateEntityDescription, ...] = (
33 key=
"core_update_available",
34 translation_key=
"core_update_available",
36 entity_category=EntityCategory.DIAGNOSTIC,
37 installed_version=
lambda versions: versions.get(
"core_current"),
38 latest_version=
lambda versions: versions.get(
"core_latest"),
39 has_update=
lambda versions: versions.get(
"core_update"),
40 release_base_url=
"https://github.com/pi-hole/pi-hole/releases/tag",
43 key=
"web_update_available",
44 translation_key=
"web_update_available",
45 title=
"Pi-hole Web interface",
46 entity_category=EntityCategory.DIAGNOSTIC,
47 installed_version=
lambda versions: versions.get(
"web_current"),
48 latest_version=
lambda versions: versions.get(
"web_latest"),
49 has_update=
lambda versions: versions.get(
"web_update"),
50 release_base_url=
"https://github.com/pi-hole/AdminLTE/releases/tag",
53 key=
"ftl_update_available",
54 translation_key=
"ftl_update_available",
55 title=
"Pi-hole FTL DNS",
56 entity_category=EntityCategory.DIAGNOSTIC,
57 installed_version=
lambda versions: versions.get(
"FTL_current"),
58 latest_version=
lambda versions: versions.get(
"FTL_latest"),
59 has_update=
lambda versions: versions.get(
"FTL_update"),
60 release_base_url=
"https://github.com/pi-hole/FTL/releases/tag",
67 entry: PiHoleConfigEntry,
68 async_add_entities: AddEntitiesCallback,
70 """Set up the Pi-hole update entities."""
71 name = entry.data[CONF_NAME]
72 hole_data = entry.runtime_data
77 hole_data.coordinator,
82 for description
in UPDATE_ENTITY_TYPES
87 """Representation of a Pi-hole update entity."""
89 entity_description: PiHoleUpdateEntityDescription
90 _attr_has_entity_name =
True
95 coordinator: DataUpdateCoordinator[
None],
97 server_unique_id: str,
98 description: PiHoleUpdateEntityDescription,
100 """Initialize a Pi-hole update entity."""
101 super().
__init__(api, coordinator, name, server_unique_id)
109 """Version installed and in use."""
110 if isinstance(self.
apiapi.versions, dict):
116 """Latest version available for install."""
117 if isinstance(self.
apiapi.versions, dict):
125 """URL to the full release notes of the latest version available."""
127 return f
"{self.entity_description.release_base_url}/{self.latest_version}"
str|None release_url(self)
None __init__(self, Hole api, DataUpdateCoordinator[None] coordinator, str name, str server_unique_id, PiHoleUpdateEntityDescription description)
str|None installed_version(self)
str|None latest_version(self)
str|None installed_version(self)
str|None latest_version(self)
None async_setup_entry(HomeAssistant hass, PiHoleConfigEntry entry, AddEntitiesCallback async_add_entities)