Private LoRaWAN Lake Monitoring
Setup: Fully self-hosted LoRaWAN telemetry system for a 1.1 ha lake. Sensors floating, data flowing, no cloud, no compromise.
Goals
- Measure water temperature and dissolved oxygen (DO)
- Send data via LoRaWAN (~200–300m range)
- Use my Multitech Conduit (MTCDT-LEU1) as the gateway (Local)
- Run ChirpStack in Docker on a Mac mini (Local)
- Visualize everything in Grafana on my FreeBSD server (Online)
Architecture
[LoRa Node 1] [LoRa Node 2] (Temp) (DO) \ / [LoRaWAN Gateway - MTCDT] | (Semtech UDP) | [Mac mini + ChirpStack] | (MQTT over LAN) | [FreeBSD + InfluxDB + Grafana]
Hardware
- Gateway: Multitech MTCDT-LEU1 – wired via LAN, LTE as fallback
- Sensors: 2× ELV Make-LW-Set-1 + DS18B20 (Temp) + DFRobot DO Sensor
- Power: 18650 Li-Ion + Solar (5V / TP4056)
- Deployment: Waterproof boxes, mounted on floating platform at lake
Backend Stack
- ChirpStack: Running in Docker on macOS (Mac mini)
- Docker Compose: includes Redis, PostgreSQL, Mosquitto
- Data Out: MQTT publishes to LAN (localhost:1883)
Visualization
- Node-RED or Python script subscribes to MQTT
- Writes parsed payload to InfluxDB
- Grafana dashboard for temperature & DO levels
- Optional: alert if DO < 5 mg/L
Security
- Mosquitto secured with username/password
- Only gateway IP allowed to hit UDP port 1700
- Web UI restricted to local net or VPN
Status
- [x] Gateway installed
- [x] ChirpStack up and running (Docker)
- [x] MQTT data flowing
- [ ] Sensor nodes deployed on lake
- [ ] Payload parsing + Influx writer script
Next Up
- Add pH & turbidity sensors
- LoRa downlink to control node sampling rates
- Battery level monitor
- Public display dashboard with read-only API
TBC