Milesight VS121: KI-Belegungssensor & People Counter

Milesight VS121 KI-Belegungssensor: DSGVO-konformes People Counting, eigenes ChirpStack-Decoder-Framework, Regionen-/Linienzählung, Smart-Office-Integration.

Milesight VS121
VS121Sensor
LoRaWAN
Class A, OTAA
Sensor
KI-ToF-Kamera, anonym (keine Bilder)
Abdeckung
Bis ~127 m² bei Deckenmontage
Regionen
Bis zu 16 frei definierbare Zählregionen
Genauigkeit
Bis zu 95 % Belegungserkennung
Stromversorgung
PoE oder DC, optional WLAN/Ethernet
Konfiguration
Web-GUI / Milesight ToolBox
Messgrößen

Was misst der VS121?

Personenzahl (gesamt)

Aktuelle Belegung im Sichtfeld plus ein periodisches Maximum.

Regionsbelegung

Belegt/frei-Status je Region und Personenzahl pro Region für bis zu 16 Zonen.

Ein-/Ausgang-Zählung

Kumulierte Personen rein und raus für Eingangs- und Korridorfluss.

Linienüberquerung

Gerichtete Line-In-/Line-Out-Zählung, wenn die Linienerkennung aktiv ist.

Verweildauer

Durchschnittliche und maximale Verweildauer je Region für die Auslastungsanalyse.

Daten ins Dashboard

Integration

Sensor / Controller

Misst oder steuert vor Ort und sendet LoRaWAN-Uplinks.

LoRaWAN-Gateway

Empfängt die Funkpakete und reicht sie an den Server weiter.

ChirpStack

Network-Server: verwaltet Sessions und decodiert das Payload.

ThingsBoard / Grafana

Dashboards, Alarme, Regeln und Reports.

ChirpStack v4 · decodeUplink
function decodeUplink(input) {
  var bytes = input.bytes;
  var data = { regions: {} };

  for (var i = 0; i < bytes.length; ) {
    var channel = bytes[i++];
    var type = bytes[i++];

    // Device info (join / power-on): version, serial, hw/fw
    if (channel === 0xff) {
      if (type === 0x01) { data.protocol_version = bytes[i]; i += 1; }
      else if (type === 0x08) { i += 6; }   // serial number
      else if (type === 0x09) { i += 2; }   // hardware version
      else if (type === 0x1f) { i += 4; }   // firmware version
      else { break; }
      continue;
    }

    // People counter: total + region count + 16-bit region occupancy mask (UINT16 BE)
    if (channel === 0x04 && type === 0xc9) {
      data.people_count_all = bytes[i];
      var regionCount = bytes[i + 1];
      var mask = readUInt16BE(bytes, i + 2);
      for (var r = 0; r < regionCount; r++) {
        data.regions["region_" + (r + 1)] = (mask >> r) & 1;
      }
      i += 4; continue;
    }

    // Cumulative people in / out (INT16 LE)
    if (channel === 0x05 && type === 0xcc) {
      data.people_in = readInt16LE(bytes, i);
      data.people_out = readInt16LE(bytes, i + 2);
      i += 4; continue;
    }

    // Periodic maximum people count
    if (channel === 0x06 && type === 0xcd) {
      data.people_count_max = bytes[i];
      i += 1; continue;
    }

    // Total people in / out (UINT16 LE)
    if (channel === 0x0d && type === 0xcc) {
      data.people_total_in = readUInt16LE(bytes, i);
      data.people_total_out = readUInt16LE(bytes, i + 2);
      i += 4; continue;
    }

    // Dwell time: region (1) + avg (UINT16) + max (UINT16)
    if (channel === 0x0e && type === 0xe4) {
      data.dwell_region = bytes[i];
      data.dwell_time_avg = readUInt16LE(bytes, i + 1);
      data.dwell_time_max = readUInt16LE(bytes, i + 3);
      i += 5; continue;
    }

    // Timestamp (UINT32 LE)
    if (channel === 0x0f && type === 0x85) {
      data.timestamp = readUInt32LE(bytes, i);
      i += 4; continue;
    }

    // Directional line in / out (UINT16 LE)
    if (channel === 0x10 && type === 0xf7) {
      data.line_in = readUInt16LE(bytes, i);
      data.line_out = readUInt16LE(bytes, i + 2);
      i += 4; continue;
    }

    // Region counters (0x07/0x08, type 0xd5): 8 bytes, one per region
    if ((channel === 0x07 || channel === 0x08) && type === 0xd5) {
      var base = channel === 0x07 ? 0 : 8;
      for (var k = 0; k < 8; k++) {
        data.regions["region_" + (base + k + 1) + "_count"] = bytes[i + k];
      }
      i += 8; continue;
    }

    // A/B/C/D flow matrices (0x09-0x0c, type 0xda): 4 x UINT16 LE
    if (channel >= 0x09 && channel <= 0x0c && type === 0xda) {
      i += 8; continue;
    }

    // Unknown / history / downlink-response channel: stop here
    break;
  }
  return { data: data };
}

function readUInt16LE(b, i) {
  return ((b[i + 1] << 8) | b[i]) & 0xffff;
}
function readUInt16BE(b, i) {
  return ((b[i] << 8) | b[i + 1]) & 0xffff;
}
function readInt16LE(b, i) {
  var v = readUInt16LE(b, i);
  return v > 0x7fff ? v - 0x10000 : v;
}
function readUInt32LE(b, i) {
  return ((b[i+3]<<24)|(b[i+2]<<16)|(b[i+1]<<8)|b[i]) >>> 0;
}

Implementiert nach der veröffentlichten Milesight-Byte-Spezifikation (Communication Protocol / User Guide).

