Milesight VS121: KI-Belegungssensor & People Counter
Milesight VS121 KI-Belegungssensor: DSGVO-konformes People Counting, eigenes ChirpStack-Decoder-Framework, Regionen-/Linienzählung, Smart-Office-Integration.
- LoRaWAN
- Class A, OTAA
- Sensor
- KI-ToF-Kamera, anonym (keine Bilder)
- Abdeckung
- Bis ~127 m² bei Deckenmontage
- Regionen
- Bis zu 16 frei definierbare Zählregionen
- Genauigkeit
- Bis zu 95 % Belegungserkennung
- Stromversorgung
- PoE oder DC, optional WLAN/Ethernet
- Konfiguration
- Web-GUI / Milesight ToolBox
Was misst der VS121?
Personenzahl (gesamt)
Aktuelle Belegung im Sichtfeld plus ein periodisches Maximum.
Regionsbelegung
Belegt/frei-Status je Region und Personenzahl pro Region für bis zu 16 Zonen.
Ein-/Ausgang-Zählung
Kumulierte Personen rein und raus für Eingangs- und Korridorfluss.
Linienüberquerung
Gerichtete Line-In-/Line-Out-Zählung, wenn die Linienerkennung aktiv ist.
Verweildauer
Durchschnittliche und maximale Verweildauer je Region für die Auslastungsanalyse.
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 = { regions: {} };
for (var i = 0; i < bytes.length; ) {
var channel = bytes[i++];
var type = bytes[i++];
// Device info (join / power-on): version, serial, hw/fw
if (channel === 0xff) {
if (type === 0x01) { data.protocol_version = bytes[i]; i += 1; }
else if (type === 0x08) { i += 6; } // serial number
else if (type === 0x09) { i += 2; } // hardware version
else if (type === 0x1f) { i += 4; } // firmware version
else { break; }
continue;
}
// People counter: total + region count + 16-bit region occupancy mask (UINT16 BE)
if (channel === 0x04 && type === 0xc9) {
data.people_count_all = bytes[i];
var regionCount = bytes[i + 1];
var mask = readUInt16BE(bytes, i + 2);
for (var r = 0; r < regionCount; r++) {
data.regions["region_" + (r + 1)] = (mask >> r) & 1;
}
i += 4; continue;
}
// Cumulative people in / out (INT16 LE)
if (channel === 0x05 && type === 0xcc) {
data.people_in = readInt16LE(bytes, i);
data.people_out = readInt16LE(bytes, i + 2);
i += 4; continue;
}
// Periodic maximum people count
if (channel === 0x06 && type === 0xcd) {
data.people_count_max = bytes[i];
i += 1; continue;
}
// Total people in / out (UINT16 LE)
if (channel === 0x0d && type === 0xcc) {
data.people_total_in = readUInt16LE(bytes, i);
data.people_total_out = readUInt16LE(bytes, i + 2);
i += 4; continue;
}
// Dwell time: region (1) + avg (UINT16) + max (UINT16)
if (channel === 0x0e && type === 0xe4) {
data.dwell_region = bytes[i];
data.dwell_time_avg = readUInt16LE(bytes, i + 1);
data.dwell_time_max = readUInt16LE(bytes, i + 3);
i += 5; continue;
}
// Timestamp (UINT32 LE)
if (channel === 0x0f && type === 0x85) {
data.timestamp = readUInt32LE(bytes, i);
i += 4; continue;
}
// Directional line in / out (UINT16 LE)
if (channel === 0x10 && type === 0xf7) {
data.line_in = readUInt16LE(bytes, i);
data.line_out = readUInt16LE(bytes, i + 2);
i += 4; continue;
}
// Region counters (0x07/0x08, type 0xd5): 8 bytes, one per region
if ((channel === 0x07 || channel === 0x08) && type === 0xd5) {
var base = channel === 0x07 ? 0 : 8;
for (var k = 0; k < 8; k++) {
data.regions["region_" + (base + k + 1) + "_count"] = bytes[i + k];
}
i += 8; continue;
}
// A/B/C/D flow matrices (0x09-0x0c, type 0xda): 4 x UINT16 LE
if (channel >= 0x09 && channel <= 0x0c && type === 0xda) {
i += 8; continue;
}
// Unknown / history / downlink-response channel: stop here
break;
}
return { data: data };
}
function readUInt16LE(b, i) {
return ((b[i + 1] << 8) | b[i]) & 0xffff;
}
function readUInt16BE(b, i) {
return ((b[i] << 8) | b[i + 1]) & 0xffff;
}
function readInt16LE(b, i) {
var v = readUInt16LE(b, i);
return v > 0x7fff ? v - 0x10000 : v;
}
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 VS121-Payload ist konfigurationsabhängig: welche Kanäle erscheinen, hängt davon ab, welche Funktionen Sie in der Web-GUI aktivieren (Personenzählung, Regionenzählung, Linienerkennung, A/B/C/D-Fluss, Verweildauer, History). Kernkanäle sind 04 C9 Personenzahl plus eine 16-Bit-Regionsmaske, 05 CC Personen rein/raus, 06 CD periodisches Maximum, 10 F7 gerichtete Linienzählung und 0E E4 Verweildauer. Das ist ein Framework, umgesetzt nach der veröffentlichten Milesight-Byte-Spezifikation, kein fester Drop-in: aktivieren Sie nur die Kanäle, die Sie berichten, und prüfen Sie den finalen Decoder gegen einen realen Uplink aus Ihrem Deployment. Für ThingsBoard wandert dieselbe Kanal-Logik in einen Uplink-Converter.
Einsatzszenarien
Smart Office & Desk Sharing
Live-Belegung von Meetingräumen, Arbeitsplätzen und Zonen für die Flächenplanung.
MehrRetail-Frequenzmessung
Anonyme Personenzählung und Flussanalyse über Verkaufsbereiche.
MehrGebäudeeffizienz
HVAC und Beleuchtung nach echter Belegung statt nach festen Zeitplänen steuern.
MehrKonfiguration & Stolpersteine
Montagehöhe & Abdeckung
Die Deckenhöhe bestimmt direkt die abgedeckte Fläche und die Zählgenauigkeit. Halten Sie sich an die Höhe-zu-Abdeckung-Tabelle im User Guide und halten Sie das Sichtfeld frei von Hindernissen.
Regionen & Linien zeichnen
Zählregionen und Erkennungslinien werden in der Web-GUI gezeichnet. Dokumentieren Sie jeden Regionsindex, damit die Dashboard-Labels zu den physischen Zonen im decodierten JSON passen.
Privacy by Design
Der VS121 verarbeitet das ToF-Bild auf dem Gerät und sendet nur Zählwerte, niemals Bilder. Das hält Deployments DSGVO-freundlich. Halten Sie die Firmware aktuell, damit die On-Device-Verarbeitung gepatcht bleibt.
Backhaul-Wahl
Der Sensor kann über LoRaWAN, WLAN oder Ethernet berichten. Für ChirpStack nutzen Sie den LoRaWAN-Uplink; wenn Sie zusätzlich Ethernet/WLAN aktivieren, vermeiden Sie Doppelzählungen im Dashboard.
So unterstützt dich merkaio beim VS121
Von der Beschaffung bis zum laufenden Betrieb, alles aus einer Hand und auf eigener europäischer Infrastruktur.
Pre-Staging & Provisioning
Wir konfigurieren den VS121, 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.