Add more Fritz sensors for DSL connections (#53198)
* Update sensor.py Added information about the upstream line accorrding to fritzconnection library (available since V1.5.0) . New information available are line sync speed,, noise margin and power attenuation. Tested with ADSL and VDSL lines on fritzbox 7590, 7490 and 7390. Not tested on cable internet / fiber. According to upstrem library should also work / fail gracefully. * Update sensor.py Fixed errors from automated tests Sorry it took so long * Update homeassistant/components/fritz/sensor.py Thank you this sounds even better Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * Update homeassistant/components/fritz/sensor.py Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * Update homeassistant/components/fritz/sensor.py Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * Update homeassistant/components/fritz/sensor.py Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * Update homeassistant/components/fritz/sensor.py Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * Update homeassistant/components/fritz/sensor.py Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * Update homeassistant/components/fritz/sensor.py Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * Update homeassistant/components/fritz/sensor.py Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * Update homeassistant/components/fritz/sensor.py Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com> * black & mypy fixes * Rebase, fix multiplier, add conditional create Co-authored-by: Simone Chemelli <simone.chemelli@gmail.com>pull/54262/head
parent
7d29eb282b
commit
fc40735295
|
@ -6,6 +6,8 @@ PLATFORMS = ["binary_sensor", "device_tracker", "sensor", "switch"]
|
||||||
|
|
||||||
DATA_FRITZ = "fritz_data"
|
DATA_FRITZ = "fritz_data"
|
||||||
|
|
||||||
|
DSL_CONNECTION = "dsl"
|
||||||
|
|
||||||
DEFAULT_DEVICE_NAME = "Unknown device"
|
DEFAULT_DEVICE_NAME = "Unknown device"
|
||||||
DEFAULT_HOST = "192.168.178.1"
|
DEFAULT_HOST = "192.168.178.1"
|
||||||
DEFAULT_PORT = 49000
|
DEFAULT_PORT = 49000
|
||||||
|
|
|
@ -15,13 +15,14 @@ from homeassistant.const import (
|
||||||
DATA_RATE_KILOBITS_PER_SECOND,
|
DATA_RATE_KILOBITS_PER_SECOND,
|
||||||
DATA_RATE_KILOBYTES_PER_SECOND,
|
DATA_RATE_KILOBYTES_PER_SECOND,
|
||||||
DEVICE_CLASS_TIMESTAMP,
|
DEVICE_CLASS_TIMESTAMP,
|
||||||
|
SIGNAL_STRENGTH_DECIBELS,
|
||||||
)
|
)
|
||||||
from homeassistant.core import HomeAssistant
|
from homeassistant.core import HomeAssistant
|
||||||
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
from homeassistant.helpers.entity_platform import AddEntitiesCallback
|
||||||
from homeassistant.util.dt import utcnow
|
from homeassistant.util.dt import utcnow
|
||||||
|
|
||||||
from .common import FritzBoxBaseEntity, FritzBoxTools
|
from .common import FritzBoxBaseEntity, FritzBoxTools
|
||||||
from .const import DOMAIN, UPTIME_DEVIATION
|
from .const import DOMAIN, DSL_CONNECTION, UPTIME_DEVIATION
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -89,6 +90,44 @@ def _retrieve_gb_received_state(status: FritzStatus, last_value: str) -> float:
|
||||||
return round(status.bytes_received / 1000 / 1000 / 1000, 1) # type: ignore[no-any-return]
|
return round(status.bytes_received / 1000 / 1000 / 1000, 1) # type: ignore[no-any-return]
|
||||||
|
|
||||||
|
|
||||||
|
def _retrieve_link_kb_s_sent_state(status: FritzStatus, last_value: str) -> float:
|
||||||
|
"""Return upload link rate."""
|
||||||
|
return round(status.max_linked_bit_rate[0] / 1000, 1) # type: ignore[no-any-return]
|
||||||
|
|
||||||
|
|
||||||
|
def _retrieve_link_kb_s_received_state(status: FritzStatus, last_value: str) -> float:
|
||||||
|
"""Return download link rate."""
|
||||||
|
return round(status.max_linked_bit_rate[1] / 1000, 1) # type: ignore[no-any-return]
|
||||||
|
|
||||||
|
|
||||||
|
def _retrieve_link_noise_margin_sent_state(
|
||||||
|
status: FritzStatus, last_value: str
|
||||||
|
) -> float:
|
||||||
|
"""Return upload noise margin."""
|
||||||
|
return status.noise_margin[0] # type: ignore[no-any-return]
|
||||||
|
|
||||||
|
|
||||||
|
def _retrieve_link_noise_margin_received_state(
|
||||||
|
status: FritzStatus, last_value: str
|
||||||
|
) -> float:
|
||||||
|
"""Return download noise margin."""
|
||||||
|
return status.noise_margin[1] # type: ignore[no-any-return]
|
||||||
|
|
||||||
|
|
||||||
|
def _retrieve_link_attenuation_sent_state(
|
||||||
|
status: FritzStatus, last_value: str
|
||||||
|
) -> float:
|
||||||
|
"""Return upload line attenuation."""
|
||||||
|
return status.attenuation[0] # type: ignore[no-any-return]
|
||||||
|
|
||||||
|
|
||||||
|
def _retrieve_link_attenuation_received_state(
|
||||||
|
status: FritzStatus, last_value: str
|
||||||
|
) -> float:
|
||||||
|
"""Return download line attenuation."""
|
||||||
|
return status.attenuation[1] # type: ignore[no-any-return]
|
||||||
|
|
||||||
|
|
||||||
class SensorData(TypedDict, total=False):
|
class SensorData(TypedDict, total=False):
|
||||||
"""Sensor data class."""
|
"""Sensor data class."""
|
||||||
|
|
||||||
|
@ -99,6 +138,7 @@ class SensorData(TypedDict, total=False):
|
||||||
unit_of_measurement: str | None
|
unit_of_measurement: str | None
|
||||||
icon: str | None
|
icon: str | None
|
||||||
state_provider: Callable
|
state_provider: Callable
|
||||||
|
connection_type: str | None
|
||||||
|
|
||||||
|
|
||||||
SENSOR_DATA = {
|
SENSOR_DATA = {
|
||||||
|
@ -118,27 +158,27 @@ SENSOR_DATA = {
|
||||||
state_provider=_retrieve_connection_uptime_state,
|
state_provider=_retrieve_connection_uptime_state,
|
||||||
),
|
),
|
||||||
"kb_s_sent": SensorData(
|
"kb_s_sent": SensorData(
|
||||||
name="kB/s sent",
|
name="Upload Throughput",
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
unit_of_measurement=DATA_RATE_KILOBYTES_PER_SECOND,
|
unit_of_measurement=DATA_RATE_KILOBYTES_PER_SECOND,
|
||||||
icon="mdi:upload",
|
icon="mdi:upload",
|
||||||
state_provider=_retrieve_kb_s_sent_state,
|
state_provider=_retrieve_kb_s_sent_state,
|
||||||
),
|
),
|
||||||
"kb_s_received": SensorData(
|
"kb_s_received": SensorData(
|
||||||
name="kB/s received",
|
name="Download Throughput",
|
||||||
state_class=STATE_CLASS_MEASUREMENT,
|
state_class=STATE_CLASS_MEASUREMENT,
|
||||||
unit_of_measurement=DATA_RATE_KILOBYTES_PER_SECOND,
|
unit_of_measurement=DATA_RATE_KILOBYTES_PER_SECOND,
|
||||||
icon="mdi:download",
|
icon="mdi:download",
|
||||||
state_provider=_retrieve_kb_s_received_state,
|
state_provider=_retrieve_kb_s_received_state,
|
||||||
),
|
),
|
||||||
"max_kb_s_sent": SensorData(
|
"max_kb_s_sent": SensorData(
|
||||||
name="Max kbit/s sent",
|
name="Max Connection Upload Throughput",
|
||||||
unit_of_measurement=DATA_RATE_KILOBITS_PER_SECOND,
|
unit_of_measurement=DATA_RATE_KILOBITS_PER_SECOND,
|
||||||
icon="mdi:upload",
|
icon="mdi:upload",
|
||||||
state_provider=_retrieve_max_kb_s_sent_state,
|
state_provider=_retrieve_max_kb_s_sent_state,
|
||||||
),
|
),
|
||||||
"max_kb_s_received": SensorData(
|
"max_kb_s_received": SensorData(
|
||||||
name="Max kbit/s received",
|
name="Max Connection Download Throughput",
|
||||||
unit_of_measurement=DATA_RATE_KILOBITS_PER_SECOND,
|
unit_of_measurement=DATA_RATE_KILOBITS_PER_SECOND,
|
||||||
icon="mdi:download",
|
icon="mdi:download",
|
||||||
state_provider=_retrieve_max_kb_s_received_state,
|
state_provider=_retrieve_max_kb_s_received_state,
|
||||||
|
@ -159,6 +199,48 @@ SENSOR_DATA = {
|
||||||
icon="mdi:download",
|
icon="mdi:download",
|
||||||
state_provider=_retrieve_gb_received_state,
|
state_provider=_retrieve_gb_received_state,
|
||||||
),
|
),
|
||||||
|
"link_kb_s_sent": SensorData(
|
||||||
|
name="Link Upload Throughput",
|
||||||
|
unit_of_measurement=DATA_RATE_KILOBITS_PER_SECOND,
|
||||||
|
icon="mdi:upload",
|
||||||
|
state_provider=_retrieve_link_kb_s_sent_state,
|
||||||
|
connection_type=DSL_CONNECTION,
|
||||||
|
),
|
||||||
|
"link_kb_s_received": SensorData(
|
||||||
|
name="Link Download Throughput",
|
||||||
|
unit_of_measurement=DATA_RATE_KILOBITS_PER_SECOND,
|
||||||
|
icon="mdi:download",
|
||||||
|
state_provider=_retrieve_link_kb_s_received_state,
|
||||||
|
connection_type=DSL_CONNECTION,
|
||||||
|
),
|
||||||
|
"link_noise_margin_sent": SensorData(
|
||||||
|
name="Link Upload Noise Margin",
|
||||||
|
unit_of_measurement=SIGNAL_STRENGTH_DECIBELS,
|
||||||
|
icon="mdi:upload",
|
||||||
|
state_provider=_retrieve_link_noise_margin_sent_state,
|
||||||
|
connection_type=DSL_CONNECTION,
|
||||||
|
),
|
||||||
|
"link_noise_margin_received": SensorData(
|
||||||
|
name="Link Download Noise Margin",
|
||||||
|
unit_of_measurement=SIGNAL_STRENGTH_DECIBELS,
|
||||||
|
icon="mdi:download",
|
||||||
|
state_provider=_retrieve_link_noise_margin_received_state,
|
||||||
|
connection_type=DSL_CONNECTION,
|
||||||
|
),
|
||||||
|
"link_attenuation_sent": SensorData(
|
||||||
|
name="Link Upload Power Attenuation",
|
||||||
|
unit_of_measurement=SIGNAL_STRENGTH_DECIBELS,
|
||||||
|
icon="mdi:upload",
|
||||||
|
state_provider=_retrieve_link_attenuation_sent_state,
|
||||||
|
connection_type=DSL_CONNECTION,
|
||||||
|
),
|
||||||
|
"link_attenuation_received": SensorData(
|
||||||
|
name="Link Download Power Attenuation",
|
||||||
|
unit_of_measurement=SIGNAL_STRENGTH_DECIBELS,
|
||||||
|
icon="mdi:download",
|
||||||
|
state_provider=_retrieve_link_attenuation_received_state,
|
||||||
|
connection_type=DSL_CONNECTION,
|
||||||
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -177,7 +259,16 @@ async def async_setup_entry(
|
||||||
return
|
return
|
||||||
|
|
||||||
entities = []
|
entities = []
|
||||||
for sensor_type in SENSOR_DATA:
|
dslinterface = await hass.async_add_executor_job(
|
||||||
|
fritzbox_tools.connection.call_action,
|
||||||
|
"WANDSLInterfaceConfig:1",
|
||||||
|
"GetInfo",
|
||||||
|
)
|
||||||
|
dsl: bool = dslinterface["NewEnable"]
|
||||||
|
|
||||||
|
for sensor_type, sensor_data in SENSOR_DATA.items():
|
||||||
|
if not dsl and sensor_data.get("connection_type") == DSL_CONNECTION:
|
||||||
|
continue
|
||||||
entities.append(FritzBoxSensor(fritzbox_tools, entry.title, sensor_type))
|
entities.append(FritzBoxSensor(fritzbox_tools, entry.title, sensor_type))
|
||||||
|
|
||||||
if entities:
|
if entities:
|
||||||
|
|
Loading…
Reference in New Issue