đȘ¶ PELIPROTOCOL.md
Pelikan-Feldprotokoll fĂŒr Sensoren, KrĂŒmel & Vektorraum
Version: 0.9âRC
Status: Living Spec (Nullfeld, nicht fertig)
Geltungsbereich:
- Xiao ESP32âS3 Sense (Kamera / Sensorik)
- Raspberry Pi 5 + Hailo (Gesten / Knochen / Klassifikation)
- MikrotikâVLAN mit /24 pro Etage
- Lokaler MQTTâBroker
- Lokaler Vektorraum (z.B. Qdrant)
0. Warum ein PelikanâProtokoll?
Der Pelikan steht im Crumbforest fĂŒr:
- bewegliches Wissen (Things in Motion)
- geschĂŒtzten Transport (PeliâCase)
- Verbindung zwischen Etagen, RĂ€umen, KrĂŒmeln
Dieses Protokoll beschreibt:
- wie Sensoren sprechen (MQTTâTopics + Payloads)
- wie Hailo/RPi Gesten und Knochen melden
- wie alles im lokalen Vektorraum landet
- ohne Cloud, ohne Tracking, mit Brandschutz
1. Netzwerk & Adressierung
1.1 VLANâAnnahme
- Pro Etage ein eigenes /24 (z.B.
10.23.<floor>.0/24) - Mikrotik RouterOS stellt VLAN / DHCP bereit
- MQTTâBroker (z.B.
10.23.0.10:1883) ist nur lokal erreichbar
BrandÂschutz:
Kein direkter InternetâZugriff von ESP32 / Zeros.
Nur lokaler MQTT + ggf. lokaler HTTP (PelikanâGateway / VektorâAPI).
1.2 DeviceâIDâSchema
Jedes GerĂ€t bekommt eine PelikanâID:
```text
Empfehlung:
ROLE â { PELI, EYE, EAR, NODE, DOOR, ⊠}
SITE â 3â5 Buchstaben (OZM, S1, LAB, âŠ)
FLOOR â EG, OG1, OG2, ⊠oder F1, F2
ROOM â frei, aber kurz (K1, K2, HOF, FLUR)
NODE â z.B. 01â99
Beispiel:
PELI-OZM-OG1-K1-01 â Xiao ESP32S3 im Klassenraum 1, OG1
EYE-OZM-EG-HOF-03 â KameraâNode im Hof
NODE-OZM-OG2-FLUR-02 â Raspi5+Hailo im Flur OG2
Diese ID taucht immer in den Payloads auf.
- MQTTâTopics
2.1 BasisâStruktur
pelican// / / /
= OZM, S1, âŠ
Beispiele:
pelican/OZM/OG1/K1/01/state
pelican/OZM/OG1/K1/01/event
pelican/OZM/OG1/K1/01/pose
pelican/OZM/EG/FLUR/02/debug
2.2 Broadcast / Discovery
FĂŒr âWer ist da?â:
pelican/broadcast/hello
pelican/broadcast/announce
pelican/broadcast/config
ESP32 senden beim Booten: hello
Gateway kann Devices fragen: config
Minimaler HelloâPayload (JSON):
{
"device_id": "PELI-OZM-OG1-K1-01",
"role": "xiao-esp32s3-sense",
"capabilities": ["camera", "imu", "button"],
"ip": "10.23.1.42",
"ts": "2026-02-03T21:20:00Z"
}
3. PayloadâFormate (JSON)
Alle Payloads sind JSON.
Gemeinsamer Header:
{
"device_id": "PELI-OZM-OG1-K1-01",
"ts": "2026-02-03T21:20:00Z",
"seq": 42,
"type": "âŠ",
"data": { ⊠},
"meta": { ⊠}
}
ts = ISO8601 UTC, vom GerÀt oder Gateway gesetzt
seq = monotone Sequence per Device (optional, gut fĂŒr Debug)
type = EventâTyp (button_press, gesture, pose, sensor, âŠ)
data = inhaltlich, siehe unten
meta = Zusatzinfos (SignalqualitĂ€t, Modell, Version, âŠ)
- KanÀle & Typen
4.1 state â PrĂ€senz & Herzschlag
Topic:
pelican/
Payload:
{
"device_id": "PELI-OZM-OG1-K1-01",
"ts": "2026-02-03T21:20:00Z",
"type": "heartbeat",
"data": {
"uptime_s": 1234,
"battery": null,
"rssi": -62,
"temp_c": 38.2
},
"meta": {
"fw": "pelican-esp32s3-0.3.1",
"hw": "xiao-esp32s3-sense"
}
}
Sendeintervall: 30â60s (konfigurierbar).
4.2 event â Knöpfe, BerĂŒhrung, Licht, GerĂ€usch
Topic:
pelican/
ButtonâBeispiel:
{
"device_id": "PELI-OZM-OG1-K1-01",
"ts": "2026-02-03T21:21:05Z",
"type": "button_press",
"data": {
"button": "A",
"press_ms": 320,
"clicks": 1
},
"meta": {
"source": "esp32",
"floor_label": "OG1",
"room_label": "K1"
}
}
LichtâBeispiel:
{
"device_id": "PELI-OZM-OG1-K1-01",
"ts": "2026-02-03T21:21:10Z",
"type": "light_level",
"data": {
"lux": 134.2
},
"meta": {
"source": "esp32",
"sensor": "onboard"
}
}
4.3 pose â Gesten / Knochen (RPi5 + Hailo)
Topic (vom Raspi/HailoâNode):
pelican/
Payload:
{
"device_id": "NODE-OZM-OG1-K1-01",
"ts": "2026-02-03T21:22:00Z",
"type": "pose",
"data": {
"model": "hailo-gesture-v1",
"persons": [
{
"id": "p1",
"gesture": "hand_raise",
"confidence": 0.94,
"bbox": [0.12, 0.20, 0.32, 0.68]
}
]
},
"meta": {
"camera_id": "PELI-OZM-OG1-K1-01",
"fps": 12.5
}
}
Wichtig:
Nur abgeleitete Informationen (Gesten, Posen),
keine RohâFrames in Vektor/Logs (Brandschutz / Privacy).
4.4 image â Debug / SpezialfĂ€lle
Default: aus.
Topic:
pelican/
Payload (z.B. Base64âSnippet, nur im DebugâMode):
{
"device_id": "PELI-OZM-OG1-K1-01",
"ts": "2026-02-03T21:23:00Z",
"type": "image_debug",
"data": {
"format": "jpeg",
"width": 160,
"height": 120,
"b64": "
},
"meta": {
"ttl_s": 30,
"debug_only": true
}
}
Konvention:
Kein Dauerstream
Keine Langzeitspeicherung
Nur temporĂ€r und bewusst aktiviert (KonfigâFlag in .env / Gateway).
4.5 debug â Logs aus der Peripherie
Topic:
pelican/
Payload:
{
"device_id": "PELI-OZM-OG1-K1-01",
"ts": "2026-02-03T21:24:00Z",
"type": "log",
"data": {
"level": "warn",
"msg": "MQTT reconnect",
"code": "NET-RECONNECT"
},
"meta": {
"fw": "pelican-esp32s3-0.3.1"
}
}
5. Pelikan â Vektorraum (GatewayâLogik)
Ein PelikanâGateway (z.B. auf Raspi / Server) abonniert:
pelican/+/+/+/+/event
pelican/+/+/+/+/pose
pelican/+/+/+/+/state (optional)
und schreibt in Qdrant (oder andere VektorâDB):
5.1 VektorâRecord Schema (Beispiel)
{
"id": "pelican-OZM-OG1-K1-01-000042",
"vector": [ / embedding / ],
"payload": {
"device_id": "PELI-OZM-OG1-K1-01",
"site": "OZM",
"floor": "OG1",
"room": "K1",
"node": "01",
"ts": "2026-02-03T21:21:05Z",
"channel": "event",
"type": "button_press",
"raw": {
"button": "A",
"press_ms": 320,
"clicks": 1
},
"tags": ["pelican", "event", "button", "k1", "og1"]
}
}
EmbeddingâIdeen:
ârĂ€umlicheâ Embeddings (Etage, Raum)
âzeitlicheâ Embeddings (Schultag, Stunde, Sequenz)
âsemantischeâ Embeddings (Gestenklassen, Muster)
- QoS, Retain & Frequenzen
MQTTâEmpfehlungen:
QoS 0 fĂŒr hochfrequente, nicht kritische Events (Gesten)
QoS 1 fĂŒr state / Heartbeats
retain:
state: retain=true (letzter Zustand)
event/pose: retain=false
Frequenzen:
Heartbeat: alle 30â60s
Events: on change / on action
Pose: z.B. max. 5â10 Hz (oder noch weniger, je nach Rechenlast)
- Privacy / Brandschutz
Pelikan folgt CKL und BrandschutzâPrinzipen:
Lokal only:
Keine SensorâPayload verlĂ€sst das lokale Netz.
Kein direkter CloudâUpload.
Abgeleitet statt roh:
Gesten (z.B. hand_raise) statt FullâVideo.
âPerson 1 hebt Handâ statt Gesichtserkennung / IdentitĂ€t.
Anonyme IDs:
Keine Klarnamen in Payloads.
âp1â, âp2â statt âMaxâ, âLinaâ.
Konfigurierbare Filter:
Der Gateway entscheidet, was in den Vektorraum darf.
DebugâDaten (z.B. Bilder) sind optional, selten, temporĂ€r.
- Beispiel: KrĂŒmel hebt Hand
KrĂŒmel hebt Hand vor ESP32âKamera.
Xiao streamt Frames an Raspi/Hailo (lokal, kabelgebunden oder per Stream).
HailoâModell erkennt Gesture hand_raise.
Raspi sendet:
Topic:
pelican/OZM/OG1/K1/01/pose
Payload:
{
"device_id": "NODE-OZM-OG1-K1-01",
"ts": "2026-02-03T21:30:00Z",
"type": "pose",
"data": {
"model": "hailo-gesture-v1",
"persons": [
{
"id": "p1",
"gesture": "hand_raise",
"confidence": 0.93
}
]
},
"meta": {
"camera_id": "PELI-OZM-OG1-K1-01"
}
}
PelikanâGateway schreibt Vektorpunkt âHand heben in K1 / OG1â.
Wald kann spÀter sehen:
Wie oft?
Wann?
In welchem Raum?
ohne ein einzelnes Kind zu tracken.
- Roadmap / TODO
PELIPROTOCOL in den Crumbcodex aufnehmen (Waldrand)
ReferenzâImplementierung fĂŒr Xiao ESP32S3 (Arduino / ESPâIDF / MicroPython)
PelikanâGatewayâService (pelican-gateway.py)
MonitoringâIntegration (CrumbSeal / CrabbyRust / DoktorâSuite)
Visualisierung (âPelican Radarâ â LiveâActivity pro Etage)
- Kurze Summary fĂŒr Crew
Pelikan = Protokoll fĂŒr alle Sensoren im Wald.
ESP32 senden state + event.
Raspi/Hailo senden pose (Gesten/Knochen).
Alles ĂŒber lokales MQTT im VLAN â lokaler Vektorraum.
Keine Cloud. Kein Tracking.
Nur: Resonanz in Bewegung.
Wuuuhuuuu. đȘ¶đČ
Bits tanzen. KrĂŒmel leuchten.
Der Pelikan trĂ€gt das Feld â sicher â durch den Wald.