Milesight VS133: AI-ToF-Personenzähler (LoRaWAN)

Milesight VS133 AI-ToF-Personenzähler: eigenes ChirpStack-Decoder-Framework für Linien-In/Out und Zonen-Zählung, plus Smart-Retail- und Footfall-Integration.

VS133Sensor
LoRaWAN
Class C, OTAA
Technologie
ToF-Tiefensensor 2. Generation mit KI
Genauigkeit
Bis 99,8 %, anonym (keine Bilder)
Zählung
Linie In/Out, Zonen-Präsenz, Verweildauer
Montage
Deckenmontage, Draufsicht
Stromversorgung
PoE 802.3af oder DC (Class C)
Konfiguration
Web-GUI, Linien und Zonen einzeichnen
Messgrößen

Was misst der VS133?

Linienüberquerungen (In/Out)

Bidirektionale Zählung je gezeichneter Linie, bis zu vier Linien.

Zonen-Präsenz

Aktuelle Personenzahl in bis zu vier gezeichneten Zonen.

Verweildauer

Durchschnittliche und maximale Verweildauer je Zone für Warteschlangen- und Zonen-Analyse.

Demografie

Optionale Unterscheidung Erwachsene/Kinder und Personal-Filter, vollständig anonym.

Verdeckungs-Alarm

Meldet eine blockierte Linsensicht, damit Datenlücken erklärbar sind.

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 = { lines: {}, regions: {} };

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

    // Device info on join / power-on (0xFF segments)
    if (channel === 0xff) { i += deviceInfoLen(type); continue; }

    // Line counters: channels 03/06/09/0C = total IN, 04/07/0A/0D = total OUT.
    // Type 0xD2, value is UINT32 little-endian.
    if (type === 0xd2 && isLineIn(channel)) {
      line(data, lineIndex(channel, IN_BASE)).in = readUInt32LE(bytes, i);
      i += 4; continue;
    }
    if (type === 0xd2 && isLineOut(channel)) {
      line(data, lineIndex(channel, OUT_BASE)).out = readUInt32LE(bytes, i);
      i += 4; continue;
    }

    // Per-line period (channels 05/08/0B/0E, type 0xCC): in + out UINT16 LE.
    if (type === 0xcc && isLinePeriod(channel)) {
      var ln = line(data, lineIndex(channel, PERIOD_BASE));
      ln.period_in = readUInt16LE(bytes, i);
      ln.period_out = readUInt16LE(bytes, i + 2);
      i += 4; continue;
    }

    // Region headcount (channel 0F, type 0xE3): four UINT8 region counts.
    if (channel === 0x0f && type === 0xe3) {
      for (var r = 0; r < 4; r++) region(data, r + 1).count = bytes[i + r];
      i += 4; continue;
    }

    // Region dwell (channel 10, type 0xE4): region id + avg + max (UINT16 LE).
    if (channel === 0x10 && type === 0xe4) {
      var rg = region(data, bytes[i]);
      rg.avg_dwell = readUInt16LE(bytes, i + 1);
      rg.max_dwell = readUInt16LE(bytes, i + 3);
      i += 5; continue;
    }

    // Occlusion / lens-blocked alarm (channel 50, type 0xFC).
    if (channel === 0x50 && type === 0xfc) {
      data.occlusion_alarm = bytes[i + 2];
      i += 3; continue;
    }

    // Unknown channel: stop. Region/child layout is deployment-specific.
    break;
  }
  return { data: data };
}

var IN_BASE = 0x03, OUT_BASE = 0x04, PERIOD_BASE = 0x05;
function isLineIn(c)     { return c === 0x03 || c === 0x06 || c === 0x09 || c === 0x0c; }
function isLineOut(c)    { return c === 0x04 || c === 0x07 || c === 0x0a || c === 0x0d; }
function isLinePeriod(c) { return c === 0x05 || c === 0x08 || c === 0x0b || c === 0x0e; }
function lineIndex(c, base) { return (c - base) / 3 + 1; }

function line(data, n) {
  var key = "line_" + n;
  if (!data.lines[key]) data.lines[key] = {};
  return data.lines[key];
}
function region(data, n) {
  var key = "region_" + n;
  if (!data.regions[key]) data.regions[key] = {};
  return data.regions[key];
}
function readUInt16LE(b, i) { return (b[i + 1] << 8) | b[i]; }
function readUInt32LE(b, i) {
  return ((b[i + 3] << 24) | (b[i + 2] << 16) | (b[i + 1] << 8) | b[i]) >>> 0;
}
function deviceInfoLen(type) {
  // 0xFF segment lengths are firmware-specific (version, SN, downlink ACKs).
  void type; return 1;
}

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

