Skip to content

Review a Wi-Fi site survey and roaming decisions

Evaluate roaming, airtime, and operations evidence by comparing a seeded walk-path survey with threshold and hysteresis decisions.

Record the input, rule, output and unresolved evidence before making a release or site decision., your practice guide

Record the input, rule, output and unresolved evidence before making a release or site decision.
Predict the reading, then compare it with the measurement.

Python 3 in your browser (JupyterLite)

Python · no install

Evaluate roaming, airtime, and operations evidence by comparing a seeded walk-path survey with threshold and hysteresis decisions.

Tier 2 · Web · paste-in setup · No account

Version tested: Python 3.12.7 / Pyodide 0.27.6 in JupyterLite 0.6.4; Chromium 148.0.7778.96; captureSource playwright:jupyterlite. Date: 2026-10-08.

Open the notebook in your browser and run each Python cell; no install or account is needed.

Three ways to run: use JupyterLite here with no install; run main.py locally from the downloadable lab folder; or open the same notebook in Google Colab.

Open in your browser (new tab)

Steps

Screens captured against Python 3 in your browser (JupyterLite) Python 3.12.7 / Pyodide 0.27.6 in JupyterLite 0.6.4; Chromium 148.0.7778.96; captureSource playwright:jupyterlite on 2026-10-08; the tool may have moved on — the text steps are the contract.

  1. 1 Step 1

    Do
    In the notebook editor, inspect the notebook input cell and run step 1 to see the synthetic walk path.
    You will see
    The walk-path table lists 9 positions and RSSI in dBm for AP-A, AP-B and AP-C.
    Why it matters
    A named position and AP identity make the candidate signal difference inspectable before applying a roaming rule.
    JupyterLite notebook step 1 showing executed Python and the observed output.
    Step 1 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  2. 2 Step 2

    Do
    In the notebook editor, run step 2 in the notebook and inspect the threshold and hysteresis rule.
    You will see
    The rule prints threshold=-67 dBm and hysteresis=6 dB, then lists the selected AP at each position.
    Why it matters
    A candidate must improve the RSSI by 6 dB once the serving AP is weak; the client owns this decision.
    JupyterLite notebook step 2 showing executed Python and the observed output.
    Step 2 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  3. 3 Step 3

    Do
    In the notebook editor, run step 3 in the notebook and inspect the roam event list.
    You will see
    The event list names the old AP, new AP, position and RSSI difference for every switch.
    Why it matters
    A roam event is a rule output for these sampled readings; it is not a packet-loss measurement.
    JupyterLite notebook step 3 showing executed Python and the observed output.
    Step 3 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  4. 4 Step 4

    Do
    In the notebook editor, run step 4 in the notebook and inspect the sticky-client comparison.
    You will see
    At the boundary the current AP remains selected despite a better candidate; a zero-hysteresis comparison switches earlier.
    Why it matters
    This exposes a cost of hysteresis: delaying a switch can leave a client on a weaker AP.
    JupyterLite notebook step 4 showing executed Python and the observed output.
    Step 4 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  5. 5 Step 5

    Do
    In the notebook editor, run step 5 in the notebook and inspect the ping-pong trace.
    You will see
    Alternating close AP readings switch repeatedly with zero hysteresis and remain stable with 6 dB hysteresis.
    Why it matters
    A deadband can suppress repeated switching in a noisy overlap zone.
    JupyterLite notebook step 5 showing executed Python and the observed output.
    Step 5 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)
  6. 6 Step 6

    Do
    In the notebook editor, run step 6 in the notebook and inspect the decision and limits.
    You will see
    The result card records the chosen rule, sticky case, ping-pong counts and a field-test gap.
    Why it matters
    A real acceptance needs device-specific roam logs, packet continuity and measured RSSI at the site.
    JupyterLite notebook step 6 showing executed Python and the observed output.
    Step 6 · Python 3 in your browser (JupyterLite); numbered callout added to a real capture. Enlarge screenshot (new tab)

Chapter checks

These questions refer to the chapter’s examples. Use the return links to review their answers.

  1. Why should Wi-Fi architecture reviews separate stationary-device reconnect evidence from mobile-device roaming evidence?

    Return to the chapter’s knowledge check
  2. A station joins an access point but cannot reach the local service. Which map helps locate the break?

    Return to the chapter’s knowledge check

Caution

These synthetic RSSI readings and a simple client rule do not establish actual device roaming, packet continuity, or site coverage.

Return to Wi-Fi Network Topologies · Browse Labs