Repository navigation
Idea: UniFi Wi-Fi monitoring (AP radios and device statistics) via the official Network Integration API #7690
Replies: 8 comments
|
Thanks @fabicarvano. The facts in the proposal check out against main, and it fills a slot we already reserved, so yes to a spec. Verified: the collector ( What the spec needs to settle:
Same shape as #7642 works well: a spec PR under |
|
Todd, thanks again for the direction on this proposal. At the moment, I don't have a suitable UniFi environment to capture and validate the real fixtures needed to close the spec with the level of confidence this work deserves, especially around radio fields, statistics, and contract compatibility. Rather than move forward with a spec based on assumptions, I'll leave this as a future implementation until I have the environment and evidence needed to validate the real data first. I wanted to record that here so the discussion stays current and has a clear status rather than remaining open without a defined next step. |
|
Sanitized fixtures for the radio and statistics fields in this proposal, pulled 2026-10-15. GET only, official Network Integration API, through the Site Manager connector:
That is the cloud server URL in the Network v10.6.106 OpenAPI spec. Consoles that answered were UniFi OS 5.1.132 running Network 10.6.106. Consoles on UniFi OS 6.0.123 returned 404 for both that path and Names, MAC addresses, IP addresses, site ids, device ids, and heartbeat timestamps are removed. A key that is missing below was omitted by the controller. Wireless client counts are from 1. U6 LR, online —
|
|
A few more observations from the same pull (Network 10.6.106, UniFi OS 5.1.132, GET only, Site Manager connector). Identifiers, names, and addresses are removed. Clients
Switches, because it bounds this proposal
Device-detail PoE is populated on those device-detail ports. That is the fixture #7271 is waiting on, so the port examples are on that issue. FirewallZones and policies are on the same API ( |
|
@bgatestmg, thank you very much for taking the time to collect and document all of this so carefully. These fixtures are extremely valuable and, more importantly, they unblock the main point that was still preventing this discussion from moving forward with the level of confidence we needed. The evidence collected from a real controller regarding radio inventory, The additional observations regarding switches, PoE, and the actual limits of what With this information now available, I will move the discussion to the next stage: preparing the spec under The spec will be submitted shortly for maintainer review and approval before any implementation begins. I will also make sure your contribution is explicitly recognized. In addition to referencing these fixtures and comments in both the spec and the PR, the spec commit will include a Thank you again for sharing such detailed and actionable data. This has genuinely moved the proposal into its next stage. |
|
Hi @bgatestmg, thanks for the fixtures for #7690. In the review of PR #9293, Todd decided that a capture from a local controller (§14.6) is an entry gate for W2. If you can, we need a specific request:
If you don't have access to a local controller, you can reply "no local access" and nothing else is needed. Thanks! |
|
Local-controller capture for §14.6, pulled 2026-10-20. GET only, from the controller itself:
Not the Site Manager connector. Network 10.6.106 ( Names, MAC addresses, IP addresses, site ids, device ids, client ids, and heartbeat timestamps are removed. A key that is missing below was omitted by the controller. Device list
List rows and detail rows do not use the same shape for those two fields. List row (an online E7, firmware 8.7.11): {
"model": "E7",
"state": "ONLINE",
"supported": true,
"firmwareVersion": "8.7.11",
"firmwareUpdatable": false,
"features": ["accessPoint"],
"interfaces": ["radios"]
}
Device detail
{
"model": "E7",
"state": "ONLINE",
"supported": true,
"firmwareVersion": "8.7.11",
"firmwareUpdatable": false,
"features": { "accessPoint": {} },
"interfaces": {
"radios": [
{"wlanStandard": "802.11be", "frequencyGHz": 2.4, "channelWidthMHz": 20, "channel": 6},
{"wlanStandard": "802.11be", "frequencyGHz": 5, "channelWidthMHz": 80, "channel": 48},
{"wlanStandard": "802.11be", "frequencyGHz": 6, "channelWidthMHz": 160, "channel": 53}
]
},
"uplink": { "deviceId": "<redacted>" }
}
statistics/latest
{
"uptimeSec": 4272049,
"loadAverage1Min": 2.46,
"loadAverage5Min": 2.3,
"loadAverage15Min": 2.18,
"cpuUtilizationPct": 4.8,
"memoryUtilizationPct": 33.1,
"uplink": {},
"interfaces": {
"radios": [
{"frequencyGHz": 2.4, "txRetriesPct": 0.0},
{"frequencyGHz": 5, "txRetriesPct": 0.0},
{"frequencyGHz": 6, "txRetriesPct": 10.0}
]
}
}
Clients
Published keys, and nothing else: {"type": "WIRELESS", "uplinkDeviceId": "<redacted>", "access": {"type": "DEFAULT"}}{"type": "WIRED", "uplinkDeviceId": "<redacted>", "access": {"type": "DEFAULT"}}Against the requested fieldsRadios, |
|
Gate met — thank you. The local-controller capture (Network 10.6.106 on UniFi OS 5.1.33, GET only, direct, not through Site Manager) is exactly what §14.6 asked for. It is recorded in the spec with the decoder/contract tests updated for the observed payload differences in #9555 ( |
Uh oh!
There was an error while loading. Please reload this page.
UniFi Wi-Fi monitoring: AP radios and device statistics
Summary
Extend the existing UniFi agent collector to report current-state Wi-Fi health of Access Points, using only the official UniFi Network Integration API. No new collector, no legacy APIs, read-only (GET), reusing
topologyV1.Context and problem
Breeze already discovers UniFi hosts/sites and devices, maps them to Breeze sites, and the agent collector already collects devices, clients, device details and the
topologyV1contract. Today Breeze can tell an operator that an AP exists and is online. It cannot tell how the AP and its radios are operating, so a first investigation of "the Wi-Fi is bad" still means opening the UniFi console.The
statisticsresource already exists intopologyV1but is not collected yet.Proposal
Add to the agent collector (
agent/internal/unifi/):GET /sites/{siteId}/devices/{deviceId}:frequencyGHz,channel,channelWidthMHz,wlanStandardper radio.GET /sites/{siteId}/devices/{deviceId}/statistics/latest:uptimeSec,cpuUtilizationPct,memoryUtilizationPct,uplink.rxRateBps/txRateBps, andtxRetriesPctper radio.uplinkDeviceIdrelationship.topologyV1(device_detailsgetsradios[],statisticsgets device and radio stats) with new shared typesWirelessRadioOverviewandWirelessRadioStatistics.Detail and statistics radios are correlated by
frequencyGHz, never by array position.What the operator will be able to answer
Principles
null, never0.txRetriesPct = 0is a valid measurement;nullmeans not collected or unsupported. Same for CPU, memory, uplink and uptime.Future customer-facing value
A simplified Wi-Fi overview in the customer portal as an extension of Network Visibility (number of APs, online, connected devices, clients per AP). Technical detail stays operator-side.
Out of scope
Tracked separately in a companion Advanced discussion: radio history/time-series, clients per band, endpoint-agent enrichment (RSSI, frequency), roaming, advanced RF metrics, multi-vendor, legacy/internal UniFi APIs, diagnostics/recommendations by AI, and any write action.
Known limitation
The official API confirms client to AP but not client to radio, so this version shows clients per AP, not per band. Only current state is shown; there is no radio history.
Tests planned
Agent: AP with no, one and several radios; 2.4/5/6 GHz;
txRetriesPct0 and greater than 0; statistics 404/500; malformed JSON; partial device failure; bounded request count. Shared: ranges, nullable fields, canonicalization, digest stability. API:topologyV1and legacy telemetry compatibility, malformed radio payload rejected.Open questions
topologyV1minor, or does the current contract require a different versioning step?statistics/latestcall per device per rotation cycle acceptable for the collector's request budget?Next step
If the idea fits the project's direction, I will write the detailed plan as a spec under
docs/superpowers/specs/, following the existing conventions, and implement only after it is approved.All reactions