From ee27bee716b6db4b4b734c1fb85e940d2200e145 Mon Sep 17 00:00:00 2001 From: dashboard-e2e bot Date: Thu, 11 Jun 2026 17:38:24 -0400 Subject: [PATCH] UniFi: degrade wan-status & client-ap-traffic to 200 'unavailable' when controller unreachable Instead of returning HTTP 500 when the UniFi controller can't be reached, these JSON data feeds now return 200 with an 'available: false' / status 'unavailable' payload so the dashboard widgets show a friendly unavailable state and the WAN poll stops silently failing. --- src/Http/Controllers/StatsController.php | 26 ++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Http/Controllers/StatsController.php b/src/Http/Controllers/StatsController.php index ec0e70a..6b0d254 100644 --- a/src/Http/Controllers/StatsController.php +++ b/src/Http/Controllers/StatsController.php @@ -36,6 +36,7 @@ class StatsController extends Controller if ($wanIp && str_starts_with($wanIp, '127.')) $wanIp = $gw['connect_request_ip'] ?? null; return response()->json([ + 'available' => true, 'status' => $wan['status'] ?? 'unknown', 'tx_rate' => $wan['tx_bytes-r'] ?? 0, 'rx_rate' => $wan['rx_bytes-r'] ?? 0, @@ -44,7 +45,19 @@ class StatsController extends Controller 'latency' => $wan['latency'] ?? $gw['wan1']['latency'] ?? null, ]); } catch (\Throwable $e) { - return response()->json(['status' => 'error'], 500); + // The UniFi controller is unreachable. Degrade gracefully: return 200 with a + // friendly "unavailable" payload so the dashboard widget shows an unavailable + // state instead of the poll silently failing on a 500. + return response()->json([ + 'available' => false, + 'status' => 'unavailable', + 'message' => 'UniFi controller is unreachable.', + 'tx_rate' => 0, + 'rx_rate' => 0, + 'isp' => null, + 'wan_ip' => null, + 'latency' => null, + ]); } } @@ -296,12 +309,21 @@ class StatsController extends Controller ->values(); return response()->json([ + 'available' => true, 'labels' => $series['labels'], 'traffic_rx' => $rx, 'traffic_tx' => $tx, ]); } catch (\Throwable $e) { - return response()->json(['error' => $e->getMessage()], 500); + // UniFi controller unreachable — degrade gracefully (200 with empty series) + // so the chart shows an empty/unavailable state rather than erroring on a 500. + return response()->json([ + 'available' => false, + 'message' => 'UniFi controller is unreachable.', + 'labels' => [], + 'traffic_rx' => [], + 'traffic_tx' => [], + ]); } }