Add packet loss sensor to Ping integration (#158081)

This commit is contained in:
Michael
2025-12-06 10:57:31 +01:00
committed by GitHub
parent 87b9c3193e
commit ce14544ec1
6 changed files with 78 additions and 2 deletions

View File

@@ -64,10 +64,11 @@ class PingDataICMPLib(PingData):
return
_LOGGER.debug(
"async_ping returned: reachable=%s sent=%i received=%s",
"async_ping returned: reachable=%s sent=%i received=%s loss=%s",
data.is_alive,
data.packets_sent,
data.packets_received,
data.packet_loss * 100,
)
self.is_alive = data.is_alive
@@ -80,6 +81,7 @@ class PingDataICMPLib(PingData):
"max": data.max_rtt,
"avg": data.avg_rtt,
"jitter": data.jitter,
"loss": data.packet_loss * 100,
}

View File

@@ -0,0 +1,9 @@
{
"entity": {
"sensor": {
"loss": {
"default": "mdi:alert-circle-outline"
}
}
}
}

View File

@@ -10,7 +10,7 @@ from homeassistant.components.sensor import (
SensorStateClass,
)
from homeassistant.config_entries import ConfigEntry
from homeassistant.const import EntityCategory, UnitOfTime
from homeassistant.const import PERCENTAGE, EntityCategory, UnitOfTime
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
@@ -82,6 +82,16 @@ SENSORS: tuple[PingSensorEntityDescription, ...] = (
value_fn=lambda result: result.data.get("jitter"),
has_fn=lambda result: "jitter" in result.data,
),
PingSensorEntityDescription(
key="loss",
translation_key="loss",
native_unit_of_measurement=PERCENTAGE,
state_class=SensorStateClass.MEASUREMENT,
entity_registry_enabled_default=False,
entity_category=EntityCategory.DIAGNOSTIC,
value_fn=lambda result: result.data.get("loss"),
has_fn=lambda result: "loss" in result.data,
),
)

View File

@@ -22,6 +22,9 @@
"jitter": {
"name": "Jitter"
},
"loss": {
"name": "Packet loss"
},
"round_trip_time_avg": {
"name": "Round-trip time average"
},

View File

@@ -54,6 +54,57 @@
'state': '3.5',
})
# ---
# name: test_setup_and_update[packet_loss]
EntityRegistryEntrySnapshot({
'aliases': set({
}),
'area_id': None,
'capabilities': dict({
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
}),
'config_entry_id': <ANY>,
'config_subentry_id': <ANY>,
'device_class': None,
'device_id': <ANY>,
'disabled_by': None,
'domain': 'sensor',
'entity_category': <EntityCategory.DIAGNOSTIC: 'diagnostic'>,
'entity_id': 'sensor.10_10_10_10_packet_loss',
'has_entity_name': True,
'hidden_by': None,
'icon': None,
'id': <ANY>,
'labels': set({
}),
'name': None,
'options': dict({
}),
'original_device_class': None,
'original_icon': None,
'original_name': 'Packet loss',
'platform': 'ping',
'previous_unique_id': None,
'suggested_object_id': None,
'supported_features': 0,
'translation_key': 'loss',
'unit_of_measurement': '%',
})
# ---
# name: test_setup_and_update[packet_loss].1
StateSnapshot({
'attributes': ReadOnlyDict({
'friendly_name': '10.10.10.10 Packet loss',
'state_class': <SensorStateClass.MEASUREMENT: 'measurement'>,
'unit_of_measurement': '%',
}),
'context': <ANY>,
'entity_id': 'sensor.10_10_10_10_packet_loss',
'last_changed': <ANY>,
'last_reported': <ANY>,
'last_updated': <ANY>,
'state': '0.0',
})
# ---
# name: test_setup_and_update[round_trip_time_average]
EntityRegistryEntrySnapshot({
'aliases': set({

View File

@@ -17,6 +17,7 @@ from homeassistant.helpers import entity_registry as er
"round_trip_time_mean_deviation", # should be None in the snapshot
"round_trip_time_minimum",
"jitter",
"packet_loss",
],
)
async def test_setup_and_update(