1
0
mirror of https://github.com/home-assistant/core.git synced 2025-12-20 19:09:45 +00:00

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 return
_LOGGER.debug( _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.is_alive,
data.packets_sent, data.packets_sent,
data.packets_received, data.packets_received,
data.packet_loss * 100,
) )
self.is_alive = data.is_alive self.is_alive = data.is_alive
@@ -80,6 +81,7 @@ class PingDataICMPLib(PingData):
"max": data.max_rtt, "max": data.max_rtt,
"avg": data.avg_rtt, "avg": data.avg_rtt,
"jitter": data.jitter, "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, SensorStateClass,
) )
from homeassistant.config_entries import ConfigEntry 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.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback
@@ -82,6 +82,16 @@ SENSORS: tuple[PingSensorEntityDescription, ...] = (
value_fn=lambda result: result.data.get("jitter"), value_fn=lambda result: result.data.get("jitter"),
has_fn=lambda result: "jitter" in result.data, 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": { "jitter": {
"name": "Jitter" "name": "Jitter"
}, },
"loss": {
"name": "Packet loss"
},
"round_trip_time_avg": { "round_trip_time_avg": {
"name": "Round-trip time average" "name": "Round-trip time average"
}, },

View File

@@ -54,6 +54,57 @@
'state': '3.5', '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] # name: test_setup_and_update[round_trip_time_average]
EntityRegistryEntrySnapshot({ EntityRegistryEntrySnapshot({
'aliases': set({ '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_mean_deviation", # should be None in the snapshot
"round_trip_time_minimum", "round_trip_time_minimum",
"jitter", "jitter",
"packet_loss",
], ],
) )
async def test_setup_and_update( async def test_setup_and_update(