fix: preserve daily activity timezone metadata

This commit is contained in:
binglua committed 2026-06-29 02:38:41 +00:00
1 parent f73fcb6659
commit 636d2857c3
2 files changed
+24 -6

No files matched your search

@@ -343,22 +343,36 @@ class MiFitnessCloudAdapter(DataAdapter):
yield yield
records = await self._fetch_key("steps", start_date, end_date) records = await self._fetch_key("steps", start_date, end_date)
daily: dict[str, dict[str, float]] = defaultdict( daily: dict[str, dict[str, Any]] = defaultdict(
lambda: {"steps": 0, "distance_m": 0.0, "active_kcal": 0.0} lambda: {
"steps": 0,
"distance_m": 0.0,
"active_kcal": 0.0,
"timezone": "UTC",
"collected_at": None,
}
) )
for item in records: for item in records:
payload = self._parse_value(item) payload = self._parse_value(item)
date_str = self._record_datetime(item).strftime("%Y-%m-%d") collected_at = self._record_datetime(item)
date_str = collected_at.strftime("%Y-%m-%d")
daily[date_str]["steps"] += int(payload.get("steps", 0)) daily[date_str]["steps"] += int(payload.get("steps", 0))
daily[date_str]["distance_m"] += float(payload.get("distance", 0)) daily[date_str]["distance_m"] += float(payload.get("distance", 0))
daily[date_str]["active_kcal"] += float(payload.get("calories", 0)) daily[date_str]["active_kcal"] += float(payload.get("calories", 0))
daily[date_str]["timezone"] = item.get("zone_name") or daily[date_str]["timezone"]
if daily[date_str]["collected_at"] is None or collected_at > daily[date_str]["collected_at"]:
daily[date_str]["collected_at"] = collected_at
calorie_records = await self._fetch_key("calories", start_date, end_date) calorie_records = await self._fetch_key("calories", start_date, end_date)
calorie_totals: dict[str, float] = defaultdict(float) calorie_totals: dict[str, float] = defaultdict(float)
for item in calorie_records: for item in calorie_records:
payload = self._parse_value(item) payload = self._parse_value(item)
date_str = self._record_datetime(item).strftime("%Y-%m-%d") collected_at = self._record_datetime(item)
date_str = collected_at.strftime("%Y-%m-%d")
calorie_totals[date_str] += float(payload.get("calories", 0)) calorie_totals[date_str] += float(payload.get("calories", 0))
daily[date_str]["timezone"] = item.get("zone_name") or daily[date_str]["timezone"]
if daily[date_str]["collected_at"] is None or collected_at > daily[date_str]["collected_at"]:
daily[date_str]["collected_at"] = collected_at
for date_str, total in calorie_totals.items(): for date_str, total in calorie_totals.items():
daily[date_str]["active_kcal"] = total daily[date_str]["active_kcal"] = total
@@ -369,10 +383,12 @@ class MiFitnessCloudAdapter(DataAdapter):
provider="mi_fitness", provider="mi_fitness",
source_type="cloud_session", source_type="cloud_session",
user_id=self.user_id or "unknown", user_id=self.user_id or "unknown",
timezone=str(values["timezone"]),
collected_at=values["collected_at"],
date=date_str, date=date_str,
steps=int(values["steps"]), steps=int(values["steps"]),
distance_m=values["distance_m"], distance_m=float(values["distance_m"]),
active_kcal=values["active_kcal"], active_kcal=float(values["active_kcal"]),
) )
async def iter_sleep_sessions( async def iter_sleep_sessions(
+2
View File
@@ -290,6 +290,8 @@ class Database:
total_kcal, floors, active_minutes total_kcal, floors, active_minutes
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
ON CONFLICT(id) DO UPDATE SET ON CONFLICT(id) DO UPDATE SET
timezone = excluded.timezone,
collected_at = excluded.collected_at,
steps = excluded.steps, steps = excluded.steps,
distance_m = excluded.distance_m, distance_m = excluded.distance_m,
active_kcal = excluded.active_kcal, active_kcal = excluded.active_kcal,