unifi-wifi: fix apply-wlan wlan_bands 6e->6g; add 5GHz + 6GHz phases to Cascades runbook

- apply-wlan.sh: wlan_bands token was "6e" but this controller stores "6g" (verified live on Cascades
  Guest SSID) -> setting 6 GHz membership would have failed. Fixed band values + option names (5g6g/6g/all).
- Cascades 2.4 runbook: folded in Phase 5 (5 GHz: width 80->40 on 76 radios; channel plan with the
  DFS decision flagged -- DFS empirically clean here, so including clean-DFS gives ~20 channels vs ~5
  non-DFS-only for 77 APs) and Phase 6 (6 GHz: root cause = production SSID CSCNet not on 6 GHz [bands
  2g,5g only]; add 6g + enable bss-transition; band-steering already on). Per Howard.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-16 21:34:18 -07:00
parent e6a0efa57c
commit 16a8dfffd1
2 changed files with 53 additions and 10 deletions

View File

@@ -10,7 +10,7 @@
# minrate <ng|na> auto|off|<Mbps> -> minrate_setting_preference + minrate_<band>_enabled/_data_rate_kbps
# kill 1-11Mbps legacy basic rates: set 2.4 floor to 12 or 24. e.g. minrate ng 12
# bandsteer <on|off> -> no2ghz_oui (keep 5GHz-capable client OUIs off 2.4 = band steering)
# bands <both|5g|5g6e|6e|all> -> wlan_bands (force the SSID onto specific bands; 5g = strongest steer)
# bands <both|5g|5g6g|6g|all> -> wlan_bands (force the SSID onto specific bands; 5g = strongest steer; 6g = this controller's 6GHz token)
# steer <on|off> -> roaming_assistant_na_enabled (5GHz sticky-client kicker)
# bsstm <on|off> -> bss_transition (802.11v; assists band/AP steering + roaming)
# (modern UniFi has no classic 'bandsteering_mode' field; the above are its replacements, confirmed 2026-06-16)
@@ -42,14 +42,15 @@ case "$ACT" in
case "$SVAL" in on) FIELDS="{\"roaming_assistant_na_enabled\":true}";; off) FIELDS="{\"roaming_assistant_na_enabled\":false}";; *) echo "steer: on|off"; exit 1;; esac ;;
bandsteer) SVAL="${1:?bandsteer <on|off>}"; shift # keep 5GHz-capable client OUIs OFF 2.4 (the band-steering toggle)
case "$SVAL" in on) FIELDS="{\"no2ghz_oui\":true}";; off) FIELDS="{\"no2ghz_oui\":false}";; *) echo "bandsteer: on|off"; exit 1;; esac ;;
bands) SVAL="${1:?bands <both|5g|5g6e|all|6e>}"; shift # per-WLAN band membership (force SSID onto bands)
bands) SVAL="${1:?bands <both|5g|5g6g|all|6g>}"; shift # per-WLAN band membership (force SSID onto bands)
# NOTE: this controller stores 6 GHz as "6g" (verified live on Cascades Guest SSID), NOT "6e".
case "$SVAL" in
both) FIELDS="{\"wlan_bands\":[\"2g\",\"5g\"]}";;
5g) FIELDS="{\"wlan_bands\":[\"5g\"]}";;
5g6e) FIELDS="{\"wlan_bands\":[\"5g\",\"6e\"]}";;
6e) FIELDS="{\"wlan_bands\":[\"6e\"]}";;
all) FIELDS="{\"wlan_bands\":[\"2g\",\"5g\",\"6e\"]}";;
*) echo "bands: both|5g|5g6e|6e|all"; exit 1;; esac ;;
5g6g) FIELDS="{\"wlan_bands\":[\"5g\",\"6g\"]}";;
6g) FIELDS="{\"wlan_bands\":[\"6g\"]}";;
all) FIELDS="{\"wlan_bands\":[\"2g\",\"5g\",\"6g\"]}";;
*) echo "bands: both|5g|5g6g|6g|all"; exit 1;; esac ;;
bsstm) SVAL="${1:?bsstm <on|off>}"; shift # 802.11v BSS Transition Management (assists steering/roaming)
case "$SVAL" in on) FIELDS="{\"bss_transition\":true}";; off) FIELDS="{\"bss_transition\":false}";; *) echo "bsstm: on|off"; exit 1;; esac ;;
wlan) SVAL="${1:?wlan <on|off>}"; shift # enable/disable the whole SSID

View File

