feat(wireless+ports): RF Health panels + physical per-port clients (v0.16.1-beta)

Wireless RF Health (fleet Wireless page + per-AP Radios tab):
- Channel usage map across 2.4/5/6 GHz with co-channel overlap; operating
  channel resolved live from /interface/wifi/monitor on the wifi package
  (auto-channel radios report no frequency in /print).
- AP deployment density: client RSSI distribution on the -90..-30 dBm scale
  with a coverage-gap warning.
- AP radio TX retries histogram (0%->35%+) with band selector, derived from
  per-client CCQ (new wireless_radio_quality InfluxDB series).
- WiFi connectivity success funnel (Association/Auth/DHCP) derived from logs.

Per-port connected clients (Ports tab):
- New card lists clients physically connected to a selected port (host/MAC/
  IP/VLAN/connection time, linked to client pages).
- Distinguishes physical clients from the raw MAC table: uplink/trunk ports
  are auto-detected (topology neighbor, multi-VLAN MAC spread, or high MAC
  count) and show an uplink explainer + "view MAC table" disclosure instead
  of every reachable MAC.
- Added clients.first_seen ("connected since"); set once, preserved across polls.
This commit is contained in:
2GT-Rich
2026-06-25 15:37:08 -07:00
parent 1be161e67a
commit 4e6c9f481e
17 changed files with 994 additions and 35 deletions
+68
View File
@@ -118,6 +118,28 @@ export interface SwitchPort extends Interface {
bridgeInfo?: BridgeVlanEntry | null;
}
export interface PortClient {
mac_address: string;
hostname: string | null;
custom_name: string | null;
vendor: string | null;
ip_address: string | null;
client_type: string;
vlan_id: number | null;
signal_strength: number | null;
first_seen: string | null;
last_seen: string | null;
}
export interface PortClientsResult {
classification: 'access' | 'uplink';
reason: string;
mac_count: number;
vlan_count: number;
neighbor: { neighbor_identity: string | null; neighbor_platform: string | null } | null;
clients: PortClient[];
}
export interface PortMonitorData {
// Link state
status?: string;
@@ -342,6 +364,52 @@ export interface WirelessMetricPoint {
noise_floor?: number;
}
// ─── RF Health ──────────────────────────────────────────────────────────────
export interface RfChannelRow {
device_id: number;
device_name: string;
name: string;
ssid?: string;
band?: string;
frequency: number;
channel_width?: string;
registered_clients: number;
}
export interface RfSignalRow {
mac_address: string;
signal_strength: number;
device_id: number;
device_name: string;
custom_name?: string | null;
hostname?: string | null;
}
export interface RfTxQualityRow {
device_id: string;
device_name?: string;
interface: string;
band: string;
tx_retry_pct: number;
}
export interface RfConnectivityStage {
success: number;
failure: number;
pct: number | null;
}
export interface RfConnectivity {
range: string;
log_derived: boolean;
stages: {
association: RfConnectivityStage;
authentication: RfConnectivityStage;
dhcp: RfConnectivityStage;
};
}
export interface ConfigSnapshotMeta {
id: number;
device_id: number;