99 lines
2.7 KiB
Python
99 lines
2.7 KiB
Python
"""AVM FRITZ!Box API wrapper."""
|
|
from __future__ import annotations
|
|
|
|
from functools import partial
|
|
import logging
|
|
from typing import Any
|
|
|
|
from fritzconnection.core.exceptions import (
|
|
FritzActionError,
|
|
FritzActionFailedError,
|
|
FritzConnectionException,
|
|
FritzLookUpError,
|
|
FritzSecurityError,
|
|
FritzServiceError,
|
|
)
|
|
|
|
from .common import FritzBoxTools
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
|
|
class AvmWrapper:
|
|
"""Setup AVM wrapper for API calls."""
|
|
|
|
def __init__(self, avm_device: FritzBoxTools) -> None:
|
|
"""Init wrapper API class."""
|
|
|
|
self._avm_device = avm_device
|
|
|
|
def _service_call_action(
|
|
self,
|
|
service_name: str,
|
|
service_suffix: str,
|
|
action_name: str,
|
|
**kwargs: Any,
|
|
) -> dict | None:
|
|
"""Return service details."""
|
|
|
|
if (
|
|
f"{service_name}{service_suffix}"
|
|
not in self._avm_device.connection.services
|
|
):
|
|
return None
|
|
|
|
try:
|
|
result: dict = self._avm_device.connection.call_action(
|
|
f"{service_name}:{service_suffix}",
|
|
action_name,
|
|
**kwargs,
|
|
)
|
|
return result
|
|
except FritzSecurityError:
|
|
_LOGGER.error(
|
|
"Authorization Error: Please check the provided credentials and verify that you can log into the web interface",
|
|
exc_info=True,
|
|
)
|
|
except (
|
|
FritzActionError,
|
|
FritzActionFailedError,
|
|
FritzServiceError,
|
|
FritzLookUpError,
|
|
):
|
|
_LOGGER.error(
|
|
"Service/Action Error: cannot execute service %s with action %s",
|
|
service_name,
|
|
action_name,
|
|
exc_info=True,
|
|
)
|
|
except FritzConnectionException:
|
|
_LOGGER.error(
|
|
"Connection Error: Please check the device is properly configured for remote login",
|
|
exc_info=True,
|
|
)
|
|
return None
|
|
|
|
async def _async_service_call_action(
|
|
self, service_name: str, service_suffix: str, action_name: str, **kwargs: Any
|
|
) -> dict[str, Any] | None:
|
|
"""Make call_action async."""
|
|
|
|
return await self._avm_device.hass.async_add_executor_job(
|
|
partial(
|
|
self._service_call_action,
|
|
service_name,
|
|
service_suffix,
|
|
action_name,
|
|
**kwargs,
|
|
)
|
|
)
|
|
|
|
async def get_wan_dsl_interface_config(self) -> dict[str, Any] | None:
|
|
"""Call WANDSLInterfaceConfig service."""
|
|
|
|
return await self._async_service_call_action(
|
|
"WANDSLInterfaceConfig",
|
|
"1",
|
|
"GetInfo",
|
|
)
|