From 5dd88f0b254222211a1a09a2e9cec007edd82f95 Mon Sep 17 00:00:00 2001 From: offmor Date: Fri, 12 Jun 2026 14:04:37 +0800 Subject: [PATCH 1/2] feat: record UI PDR values in CSV --- marilib/marilib/logger.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/marilib/marilib/logger.py b/marilib/marilib/logger.py index 94987a61..204be867 100644 --- a/marilib/marilib/logger.py +++ b/marilib/marilib/logger.py @@ -114,6 +114,10 @@ def _open_new_segment(self): "success_rate_total", "pdr_downlink", "pdr_uplink", + "radio_pdr_downlink", + "radio_pdr_uplink", + "uart_pdr_downlink", + "uart_pdr_uplink", "rssi_node_dbm", "rssi_gw_dbm", "avg_latency_edge_ms", @@ -164,6 +168,16 @@ def log_gateway_metrics(self, gateway: MariGateway): ] self._gateway_writer.writerow(row) + def _safe_pct(self, value: float | None) -> float: + """Normalizes invalid PDR values to a stable 0..1 range for CSV export.""" + if value is None: + return 0.0 + try: + v = float(value) + except (TypeError, ValueError): + return 0.0 + return 0.0 if v < 0 else min(v, 1.0) + def log_all_nodes_metrics(self, nodes: List[MariNode]): """Writes metrics for all nodes, handling rotation.""" if not self._log_common() or self._nodes_writer is None: @@ -184,6 +198,10 @@ def log_all_nodes_metrics(self, nodes: List[MariNode]): f"{node.stats.success_rate():.2%}", f"{node.pdr_downlink:.2%}", f"{node.pdr_uplink:.2%}", + f"{self._safe_pct(node.stats_pdr_downlink_radio()):.2%}", + f"{self._safe_pct(node.stats_pdr_uplink_radio()):.2%}", + f"{self._safe_pct(node.stats_pdr_downlink_uart()):.2%}", + f"{self._safe_pct(node.stats_pdr_uplink_uart()):.2%}", node.stats_rssi_node_dbm(), node.stats_rssi_gw_dbm(), f"{node.stats_avg_latency_roundtrip_node_edge_ms():.2f}", From e34a4562c7351246322056c22a28bd515778b821 Mon Sep 17 00:00:00 2001 From: Geovane Fedrecheski Date: Fri, 12 Jun 2026 17:20:33 +0200 Subject: [PATCH 2/2] log: rename _safe_pct to _safe_fraction AI-assisted: Claude Fable 5 --- marilib/marilib/logger.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/marilib/marilib/logger.py b/marilib/marilib/logger.py index 204be867..cb9ad75f 100644 --- a/marilib/marilib/logger.py +++ b/marilib/marilib/logger.py @@ -168,7 +168,7 @@ def log_gateway_metrics(self, gateway: MariGateway): ] self._gateway_writer.writerow(row) - def _safe_pct(self, value: float | None) -> float: + def _safe_fraction(self, value: float | None) -> float: """Normalizes invalid PDR values to a stable 0..1 range for CSV export.""" if value is None: return 0.0 @@ -198,10 +198,10 @@ def log_all_nodes_metrics(self, nodes: List[MariNode]): f"{node.stats.success_rate():.2%}", f"{node.pdr_downlink:.2%}", f"{node.pdr_uplink:.2%}", - f"{self._safe_pct(node.stats_pdr_downlink_radio()):.2%}", - f"{self._safe_pct(node.stats_pdr_uplink_radio()):.2%}", - f"{self._safe_pct(node.stats_pdr_downlink_uart()):.2%}", - f"{self._safe_pct(node.stats_pdr_uplink_uart()):.2%}", + f"{self._safe_fraction(node.stats_pdr_downlink_radio()):.2%}", + f"{self._safe_fraction(node.stats_pdr_uplink_radio()):.2%}", + f"{self._safe_fraction(node.stats_pdr_downlink_uart()):.2%}", + f"{self._safe_fraction(node.stats_pdr_uplink_uart()):.2%}", node.stats_rssi_node_dbm(), node.stats_rssi_gw_dbm(), f"{node.stats_avg_latency_roundtrip_node_edge_ms():.2f}",