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>
246 lines
5.3 KiB
Markdown
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.
|