Fixed last activity attribute too big issue

This commit is contained in:
Ron Klinkien
2026-01-03 17:17:45 +01:00
parent f8a9a0d61c
commit 9ea284bf95

View File

@@ -18,6 +18,52 @@ from homeassistant.const import (
UnitOfVolume, UnitOfVolume,
) )
# Essential keys to keep when trimming activity data for attributes
# This reduces ~3KB per activity to ~500 bytes to stay under HA's 16KB limit
ACTIVITY_ESSENTIAL_KEYS = {
# Identity
"activityId",
"activityName",
# Time
"startTimeLocal",
"startTimeGMT",
"duration",
"movingDuration",
"elapsedDuration",
# Distance/Speed
"distance",
"averageSpeed",
"maxSpeed",
# Location
"locationName",
"startLatitude",
"startLongitude",
"endLatitude",
"endLongitude",
# Heart Rate
"averageHR",
"maxHR",
# Stats
"calories",
"steps",
"elevationGain",
"elevationLoss",
# Cadence
"averageRunningCadenceInStepsPerMinute",
"maxRunningCadenceInStepsPerMinute",
# Type (simplified)
"activityType",
}
def _trim_activity(activity: dict) -> dict:
"""Trim activity to essential fields only to reduce attribute size."""
trimmed = {k: v for k, v in activity.items() if k in ACTIVITY_ESSENTIAL_KEYS}
# Simplify activityType to just typeKey
if "activityType" in trimmed and isinstance(trimmed["activityType"], dict):
trimmed["activityType"] = trimmed["activityType"].get("typeKey", "unknown")
return trimmed
@dataclass(frozen=True, kw_only=True) @dataclass(frozen=True, kw_only=True)
class GarminConnectSensorEntityDescription(SensorEntityDescription): class GarminConnectSensorEntityDescription(SensorEntityDescription):
@@ -778,10 +824,7 @@ ACTIVITY_TRACKING_SENSORS: tuple[GarminConnectSensorEntityDescription, ...] = (
icon="mdi:walk", icon="mdi:walk",
value_fn=lambda data: data.get("lastActivity", {}).get("activityName"), value_fn=lambda data: data.get("lastActivity", {}).get("activityName"),
attributes_fn=lambda data: { attributes_fn=lambda data: _trim_activity(data.get("lastActivity", {})),
**data.get("lastActivity", {}),
},
), ),
GarminConnectSensorEntityDescription( GarminConnectSensorEntityDescription(
key="lastActivities", key="lastActivities",
@@ -791,11 +834,12 @@ ACTIVITY_TRACKING_SENSORS: tuple[GarminConnectSensorEntityDescription, ...] = (
value_fn=lambda data: len(data.get("lastActivities", [])), value_fn=lambda data: len(data.get("lastActivities", [])),
attributes_fn=lambda data: { attributes_fn=lambda data: {
"last_activities": [
"last_activities": sorted( _trim_activity(a) for a in sorted(
data.get("lastActivities", []), data.get("lastActivities", []),
key=lambda x: x.get("activityId", 0), key=lambda x: x.get("activityId", 0),
)[-5:], )[-10:]
],
}, },
), ),
GarminConnectSensorEntityDescription( GarminConnectSensorEntityDescription(