From cdc01aaa76c15335833a52a1dbe43a8e5cf02d67 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Tue, 26 May 2026 17:49:12 +0200 Subject: [PATCH] data_model: implement range_at_100 procedural field Compute estimated full-charge range from totalRange and current SOC. Guard against None values (_get returns None for missing keys) and SOC = 0 to avoid TypeError / ZeroDivisionError on incomplete records. Co-Authored-By: Claude Sonnet 4.6 --- server/data_model.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/data_model.py b/server/data_model.py index 10f20d4..d2e750f 100644 --- a/server/data_model.py +++ b/server/data_model.py @@ -265,6 +265,11 @@ def apply_procedural(record: dict) -> dict: """ proc: dict = {} + range_at_soc = _get(record, "measurements", "rangeStatus", "totalRange", "value") + soc = _get(record, "charging", "batteryStatus", "currentSOC", "value") + if range_at_soc is not None and soc: + proc["range_at_100"] = _phys(round(100 * float(range_at_soc) / float(soc), 1), "km") + # ── add computed fields here ────────────────────────────────────────── # Use _get(record, "domain", "statusObject", "field", "value") to # safely read any nested value. Always use {"value": ..., "unit": ...}