Skip to content
Merged
33 changes: 19 additions & 14 deletions homeassistant/components/fritzbox/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,11 @@
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import FritzBoxDeviceEntity
from .const import CONF_COORDINATOR, DOMAIN as FRITZBOX_DOMAIN
from .const import CONF_COORDINATOR, DOMAIN
from .coordinator import FritzboxDataUpdateCoordinator
from .model import FritzEntityDescriptionMixinBase

Expand Down Expand Up @@ -68,18 +68,23 @@ async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the FRITZ!SmartHome binary sensor from ConfigEntry."""
coordinator: FritzboxDataUpdateCoordinator = hass.data[FRITZBOX_DOMAIN][
entry.entry_id
][CONF_COORDINATOR]

async_add_entities(
[
FritzboxBinarySensor(coordinator, ain, description)
for ain, device in coordinator.data.devices.items()
for description in BINARY_SENSOR_TYPES
if description.suitable(device)
]
)
coordinator: FritzboxDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
CONF_COORDINATOR
]

@callback
def _add_entities() -> None:
Comment thread
mib1185 marked this conversation as resolved.
"""Add devices."""
entities: list[FritzboxBinarySensor] = []
for ain in coordinator.new_devices:
for description in BINARY_SENSOR_TYPES:
if description.suitable(coordinator.data.devices[ain]):
entities.append(FritzboxBinarySensor(coordinator, ain, description))
async_add_entities(entities)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))
Comment thread
mib1185 marked this conversation as resolved.

_add_entities()


class FritzboxBinarySensor(FritzBoxDeviceEntity, BinarySensorEntity):
Expand Down
26 changes: 17 additions & 9 deletions homeassistant/components/fritzbox/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,33 @@

from homeassistant.components.button import ButtonEntity
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.device_registry import DeviceInfo
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import FritzboxDataUpdateCoordinator, FritzBoxEntity
from .const import CONF_COORDINATOR, DOMAIN as FRITZBOX_DOMAIN
from .const import CONF_COORDINATOR, DOMAIN


async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the FRITZ!SmartHome template from ConfigEntry."""
coordinator: FritzboxDataUpdateCoordinator = hass.data[FRITZBOX_DOMAIN][
entry.entry_id
][CONF_COORDINATOR]
coordinator: FritzboxDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
CONF_COORDINATOR
]

async_add_entities(
[FritzBoxTemplate(coordinator, ain) for ain in coordinator.data.templates]
)
@callback
def _add_entities() -> None:
"""Add devices."""
entities: list[FritzBoxTemplate] = []
for ain in coordinator.new_templates:
entities.append(FritzBoxTemplate(coordinator, ain))
async_add_entities(entities)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzBoxTemplate(FritzBoxEntity, ButtonEntity):
Expand All @@ -37,7 +45,7 @@ def device_info(self) -> DeviceInfo:
"""Return device specific attributes."""
return DeviceInfo(
name=self.data.name,
identifiers={(FRITZBOX_DOMAIN, self.ain)},
identifiers={(DOMAIN, self.ain)},
configuration_url=self.coordinator.configuration_url,
manufacturer="AVM",
model="SmartHome Template",
Expand Down
31 changes: 18 additions & 13 deletions homeassistant/components/fritzbox/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
PRECISION_HALVES,
UnitOfTemperature,
)
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import FritzboxDataUpdateCoordinator, FritzBoxDeviceEntity
Expand All @@ -28,7 +28,7 @@
ATTR_STATE_SUMMER_MODE,
ATTR_STATE_WINDOW_OPEN,
CONF_COORDINATOR,
DOMAIN as FRITZBOX_DOMAIN,
DOMAIN,
)
from .model import ClimateExtraAttributes

Expand All @@ -50,17 +50,22 @@ async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the FRITZ!SmartHome thermostat from ConfigEntry."""
coordinator: FritzboxDataUpdateCoordinator = hass.data[FRITZBOX_DOMAIN][
entry.entry_id
][CONF_COORDINATOR]

async_add_entities(
[
FritzboxThermostat(coordinator, ain)
for ain, device in coordinator.data.devices.items()
if device.has_thermostat
]
)
coordinator: FritzboxDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
CONF_COORDINATOR
]

@callback
def _add_entities() -> None:
"""Add devices."""
entities: list[FritzboxThermostat] = []
for ain in coordinator.new_devices:
if coordinator.data.devices[ain].has_thermostat:
entities.append(FritzboxThermostat(coordinator, ain))
async_add_entities(entities)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzboxThermostat(FritzBoxDeviceEntity, ClimateEntity):
Expand Down
7 changes: 7 additions & 0 deletions homeassistant/components/fritzbox/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ def __init__(
self.fritz: Fritzhome = hass.data[DOMAIN][self.entry.entry_id][CONF_CONNECTIONS]
self.configuration_url = self.fritz.get_prefixed_host()
self.has_templates = has_templates
self.new_devices: set[str] = set()
self.new_templates: set[str] = set()

super().__init__(
hass,
Expand All @@ -45,6 +47,8 @@ def __init__(
update_interval=timedelta(seconds=30),
)

self.data = FritzboxCoordinatorData({}, {})

def _update_fritz_devices(self) -> FritzboxCoordinatorData:
"""Update all fritzbox device data."""
try:
Expand Down Expand Up @@ -87,6 +91,9 @@ def _update_fritz_devices(self) -> FritzboxCoordinatorData:
for template in templates:
template_data[template.ain] = template

self.new_devices = device_data.keys() - self.data.devices.keys()
self.new_templates = template_data.keys() - self.data.templates.keys()

Comment thread
mib1185 marked this conversation as resolved.
return FritzboxCoordinatorData(devices=device_data, templates=template_data)

async def _async_update_data(self) -> FritzboxCoordinatorData:
Expand Down
29 changes: 18 additions & 11 deletions homeassistant/components/fritzbox/cover.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,33 @@
CoverEntityFeature,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import FritzboxDataUpdateCoordinator, FritzBoxDeviceEntity
from .const import CONF_COORDINATOR, DOMAIN as FRITZBOX_DOMAIN
from .const import CONF_COORDINATOR, DOMAIN


async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the FRITZ!SmartHome cover from ConfigEntry."""
coordinator: FritzboxDataUpdateCoordinator = hass.data[FRITZBOX_DOMAIN][
entry.entry_id
][CONF_COORDINATOR]

