A proof-of-concept IoT-based system promoting citizen engagement and urban safety through real-time data collection and visualization.
- About the Project
- Key Features
- System Architecture
- Built With
- Getting Started
- Usage
- Project Structure
- Hardware Components
- Communication Protocol
- API Endpoints
- Deployment
- Testing
- Challenges & Solutions
- Results Summary
- License
- Team
- References
SafeWalkMunich is a proof-of-concept IoT-based system developed to promote citizen engagement and enhance urban safety through real-time data collection, visualization, and feedback.
The project focuses on street lighting and nighttime safety in Munich, using mobile IoT sensors mounted on vehicles such as e-scooters and buses to record illumination and environmental data.
Citizens can view lighting conditions and leave geotagged feedback via an interactive web application.
Using mobile IoT sensors mounted on vehicles (e-scooters, buses), the system records:
- π‘ Illumination levels (lux)
- π‘οΈ Temperature
- π§ Humidity
- πΊοΈ GPS coordinates
- π Pressure and environmental parameters
Citizens can:
- π Drop pins on poorly lit areas
- π¬ Leave geotagged comments and feedback
- π View real-time heatmaps and charts
- π³οΈ Participate in community polls
Academic Context: Developed as part of the course GeoSensor Networks and the Internet of Things at the Technical University of Munich, 2025.
π Course Information
- πΊοΈ Interactive Mapping β Real-time heatmaps showing illumination distribution
- π Data Visualization β Charts displaying environmental correlations
- π¬ Citizen Feedback β Geotagged comments and reports
- π³οΈ Community Polls β Engage citizens in urban planning decisions
- π± Responsive Design β Works seamlessly on desktop and mobile
- π Secure API β RESTful backend with MongoDB persistence
- π LoRaWAN Integration β Low-power, long-range IoT communication
- π Real-time Analytics β Correlation analysis between environmental factors
The system follows a layered IoT architecture:
| Layer | Description | Technologies |
|---|---|---|
| Sensing Layer | Data collection from environmental sensors | BME680, VEML7700, GPS (Air530) |
| Network Layer | Low-power, long-range communication | LoRaWAN (TTN, SWM), Cayenne LPP |
| Data Management | Middleware and persistent storage | FROST Server, MongoDB, Mongoose |
| Application Layer | User interfaces and visualizations | React, Express.js, Leaflet, Chart.js |
- React 19.1 β UI library with hooks and Context API
- Vite 6.3 β Lightning-fast build tool
- Leaflet + React-Leaflet β Interactive maps
- Chart.js 4.5 β Data visualization
- ApexCharts β Advanced charting
- Lucide React β Beautiful icons
- Node.js β JavaScript runtime
- Express.js 5.1 β Web framework
- MongoDB 6.17 β NoSQL database
- Mongoose 8.16 β MongoDB ODM
- CORS β Cross-origin resource sharing
- Multer 2.0 β File upload middleware
- Seeeduino LoRaWAN β Microcontroller with LoRa capability
- BME680 β Temperature, humidity, pressure, gas sensor
- VEML7700 β High-sensitivity light sensor
- Air530 GPS Module β Geolocation tracking
- LoRaWAN Protocol β Long-range, low-power communication
- FROST Server β OGC SensorThings API implementation
Before you begin, ensure you have the following installed:
- Node.js (v18.0.0 or higher) β Download
- npm (comes with Node.js) or yarn
- MongoDB (local or cloud instance) β MongoDB Atlas
- Git β Download
-
Clone the repository
git clone https://github.com/yourusername/IoT-Web-platform.git cd IoT-Web-platform -
Install backend dependencies
cd backend npm install -
Install frontend dependencies
cd ../frontend npm install
Create a .env file in the backend directory:
# Server Configuration
PORT=5000
NODE_ENV=production
# CORS Settings (optional)
ALLOWED_ORIGINS=https://munichsafewalk.netlify.app,http://localhost:5173Create a .env file in the frontend directory:
# API Base URL
VITE_API_URL=http://localhost:5000
# For production
# VITE_API_URL=https://your-backend-url.com-
Start the backend server
cd backend npm startThe API will run on
http://localhost:5000 -
Start the frontend development server
cd frontend npm run devThe app will run on
http://localhost:5173
# Build frontend
cd frontend
npm run build
# Preview production build
npm run preview- Frontend: http://localhost:5173
- Backend API: http://localhost:5000
- Live Demo: https://munichsafewalk.netlify.app/
IoT-Web-platform/
βββ backend/
β βββ models/
β β βββ Comment.js # Comment schema
β β βββ Feedback.js # Feedback schema
β β βββ Poll.js # Poll schema
β βββ routes/
β β βββ commentRoutes.js # Comment endpoints
β β βββ feedbackRoutes.js # Feedback endpoints
β β βββ pollRoutes.js # Poll endpoints
β βββ index.js # Entry point (alias for server.js)
β βββ server.js # Express app configuration
β βββ package.json # Backend dependencies
β βββ .env # Environment variables (not in repo)
βββ frontend/
β βββ public/
β β βββ combined_lux_gps.geojson # Sensor data
β βββ src/
β β βββ assets/
β β βββ Charts/
β β β βββ CombinedSensorChart.jsx
β β β βββ EnvironmentalRadialBarCharts.jsx
β β β βββ HumidityRadialBarChart.jsx
β β β βββ IlluminanceRadialBarChart.jsx
β β β βββ PressureRadialBarChart.jsx
β β β βββ TemperatureRadialBarChart.jsx
β β βββ tools/
β β β βββ CommentTool.jsx
β β β βββ feedbackTool.jsx
β β β βββ LightingHeatmapTool.jsx
β β β βββ LightingTool.jsx
β β β βββ PollTool.jsx
β β βββ App.jsx # Main app component
β β βββ Dashboard.jsx # Dashboard page
β β βββ Home.jsx # Landing page
β β βββ PollModal.jsx # Poll modal component
β β βββ FloatingButtons.jsx # Navigation buttons
β β βββ ToolContext.jsx # Context API for tools
β β βββ toolRegistry.jsx # Tool registration
β β βββ main.jsx # Entry point
β β βββ index.css # Global styles
β βββ vite.config.js # Vite configuration
β βββ package.json # Frontend dependencies
β βββ .env # Environment variables (not in repo)
βββ scripts/ # Data processing scripts
βββ LICENSE # GNU GPL v3
βββ README.md # This file
- Seeeduino LoRaWAN (Arduino-compatible with LoRa radio)
- Base Shield V2 (Grove connector interface)
| Sensor | Measurement | Interface |
|---|---|---|
| BME680 | Temperature, Humidity, Pressure, Air Quality | I2C |
| VEML7700 | Ambient Light Intensity (0.0036 - 120k lux) | I2C |
| Air530 GPS | GPS coordinates (latitude, longitude) | UART |
- Li-Po Battery: 3.7V, 2000 mAh
- USB Power Bank: Backup power for extended operation
- Custom 3D-printed case designed in Autodesk Fusion 360
- Weatherproof and mountable on vehicles
- Protocol: LoRaWAN Class A
- Networks:
- SWM (Stadtwerke MΓΌnchen) β Municipal network
- TTN (The Things Network) β Community network
- Frequency: EU868 MHz
- Payload Format: Cayenne LPP (Low Power Payload)
- Data Rate: SF7-SF12 (adaptive)
Sensors β Seeeduino β LoRa Radio β Gateway β TTN/SWM β FROST Server β MongoDB β API β Web App
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/comments |
Retrieve all comments |
| POST | /api/comments |
Create a new comment |
| GET | /api/comments/:id |
Get comment by ID |
| DELETE | /api/comments/:id |
Delete a comment |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/feedbacks |
Retrieve all feedback |
| POST | /api/feedbacks |
Submit new feedback |
| GET | /api/feedbacks/:id |
Get feedback by ID |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/polls |
Retrieve all polls |
| POST | /api/polls |
Create a new poll |
| PUT | /api/polls/:id/vote |
Submit a vote |
| GET | /api/polls/:id/results |
Get poll results |
Base URL (Development): http://localhost:5000
Base URL (Production): [Your deployed backend URL]
- Live URL: https://munichsafewalk.netlify.app/
- Build Command:
npm run build - Publish Directory:
dist - Auto-deploy: Enabled on
mainbranch
- Runtime: Node.js
- Build Command:
npm install - Start Command:
npm start - Environment Variables: Configure in Render dashboard
- Auto-deploy: Enabled on
mainbranch
- Cloud-hosted MongoDB cluster
- Connection: Via
MONGO_URIenvironment variable - Backup: Automated daily backups
- Location: Moosfeld district, Munich, Germany
- Duration: 3-hour nighttime walk
- Date: August 2025
β
LoRaWAN Performance: Stable connectivity throughout test area
β
GPS Accuracy: Β±5 meters
β
Battery Life: 6+ hours continuous operation
β
Sensor Reliability: 99.2% successful readings
β
Data Transmission: 98.7% packet delivery rate
- Real-time monitoring via Grafana dashboards
- Post-processing analysis in web application
- Cross-validation with city lighting infrastructure data
| Challenge | Impact | Solution |
|---|---|---|
| Heavy, non-ergonomic sensor enclosure | Limited deployment mobility | 3D-printed lightweight, ergonomic case |
| Grafana dashboard complexity | Steep learning curve | Reimplemented with Chart.js + ApexCharts |
| Insufficient TSL2561 sensitivity | Poor low-light readings | Upgraded to VEML7700 (120k lux range) |
| GPS coordinate rounding (Cayenne LPP) | Loss of precision | Implemented heatmap visualization |
| Timestamp timezone offset | Data synchronization issues | Reconstructed timing using photo metadata |
- Identified uneven illumination along pedestrian routes.
- Confirmed correlation between temperature drops and humidity peaks near open fields.
- Demonstrated technical feasibility of mobile IoT data collection for citizen-engaged smart-city services.
Distributed under the GNU General Public License v3.0. See LICENSE for more information.
This means you can freely:
- β Use this software for any purpose
- β Modify the source code
- β Distribute copies
- β Distribute modified versions
Conditions:
- π Disclose source code
- π Include original license and copyright
- π State changes made to the code
Group 04 β IoT for Citizen Engagement in Smart Cities (2025)
| Name | Role | GitHub |
|---|---|---|
| Gloria Asenath Kiawa | IoT Hardware & Backend | gloriak9 |
| Margarita Zykova | Data Visualization & Frontend | @go34loj |
Supervisors:
M.Sc. Joseph Mureithi Gitahi, M.Sc. Benedikt Schwab, Univ.-Prof. Dr. rer. nat. Thomas H. Kolbe
For complete citations and bibliography, please refer to:
- π Full Project Report (PDF)
- π Course Website
Made with β€οΈ in Munich π©πͺ
Β© 2025 Technical University of Munich β Group 04 Β· Smart Cities IoT Project