mirror of
https://github.com/cyberjunky/home-assistant-garmin_connect.git
synced 2026-01-09 12:57:58 -05:00
Fixed last activity attribute too big issue
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user