function decodeUplink(input) { var bytes = input.bytes; var errors = []; // Sicherheits-Check: Hat das Paket wirklich die erwarteten 10 Bytes? if (bytes.length !== 10) { return { errors: ["Ungültige Paketlänge: Erwartet 10 Bytes, erhalten " + bytes.length] }; } // 1. Unsigned 24-Bit Integer für Latitude zusammensetzen (Bytes 0, 1, 2) var latBin = ((bytes[0] << 16) | (bytes[1] << 8) | bytes[2]) >>> 0; // Rückberechnung laut Arduino-Formel: ((val / 16777215) * 180) - 90 var lat = (latBin / 16777215.0) * 180.0 - 90.0; // 2. Unsigned 24-Bit Integer für Longitude zusammensetzen (Bytes 3, 4, 5) var lonBin = ((bytes[3] << 16) | (bytes[4] << 8) | bytes[5]) >>> 0; // Rückberechnung laut Arduino-Formel: ((val / 16777215) * 360) - 180 var lon = (lonBin / 16777215.0) * 360.0 - 180.0; // 3. Altitude (Höhe) extrahieren (Bytes 6, 7) var alt = (bytes[6] << 8) | bytes[7]; // 4. HDOP extrahieren (Byte 8) und zurückskalieren var hdopValue = bytes[8] / 10.0; // 5. Satellitenanzahl extrahieren (Byte 9) var satsCount = bytes[9]; // Plausibilitäts-Check: Koordinaten von genau 0.0000/0.0000 abfangen if (latBin === 0 && lonBin === 0) { errors.push("GPS-Modul hat noch keinen gültigen Fix (0.0/0.0 empfangen)"); } // Berechnete Schätzung für 'accuracy' in Metern (HDOP * 5) var accuracyMeters = Math.round(hdopValue * 5.0 * 10) / 10; return { data: { latitude: Math.round(lat * 1000000) / 1000000, // Auf 6 Nachkommastellen runden longitude: Math.round(lon * 1000000) / 1000000, // Auf 6 Nachkommastellen runden altitude: alt, hdop: hdopValue, sats: satsCount, accuracy: accuracyMeters }, warnings: errors.length > 0 ? errors : undefined }; }