Milesight VS351: LoRaWAN Mini Thermopile-Personenzähler

Milesight VS351 LoRaWAN Thermopile-Personenzähler: eigener ChirpStack/ThingsBoard-Decoder, dekodiertes In/Out-Beispiel und Smart-Retail-Integration.

Milesight VS351
VS351Sensor
LoRaWAN
Class A, OTAA
Band / Port
EU868 / Port 85
Sensorik
Thermopile-IR-Array + Radar
Zählung
Bidirektional rein / raus
Datenschutz
Anonym, kein Bild, DSGVO-freundlich
Stromversorgung
Batterie- oder USB-Type-C-Variante
Konfiguration
NFC (Milesight ToolBox)
Messgrößen

Was misst der VS351?

Gesamt rein / raus

Kumulierte Personenzahl in beide Richtungen seit dem letzten Reset.

Periode rein / raus

Im aktuellen Meldeintervall rein und raus gezählte Personen.

Temperatur

Umgebungstemperatur des Thermopile-Arrays in Grad Celsius.

Batterie / Stromstatus

Batteriestand in Prozent bei der Funkvariante oder Extern-/Lade-Status bei der Type-C-Variante.

Zähl-Alarme

Schwellenalarme auf kumulierte oder Perioden-Zählwerte, außerhalb des regulären Intervalls gesendet.

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 = {};

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

    if (channel === 0x01 && type === 0x75) {          // battery (%)
      data.battery = bytes[i]; i += 1;
    } else if (channel === 0x03 && type === 0x67) {   // temperature (INT16 LE, /10 °C)
      data.temperature = readInt16LE(bytes, i) / 10; i += 2;
    } else if (channel === 0x04 && type === 0xcc) {   // total in / out (UINT16 LE each)
      data.total_in = readUInt16LE(bytes, i);
      data.total_out = readUInt16LE(bytes, i + 2);
      i += 4;
    } else if (channel === 0x05 && type === 0xcc) {   // period in / out (UINT16 LE each)
      data.period_in = readUInt16LE(bytes, i);
      data.period_out = readUInt16LE(bytes, i + 2);
      i += 4;
    } else if (channel === 0xff) {                    // device info (join / power-on)
      i += deviceInfoLen(type);
    } else {
      break;                                          // alarm / history / downlink frames
    }
  }
  return { data: data };
}

function readUInt16LE(b, i) {
  return ((b[i + 1] << 8) | b[i]) & 0xffff;
}
function readInt16LE(b, i) {
  var v = readUInt16LE(b, i);
  return v > 0x7fff ? v - 0x10000 : v;
}
// 0xFF segment lengths from the published byte spec: version 1B, hw/fw/tsl 2B, SN 8B, class/power 1B.
function deviceInfoLen(type) {
  if (type === 0x16) return 8;                        // serial number
  if (type === 0x09 || type === 0x0a || type === 0xff) return 2; // hw / fw / tsl version
  return 1;                                           // ipso version, class, power, reset, status
}

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

Kanalformat: 01 75 Batterie (%), 03 67 Temperatur (INT16 Little-Endian, /10), 04 cc Gesamt rein/raus (zwei UINT16 LE), 05 cc Periode rein/raus (zwei UINT16 LE). Der Kanal 0xFF trägt beim Join und Einschalten die Geräteinfo. Temperatur-Alarme (83 67) und Zähl-Alarme (84/85 cc mit angehängtem Alarm-Byte), historische Batches (20 ce) und Downlink-Antwort-Frames sind konfigurationsabhängig und werden von der Schleife übersprungen; wir ergänzen sie je Einsatz. Für ThingsBoard kommt dieselbe Kanal-Logik in einen Uplink-Converter. Implementiert nach der veröffentlichten Milesight-Byte-Spezifikation.

Uplink (hex)

0175640367000104cc0000000005cc02000000

Decoded JSON

{ "battery": 100, "temperature": 25.6, "total_in": 0, "total_out": 0, "period_in": 2, "period_out": 0 }
Aus der Praxis

Konfiguration & Stolpersteine

Montagehöhe & Winkel

Das Thermopile-Array hat ein festes Sichtfeld, montieren Sie es deshalb in der im Handbuch angegebenen Höhe und Neigung über dem Durchgang. Ein falscher Winkel beschneidet die Erkennungszone und zählt an den Rändern zu wenig.

Richtung der Zähllinie

Stellen Sie die Rein/Raus-Richtung per NFC passend zum echten Durchgangsfluss ein. Ist sie gespiegelt, vertauscht jeder Gesamtwert rein gegen raus und die Auswertung läuft verkehrt herum.

Periode vs. Gesamt-Reset

Periode rein/raus wird je Meldeintervall zurückgesetzt, Gesamt akkumuliert bis zum Löschen. Legen Sie im Dashboard fest, welcher Wert die Besucherkurve speist, damit nicht doppelt gezählt wird.

Anonyme Erkennung

Thermopile- und Radar-Sensorik erfassen kein Bild und keine Identität, das hält die Besucherzählung im DSGVO-Rahmen. Dokumentieren Sie das für Betriebsrat oder Verarbeitungsverzeichnis.

Dein Partner

So unterstützt dich merkaio beim VS351

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

Pre-Staging & Provisioning

Wir konfigurieren den VS351, 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. Es ist ein Standard-LoRaWAN-Gerät der Klasse A, kein Milesight-Gateway und keine Cloud nötig. Sie hinterlegen den Codec im Device-Profile und provisionieren das Gerät per OTAA.
Ja, für ChirpStack und ThingsBoard, implementiert nach der veröffentlichten Milesight-Byte-Spezifikation. Dieselbe Kanal-Logik kommt in einen ThingsBoard-Uplink-Converter.
Bidirektionale Personenzählungen: einen Gesamtwert rein/raus, der akkumuliert, und einen Periodenwert rein/raus je Meldeintervall, dazu eine Umgebungstemperatur und den Batterie- oder Stromstatus. Er erfasst kein Bild.
Die Erkennung ist anonym. Thermopile- und Radar-Sensorik messen Präsenz und Bewegung, ohne ein Bild oder personenbezogene Daten zu erfassen, daher eignet er sich gut für DSGVO-sensible Retail- und Public-Space-Einsätze.
Periode rein/raus ist die Zahl der im aktuellen Meldeintervall gezählten Personen und wird jeden Zyklus zurückgesetzt. Gesamt rein/raus akkumuliert bis zum Löschen, nutzen Sie Periode für Live-Traffic und Gesamt für kumulierte Auswertungen.
Es gibt eine Batterievariante für die komplett kabellose Installation und eine USB-Type-C-Variante für den Dauerbetrieb. Die dekodierte Payload meldet entsprechend entweder einen Batteriestand in Prozent oder einen Extern-/Lade-Status.
Milesight gibt die bidirektionale Zählung mit bis zu rund 95 Prozent Genauigkeit an, ein KI-Algorithmus filtert nebeneinander Gehende und Umkehrer heraus. Montagehöhe, Winkel und die bei der Konfiguration gesetzte Zähllinie bestimmen die Genauigkeit in der Praxis.
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.