Milesight VS135: Ultra-ToF-LoRaWAN-Personenzähler

Milesight VS135 Ultra-ToF-Personenzähler: eigenes ChirpStack-Decoder-Framework für Linien-, Zonen- und Verweilzeit-Zählung plus Retail-Integration.

Milesight VS135
VS135Sensor
LoRaWAN
Class C, OTAA / ABP
Band
EU868 / US915 / AS923 und weitere
Erfassung
ToF-Tiefe 2. Generation + KI, keine Kamerabilder
Zählgenauigkeit
bis zu 99,8 %
Montagehöhe
2 bis 6,5 m (Hochdecken-Montage)
Stromversorgung
DC 12 V / PoE (netzgespeist, keine Batterie)
Betriebstemperatur
-20 bis +50 °C
Messgrößen

Was misst der VS135?

Linienquerung (rein / raus)

Bis zu vier Zähllinien, kumulierte Personen rein und raus je Linie.

Zonenzählung

Bis zu vier Zonen melden die aktuelle Personenzahl je Bereich.

Verweilzeit

Durchschnittliche und maximale Verweilzeit je Zone zur Warteschlangenanalyse.

Periodenzählung

Personen rein und raus je Meldeintervall, getrennt vom laufenden Gesamtwert.

Multi-Device-Stitching

Master- und Child-Sensoren liefern einen kombinierten Zählwert für breite Eingänge.

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: {}, dwell: {} };

  // Channel groups (IPSO): each counting line uses a fixed triplet of channels.
  var inChns = [0x03, 0x06, 0x09, 0x0c];
  var outChns = [0x04, 0x07, 0x0a, 0x0d];
  var periodChns = [0x05, 0x08, 0x0b, 0x0e];

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

    // Device info on join / power-on: skip with known lengths.
    if (channel === 0xff) {
      if (type === 0x01) { i += 1; }        // protocol version
      else if (type === 0x09) { i += 2; }   // hardware version
      else if (type === 0x16) { i += 8; }   // serial number
      else if (type === 0x1f) { i += 4; }   // firmware version
      else { break; }                       // downlink-response payloads vary
      continue;
    }

    // Line total IN: UINT32 little-endian.
    if (idx(inChns, channel) >= 0 && type === 0xd2) {
      data.lines["line_" + (idx(inChns, channel) + 1) + "_in"] = readUInt32LE(bytes, i);
      i += 4; continue;
    }
    // Line total OUT: UINT32 little-endian.
    if (idx(outChns, channel) >= 0 && type === 0xd2) {
      data.lines["line_" + (idx(outChns, channel) + 1) + "_out"] = readUInt32LE(bytes, i);
      i += 4; continue;
    }
    // Line period IN/OUT: two UINT16 little-endian values.
    if (idx(periodChns, channel) >= 0 && type === 0xcc) {
      var n = idx(periodChns, channel) + 1;
      data.lines["line_" + n + "_period_in"] = readUInt16LE(bytes, i);
      data.lines["line_" + n + "_period_out"] = readUInt16LE(bytes, i + 2);
      i += 4; continue;
    }
    // Region count: four UINT8 head counts.
    if (channel === 0x0f && type === 0xe3) {
      for (var r = 0; r < 4; r++) { data.regions["region_" + (r + 1)] = bytes[i + r]; }
      i += 4; continue;
    }
    // Region dwell time: region id + avg + max (UINT16 little-endian, seconds).
    if (channel === 0x10 && type === 0xe4) {
      var region = bytes[i];
      data.dwell["region_" + region + "_avg"] = readUInt16LE(bytes, i + 1);
      data.dwell["region_" + region + "_max"] = readUInt16LE(bytes, i + 3);
      i += 5; continue;
    }
    // Occlusion / sensor alarm: node id + alarm type.
    if (channel === 0x50 && type === 0xfc) {
      data.alarm = { node: bytes[i + 1], type: bytes[i + 2] };
      i += 3; continue;
    }

    break; // unknown channel: stop, the mapping is deployment-specific
  }
  return { data: data };
}

