From 155196827592f53420ee697c83094735a9f210bf Mon Sep 17 00:00:00 2001 From: Micha Date: Mon, 6 Apr 2026 11:44:54 +0000 Subject: [PATCH] fix: handle scrutiny smart field as dict (KeyError: -1) --- .../backend/app/clients/scrutiny_client.py | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/apps/dashboard/backend/app/clients/scrutiny_client.py b/apps/dashboard/backend/app/clients/scrutiny_client.py index b123a09..2c4464c 100644 --- a/apps/dashboard/backend/app/clients/scrutiny_client.py +++ b/apps/dashboard/backend/app/clients/scrutiny_client.py @@ -26,7 +26,6 @@ class ScrutinyClient(BaseHTTPClient): return snapshot data = await self._request_json("GET", "/api/summary") - if data is None: logger.warning("scrutiny: empty or failed response") return snapshot @@ -52,12 +51,24 @@ class ScrutinyClient(BaseHTTPClient): for device_path, device_data in summary.items(): device_info: dict = device_data.get("device") or {} - smart_list: list = device_data.get("smart") or [] + + # "smart" may be a list OR a dict keyed by timestamp — handle both + smart_raw = device_data.get("smart") or {} + if isinstance(smart_raw, dict): + smart_values = list(smart_raw.values()) + elif isinstance(smart_raw, list): + smart_values = smart_raw + else: + smart_values = [] + + # Sort by date if values have a date field, otherwise take last entry + if smart_values and isinstance(smart_values[0], dict) and "date" in smart_values[0]: + smart_values = sorted(smart_values, key=lambda x: x.get("date", "")) + latest_smart = smart_values[-1] if smart_values else {} name = device_info.get("device_name") or device_path.split("/")[-1] model = device_info.get("model_name") or "Unknown" - latest_smart = smart_list[-1] if smart_list else {} status_code = latest_smart.get("Status", -1) if status_code == 0: status = "passed" @@ -66,6 +77,15 @@ class ScrutinyClient(BaseHTTPClient): else: status = "unknown" - devices.append(ScrutinyDevice(name=name, model=model, status=status)) + # Temperature: try top-level "temp", then nested attrs + temperature: int | None = None + temp_val = latest_smart.get("temp") or latest_smart.get("temperature") + if temp_val is not None: + try: + temperature = int(temp_val) + except (TypeError, ValueError): + pass + + devices.append(ScrutinyDevice(name=name, model=model, status=status, temperature=temperature)) return sorted(devices, key=lambda d: d.name)