diff --git a/routes/meshcore.py b/routes/meshcore.py index 4990afd..57f6fca 100644 --- a/routes/meshcore.py +++ b/routes/meshcore.py @@ -93,7 +93,7 @@ def ports(): def ble_scan(): if not is_meshcore_available(): return api_error("meshcore not installed", 503) - devices = _client().scan_ble_sync() + devices = _client().scan_ble() return jsonify({"devices": devices}) diff --git a/utils/meshcore.py b/utils/meshcore.py index 8b86a40..7520095 100644 --- a/utils/meshcore.py +++ b/utils/meshcore.py @@ -413,10 +413,19 @@ class MeshcoreClient: self._worker.request_traceroute(node_id) def scan_ble(self) -> list[dict]: - """Scan for BLE MeshCore devices; returns list of found device dicts.""" + """Scan for BLE MeshCore devices; works with or without an active connection.""" if self._worker: return self._worker.scan_ble_sync() - return [] + # No worker yet — run a one-shot scan directly + import asyncio + + from utils.meshcore_client import _scan_ble + + try: + return asyncio.run(_scan_ble()) + except Exception as exc: + logger.warning("BLE scan failed: %s", exc) + return [] _client: MeshcoreClient | None = None