Die VS121-Payload ist konfigurationsabhängig: welche Kanäle erscheinen, hängt davon ab, welche Funktionen Sie in der Web-GUI aktivieren (Personenzählung, Regionenzählung, Linienerkennung, A/B/C/D-Fluss, Verweildauer, History). Kernkanäle sind 04 C9 Personenzahl plus eine 16-Bit-Regionsmaske, 05 CC Personen rein/raus, 06 CD periodisches Maximum, 10 F7 gerichtete Linienzählung und 0E E4 Verweildauer. Das ist ein Framework, umgesetzt nach der veröffentlichten Milesight-Byte-Spezifikation, kein fester Drop-in: aktivieren Sie nur die Kanäle, die Sie berichten, und prüfen Sie den finalen Decoder gegen einen realen Uplink aus Ihrem Deployment. Für ThingsBoard wandert dieselbe Kanal-Logik in einen Uplink-Converter.

Aus der Praxis

Konfiguration & Stolpersteine

Montagehöhe & Abdeckung

Die Deckenhöhe bestimmt direkt die abgedeckte Fläche und die Zählgenauigkeit. Halten Sie sich an die Höhe-zu-Abdeckung-Tabelle im User Guide und halten Sie das Sichtfeld frei von Hindernissen.

Regionen & Linien zeichnen

Zählregionen und Erkennungslinien werden in der Web-GUI gezeichnet. Dokumentieren Sie jeden Regionsindex, damit die Dashboard-Labels zu den physischen Zonen im decodierten JSON passen.

Privacy by Design

Der VS121 verarbeitet das ToF-Bild auf dem Gerät und sendet nur Zählwerte, niemals Bilder. Das hält Deployments DSGVO-freundlich. Halten Sie die Firmware aktuell, damit die On-Device-Verarbeitung gepatcht bleibt.

Backhaul-Wahl

Der Sensor kann über LoRaWAN, WLAN oder Ethernet berichten. Für ChirpStack nutzen Sie den LoRaWAN-Uplink; wenn Sie zusätzlich Ethernet/WLAN aktivieren, vermeiden Sie Doppelzählungen im Dashboard.

Dein Partner

So unterstützt dich merkaio beim VS121

Von der Beschaffung bis zum laufenden Betrieb, alles aus einer Hand und auf eigener europäischer Infrastruktur.

Pre-Staging & Provisioning

Wir konfigurieren den VS121, setzen Keys, Intervalle und Alarme und liefern einsatzbereit aus.

Eigener Decoder

Payload-Codec für ChirpStack v4 und ThingsBoard, nach der Milesight-Spezifikation implementiert.

Integration ins Dashboard

Die Daten landen in deinem ThingsBoard oder Grafana, inklusive Alarmen und Reports.

Betrieb & Monitoring

Wir betreiben LoRaWAN-Stack und Dashboards auf europäischer Infrastruktur, du nutzt nur die Daten.

Häufige Fragen

Ja. Über LoRaWAN ist er ein Standard-Class-A-Gerät, keine Milesight-Cloud nötig. Sie hinterlegen den Codec im Device-Profile und provisionieren ihn per OTAA. Alternativ kann er über Ethernet oder WLAN berichten, wenn Sie ein kabelgebundenes Backhaul bevorzugen.
Ja. Wir liefern ein Decoder-Framework für ChirpStack und ThingsBoard, umgesetzt nach der veröffentlichten Milesight-Byte-Spezifikation. Da die Payload konfigurationsabhängig ist, aktivieren wir die Kanäle, die Sie tatsächlich berichten, und prüfen es gegen einen realen Uplink.
Die empfangenen Bytes hängen davon ab, welche Funktionen in der Web-GUI aktiv sind: Personenzählung, bis zu 16 Regionszähler, Linienerkennung, A/B/C/D-Fluss und Verweildauer. Das Framework deckt die dokumentierten Kanäle ab, und wir schneiden es auf Ihre Konfiguration zu.
Er ist auf Datenschutz ausgelegt: Die KI-ToF-Verarbeitung läuft auf dem Gerät, und es werden nur anonyme Zählwerte übertragen, keine Bilder verlassen den Sensor. Das macht ihn für Büros und öffentliche Bereiche geeignet, wo eine kamerabasierte Zählung ein Problem wäre.
Gesamtbelegung, Belegt/frei-Status und Personenzahl je Region für bis zu 16 Regionen, kumulierte Personen rein/raus, gerichtete Linienüberquerungen, ein periodisches Maximum und die Verweildauer je Region.
Er wird über PoE oder DC versorgt und an der Decke montiert. Die Abdeckung reicht je nach Montagehöhe bis etwa 127 Quadratmeter, mit bis zu 95 Prozent Genauigkeit bei der Belegungserkennung.
Aus derselben Serie

Verwandte Geräte

Sprechen wir über Ihre Infrastruktur. Digital und vor Ort.

Ob IoT-Plattformentwicklung, Hardwareauswahl, Managed Hosting für ChirpStack, ThingsBoard, Grafana oder NetBird VPN, oder Migration von einem Self-Hosted-Setup - wir finden die passende Lösung für Ihren Anwendungsfall. Buchen Sie ein kostenloses 30-Minuten-Gespräch, unverbindlich.

Timo Wevelsiep

Ihr Ansprechpartner

Timo Wevelsiep

Gründer, merkaio

15 Minuten, unverbindlich, direkt mit Timo.

Mit dem Absenden stimmen Sie unserer Datenschutzerklärung zu.

Decoder für ChirpStack v4. merkaio ist unabhängiger Integrator und nicht mit Milesight affiliiert.