Adds a vendor-agnostic radio-state extractor that lets the frequency- aware rules actually fire on production data without per-vendor plumbing for each profile. - Towerops.Snmp.RadioState — pure module that maps a frequency in MHz to the corresponding 802.11 channel across 2.4 GHz, 5 GHz, and 6 GHz bands; reads the freshest "frequency" sensor (already emitted by Cambium/MikroTik/AirOS/Mimosa/Exalt/etc. profiles) and persists the AP-level current_frequency_mhz, current_channel, last_radio_seen_at fields onto snmp_devices. - DevicePollerWorker now calls RadioState.update_from_sensors/1 after each sensor poll so frequency-aware rules read a single canonical source instead of joining sensors at query time. - Towerops.Recommendations.Rules.OwnFleetChannelConflict — new rule that needs no neighbor-scan collection: detects when 2+ of our own APs at the same site share a channel (self-interference). One insight per (site, channel) with a clickable list of conflicting APs and their channel widths. Critical when 3+ APs share a channel. - Insight.@valid_types extended with own_fleet_channel_conflict. - UI: amber card showing channel, frequency, AP count, and the linked list of conflicting devices. Wired into the existing hourly RecommendationsRunWorker. LLM enrichment automatically applies via the Phase 1 worker. |
||
|---|---|---|
| .. | ||
| channels | ||
| components | ||
| controllers | ||
| graphql | ||
| helpers | ||
| live | ||
| plugs | ||
| changelog_parser.ex | ||
| endpoint.ex | ||
| gettext.ex | ||
| gettext_helpers.ex | ||
| graphql_socket.ex | ||
| permissions.ex | ||
| plug_exceptions.ex | ||
| remote_ip.ex | ||
| router.ex | ||
| scoped_resource.ex | ||
| telemetry.ex | ||
| telemetry_filter.ex | ||
| user_auth.ex | ||