From a03c77af096c3b9717ba55073753d7e9474a9dcb Mon Sep 17 00:00:00 2001 From: Brian Harrison Date: Fri, 10 Apr 2026 01:43:02 -0400 Subject: [PATCH] fix: remove non-existent DeviceInfo fields from ach_server log and dict MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit calibration_date, aux_trigger, setup_name etc. don't exist directly on DeviceInfo — they live in DeviceInfo.compliance_config (ComplianceConfig). _device_info_to_dict now accesses them via cc = d.compliance_config. Log line updated to show serial/firmware/model/event_count instead. Co-Authored-By: Claude Sonnet 4.6 --- bridges/ach_server.py | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/bridges/ach_server.py b/bridges/ach_server.py index 235c306..9f1d745 100644 --- a/bridges/ach_server.py +++ b/bridges/ach_server.py @@ -210,10 +210,11 @@ class AchSession: serial = device_info.serial _save_json(session_dir / "device_info.json", _device_info_to_dict(device_info)) log.info( - " [OK] Device: serial=%s firmware=%s calibration=%s", + " [OK] Device: serial=%s firmware=%s model=%s events=%d", serial, device_info.firmware_version, - device_info.calibration_date, + device_info.model, + device_info.event_count or 0, ) except Exception as exc: log.error(" [FAIL] Device info failed: %s", exc) @@ -319,21 +320,24 @@ def _save_json(path: Path, obj: object) -> None: def _device_info_to_dict(d: DeviceInfo) -> dict: + cc = d.compliance_config return { "serial": d.serial, "firmware_version": d.firmware_version, - "calibration_date": str(d.calibration_date) if d.calibration_date else None, - "aux_trigger": d.aux_trigger, - "setup_name": d.setup_name, - "sample_rate": d.sample_rate, - "record_time": d.record_time, - "trigger_level_geo": d.trigger_level_geo, - "alarm_level_geo": d.alarm_level_geo, - "max_range_geo": d.max_range_geo, - "project": d.project, - "client": d.client, - "operator": d.operator, - "sensor_location": d.sensor_location, + "dsp_version": d.dsp_version, + "model": d.model, + "event_count": d.event_count, + # compliance config fields (None if 1A read failed) + "setup_name": cc.setup_name if cc else None, + "sample_rate": cc.sample_rate if cc else None, + "record_time": cc.record_time if cc else None, + "trigger_level_geo": cc.trigger_level_geo if cc else None, + "alarm_level_geo": cc.alarm_level_geo if cc else None, + "max_range_geo": cc.max_range_geo if cc else None, + "project": cc.project if cc else None, + "client": cc.client if cc else None, + "operator": cc.operator if cc else None, + "sensor_location": cc.sensor_location if cc else None, }