SYSTEM
Raspberry Pi – TTN GPS-Datenerfassung mit SQLite, Webserver und Statusdisplay
Dieses Projekt beschreibt den Aufbau eines Raspberry Pi als zentrale Datenstation für GPS-Daten aus einem LoRaWAN-/The Things Network (TTN)-System.
Der Raspberry Pi empfängt die von einem LoRaWAN-GPS-Sender übertragenen Daten über TTN MQTT, speichert sie in einer SQLite-Datenbank und stellt sie anschließend über einen Python-Webserver zur Verfügung.
Zusätzlich kann ein 5-Zoll-Monitor direkt am Raspberry Pi zur Anzeige des aktuellen System- und Datenstatus verwendet werden.
Das System läuft auf einem Raspberry Pi OS Lite 64 Bit und verwendet eine angeschlossene SSD als Datenspeicher.
1. Systemübersicht
Der grundsätzliche Datenfluss ist:
GPS / LoRaWAN Sender
│
│ LoRaWAN
▼
The Things Network
│
│ MQTT
▼
Raspberry Pi
│
├── TTN MQTT Logger
│ │
│ ▼
│ SQLite Datenbank
│
├── Flask Webserver
│ │
│ ▼
│ Weboberfläche
│
└── 5" Monitor
│
▼
Statusanzeige
Der Raspberry Pi übernimmt damit mehrere Aufgaben:
- Empfang der TTN-Daten
- Speicherung der GPS-Daten
- Verwaltung der Datenbank
- Bereitstellung einer Weboberfläche
- Statusanzeige auf einem angeschlossenen Monitor
- Speicherung der Daten auf einer SSD
- Netzwerkfreigabe über SMB
- automatischer Start der Hintergrunddienste
2. Hardware
Raspberry Pi
Verwendet wird:
- Raspberry Pi
- Raspberry Pi OS Lite 64 Bit
- Netzwerkverbindung über LAN oder WLAN
- SSH-Zugang
Datenspeicher
Zusätzlich zur SD-Karte wird eine SSD verwendet.
Die SSD wird mit ext4 formatiert und dient als Speicherort für die Projektdaten und die SQLite-Datenbank.
Beispiel:
/dev/sda1
Mountpoint:
/srv/ttn-data
bzw. im späteren OMV-System:
/srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/
Der UUID-Pfad ist systemspezifisch und kann bei einer anderen Installation abweichen.
3. Raspberry Pi OS installieren
Verwendet wird:
Raspberry Pi OS Lite 64 Bit
Nach der Installation:
- SSH aktivieren
- feste IP-Adresse vergeben
- Netzwerkverbindung prüfen
System aktualisieren:
sudo apt update
sudo apt full-upgrade -y
Anschließend:
sudo reboot
4. SSD vorbereiten
Angeschlossene Datenträger anzeigen:
lsblk
Beispiel:
sda
└─sda1
mmcblk0
├─mmcblk0p1
└─mmcblk0p2
Die SSD befindet sich in diesem Beispiel unter:
/dev/sda1
Achtung
Der folgende Befehl löscht den vorhandenen Inhalt der angegebenen Partition:
sudo mkfs.ext4 /dev/sda1
Mountpoint anlegen:
sudo mkdir -p /srv/ttn-data
5. OpenMediaVault installieren
OpenMediaVault wird für die Verwaltung des Datenspeichers und der Netzwerkfreigaben verwendet.
Installation:
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash
Danach:
sudo reboot
Status prüfen:
systemctl status openmediavault-engined
6. Netzwerk nach der OMV-Installation prüfen
Netzwerkinterfaces anzeigen:
ip link
Falls beispielsweise nur
lo
wlan0
vorhanden sind, kann die Netzwerkkonfiguration mit:
sudo omv-firstaid
bearbeitet werden.
Beispiel:
Interface: wlan0
DHCP: YES
SSID + Passwort
7. OpenMediaVault Weboberfläche
Die OMV-Weboberfläche ist anschließend über die IP-Adresse des Raspberry Pi erreichbar.
Beispiel:
http://192.168.178.123
Standardmäßig:
Benutzer: admin
Passwort: openmediavault
Das Standardpasswort sollte nach der ersten Anmeldung geändert werden.
8. OMV-Speicher einrichten
Falls erforderlich, kann die OMV-Konfiguration neu eingelesen werden:
sudo omv-salt stage run deploy
sudo omv-salt deploy run fstab
sudo reboot
Anschließend in OMV:
Datenspeicher
→ Dateisysteme
→ Vorhandenes Dateisystem einhängen
Danach kann unter:
Dienste
→ SMB/CIFS
die Windows-Dateifreigabe eingerichtet werden.
9. SMB-Zugriff
Für den Benutzer pi kann ein Samba-Passwort gesetzt werden:
sudo smbpasswd -a pi
Danach:
sudo systemctl restart smbd
Vorhandene Samba-Benutzer anzeigen:
sudo pdbedit -L
Windows
Falls bereits alte Verbindungen bestehen:
net use * /delete
Danach kann die SMB-Freigabe des Raspberry Pi über Windows verwendet werden.
10. TTN Logger
Der zentrale Bestandteil des Projekts ist der Python-basierte TTN MQTT Logger.
Er übernimmt:
- Verbindung zum The Things Network
- Empfang der MQTT-Nachrichten
- Auswertung der TTN-Daten
- Extraktion der GPS- und Funkdaten
- Speicherung in SQLite
Verwendete Software:
- Python 3
- MQTT
paho-mqtt- SQLite
11. Python vorbereiten
Pakete installieren:
sudo apt update
sudo apt install -y python3-pip python3-venv sqlite3
Projektverzeichnis:
mkdir -p /srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER
Anschließend:
cd /srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER
MQTT-Bibliothek installieren:
pip3 install --break-system-packages paho-mqtt
12. SQLite-Datenbank
Datenbank anlegen:
sqlite3 ttn_data.db
Tabelle erstellen:
CREATE TABLE gps_data (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT,
device_id TEXT,
latitude REAL,
longitude REAL,
altitude REAL,
status INTEGER,
battery REAL,
rssi INTEGER,
snr REAL,
raw_json TEXT,
gateway_id TEXT,
spreading_factor INTEGER,
frequency INTEGER,
unix_time INTEGER
);
SQLite verlassen:
.quit
Datenbank prüfen:
sqlite3 ttn_data.db ".tables"
13. TTN MQTT Verbindung
Der Logger verwendet die MQTT-Schnittstelle von:
eu1.cloud.thethings.network
Port:
1883
Der MQTT-Topic ist beispielsweise:
v3/APP_ID@ttn/devices/+/up
Die Zugangsdaten müssen im Python-Programm eingetragen werden.
Sicherheit
API Keys dürfen niemals öffentlich auf GitHub veröffentlicht werden.
In einer öffentlichen Version sollte beispielsweise stehen:
APP_ID = "DEINE_APP_ID"
API_KEY = "DEIN_TTN_API_KEY"
Alternativ können die Zugangsdaten über Umgebungsvariablen oder eine separate Konfigurationsdatei eingebunden werden.
14. TTN Logger
Die aktuelle Datei:
ttn_logger.py
befindet sich im GitHub-Projekt.
Start zum Testen:
cd /srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER
python3 ttn_logger.py
Bei erfolgreicher Verbindung werden empfangene Daten beispielsweise in dieser Form ausgegeben:
2026-... | device_id | latitude, longitude | SF... | RSSI ...
15. Schreibrechte für SQLite
Die Projektdateien werden dem Benutzer pi zugeordnet:
sudo chown -R pi:users .
Datenbank:
chmod 664 ttn_data.db
Projektverzeichnis:
chmod 775 .
16. TTN Logger als Systemdienst
Damit der Logger nach einem Neustart automatisch gestartet wird, wird ein systemd-Dienst eingerichtet.
Datei erstellen:
sudo nano /etc/systemd/system/ttn_logger.service
Inhalt:
[Unit]
Description=TTN MQTT SQLite Logger
After=network.target
[Service]
Type=simple
User=pi
WorkingDirectory=/srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER
ExecStart=/usr/bin/python3 -u /srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER/ttn_logger.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Danach:
sudo systemctl daemon-reload
Dienst aktivieren:
sudo systemctl enable ttn_logger
Dienst starten:
sudo systemctl start ttn_logger
Status:
systemctl status ttn_logger
Live-Log:
journalctl -u ttn_logger -f
Damit läuft der Logger auch nach einem Neustart des Raspberry Pi automatisch.
17. SQLite optimieren
SQLite öffnen:
sqlite3 ttn_data.db
WAL-Modus aktivieren:
PRAGMA journal_mode=WAL;
Index für Zeitstempel:
CREATE INDEX idx_timestamp ON gps_data(timestamp);
Index für Geräte:
CREATE INDEX idx_device ON gps_data(device_id);
Danach:
.quit
Die Indizes verbessern insbesondere spätere Abfragen nach Zeitraum oder Gerät.
18. Flask-Webserver
Die gespeicherten GPS-Daten können über einen Python-Webserver dargestellt und weiterverarbeitet werden.
Verwendet wird:
- Python
- Flask
- gpxpy
Die aktuelle Datei:
webserver3.py
befindet sich ebenfalls im GitHub-Projekt.
19. Virtuelle Python-Umgebung
Python-Virtualenv installieren:
sudo apt install -y python3-venv
Virtuelle Umgebung erstellen:
python3 -m venv venv
Aktivieren:
source venv/bin/activate
Benötigte Pakete:
pip install gpxpy
pip install flask
20. Webserver starten
Projektverzeichnis:
cd /srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER
Virtuelle Umgebung aktivieren:
source venv/bin/activate
Webserver starten:
python webserver3.py
Der Webserver kann anschließend über den Browser des PCs aufgerufen werden.
21. 5-Zoll-Statusmonitor
Zusätzlich kann ein 5-Zoll-Monitor direkt am Raspberry Pi betrieben werden.
Der Monitor dient zur lokalen Anzeige des aktuellen Daten- und Systemstatus.
22. Raspberry Pi Desktop installieren
Für die lokale grafische Anzeige wird LXDE installiert:
sudo apt update
sudo apt install task-lxde-desktop
Grafischen Systemstart aktivieren:
sudo systemctl set-default graphical.target
Display Manager prüfen:
systemctl status display-manager --no-pager
Installierte Display Manager anzeigen:
dpkg -l | grep -E "lightdm|gdm3|sddm"
Standard-Ziel prüfen:
systemctl get-default
Falls erforderlich:
sudo apt install lightdm
Danach:
sudo systemctl enable lightdm
sudo systemctl start lightdm
Status:
systemctl status lightdm --no-pager
Anschließend:
sudo reboot
23. Monitor-Konfiguration
Die Display-Konfiguration befindet sich unter:
/boot/firmware/config.txt
Die für dieses Projekt verwendete Konfiguration ist Bestandteil des GitHub-Projekts.
Datei:
config.txt
Die Displayparameter können abhängig vom verwendeten Monitor angepasst werden müssen.
24. Statusanzeige
Die lokale Statusanzeige wird durch:
data_status.py
realisiert.
Die aktuelle Version befindet sich im GitHub-Projekt.
Start:
cd /srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER
Virtuelle Umgebung aktivieren:
source venv/bin/activate
Programm starten:
python3 data_status.py
25. Automatischer Start der Statusanzeige
Damit die Statusanzeige nach dem Start des Raspberry Pi automatisch geöffnet wird:
Verzeichnis anlegen:
mkdir -p ~/.config/lxsession/LXDE
Autostart-Datei bearbeiten:
nano ~/.config/lxsession/LXDE/autostart
Eintragen:
@xset s off
@xset -dpms
@xset s noblank
@/srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER/venv/bin/python3 /srv/dev-disk-by-uuid-9a72c610-e381-4060-a696-645a6a3b543f/TTN_LOGGER/data_status.py
Damit wird:
- der Bildschirmschoner deaktiviert
- DPMS deaktiviert
- das automatische Abdunkeln verhindert
- die Statusanzeige automatisch gestartet
26. Projektdateien
Das GitHub-Projekt enthält unter anderem:
TTN_LOGGER/
│
├── README.md
│
├── ttn_logger.py
│
├── webserver3.py
│
├── data_status.py
│
├── ttn_data.db
│
└── config.txt
Die genaue Zusammenstellung kann je nach aktuellem Entwicklungsstand abweichen.
27. Sicherheits- und Datenschutz-Hinweise
Bei einer Veröffentlichung auf GitHub müssen insbesondere folgende Daten geschützt werden:
- TTN API Keys
- MQTT Zugangsdaten
- WLAN Passwörter
- private IP-Adressen
- persönliche GPS-Daten
Insbesondere darf der verwendete TTN API-Key nicht Bestandteil eines öffentlichen GitHub-Repositories sein.
Empfohlen ist beispielsweise eine Konfigurationsdatei:
config_private.py
Diese Datei sollte anschließend über .gitignore vom Repository ausgeschlossen werden:
config_private.py
Die öffentliche Version kann stattdessen eine Beispielkonfiguration enthalten:
config_example.py
28. Verwendete Technologien
| Bereich | Technologie |
|---|---|
| Betriebssystem | Raspberry Pi OS Lite 64 Bit |
| NAS / Storage | OpenMediaVault |
| Netzwerkfreigabe | SMB/CIFS |
| Datenübertragung | LoRaWAN |
| Netzwerk | The Things Network |
| Protokoll | MQTT |
| Programmiersprache | Python |
| Datenbank | SQLite |
| Webserver | Flask |
| GPS-Daten | Latitude / Longitude |
| Export | GPX |
| Dateisystem | ext4 / LittleFS je nach Gerät |
| Display | 5-Zoll HDMI |
| Desktop | LXDE |
| Autostart | systemd / LXDE |
29. Ziel des Projekts
Das Projekt bildet eine kleine, eigenständige Datenplattform für LoRaWAN-GPS-Anwendungen.
Die Architektur trennt dabei die einzelnen Aufgaben:
LoRaWAN
↓
TTN
↓
MQTT
↓
Raspberry Pi
↓
SQLite
├── Webserver
├── GPX / Datenauswertung
└── lokale Statusanzeige
Dadurch können GPS-Daten langfristig gespeichert, ausgewertet und über eine Weboberfläche visualisiert werden.
Der Raspberry Pi fungiert gleichzeitig als Datenspeicher, Datenlogger, Webserver und lokale Anzeigeeinheit.
Projektstatus
Status: funktionsfähiges System / laufende Weiterentwicklung
Das Projekt wurde schrittweise aufgebaut und erweitert. Einzelne Komponenten wie Logger, Webserver und Statusanzeige können unabhängig voneinander weiterentwickelt werden.
github
| Quellen | ttn_logger.py webserver3.py |
| Dateien | Beschreibung, Bilder |
| Repository | joachim-reuter/Raspberry-Pi-TTN-GPS-Datenerfassung: Raspberry Pi – TTN GPS-Datenerfassung mit SQLite, Webserver und Statusdisplay |