Skip to content

WiFi Optimizer: Centralized rule engine for recommendations#216

Merged
tvancott42 merged 34 commits intomainfrom
feature/iot-ssid-wording
Feb 5, 2026
Merged

WiFi Optimizer: Centralized rule engine for recommendations#216
tvancott42 merged 34 commits intomainfrom
feature/iot-ssid-wording

Conversation

@tvancott42
Copy link
Collaborator

@tvancott42 tvancott42 commented Feb 5, 2026

Summary

Major refactor of the WiFi Optimizer that extracts recommendation logic from individual Razor components into a centralized, testable rule engine.

  • 21 new rules in NetworkOptimizer.WiFi/Rules/ replace inline logic from BandSteeringAnalysis, PowerCoverageAnalysis, AirtimeFairness, ApLoadBalance, and ConnectivityFlow components
  • Reusable IssuesList component provides consistent issue display across all WiFi pages with proper sorting (severity desc, then dimension)
  • PPSK support for IoT network detection - rules now check both direct network binding and Private Pre-Shared Key network assignments
  • ShowOnOverview flag controls which issues appear on the main WiFi Optimizer page vs only on specific tabs

UI Improvements

  • Nested card colors alternate by depth for better visual hierarchy
  • Band-tab styling applied to RF Environment filter tabs
  • Pagination added to Neighboring Networks table (25 per page)
  • Issue icons updated to 24x24 matching audit page style
  • Power-auto bars use primary blue gradient

Rules Ported

Source Component Rules Created
BandSteeringAnalysis BandSteeringRule, High2GHzConcentrationRule, IoTSsidSeparationRule, MinRssiRule
PowerCoverageAnalysis HighPowerRule, CoverageGapRule, WeakSignalPopulationRule, MinRssiEnabledRule, RoamingAssistantRule, TxPowerVariationRule, HighPowerOverlapRule, CoChannelInterferenceRule
AirtimeFairness HighRadioUtilizationRule, LegacyClientAirtimeRule, HighTxRetryRule, MinimumDataRatesRule
ApLoadBalance LoadImbalanceRule, HighApLoadRule
ConnectivityFlow DhcpIssuesRule
New NonStandardChannelRule

Test plan

  • Verify WiFi Optimizer overview shows only issues with ShowOnOverview=true
  • Verify each tab (Band Steering, Airtime, etc.) shows issues filtered by correct dimension
  • Test IoT SSID detection with both direct network binding and PPSK configurations
  • Verify pagination works on Neighboring Networks table
  • Check nested card color alternation on all WiFi pages

- Create extensible rule engine (IWiFiOptimizerRule, WiFiOptimizerEngine)
- Add IoTSsidSeparationRule: suppresses recommendation when IoT SSID exists
  with band steering enabled on main SSIDs
- Add BandSteeringRule: recommends enabling when >30% clients are steerable
- Add High2GHzConcentrationRule: flags when >50% on 2.4 GHz despite capability
- Integrate with VlanAnalyzer for network classification (IoT, Security, etc.)
- Add NetworkId to WlanConfiguration for WLAN-to-network linking
- Port Minimum RSSI recommendation to rule engine (MinRssiRule)
- Update BandSteeringAnalysis.razor to use audit issue CSS classes
- Remove debug logging from WiFiOptimizerEngine
Rules added:
- HighPowerRule: warns when all radios on an AP are set to high TX power
- CoverageGapRule: detects APs with >= 50% weak-signal clients
- WeakSignalPopulationRule: warns when >= 30% of all clients have weak signal
- MinRssiEnabledRule: info about min RSSI being enabled (can cause disconnects)
- RoamingAssistantRule: recommends enabling 5 GHz Roaming Assistant
- TxPowerVariationRule: recommends varied TX power in multi-AP deployments
- Add ShowOnOverview property to HealthIssue (defaults true)
- Set ShowOnOverview=false for informational rules (tab-only)
- Port AirtimeFairness.razor rules:
  - HighRadioUtilizationRule: warns when utilization > 70%
  - LegacyClientAirtimeRule: warns when >= 3 legacy clients
  - HighTxRetryRule: warns when TX retries > 15%
  - MinimumDataRatesRule: recommends min data rates for 2.4 GHz
Rules added:
- LoadImbalanceRule: warns when load imbalance > 50%
- HighApLoadRule: warns when AP has > 2x average clients
- DhcpIssuesRule: detects clients without IP addresses
Update all WiFi Optimizer components to pull recommendations from the
rule engine via health score instead of generating locally. Use the
same issue-item CSS styling as Security Audit for consistent UI.
- Create IssuesList.razor with SVG icons (shield/triangle/circle-i)
- Convert all WiFi tabs to use standardized component
- Replace text icons ("!" and "i") with proper SVG icons
- Convert local issue classes to use HealthIssue where possible
- Update CSS with proper styling aliases
- Add CoChannelInterferenceRule for detecting co-channel interference
- Add NonStandardChannelRule for 2.4 GHz non-standard channel detection
- Add ChannelHealth dimension to HighRadioUtilizationRule
- Add EvaluateAll interface method for multi-issue rules
- Update WiFiOptimizerEngine to use EvaluateAll
- ChannelAnalysis now pulls issues from health score engine
- Add HighPowerOverlapRule for detecting high-power APs on same channel
- PowerCoverageAnalysis now pulls overlap issues from health score
- Both co-channel rules properly filter out mesh pairs
- Add BandSteering to HealthDimension enum
- Update BandSteeringRule, IoTSsidSeparationRule, High2GHzConcentrationRule to use BandSteering
- BandSteeringAnalysis now filters by BandSteering dimension
- Channel-related issues no longer appear on Band Steering page
- Fix LoadImbalanceRule string interpolation bug
- Remove ClientSatisfaction from load-related rules (HighApLoadRule, LoadImbalanceRule)
- Exclude overlap issues from PowerCoverageAnalysis recommendations section
Shows on Band Steering page under legacy devices section
instead of separate custom display.
The LegacyClientAirtimeRule now shows in the Recommendations section
via the standard IssuesList component instead of a custom display.
@tvancott42 tvancott42 merged commit 698a971 into main Feb 5, 2026
1 check passed
@tvancott42 tvancott42 deleted the feature/iot-ssid-wording branch February 5, 2026 04:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant