Skip to content

Commit 02bd5e6

Browse files
committed
Fix Garmin data parsing for None values
- Handle None values in stress data to prevent float conversion errors - Add None checks for HRV data parsing - Add additional field mappings for heart rate (including minHeartRate) - Prevents 'float() argument must be a string or a real number, not NoneType' errors
1 parent 2535fe6 commit 02bd5e6

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

garmin_schemas.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -153,15 +153,21 @@ def from_garmin_response(cls, data: dict[str, Any]) -> Optional["GarminHRVData"]
153153
parsed_data = {}
154154

155155
# Primary HRV value - use lastNightAvg as RMSSD equivalent
156-
if "lastNightAvg" in hrv_summary:
156+
if (
157+
"lastNightAvg" in hrv_summary
158+
and hrv_summary["lastNightAvg"] is not None
159+
):
157160
parsed_data["hrv_rmssd"] = float(hrv_summary["lastNightAvg"])
158161

159162
# Weekly average as backup SDRR value
160-
if "weeklyAvg" in hrv_summary:
163+
if "weeklyAvg" in hrv_summary and hrv_summary["weeklyAvg"] is not None:
161164
parsed_data["hrv_sdrr"] = float(hrv_summary["weeklyAvg"])
162165

163166
# No direct score in Garmin API, use lastNightAvg
164-
if "lastNightAvg" in hrv_summary:
167+
if (
168+
"lastNightAvg" in hrv_summary
169+
and hrv_summary["lastNightAvg"] is not None
170+
):
165171
parsed_data["hrv_score"] = float(hrv_summary["lastNightAvg"])
166172

167173
if not any(parsed_data.values()):
@@ -190,15 +196,15 @@ def from_garmin_response(cls, data: dict[str, Any]) -> Optional["GarminStressDat
190196
try:
191197
parsed_data = {}
192198

193-
# Use the actual Garmin API field names
194-
if "avgStressLevel" in data:
199+
# Use the actual Garmin API field names - handle None values
200+
if "avgStressLevel" in data and data["avgStressLevel"] is not None:
195201
parsed_data["avg_stress"] = float(data["avgStressLevel"])
196202

197-
if "maxStressLevel" in data:
203+
if "maxStressLevel" in data and data["maxStressLevel"] is not None:
198204
parsed_data["max_stress"] = float(data["maxStressLevel"])
199205

200206
# Use average as score since no direct score available
201-
if "avgStressLevel" in data:
207+
if "avgStressLevel" in data and data["avgStressLevel"] is not None:
202208
parsed_data["stress_score"] = float(data["avgStressLevel"])
203209

204210
if not any(parsed_data.values()):
@@ -245,7 +251,14 @@ def from_garmin_response(
245251
field_mappings = {
246252
"resting_hr": ["restingHeartRate", "resting_hr", "restingHR", "rhr"],
247253
"max_hr": ["maxHeartRate", "max_hr", "maxHR", "maximumHR"],
248-
"avg_hr": ["avgHeartRate", "avg_hr", "averageHR", "avgHR"],
254+
"avg_hr": [
255+
"avgHeartRate",
256+
"averageHeartRate",
257+
"avg_hr",
258+
"averageHR",
259+
"avgHR",
260+
"minHeartRate",
261+
],
249262
}
250263

251264
parsed_data = {}

0 commit comments

Comments
 (0)