Add buttons and deprecate services for Fritz (#61483)
* Add buttons and deprecate services * Exclude tests * Log full service name
This commit is contained in:
parent
116759f2a1
commit
105ad861bd
4 changed files with 128 additions and 1 deletions
|
@ -371,6 +371,7 @@ omit =
|
||||||
homeassistant/components/freebox/switch.py
|
homeassistant/components/freebox/switch.py
|
||||||
homeassistant/components/fritz/__init__.py
|
homeassistant/components/fritz/__init__.py
|
||||||
homeassistant/components/fritz/binary_sensor.py
|
homeassistant/components/fritz/binary_sensor.py
|
||||||
|
homeassistant/components/fritz/button.py
|
||||||
homeassistant/components/fritz/common.py
|
homeassistant/components/fritz/common.py
|
||||||
homeassistant/components/fritz/const.py
|
homeassistant/components/fritz/const.py
|
||||||
homeassistant/components/fritz/device_tracker.py
|
homeassistant/components/fritz/device_tracker.py
|
||||||
|
|
100
homeassistant/components/fritz/button.py
Normal file
100
homeassistant/components/fritz/button.py
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
"""Switches for AVM Fritz!Box buttons."""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from collections.abc import Callable
|
||||||
|
from dataclasses import dataclass
|
||||||
|
import logging
|
||||||
|
from typing import Final
|
||||||
|
|
||||||
|
from homeassistant.components.button import (
|
||||||
|
ButtonDeviceClass,
|
||||||
|
ButtonEntity,
|
||||||
|
ButtonEntityDescription,
|
||||||
|
)
|
||||||
|
from homeassistant.config_entries import ConfigEntry
|
||||||
|
from homeassistant.const import ENTITY_CATEGORY_CONFIG
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC
|
||||||
|
from homeassistant.helpers.entity import DeviceInfo
|
||||||
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
|
from homeassistant.util import slugify
|
||||||
|
|
||||||
|
from .common import FritzBoxTools
|
||||||
|
from .const import DOMAIN
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class FritzButtonDescriptionMixin:
|
||||||
|
"""Mixin to describe a Button entity."""
|
||||||
|
|
||||||
|
press_action: Callable
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class FritzButtonDescription(ButtonEntityDescription, FritzButtonDescriptionMixin):
|
||||||
|
"""Class to describe a Button entity."""
|
||||||
|
|
||||||
|
|
||||||
|
BUTTONS: Final = [
|
||||||
|
FritzButtonDescription(
|
||||||
|
key="firmware_update",
|
||||||
|
name="Firmware Update",
|
||||||
|
device_class=ButtonDeviceClass.UPDATE,
|
||||||
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||||
|
press_action=lambda router: router.async_trigger_firmware_update(),
|
||||||
|
),
|
||||||
|
FritzButtonDescription(
|
||||||
|
key="reboot",
|
||||||
|
name="Reboot",
|
||||||
|
device_class=ButtonDeviceClass.RESTART,
|
||||||
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||||
|
press_action=lambda router: router.async_trigger_reboot(),
|
||||||
|
),
|
||||||
|
FritzButtonDescription(
|
||||||
|
key="reconnect",
|
||||||
|
name="Reconnect",
|
||||||
|
device_class=ButtonDeviceClass.RESTART,
|
||||||
|
entity_category=ENTITY_CATEGORY_CONFIG,
|
||||||
|
press_action=lambda router: router.async_trigger_reconnect(),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
async def async_setup_entry(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
entry: ConfigEntry,
|
||||||
|
async_add_entities: AddEntitiesCallback,
|
||||||
|
) -> None:
|
||||||
|
"""Set buttons for device."""
|
||||||
|
_LOGGER.debug("Setting up buttons")
|
||||||
|
router: FritzBoxTools = hass.data[DOMAIN][entry.entry_id]
|
||||||
|
|
||||||
|
async_add_entities([FritzButton(router, entry.title, button) for button in BUTTONS])
|
||||||
|
|
||||||
|
|
||||||
|
class FritzButton(ButtonEntity):
|
||||||
|
"""Defines a Fritz!Box base button."""
|
||||||
|
|
||||||
|
entity_description: FritzButtonDescription
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
router: FritzBoxTools,
|
||||||
|
device_friendly_name: str,
|
||||||
|
description: FritzButtonDescription,
|
||||||
|
) -> None:
|
||||||
|
"""Initialize Fritz!Box button."""
|
||||||
|
self.entity_description = description
|
||||||
|
self.router = router
|
||||||
|
|
||||||
|
self._attr_name = f"{device_friendly_name} {description.name}"
|
||||||
|
self._attr_unique_id = slugify(self._attr_name)
|
||||||
|
self._attr_device_info = DeviceInfo(
|
||||||
|
connections={(CONNECTION_NETWORK_MAC, router.mac)}
|
||||||
|
)
|
||||||
|
|
||||||
|
async def async_press(self) -> None:
|
||||||
|
"""Triggers Fritz!Box service."""
|
||||||
|
await self.entity_description.press_action(self.router)
|
|
@ -6,7 +6,7 @@ from dataclasses import dataclass, field
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import logging
|
import logging
|
||||||
from types import MappingProxyType
|
from types import MappingProxyType
|
||||||
from typing import Any, TypedDict
|
from typing import Any, TypedDict, cast
|
||||||
|
|
||||||
from fritzconnection import FritzConnection
|
from fritzconnection import FritzConnection
|
||||||
from fritzconnection.core.exceptions import (
|
from fritzconnection.core.exceptions import (
|
||||||
|
@ -315,6 +315,25 @@ class FritzBoxTools(update_coordinator.DataUpdateCoordinator):
|
||||||
_LOGGER.debug("Checking host info for FRITZ!Box router %s", self.host)
|
_LOGGER.debug("Checking host info for FRITZ!Box router %s", self.host)
|
||||||
self._update_available, self._latest_firmware = self._update_device_info()
|
self._update_available, self._latest_firmware = self._update_device_info()
|
||||||
|
|
||||||
|
async def async_trigger_firmware_update(self) -> bool:
|
||||||
|
"""Trigger firmware update."""
|
||||||
|
results = await self.hass.async_add_executor_job(
|
||||||
|
self.connection.call_action, "UserInterface:1", "X_AVM-DE_DoUpdate"
|
||||||
|
)
|
||||||
|
return cast(bool, results["NewX_AVM-DE_UpdateState"])
|
||||||
|
|
||||||
|
async def async_trigger_reboot(self) -> None:
|
||||||
|
"""Trigger device reboot."""
|
||||||
|
await self.hass.async_add_executor_job(
|
||||||
|
self.connection.call_action, "DeviceConfig1", "Reboot"
|
||||||
|
)
|
||||||
|
|
||||||
|
async def async_trigger_reconnect(self) -> None:
|
||||||
|
"""Trigger device reconnect."""
|
||||||
|
await self.hass.async_add_executor_job(
|
||||||
|
self.connection.call_action, "WANIPConn1", "ForceTermination"
|
||||||
|
)
|
||||||
|
|
||||||
async def service_fritzbox(
|
async def service_fritzbox(
|
||||||
self, service_call: ServiceCall, config_entry: ConfigEntry
|
self, service_call: ServiceCall, config_entry: ConfigEntry
|
||||||
) -> None:
|
) -> None:
|
||||||
|
@ -326,12 +345,18 @@ class FritzBoxTools(update_coordinator.DataUpdateCoordinator):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if service_call.service == SERVICE_REBOOT:
|
if service_call.service == SERVICE_REBOOT:
|
||||||
|
_LOGGER.warning(
|
||||||
|
'Service "fritz.reboot" is deprecated, please use the corresponding button entity instead'
|
||||||
|
)
|
||||||
await self.hass.async_add_executor_job(
|
await self.hass.async_add_executor_job(
|
||||||
self.connection.call_action, "DeviceConfig1", "Reboot"
|
self.connection.call_action, "DeviceConfig1", "Reboot"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
if service_call.service == SERVICE_RECONNECT:
|
if service_call.service == SERVICE_RECONNECT:
|
||||||
|
_LOGGER.warning(
|
||||||
|
'Service "fritz.reconnect" is deprecated, please use the corresponding button entity instead'
|
||||||
|
)
|
||||||
await self.hass.async_add_executor_job(
|
await self.hass.async_add_executor_job(
|
||||||
self.connection.call_action,
|
self.connection.call_action,
|
||||||
"WANIPConn1",
|
"WANIPConn1",
|
||||||
|
|
|
@ -7,6 +7,7 @@ from homeassistant.const import Platform
|
||||||
DOMAIN = "fritz"
|
DOMAIN = "fritz"
|
||||||
|
|
||||||
PLATFORMS = [
|
PLATFORMS = [
|
||||||
|
Platform.BUTTON,
|
||||||
Platform.BINARY_SENSOR,
|
Platform.BINARY_SENSOR,
|
||||||
Platform.DEVICE_TRACKER,
|
Platform.DEVICE_TRACKER,
|
||||||
Platform.SENSOR,
|
Platform.SENSOR,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue