Milesight VS360: LoRaWAN IR-Lichtschranken-Personenzähler

Milesight VS360 LoRaWAN IR-Lichtschranken-Personenzähler: eigener ChirpStack/ThingsBoard-Decoder, dekodiertes Beispiel, In/Out-Zählung und Eingangs-Integration.

Milesight VS360
VS360Sensor
LoRaWAN
Class A, OTAA
Aufbau
Paar aus Master + Node (Sender/Empfänger)
Zählung
IR-Lichtschranke, bidirektional In/Out
Genauigkeit
Bis zu 80 % (Einzeldurchgang)
Durchgangsbreite
1,2 bis 3 m, Montagehöhe 0,7 bis 1,2 m
Batterie
2 x ER14505 Li-SOCl2 je Einheit, mehrere Jahre
Schutzart / Temperatur
IP30, -20 bis +50 °C
Messgrößen

Was misst der VS360?

Total In / Out

Kumulierte Ein- und Ausgänge seit dem letzten Reset (Kanal 04, zwei UINT16LE).

Periode In / Out

Ein- und Ausgänge der aktuellen Meldeperiode (Kanal 05, zwei UINT16LE).

Zähl-Alarme

Schwellwert-Alarme auf Perioden- oder Gesamtzählung, außerhalb des regulären Intervalls gesendet.

Batterie (Master + Node)

Jede gepaarte Einheit meldet ihren eigenen Batteriestand (Kanal 01 und 02).

Events

Manipulation, niedriger Batteriestand und Pairing-Events als diskrete Status-Flags.

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++];

    // Device info on join / power-on (protocol, hw/fw, serial, class)
    if (channel === 0xff) {
      if (type === 0x01) { i += 1; }        // IPSO version
      else if (type === 0x09) { i += 2; }   // hardware version
      else if (type === 0x0a) { i += 2; }   // firmware version
      else if (type === 0x16) { i += 8; }   // serial number
      else if (type === 0x0f) { i += 1; }   // LoRaWAN class
      else if (type === 0xff) { i += 2; }   // TSL version
      else { break; }
    } else if (channel === 0x01 && type === 0x75) {        // battery master (%)
      data.battery_main = bytes[i]; i += 1;
    } else if (channel === 0x02 && type === 0x75) {        // battery node (%)
      data.battery_node = bytes[i]; i += 1;
    } else if (channel === 0x03 && type === 0xf4) {        // event: type + status
      data.event = { type: bytes[i], status: bytes[i + 1] }; i += 2;
    } else if (channel === 0x04 && type === 0xcc) {        // total in / out
      data.total_in = readUInt16LE(bytes, i);
      data.total_out = readUInt16LE(bytes, i + 2); i += 4;
    } else if (channel === 0x84 && type === 0xcc) {        // total in / out + alarm
      data.total_in = readUInt16LE(bytes, i);
      data.total_out = readUInt16LE(bytes, i + 2);
      data.total_count_alarm = bytes[i + 4]; i += 5;
    } else if (channel === 0x05 && type === 0xcc) {        // period in / out
      data.period_in = readUInt16LE(bytes, i);
      data.period_out = readUInt16LE(bytes, i + 2); i += 4;
    } else if (channel === 0x85 && type === 0xcc) {        // period in / out + alarm
      data.period_in = readUInt16LE(bytes, i);
      data.period_out = readUInt16LE(bytes, i + 2);
      data.period_count_alarm = bytes[i + 4]; i += 5;
    } else if (channel === 0x0a && type === 0xef) {        // timestamp (UINT32LE)
      data.timestamp = readUInt32LE(bytes, i); i += 4;
    } else {
      break;
    }
  }
  return { data: data };
}

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

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

Kanalformat: 01 75 Batterie Master (%), 02 75 Batterie Node (%), 04 cc Total In/Out (zwei UINT16LE), 05 cc Periode In/Out, 84/85 cc dasselbe plus ein Zähl-Alarm-Byte, 03 f4 Event (Typ + Status), 0a ef Zeitstempel (UINT32LE). Der Decoder ist aus der veröffentlichten Milesight-Byte-Spezifikation umgesetzt. Historische (Nachhol-)Uplinks auf Kanal 20 ce und Downlink-Response-Frames sind geräteabhängig; wir ergänzen sie pro Deployment. Für ThingsBoard geht dieselbe Kanal-Logik in einen Uplink-Converter.

Uplink (hex)

01756402756304CC0C00000005CC05000200

Decoded JSON

{ "battery_main": 100, "battery_node": 99, "total_in": 12, "total_out": 0, "period_in": 5, "period_out": 2 }
Aus der Praxis

Konfiguration & Stolpersteine

Beide Einheiten paaren

Der VS360 arbeitet als Master plus Node, die sich über dem Durchgang gegenüberstehen. Beide paaren und so ausrichten, dass der IR-Strahl frei ist, dann nur den Master über LoRaWAN registrieren.

Montagehöhe und Breite

Den Durchgang zwischen 1,2 und 3 m breit halten und auf 0,7 bis 1,2 m montieren. Nebeneinander gehende Personen zählen als eine, daher liegt die Genauigkeit bei rund 80 % im Einzeldurchgang.

Total- vs. Periodenzählung

Total-Werte sind kumulativ seit Reset, Perioden-Werte decken ein Intervall ab. Dashboard-Deltas aus den Perioden-Werten bilden und Total nur als laufende Referenz nutzen.

NFC-Einrichtung

Keys, Meldeintervall und Zähl-Alarm-Schwellen werden vor dem Rollout per NFC mit der Milesight-ToolBox-App am Master gesetzt.

Dein Partner

So unterstützt dich merkaio beim VS360

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

Pre-Staging & Provisioning

Wir konfigurieren den VS360, 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. Er ist ein Standard-LoRaWAN-Gerät der Class A, ohne Milesight-Gateway oder -Cloud. Der Codec kommt ins Device Profile, der Master wird per OTAA registriert.
Ja, für ChirpStack und ThingsBoard, umgesetzt aus der veröffentlichten Milesight-Byte-Spezifikation. Dieselbe Kanal-Logik geht in einen ThingsBoard-Uplink-Converter.
Er nutzt zwei gepaarte IR-Lichtschranken-Einheiten, die sich über einem Eingang gegenüberstehen. Die Reihenfolge, in der die Strahlen unterbrochen werden, zeigt an, ob eine Person hinein- oder hinausgeht, daher meldet er getrennte In- und Out-Zählungen.
Bis zu rund 80 % im Einzeldurchgang. Nebeneinander durch den Strahl gehende Personen werden als eine gezählt, daher eignet er sich besser für schmale Eingänge als für weite offene Flächen.
Total In/Out sind kumulativ seit dem letzten Reset, Periode In/Out decken das aktuelle Meldeintervall ab. Für Trend-Dashboards die Perioden-Werte nutzen und Total als laufende Referenz behalten.
Jede Einheit nutzt zwei austauschbare ER14505-Li-SOCl2-Zellen und hält je nach Verkehr und Meldeintervall mehrere Jahre. Master und Node melden jeweils ihren eigenen Batteriestand.
Ja. Zähl-Alarm-Schwellen auf Perioden- oder Gesamtzählung werden per NFC gesetzt und sofort auf Kanal 84/85 gesendet, außerhalb des regulären Intervalls. Dashboard-Regeln sollten sie als Priority-Events behandeln.
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.