Christian Mueller e706b22f31 Add design specification for LoRaWAN Web Portal
Based on Pflichtenheft v2.2, documents the full system design
including daemon, API, frontend, and infrastructure with agreed
deviations (Axum 0.8, SQLx 0.8, Vite 6, Tailwind 4).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 22:27:49 +01:00

246 lines
5.3 KiB
Markdown

# ChirpStack Decoder Fehler beheben
## Problem
```
ERROR: UPLINK_CODEC
description: "decodeUplink returned errors: Invalid payload length"
```
## Lösung 1: Minimaler Decoder verwenden
Der einfachste Weg ist, einen Decoder **ohne Validierung** zu verwenden:
### Schritt-für-Schritt:
1. **Öffne ChirpStack**
2. Gehe zu **Device Profiles**
3. Wähle dein Profil: `LILYGO_1_HC-SR04`
4. Klicke auf **Codec** Tab
5. Wähle **Codec:** `JavaScript`
6. **Lösche** alles im "Uplink decoder" Feld
7. **Kopiere** folgenden Code ein:
```javascript
function decodeUplink(input) {
var bytes = input.bytes;
var distanceMm = (bytes[0] << 8) | bytes[1];
return {
data: {
distance_mm: distanceMm,
distance_cm: distanceMm / 10.0,
distance_m: distanceMm / 1000.0
}
};
}
```
8. **Speichere** das Device Profile
9. **Warte** auf die nächste Uplink-Nachricht (alle 30 Sekunden)
## Lösung 2: Decoder mit Debug-Informationen
Falls Lösung 1 nicht funktioniert, verwende diesen Decoder mit Debug-Ausgabe:
```javascript
function decodeUplink(input) {
var bytes = input.bytes;
var fPort = input.fPort;
// Debug
var hex = "";
for (var i = 0; i < bytes.length; i++) {
hex += bytes[i].toString(16).padStart(2, '0');
}
// Längenprüfung
if (bytes.length !== 2) {
return {
errors: ["Expected 2 bytes, got " + bytes.length + ". Hex: " + hex + ", fPort: " + fPort]
};
}
// Dekodierung
var distanceMm = (bytes[0] << 8) | bytes[1];
return {
data: {
distance_mm: distanceMm,
distance_cm: distanceMm / 10.0,
distance_m: distanceMm / 1000.0,
raw_hex: hex,
bytes_count: bytes.length,
fPort: fPort
}
};
}
```
Dieser Decoder gibt dir zusätzliche Informationen, wenn ein Fehler auftritt.
## Lösung 3: Prüfe die Payload-Länge
### Mögliche Ursachen für "Invalid payload length":
1. **ChirpStack fügt zusätzliche Bytes hinzu**
- Manche ChirpStack-Konfigurationen fügen MAC-Commands zur Payload hinzu
2. **Falsche fPort-Konfiguration**
- Stelle sicher, dass fPort = 1 ist
3. **Alte Decoder-Version**
- Lösche den alten Decoder komplett und füge den neuen ein
### Überprüfung im Serial Monitor:
Schau im Serial Monitor nach, was tatsächlich gesendet wird:
```
Distanz gesendet:
Distanz: 13.9 cm
Distanz: 139.0 mm
Nachricht übertragen.
```
Die Payload sollte genau 2 Bytes sein.
## Lösung 4: ChirpStack v3 vs v4
### Für ChirpStack v4 (aktuell):
```javascript
function decodeUplink(input) {
// ... Code wie oben
}
```
### Für ChirpStack v3 (alt):
```javascript
function Decode(fPort, bytes) {
if (bytes.length !== 2) {
return { error: "Invalid length" };
}
var distanceMm = (bytes[0] << 8) | bytes[1];
return {
distance_mm: distanceMm,
distance_cm: distanceMm / 10.0,
distance_m: distanceMm / 1000.0
};
}
```
**Wichtig:** ChirpStack v3 nutzt `Decode()`, v4 nutzt `decodeUplink()`!
## Testen des Decoders
### Im ChirpStack Web-Interface:
1. Gehe zu **Device Profile****Codec**
2. Scrolle nach unten zu **"Test decoder"** (falls vorhanden)
3. Gib ein:
- **fPort:** `1`
- **Payload (hex):** `008b`
4. Klicke auf **"Test"**
**Erwartetes Ergebnis:**
```json
{
"data": {
"distance_mm": 139,
"distance_cm": 13.9,
"distance_m": 0.139
}
}
```
## Was du in den Events sehen solltest
Nach erfolgreicher Konfiguration siehst du unter **Device → Events**:
### Vorher (Fehler):
```json
{
"level": "ERROR",
"code": "UPLINK_CODEC",
"description": "decodeUplink returned errors: Invalid payload length"
}
```
### Nachher (Erfolg):
```json
{
"deviceName": "00000 - HC-SR04-1",
"devEui": "70b3d57ed005a1b2",
"fPort": 1,
"data": "008b",
"object": {
"distance_mm": 139,
"distance_cm": 13.9,
"distance_m": 0.139
}
}
```
## Häufige Fehler
### 1. Decoder nicht gespeichert
- ❌ Decoder eingefügt, aber nicht auf "Submit" geklickt
- ✅ Immer auf "Submit" oder "Save" klicken!
### 2. Falsches Device Profile
- ❌ Decoder im falschen Device Profile eingetragen
- ✅ Prüfe, welches Profile dein Device nutzt
### 3. ChirpStack-Version verwechselt
-`Decode()` in ChirpStack v4 verwendet
- ✅ ChirpStack v4 braucht `decodeUplink()`
### 4. JavaScript-Fehler
- ❌ Syntaxfehler im Decoder-Code
- ✅ Code exakt wie oben kopieren
### 5. Alte Events angeschaut
- ❌ Alte Uplink-Messages werden nicht neu dekodiert
- ✅ Warte auf neue Uplink (alle 30 Sek)
## Schnelltest
Kopiere diesen **Ultra-Minimal-Decoder** zum Testen:
```javascript
function decodeUplink(input) {
return {
data: {
distance_cm: ((input.bytes[0] << 8) | input.bytes[1]) / 10.0
}
};
}
```
Wenn dieser funktioniert, kannst du ihn später durch einen ausführlicheren ersetzen.
## Support-Informationen sammeln
Falls es immer noch nicht funktioniert, sammle diese Informationen:
1. **ChirpStack Version:**
- Gehe zu ChirpStack → Klicke auf dein Logo/Avatar → "About"
- Notiere die Version (z.B. "ChirpStack v4.8.0")
2. **Fehlermeldung:**
- Kopiere die komplette Fehlermeldung aus den Events
3. **Device Profile Codec:**
- Screenshot von Device Profile → Codec Einstellungen
4. **Payload:**
- Notiere die `frm_payload` aus den Events (z.B. "008b")
5. **Serial Monitor:**
- Kopiere die Ausgabe vom Arduino Serial Monitor
Mit diesen Informationen kann das Problem eingegrenzt werden.