LoRaWAN-Paketverlustrate (PER) berechnen und anzeigen

Überblick

LoRaWAN-Frames werden mit einem Frame-Counter versendet. Gehen Frames z. B. durch Kollisionen oder durch schlechte Funkkanalqualität verloren, lässt sich dies an fehlenden Frame-Nummern erkennen. Die Paketverlustrate (PER) gibt an, wie viele der erwarteten Pakete in einem Zeitraum nicht angekommen sind. Im LoRaWAN-Netzmonitoring ist die PER eine etablierte Kenngröße zur Bewertung der Uplink-Qualität und wird häufig zusammen mit RSSI und SNR genutzt, um die Funkverbindung zu überwachen, Störungen oder Kollisionen zu erkennen und die Netzplanung zu unterstützen.

In diesem Best Practice wird beschrieben, wie in einem Gerätetemplate die PER aus dem _raw-Datenpunkt berechnet und anschließend über eine Messuhr mit Schwellenwerten (z. B. hellgrün → orange → rot) visualisiert werden kann. Dazu werden zwei Datenpunkte angelegt: einer sammelt die Frame-Counter und berechnet die PER für die letzten 5, 10 und 25 Pakete; ein zweiter übernimmt den PER-Wert (z. B. für die letzten 25 Pakete) und wird als Messuhr dargestellt.

Voraussetzungen

  • Ein Virtuelles Gerät bzw. Gerätetemplate mit LoRaWAN-Datenquelle, das den _raw-Datenpunkt mit frame_counter liefert.
  • Zugriff auf die Datenpunkt-Konfiguration (z. B. im Gerätetemplate oder im Virtuellen Gerät).

Konfiguration

Datenpunkt zur PER-Berechnung anlegen

Ein neuer Datenpunkt speichert die Frame-Counter der letzten 25 empfangenen Frames und berechnet daraus die PER für die letzten 5, 10 und 25 Pakete.

Einstellung Wert
Titel _LoRaPacketLoss
Quelle Virtuelles Gerät Aggregation – _raw
Anzeigen als Versteckt

JavaScript-Transformer:

module.exports = (data, lastData, meta) => {
    let returnValue = {
        "savedFrameCounters": [],
        "PERLast5": null,
        "PERLast10": null,
        "PERLast25": null
    };
    if (lastData) {
        returnValue.savedFrameCounters = lastData.value.savedFrameCounters;
    }
    returnValue.savedFrameCounters.unshift(data._raw.frame_counter);
    returnValue.PERLast5 = calculateRecentPacketLoss(returnValue.savedFrameCounters, 5);
    returnValue.PERLast10 = calculateRecentPacketLoss(returnValue.savedFrameCounters, 10);
    returnValue.PERLast25 = calculateRecentPacketLoss(returnValue.savedFrameCounters, 25);
    returnValue.savedFrameCounters = returnValue.savedFrameCounters.slice(0, 25);
    return returnValue;
};

function calculateRecentPacketLoss(frameCounters, interval) {
    if (!Array.isArray(frameCounters) || frameCounters.length < 2 || interval < 1) {
        return null;
    }
    const expected = [];
    const received = new Set(frameCounters);
    let count = 0;
    let current = frameCounters[0];
    expected.push(current);
    count++;
    for (let i = 1; i < frameCounters.length && count < interval; i++) {
        const next = frameCounters[i];
        let step;
        if (current > next) {
            step = current - next;
            for (let j = 1; j <= step && count < interval; j++) {
                expected.push(current - j);
                count++;
            }
        } else if (current < next) {
            for (let j = current - 1; j >= 0 && count < interval; j--) {
                expected.push(j);
                count++;
            }
            if (count < interval) {
                expected.push(next);
                count++;
            }
        }
        current = next;
    }
    if (expected.length < interval) {
        return null;
    }
    const trimmedExpected = expected.slice(0, interval);
    const missingFrames = trimmedExpected.filter(f => !received.has(f));
    const per = (missingFrames.length / interval) * 100;
    return per;
}

Der Datenpunkt bleibt versteckt und dient nur als Quelle für die PER-Anzeige. Ein Rejoin des Geräts (Rücksetzen des Frame-Counters) wird in der Logik berücksichtigt.

Datenpunkt zur Anzeige der PER anlegen (Messuhr)

Ein zweiter Datenpunkt liest den PER-Wert aus dem ersten Datenpunkt und wird als Messuhr mit Schwellenwerten dargestellt.

Einstellung Wert
Titel per
Icon wifi
Quelle Virtuelles Gerät Aggregation – _LoRaPacketLoss
Typ number
Anzeigen als Messuhr
Minimalwert 0
Maximalwert 100
Schwellenwerte 33, 66
Nachkommestellen 0
Farbzuordnung hellgrün → orange → rot

JavaScript-Transformer:

module.exports = (data) => {
  return data._lorapacketloss.PERLast25;
};

Damit wird die PER der letzten 25 Pakete in Prozent (0–100) auf der Messuhr angezeigt. Die Schwellenwerte 33 und 66 unterteilen den Bereich in grün (0–33), orange (33–66) und rot (66–100) und eignen sich zur schnellen Einschätzung der Funkqualität.

Verwandte Themen

  • Framecounter – Frame-Counter auslesen und Paketverluste über die Differenz zum letzten Wert erkennen.