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.
- 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
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.
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.
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)
01756402756304CC0C00000005CC05000200Decoded JSON
{ "battery_main": 100, "battery_node": 99, "total_in": 12, "total_out": 0, "period_in": 5, "period_out": 2 }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.
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
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.
Ihr Ansprechpartner
Timo Wevelsiep
Gründer, merkaio
15 Minuten, unverbindlich, direkt mit Timo.
Decoder für ChirpStack v4. merkaio ist unabhängiger Integrator und nicht mit Milesight affiliiert.