RisalDash RisalDash

Project · Wi-Fi · Site survey

Map where your Wi-Fi actually is

“The Wi-Fi is bad in the corner” is a feeling; −82 dBm at 41.3110, 69.2401 is a fact. Carry an ESP32 around the site and it reports the live RSSI of the link it's actually on, drops the reading on a map, grades it Excellent/OK/WEAK and logs every dead zone with its position — a phone-watchable site survey for a few dollars.

ProjectWi-FiRSSISurveyESP32
ESP32 Wi-Fi site survey project: RSSI mapped by GPS position with a live dashboard

The measurement — RSSI of the link you care about

WiFi.RSSI() returns the strength of the connection the board is actually using — which is exactly what a survey should measure, not a scan of every network in the air. A simple mapping turns dBm into an intuitive percentage, and a three-step grade drives the badge and the weak-zone log:

// The real measurement: this board's link to the AP, right where it stands.
long r = WiFi.RSSI();
if (r != 0 && r > -127) rssi = r;

// Map dBm to an intuitive 0-100 % (−50 dBm and better = 100, −100 dBm = 0).
quality = rssi >= -50 ? 100 : (rssi <= -100 ? 0 : 2.0f * (rssi + 100));

// Grade it, and log weak zones WITH their position:
int g = rssi > -60 ? 0 : (rssi > -75 ? 1 : 2);
if (g == 2 && grade != 2)
  evlog->print("WEAK " + String((int)rssi) + " dBm @ " + String(lat, 4) + "," + String(lon, 4));
RSSIGradeWhat it means in practice
−30…−60 dBmExcellentfull speed, video calls anywhere
−60…−75 dBmOKbrowsing fine, IoT fine
−75…−90 dBmWEAKdrops, retries — move the AP or add a node

The place — a marker for every reading

A number without a location is half a survey. Outdoors, a NEO-6M GPS pins each reading; the map widget draws the moving marker live. Indoors GPS won't help — just watch the RSSI stat and trend as you walk room to room; the weak-zone log still timestamps every dip:

dash.layout("Survey", RICON_WIFI);
dash.map("Position", &lat, &lon);              // where this reading was taken
dash.stat("RSSI", &rssi, "dBm");
dash.gauge("Quality", &quality, 0, 100, "%").variant("bar");
dash.badge("Signal", &grade).labels("Excellent", "OK", "WEAK");
dash.chart("RSSI trend", &rssi, "dBm");        // the survey trace
evlog = &dash.log("Weak zones", 5);
dash.begin(WIFI_SSID, WIFI_PASS);              // STA — we measure THIS link

The shipped example (examples/04_Templates/WifiSurvey) is honest about what's real: RSSI is live on any board from the first boot; the GPS is RisalFakeGPS replaying a walk route, so the whole survey works on the bench. For real outdoor mapping, feed lat/lon from TinyGPS++ — the wiring and NMEA parsing are in the GPS tracker build.

Survey tactics

Walk slow — RSSI is averaged and lags a second or two. Survey at desk height, not floor. Repeat the loop twice and trust the worse pass (people and doors move). And when you find the dead corner, the fix is usually the AP's position, not its power: relocate first, extend second. What the dBm numbers mean physically — antennas, walls, 2.4 vs 5 GHz — is in the wireless guide.

RSSI is live from the first boot — the GPS can stay fake until you go outside.