function idx(arr, v) {
  for (var k = 0; k < arr.length; k++) { if (arr[k] === v) { return k; } }
  return -1;
}
function readUInt16LE(b, i) {
  return ((b[i + 1] << 8) | b[i]) & 0xffff;
}
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 VS135-Payload ist konfigurationsabhängig: Welche Zähllinien, Zonen und Verweilzeit-Kanäle erscheinen, hängt davon ab, wie Sie die Erfassungslinien und Bereiche im Web-GUI einrichten. Linien-Gesamtwerte sind UINT32 little-endian, Zonenzählwerte sind ein Byte je Bereich und Verweilzeiten sind UINT16 in Sekunden. Master- und Child-Sensoren nutzen für das Multi-Device-Stitching getrennte Kanalgruppen. Das ist ein Framework, kein fertiges Drop-in: Wir gleichen die finale Feldzuordnung gegen ein echtes Uplink Ihrer Installation ab. Die LoRaWAN-Version ist Class C und netzgespeist. Für ThingsBoard kommt dieselbe Kanal-Logik in einen Uplink-Converter.

Aus der Praxis

Konfiguration & Stolpersteine

Erst Linien und Zonen zeichnen

Zähllinien und Zonen werden vor dem Rollout über das lokale Wi-Fi-Web-GUI konfiguriert. Die Kanäle im Uplink existieren nur für die Linien und Bereiche, die Sie tatsächlich definieren.

Automatische Höhenerkennung

Der Sensor erkennt seine Montagehöhe selbst. Montieren Sie ihn waagerecht und innerhalb von 2 bis 6,5 m, da eine schräge oder unzulässige Montage die Tiefengenauigkeit verschlechtert.

Master- und Child-Stitching

Für breite Eingänge mehrere Geräte koppeln. Child-Sensoren melden unter eigener Kanalgruppe, daher müssen Decoder und Dashboard Master- und Child-Werte summieren.

Class-C-Stromversorgung

Die LoRaWAN-Version läuft über DC 12 V oder PoE und hält ihr Empfangsfenster offen. Planen Sie eine Dauerversorgung ein, das ist kein Batteriesensor.

Dein Partner

So unterstützt dich merkaio beim VS135

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

Pre-Staging & Provisioning

Wir konfigurieren den VS135, 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. Die LoRaWAN-Version ist ein Standard-Class-C-Gerät, es ist kein Milesight-Gateway und keine Cloud nötig. Sie hinterlegen den Codec im Device-Profil und binden das Gerät per OTAA ein.
Ja, umgesetzt nach der veröffentlichten Milesight-Byte-Spezifikation. Da die Payload von Ihrer Linien- und Zonenkonfiguration abhängt, liefern wir ein Decoder-Framework und gleichen die genaue Feldzuordnung gegen ein echtes Uplink ab. Dieselbe Logik kommt in einen ThingsBoard-Uplink-Converter.
Das Uplink trägt nur die Zähllinien, Zonen und Verweilzeit-Bereiche, die Sie im Web-GUI definieren, jeweils auf eigener Kanalgruppe. Der Decoder liest die jeweils vorhandenen Kanäle, daher validieren wir ihn gegen Ihre Installation statt ein festes Drop-in auszuliefern.
Ja. Er nutzt ToF-Tiefenerfassung der 2. Generation mit KI-Algorithmus und speichert keine Kamerabilder, somit liefert er anonyme Personenzähl-Analytik ohne identifizierbare Aufnahmen.
Linienquerungs-Zählung (Personen rein und raus) auf bis zu vier Linien, aktuelle Personenzahl in bis zu vier Zonen sowie durchschnittliche und maximale Verweilzeit je Zone für Warteschlangen- und Belegungsanalyse.
Nein. Die LoRaWAN-Version ist über DC 12 V oder PoE netzgespeist und arbeitet als Class-C-Gerät, sie benötigt also eine Dauerversorgung statt einer Batterie.
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.