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:

  1. Verbindung zum The Things Network
  2. Empfang der MQTT-Nachrichten
  3. Auswertung der TTN-Daten
  4. Extraktion der GPS- und Funkdaten
  5. 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

BereichTechnologie
BetriebssystemRaspberry Pi OS Lite 64 Bit
NAS / StorageOpenMediaVault
NetzwerkfreigabeSMB/CIFS
DatenübertragungLoRaWAN
NetzwerkThe Things Network
ProtokollMQTT
ProgrammiersprachePython
DatenbankSQLite
WebserverFlask
GPS-DatenLatitude / Longitude
ExportGPX
Dateisystemext4 / LittleFS je nach Gerät
Display5-Zoll HDMI
DesktopLXDE
Autostartsystemd / 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

Quellenttn_logger.py
webserver3.py
DateienBeschreibung, Bilder
Repositoryjoachim-reuter/Raspberry-Pi-TTN-GPS-Datenerfassung: Raspberry Pi – TTN GPS-Datenerfassung mit SQLite, Webserver und Statusdisplay