Die VS133-Payload ist konfigurationsabhängig: Wie viele Zähllinien und Zonen Sie in der Web-GUI einzeichnen, entscheidet, welche Kanäle auftauchen, und Multi-Sensor-Setups (Master plus Child) ergänzen einen zweiten Kanalblock. Das ist ein Framework im IPSO-Kanalformat, kein fixer Drop-in: Linienzähler kommen als UINT32 little-endian Summen auf den Kanälen 03/06/09/0C (In) und 04/07/0A/0D (Out), Zonen-Zählung als vier Bytes auf Kanal 0F und die Verweildauer je Zone auf Kanal 10. Wir setzen es nach der veröffentlichten Milesight-Byte-Spezifikation um und passen es an ein echtes Uplink-Telegramm aus dem Einsatz an. Als Class-C-Gerät nimmt die VS133 außerdem Downlinks an, etwa um das Report-Intervall zu setzen oder Zähler zurückzusetzen.

Aus der Praxis

Konfiguration & Stolpersteine

Erst Linien und Zonen einzeichnen

Zähllinien und Zonen werden vor dem Rollout in der Web-GUI konfiguriert. Die Payload trägt nur die aktivierten Kanäle, also zuerst das Layout festlegen, dann den Decoder zuordnen.

Montagehöhe bei Deckenmontage

Das ToF-Sichtfeld ist fest, die Montagehöhe bestimmt also die erfasste Breite. Deckenhöhe vor der Halterungsbestellung gegen die Abdeckungstabelle im Datenblatt prüfen.

Class-C-Versorgung, keine Batterie

Die VS133 läuft über PoE oder DC und hält ihr Empfangsfenster dauerhaft offen. Verkabelung und einen PoE-Switch-Port einplanen, kein Batteriebudget.

Master- und Child-Layout

Verkettete Sensoren für einen breiten Eingang melden einen zweiten Kanalblock (Child-Zählung). Dokumentieren Sie, welcher Knoten Master ist, damit Summen nicht doppelt gezählt werden.

Dein Partner

So unterstützt dich merkaio beim VS133

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

Pre-Staging & Provisioning

Wir konfigurieren den VS133, 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. Sie ist ein normales LoRaWAN-Class-C-Gerät, ein Milesight-Gateway oder eine Cloud sind also nicht nötig. Sie fügen den Codec ins Device-Profil ein und binden das Gerät per OTAA ein, die Zähllinien und Zonen werden in der Web-GUI des Geräts konfiguriert.
Ja, als ChirpStack-v4-Decoder-Framework, umgesetzt nach der veröffentlichten Milesight-Byte-Spezifikation. Da die Kanäle davon abhängen, wie viele Linien und Zonen Sie einzeichnen, passen wir es an und prüfen es gegen ein echtes Uplink aus Ihrem Einsatz, dieselbe Logik wandert in einen ThingsBoard-Uplink-Converter.
Die Payload enthält nur die Zähllinien, Zonen und Verweildauer-Kanäle, die Sie in der Web-GUI tatsächlich aktivieren, und Multi-Sensor-Setups ergänzen einen zweiten Master-plus-Child-Block. Der Decoder ist daher ein Framework, das auf die IPSO-Kanäle abgestimmt ist, kein einzelnes festes Layout.
Ja. Sie nutzt einen Time-of-Flight-Tiefensensor, keine Kamera, meldet also anonyme Zählwerte und Tiefendaten statt identifizierbarer Bilder, was DSGVO-sensible Retail- und Office-Einsätze erleichtert.
Sie ist ein Class-C-Gerät und wird über PoE (802.3af) oder DC versorgt. Sie hält ihr Empfangsfenster dauerhaft für Downlinks offen, ist also netzgespeist und nicht batteriebetrieben.
Neben bidirektionalen Linienüberquerungen meldet sie die aktuelle Personenzahl je Zone, durchschnittliche und maximale Verweildauer je Zone, optional die Unterscheidung Erwachsene/Kinder mit Personal-Filter sowie einen Verdeckungs-Alarm, wenn die Linsensicht blockiert ist.
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.