@@ -95,15 +95,57 @@ in a covered area; no user complaints. If a dead spot appears → re-enable that
---
## Phase 5 — 5 GHz tuning (NEXT phase, after the 2.4 power-down settles)
Both changes are reversible and coverage-safe (width/channel don't change coverage). Per zone, dry-run
(omit `--apply`) then apply; Floors 5 & 6 excluded per scope.
**5a. Width 80 -> 40 MHz** (currently 80 MHz on 76/77). 40 MHz doubles the non-overlapping channels ->
better spatial reuse in this AP density. (Halves peak per-client rate, but the density win dominates.)
```
for z in "Floor 3" "Floor 1" "Floor 2" "Floor 4"; do \
bash .claude/skills/unifi-wifi/scripts/apply-radio.sh cascades na width 40 --zone "$z" --apply; done
# rollback: na width 80
```
**5b. Channel plan — DECISION NEEDED (non-DFS vs include clean-DFS):**
- DFS reality here: `dfs-check.sh` found **ZERO radar events fleet-wide** -> DFS channels are empirically CLEAN.
- Tradeoff at 40 MHz: **non-DFS-only** = ~5 usable channels (36-48 + 149-165) for 77 APs -> heavy co-channel.
**Including the clean DFS channels** (52-144) gives ~20 channels -> far better reuse, tiny resilience risk
(a radar hit would force a vacate, but none seen near Davis-Monthan in the logs).
- RECOMMENDATION: use a plan that INCLUDES clean DFS for channel diversity. Choose non-DFS-only only if you
want maximum resilience and will accept more co-channel overlap. (55/77 are on DFS today.)
```
SURVEY=.claude/tmp/cascades-survey.json; SURVEY_JSON=$SURVEY bash .../survey-collect.sh cascades
SURVEY_JSON=$SURVEY bash .../channel-plan.sh cascades na # dry-run; review, then apply per zone w/ validation
```
## Phase 6 — 6 GHz adoption + steering (the untapped clean band)
**Root cause 6 GHz is empty (1 client):** the production SSID **CSCNet is NOT broadcasting on 6 GHz**
(`wlan_bands=["2g","5g"]`); only Guest is. So step 1 is enabling the band, then assisting steering.
```
# 6a. add 6 GHz to CSCNet (keeps 2.4/5 for legacy):
bash .claude/skills/unifi-wifi/scripts/apply-wlan.sh cascades bands all --wlan CSCNet --apply # -> [2g,5g,6g]
# 6b. enable 802.11v BSS-transition on CSCNet (Guest already has it; assists up-band steering + roaming):
bash .claude/skills/unifi-wifi/scripts/apply-wlan.sh cascades bsstm on --wlan CSCNet --apply
```
Band-steering (`no2ghz_oui`) is already ON for CSCNet. After 6a/6b, 6E/7-capable clients gravitate to the
clean 6 GHz, offloading 5 GHz. Validate: `live-stats` client mix shifts toward 6e; confirm no SSID-visibility
loss for legacy devices (none expected — 2.4/5 stay on). 6 GHz has shorter range, fine with 77 APs.
(CSC ENT is legacy/being deprecated — leave as-is or add 6g too.)
> NOTE: this controller's 6 GHz token is `6g` (not `6e`); apply-wlan.sh fixed accordingly 2026-06-16.
---
## NOT doing tonight (explicit — so nothing is ambiguous)
- **Power-DOWN instead of disable** (redundant but high-client, keep serving): `3rd Floor Atrium, 318, 303,
4th Floor Atrium, 406-408, Dining Room` — already set Low in Phase 1; leave ON. (505 was here but
Floor 5 is now EXCLUDED — Howard 2026-06-16 — so 505/517 and Floor 6's 615/608/622 are left fully alone.)
- **HOLD (leave fully on):** `Memcare TV room` (memory-care area); all **MESH-PROTECTED** APs.
- **Companion 2.4 levers deferred to a later night** (isolate cause/effect): min-data-rate raise
(1→12 Mbps), band-steering (`apply-wlan bandsteer`), 2.4 min-RSSI on the 6 OFF APs
(615,608,505,517,622,salon). These are the next big airtime levers once disables are validated.
- **5 GHz / DFS / channel-plan:** separate effort (see full audit).
- **Remaining 2.4 levers deferred** (isolate cause/effect; do after disables validate): min-data-rate raise
(1→12 Mbps) and 2.4 min-RSSI on the OFF APs that aren't on excluded floors. (Band-steering `no2ghz_oui`
is already ON for CSCNet/CSC ENT/Guest.)
- **5 GHz tuning + 6 GHz adoption are now Phase 5 & Phase 6** above (folded in per Howard 2026-06-16) —
the next phase after the 2.4 power-down settles.
---