Local-network scouting app for the Waterloo EV Challenge (Team 839). Scouts on phones tap a button each time a team crosses start/finish; the server computes lap time and average speed (700 m track length, 50-lap target over the 70 min event). Our Pi pushes live ground speed over WebSocket.
cd "C:\Users\danie\Code Projects\waterloo-ev-scouting"
pip install -r requirements.txt
python app.pyThe server binds to 0.0.0.0:5000. Find the laptop's IP:
ipconfig | findstr IPv4Open on the laptop / share with scouts:
- Dashboard:
http://<laptop-ip>:5000/ - Scout view:
http://<laptop-ip>:5000/scout - Our speed:
http://<laptop-ip>:5000/self
Firewall: the first time you run it, Windows will ask to allow Python through the firewall — pick Private networks so phones on the same WiFi/hotspot can reach it.
pip install "python-socketio[client]"Edit pi_client.py:
SERVER_URL= laptop's IP +:5000WHEEL_DIAMETER_MandGEAR_RATIOfor your drivetrain- While testing without Phoenix 6 hooked up, leave
USE_FAKE_DATA = True— the dashboard will show a varying fake speed so you can verify everything works end-to-end. Flip toFalseand uncomment the Phoenix 6 block inread_motor_real()when ready.
Run:
python pi_client.py- Open
/scouton the phone. - Tap the team you're tracking.
- First LAP tap = starts the timer (no lap time yet — that's just the start line).
- Every subsequent tap records a lap. Lap time + km/h appears immediately and on the dashboard.
- "Undo Last Lap" fixes accidental taps.
One scout per team is the easiest setup. Multiple phones can scout different teams at once.
| File | Purpose |
|---|---|
app.py |
Flask + SocketIO server, all API routes |
schema.sql |
SQLite tables (teams, laps) |
templates/ |
Dashboard, scout, self-telemetry pages |
static/style.css |
Dark theme, big tap targets for phones |
pi_client.py |
Runs on Pi, pushes speed via WebSocket |
scouting.db |
Auto-created on first run |
Stop the server, delete scouting.db, restart. Your custom teams will be lost — re-add them from the scout page.