Skip to content
Merged
33 changes: 20 additions & 13 deletions homeassistant/components/fritzbox/binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
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,25 @@ 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
]

def _add_entities() -> None:
Comment thread
mib1185 marked this conversation as resolved.
"""Add devices."""
async_add_entities(
[

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can remove the brackets to make it a generator expression instead of a list comprehension.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FritzboxBinarySensor(coordinator, ain, description)
for ain, device in coordinator.data.devices.items()
if ain in coordinator.new_devices
Comment thread
mib1185 marked this conversation as resolved.
Outdated
for description in BINARY_SENSOR_TYPES
if description.suitable(device)
]
Comment thread
mib1185 marked this conversation as resolved.
)

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: 18 additions & 8 deletions homeassistant/components/fritzbox/button.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,30 @@
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
]

def _add_entities() -> None:
"""Add Templaes."""
async_add_entities(
[
FritzBoxTemplate(coordinator, ain)
for ain in coordinator.data.templates
if ain in coordinator.new_templates
]
)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

async_add_entities(
[FritzBoxTemplate(coordinator, ain) for ain in coordinator.data.templates]
)
_add_entities()


class FritzBoxTemplate(FritzBoxEntity, ButtonEntity):
Expand All @@ -37,7 +47,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
30 changes: 18 additions & 12 deletions homeassistant/components/fritzbox/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,23 @@ 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
]

def _add_entities() -> None:
"""Add devices."""
async_add_entities(
[
FritzboxThermostat(coordinator, ain)
for ain, device in coordinator.data.devices.items()
if ain in coordinator.new_devices and device.has_thermostat
]
)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzboxThermostat(FritzBoxDeviceEntity, ClimateEntity):
Expand Down
11 changes: 11 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: list[str] = []
self.new_templates: list[str] = []

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 All @@ -63,6 +67,9 @@ def _update_fritz_devices(self) -> FritzboxCoordinatorData:
if self.has_templates:
self.fritz.update_templates()

self.new_devices = []
self.new_templates = []

devices = self.fritz.get_devices()
device_data = {}
for device in devices:
Expand All @@ -80,12 +87,16 @@ def _update_fritz_devices(self) -> FritzboxCoordinatorData:
device.present = False

device_data[device.ain] = device
if (ain := device.ain) not in self.data.devices:
self.new_devices.append(ain)

template_data = {}
if self.has_templates:
templates = self.fritz.get_templates()
for template in templates:
template_data[template.ain] = template
if (ain := template.ain) not in self.data.templates:
self.new_templates.append(ain)

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

Expand Down
28 changes: 18 additions & 10 deletions homeassistant/components/fritzbox/cover.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,30 @@
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
]

def _add_entities() -> None:
"""Add devices."""
async_add_entities(
[
FritzboxCover(coordinator, ain)
for ain, device in coordinator.data.devices.items()
if ain in coordinator.new_devices and device.has_blind
]
)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzboxCover(FritzBoxDeviceEntity, CoverEntity):
Expand Down
59 changes: 31 additions & 28 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 @@ -17,13 +18,7 @@
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,39 @@ 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_color_temps = await hass.async_add_executor_job(
# device.get_color_temps
# )

# supported_colors = await hass.async_add_executor_job(device.get_colors)
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)

entities.append(
FritzboxLight(
coordinator,
ain,
supported_colors,
supported_color_temps,
)
def _add_entities() -> None:
"""Add devices."""
async_add_entities(
[
_prepare_light_entity(ain, device)
for ain, device in coordinator.data.devices.items()
if ain in coordinator.new_devices and device.has_lightbulb
]
)

async_add_entities(entities)
entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzboxLight(FritzBoxDeviceEntity, LightEntity):
Expand Down
31 changes: 20 additions & 11 deletions homeassistant/components/fritzbox/sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
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,24 @@ 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
]

def _add_entities() -> None:
"""Add devices."""
async_add_entities(
[
FritzBoxSensor(coordinator, ain, description)
for ain, device in coordinator.data.devices.items()
for description in SENSOR_TYPES
if ain in coordinator.new_devices and description.suitable(device)
]
)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzBoxSensor(FritzBoxDeviceEntity, SensorEntity):
Expand Down
30 changes: 18 additions & 12 deletions homeassistant/components/fritzbox/switch.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,24 +9,30 @@
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 switch from ConfigEntry."""
coordinator: FritzboxDataUpdateCoordinator = hass.data[FRITZBOX_DOMAIN][
entry.entry_id
][CONF_COORDINATOR]

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

def _add_entities() -> None:
"""Add devices."""
async_add_entities(
[
FritzboxSwitch(coordinator, ain)
for ain, device in coordinator.data.devices.items()
if ain in coordinator.new_devices and device.has_switch
]
)

entry.async_on_unload(coordinator.async_add_listener(_add_entities))

_add_entities()


class FritzboxSwitch(FritzBoxDeviceEntity, SwitchEntity):
Expand Down