async_add_entities(
FritzboxCover(coordinator, ain)
for ain, device in coordinator.data.devices.items()
if device.has_blind
)
coordinator: FritzboxDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
CONF_COORDINATOR
]

@callback
def _add_entities() -> None:
"""Add devices."""
entities: list[FritzboxCover] = []
for ain in coordinator.new_devices:
if coordinator.data.devices[ain].has_blind:
entities.append(FritzboxCover(coordinator, ain))
async_add_entities(entities)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzboxCover(FritzBoxDeviceEntity, CoverEntity):
Expand Down
55 changes: 26 additions & 29 deletions homeassistant/components/fritzbox/light.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

from typing import Any, cast

from pyfritzhome import FritzhomeDevice
from requests.exceptions import HTTPError

from homeassistant.components.light import (
Expand All @@ -13,17 +14,11 @@
LightEntity,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback

from . import FritzboxDataUpdateCoordinator, FritzBoxDeviceEntity
from .const import (
COLOR_MODE,
COLOR_TEMP_MODE,
CONF_COORDINATOR,
DOMAIN as FRITZBOX_DOMAIN,
LOGGER,
)
from .const import COLOR_MODE, COLOR_TEMP_MODE, CONF_COORDINATOR, DOMAIN, LOGGER

SUPPORTED_COLOR_MODES = {ColorMode.COLOR_TEMP, ColorMode.HS}

Expand All @@ -32,31 +27,33 @@ async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the FRITZ!SmartHome light from ConfigEntry."""
entities: list[FritzboxLight] = []
coordinator: FritzboxDataUpdateCoordinator = hass.data[FRITZBOX_DOMAIN][
entry.entry_id
][CONF_COORDINATOR]

for ain, device in coordinator.data.devices.items():
if not device.has_lightbulb:
continue

supported_color_temps = await hass.async_add_executor_job(
device.get_color_temps
coordinator: FritzboxDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
CONF_COORDINATOR
]

def _prepare_light_entity(ain: str, device: FritzhomeDevice) -> FritzboxLight:
Comment thread
mib1185 marked this conversation as resolved.
Outdated
supported_color_temps = device.get_color_temps()
supported_colors = device.get_colors()

return FritzboxLight(
coordinator,
ain,
supported_colors,
supported_color_temps,
)

supported_colors = await hass.async_add_executor_job(device.get_colors)
@callback
def _add_entities() -> None:
"""Add devices."""
entities: list[FritzboxLight] = []
for ain in coordinator.new_devices:
if (device := coordinator.data.devices[ain]).has_lightbulb:
entities.append(_prepare_light_entity(ain, device))
async_add_entities(entities)

entities.append(
FritzboxLight(
coordinator,
ain,
supported_colors,
supported_color_temps,
)
)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))

async_add_entities(entities)
_add_entities()


class FritzboxLight(FritzBoxDeviceEntity, LightEntity):
Expand Down
32 changes: 20 additions & 12 deletions homeassistant/components/fritzbox/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,14 @@
UnitOfPower,
UnitOfTemperature,
)
from homeassistant.core import HomeAssistant
from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.entity_platform import AddEntitiesCallback
from homeassistant.helpers.typing import StateType
from homeassistant.util.dt import utc_from_timestamp

from . import FritzBoxDeviceEntity
from .const import CONF_COORDINATOR, DOMAIN as FRITZBOX_DOMAIN
from .const import CONF_COORDINATOR, DOMAIN
from .coordinator import FritzboxDataUpdateCoordinator
from .model import FritzEntityDescriptionMixinBase


Expand Down Expand Up @@ -212,16 +213,23 @@ async def async_setup_entry(
hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback
) -> None:
"""Set up the FRITZ!SmartHome sensor from ConfigEntry."""
coordinator = hass.data[FRITZBOX_DOMAIN][entry.entry_id][CONF_COORDINATOR]

async_add_entities(
[
FritzBoxSensor(coordinator, ain, description)
for ain, device in coordinator.data.devices.items()
for description in SENSOR_TYPES
if description.suitable(device)
]
)
coordinator: FritzboxDataUpdateCoordinator = hass.data[DOMAIN][entry.entry_id][
CONF_COORDINATOR
]

@callback
def _add_entities() -> None:
"""Add devices."""
entities: list[FritzBoxSensor] = []
for ain in coordinator.new_devices:
for description in SENSOR_TYPES:
if description.suitable(coordinator.data.devices[ain]):
entities.append(FritzBoxSensor(coordinator, ain, description))
async_add_entities(entities)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzBoxSensor(FritzBoxDeviceEntity, SensorEntity):
Expand Down
Loading