Clean up freebox entity (#150695)

This commit is contained in:
Joost Lekkerkerker
2025-08-18 09:47:02 +02:00
committed by GitHub
parent 9138930cb9
commit 419315d9cf
5 changed files with 24 additions and 45 deletions

View File

@@ -36,7 +36,7 @@ async def async_setup_entry(
async_add_entities( async_add_entities(
( (
FreeboxAlarm(hass, router, node) FreeboxAlarm(router, node)
for node in router.home_devices.values() for node in router.home_devices.values()
if node["category"] == FreeboxHomeCategory.ALARM if node["category"] == FreeboxHomeCategory.ALARM
), ),
@@ -49,11 +49,9 @@ class FreeboxAlarm(FreeboxHomeEntity, AlarmControlPanelEntity):
_attr_code_arm_required = False _attr_code_arm_required = False
def __init__( def __init__(self, router: FreeboxRouter, node: dict[str, Any]) -> None:
self, hass: HomeAssistant, router: FreeboxRouter, node: dict[str, Any]
) -> None:
"""Initialize an alarm.""" """Initialize an alarm."""
super().__init__(hass, router, node) super().__init__(router, node)
# Commands # Commands
self._command_trigger = self.get_command_id( self._command_trigger = self.get_command_id(

View File

@@ -50,12 +50,12 @@ async def async_setup_entry(
for node in router.home_devices.values(): for node in router.home_devices.values():
if node["category"] == FreeboxHomeCategory.PIR: if node["category"] == FreeboxHomeCategory.PIR:
binary_entities.append(FreeboxPirSensor(hass, router, node)) binary_entities.append(FreeboxPirSensor(router, node))
elif node["category"] == FreeboxHomeCategory.DWS: elif node["category"] == FreeboxHomeCategory.DWS:
binary_entities.append(FreeboxDwsSensor(hass, router, node)) binary_entities.append(FreeboxDwsSensor(router, node))
binary_entities.extend( binary_entities.extend(
FreeboxCoverSensor(hass, router, node) FreeboxCoverSensor(router, node)
for endpoint in node["show_endpoints"] for endpoint in node["show_endpoints"]
if ( if (
endpoint["name"] == "cover" endpoint["name"] == "cover"
@@ -74,13 +74,12 @@ class FreeboxHomeBinarySensor(FreeboxHomeEntity, BinarySensorEntity):
def __init__( def __init__(
self, self,
hass: HomeAssistant,
router: FreeboxRouter, router: FreeboxRouter,
node: dict[str, Any], node: dict[str, Any],
sub_node: dict[str, Any] | None = None, sub_node: dict[str, Any] | None = None,
) -> None: ) -> None:
"""Initialize a Freebox binary sensor.""" """Initialize a Freebox binary sensor."""
super().__init__(hass, router, node, sub_node) super().__init__(router, node, sub_node)
self._command_id = self.get_command_id( self._command_id = self.get_command_id(
node["type"]["endpoints"], "signal", self._sensor_name node["type"]["endpoints"], "signal", self._sensor_name
) )
@@ -123,9 +122,7 @@ class FreeboxCoverSensor(FreeboxHomeBinarySensor):
_sensor_name = "cover" _sensor_name = "cover"
def __init__( def __init__(self, router: FreeboxRouter, node: dict[str, Any]) -> None:
self, hass: HomeAssistant, router: FreeboxRouter, node: dict[str, Any]
) -> None:
"""Initialize a cover for another device.""" """Initialize a cover for another device."""
cover_node = next( cover_node = next(
filter( filter(
@@ -134,7 +131,7 @@ class FreeboxCoverSensor(FreeboxHomeBinarySensor):
), ),
None, None,
) )
super().__init__(hass, router, node, cover_node) super().__init__(router, node, cover_node)
class FreeboxRaidDegradedSensor(BinarySensorEntity): class FreeboxRaidDegradedSensor(BinarySensorEntity):

View File

@@ -74,7 +74,7 @@ class FreeboxCamera(FreeboxHomeEntity, FFmpegCamera):
) -> None: ) -> None:
"""Initialize a camera.""" """Initialize a camera."""
super().__init__(hass, router, node) super().__init__(router, node)
device_info = { device_info = {
CONF_NAME: node["label"].strip(), CONF_NAME: node["label"].strip(),
CONF_INPUT: node["props"]["Stream"], CONF_INPUT: node["props"]["Stream"],

View File

@@ -2,11 +2,9 @@
from __future__ import annotations from __future__ import annotations
from collections.abc import Callable
import logging import logging
from typing import Any from typing import Any
from homeassistant.core import HomeAssistant
from homeassistant.helpers.device_registry import DeviceInfo from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.dispatcher import async_dispatcher_connect from homeassistant.helpers.dispatcher import async_dispatcher_connect
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
@@ -22,13 +20,11 @@ class FreeboxHomeEntity(Entity):
def __init__( def __init__(
self, self,
hass: HomeAssistant,
router: FreeboxRouter, router: FreeboxRouter,
node: dict[str, Any], node: dict[str, Any],
sub_node: dict[str, Any] | None = None, sub_node: dict[str, Any] | None = None,
) -> None: ) -> None:
"""Initialize a Freebox Home entity.""" """Initialize a Freebox Home entity."""
self._hass = hass
self._router = router self._router = router
self._node = node self._node = node
self._sub_node = sub_node self._sub_node = sub_node
@@ -44,7 +40,6 @@ class FreeboxHomeEntity(Entity):
self._available = True self._available = True
self._firmware = node["props"].get("FwVersion") self._firmware = node["props"].get("FwVersion")
self._manufacturer = "Freebox SAS" self._manufacturer = "Freebox SAS"
self._remove_signal_update: Callable[[], None] | None = None
self._model = CATEGORY_TO_MODEL.get(node["category"]) self._model = CATEGORY_TO_MODEL.get(node["category"])
if self._model is None: if self._model is None:
@@ -61,10 +56,7 @@ class FreeboxHomeEntity(Entity):
model=self._model, model=self._model,
name=self._device_name, name=self._device_name,
sw_version=self._firmware, sw_version=self._firmware,
via_device=( via_device=(DOMAIN, router.mac),
DOMAIN,
router.mac,
),
) )
async def async_update_signal(self) -> None: async def async_update_signal(self) -> None:
@@ -116,23 +108,14 @@ class FreeboxHomeEntity(Entity):
async def async_added_to_hass(self) -> None: async def async_added_to_hass(self) -> None:
"""Register state update callback.""" """Register state update callback."""
self.remove_signal_update( self.async_on_remove(
async_dispatcher_connect( async_dispatcher_connect(
self._hass, self.hass,
self._router.signal_home_device_update, self._router.signal_home_device_update,
self.async_update_signal, self.async_update_signal,
) )
) )
async def async_will_remove_from_hass(self) -> None:
"""When entity will be removed from hass."""
if self._remove_signal_update is not None:
self._remove_signal_update()
def remove_signal_update(self, dispatcher: Callable[[], None]) -> None:
"""Register state update callback."""
self._remove_signal_update = dispatcher
def get_value(self, ep_type: str, name: str): def get_value(self, ep_type: str, name: str):
"""Get the value.""" """Get the value."""
node = next( node = next(

View File

@@ -68,7 +68,6 @@ async def async_setup_entry(
) -> None: ) -> None:
"""Set up the sensors.""" """Set up the sensors."""
router = entry.runtime_data router = entry.runtime_data
entities: list[SensorEntity] = []
_LOGGER.debug( _LOGGER.debug(
"%s - %s - %s temperature sensors", "%s - %s - %s temperature sensors",
@@ -76,7 +75,7 @@ async def async_setup_entry(
router.mac, router.mac,
len(router.sensors_temperature), len(router.sensors_temperature),
) )
entities = [ entities: list[SensorEntity] = [
FreeboxSensor( FreeboxSensor(
router, router,
SensorEntityDescription( SensorEntityDescription(
@@ -105,14 +104,16 @@ async def async_setup_entry(
for description in DISK_PARTITION_SENSORS for description in DISK_PARTITION_SENSORS
) )
for node in router.home_devices.values(): entities.extend(
for endpoint in node["show_endpoints"]: FreeboxBatterySensor(router, node, endpoint)
if ( for node in router.home_devices.values()
endpoint["name"] == "battery" for endpoint in node["show_endpoints"]
and endpoint["ep_type"] == "signal" if (
and endpoint.get("value") is not None endpoint["name"] == "battery"
): and endpoint["ep_type"] == "signal"
entities.append(FreeboxBatterySensor(hass, router, node, endpoint)) and endpoint.get("value") is not None
)
)
if entities: if entities:
async_add_entities(entities, True) async_add_entities(entities, True)