From 4dd999178c1d4580eee5fc9493521919cc5bde1f Mon Sep 17 00:00:00 2001 From: pablorevilla-meshtastic Date: Mon, 9 Feb 2026 21:31:34 -0800 Subject: [PATCH] more details --- meshview/radio/coverage.py | 12 +++++++++++- meshview/web_api/api.py | 7 +++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/meshview/radio/coverage.py b/meshview/radio/coverage.py index cc1c8a9..7755d18 100644 --- a/meshview/radio/coverage.py +++ b/meshview/radio/coverage.py @@ -1,7 +1,13 @@ import math from functools import lru_cache -from pyitm import itm +try: + from pyitm import itm + + ITM_AVAILABLE = True +except Exception: + itm = None + ITM_AVAILABLE = False DEFAULT_CLIMATE = 5 # Continental temperate DEFAULT_GROUND = 0.005 # Average ground conductivity @@ -48,6 +54,8 @@ def compute_coverage( step_km: float, reliability: float, ) -> list[tuple[float, float, float]]: + if not ITM_AVAILABLE: + return [] points = [] distance = max(step_km, 1.0) while distance <= radius_km: @@ -94,6 +102,8 @@ def compute_perimeter( reliability: float, threshold_dbm: float, ) -> list[tuple[float, float]]: + if not ITM_AVAILABLE: + return [] perimeter = [] distance = max(step_km, 1.0) for bearing in range(0, 360, BEARING_STEP_DEG): diff --git a/meshview/web_api/api.py b/meshview/web_api/api.py index 34a963a..6bd7b17 100644 --- a/meshview/web_api/api.py +++ b/meshview/web_api/api.py @@ -20,6 +20,7 @@ from meshview.radio.coverage import ( DEFAULT_MIN_DBM, DEFAULT_RELIABILITY, DEFAULT_THRESHOLD_DBM, + ITM_AVAILABLE, compute_coverage, compute_perimeter, ) @@ -1050,6 +1051,12 @@ async def api_coverage(request): except (KeyError, ValueError): return web.json_response({"error": "Invalid node_id"}, status=400) + if not ITM_AVAILABLE: + return web.json_response( + {"error": "Coverage requires pyitm. Run: pip install -r requirements.txt"}, + status=503, + ) + def parse_float(name, default): value = request.query.get(name) if value is None: