Here you go — a clean, vector-friendly MD you can drop straight into the repo.


Beardyman-Prinzip → ESP-Wald

Ein Sound-Broker als Lern- und BĂŒhnen-Setup (Clock, Control, Care)

Stand: v1
Kontext: 4 iPads steuern via MQTT eine „Aurora“-Kernuhr (Clock) und Module (LEDs, Seifenblasen, Prompts). Broker lĂ€uft lokal/statisch, MikroTik segmentiert (ESP-VLAN isoliert, Crew-Pads separat).
Ziel: Ein robustes, kindertaugliches Set-up, das im Learn-Modus ruhig und nachvollziehbar ist und im Stage-Modus Show kann—ohne je die Nullfeld-Sicherheiten (CUT, Watchdogs, Logs) zu verlieren.


1) Architektur (kurz)

  • Netz

  • MikroTik: VLAN50 = ESP_WALD, VLAN20 = CREWPADS (oder vorhandenes Crew-WLAN).

  • Broker (RasPi/Jetson) per LAN, feste IP (z. B. 192.168.50.10), nur Control-Daten ĂŒber MQTT.
  • Rollen

  • Clock/Conductor: zentrale BPM & Tick.

  • Controller (4 iPads): Beat, Lights/Bubbles, FX/Prompts, Scene/CUT.
  • Acts: ESP-LEDs, Seifenblasen-ESP, OpenMV (Heartbeat/Events), optional Audio-Host (Ableton/Logic).

2) MQTT-Topics (minimal & robust)

# Zeitbasis
crumb/clock/bpm            int      # z.B. 120
crumb/clock/tick           int      # 0..7 (8er Raster)

# Global Commands
crumb/cmd/cut              "NOW"    # harter Not-Aus fĂŒr alles
crumb/cmd/scene            "A"|"B"|"C"

# Musik / Visual Control (klein halten!)
crumb/stem/beat            "k:1,5|h:3,7"         # Mini-Pattern
crumb/stem/melody          "C4:1,C5:5"           # Note events
crumb/stem/light/<zone>    JSON {"mode":"pulse","h":210,"s":80,"v":60}

# Telemetrie / Logs
crumb/esp/<id>/heartbeat   JSON {"rssi":-57,"lat":42}
crumb/log/<device>         string   # Plain debug for Node-RED pane

Prinzip: Nur wenige, sinnvolle Messages. Clock zuerst, alles andere folgt.


3) Zwei Betriebsarten

Learn (Default)

  • 8-Takt-Fenster: add (1–2), hold (3–6), remove (7–8) → Kinder spĂŒren Struktur.
  • Node-RED zeigt Logs („KrĂŒmel-Beweise“) live.
  • CUT jederzeit verfĂŒgbar.

Stage (Show)

  • Clock „free run“, Scenes feuern mehrere Topics als Makro.
  • CUT bleibt „großer roter Knopf“.

4) Die 4 iPad-Rollen

  1. Clock/Conductor

  2. Fader: bpm (80–140) → crumb/clock/bpm

  3. Buttons: crumb/cmd/cut=NOW, crumb/cmd/scene=A|B|C
  4. Takt-Reset (tick=0)

  5. Beat

  6. 8 Step-Pads → crumb/stem/beat

  7. „Ghost“-Taste: nur Visuals (kein Ton)

  8. Lights & Bubbles

  9. Zonen-Pads: crumb/stem/light/front|hex|sky

  10. Slider: H/S/V, Modes: pulse|aurora

  11. FX / Prompts

  12. Kurztexte → crumb/ui/hint

  13. „Solo“: alles Mute außer gewĂ€hlte Zone

UX-Regel: Pro iPad nur 3–4 Controls gleichzeitig aktiv. Kein Überladen.


5) Node-RED Mini-Flow (Tag-1)

  • mqtt-in: crumb/# → debug (Live-Sicht fĂŒr Kinder & Crew)
  • function „tick gate“: lĂ€sst nur Messages zu Takt-Beginn (1/3/5/7) durch → Groove bleibt sauber.
  • Optional: Ableton-Link → MQTT (kleines Python-Skript) publisht bpm & tick.

6) Safety (Nullfeld)

  • CUT muss auf jedem iPad groß, eindeutig, erreichbar sein.
  • Jedes ESP: Wenn 3 Ticks fehlen oder bpm out-of-range, lokal Failsafe (Schwarz/Still) bis tick=0.
  • Watchdog: Bei fehlendem heartbeat → Node-RED zeigt Warnkarte.
  • Firewall: ESP-VLAN darf nur DNS/DHCP/MQTT; kein „Internet by default“.

7) Bring-up in 10 Schritten

  1. Broker IP fix (z. B. 192.168.50.10). Lokal testen: mosquitto_pub/sub.
  2. MikroTik: CREWPADS → Broker TCP/1883 erlauben; ESP-VLAN nur DNS/DHCP/MQTT.
  3. Node-RED: mqtt-broker Node + Panels „Clock / Logs“.
  4. Clock-Publisher (RPi): bpm=120, tick 0..7 senden (8er Raster).
  5. iPad #1 (Clock): CUT + Scene + BPM-Fader live testen.
  6. iPad #2 (Beat): Step-Pads → crumb/stem/beat.
  7. ESP-LED: crumb/stem/light/hex → Farbe Ă€ndert.
  8. OpenMV: heartbeat/ui/hint publisht („Bubble time!“).
  9. CUT-Test: Alles geht sofort aus, Re-Start bei tick=0.
  10. „Regel der 8“ mit Kids ĂŒben (add/hold/remove) → Ruhe & Kontrolle.

8) Beispiel: mini-Clock (Python, skizziert)

# sendet bpm & 8er tick
import time, paho.mqtt.client as mq
c = mq.Client()
c.connect("192.168.50.10", 1883, 60)
bpm = 120
t = 0
while True:
    c.publish("crumb/clock/bpm", bpm, qos=0, retain=True)
    c.publish("crumb/clock/tick", t, qos=0, retain=False)
    t = (t + 1) % 8
    time.sleep(60.0 / bpm / 2)  # 8tel oder wie gewĂŒnscht

9) Akzeptanzkriterien (Done)

  • CUT schaltet alles in < 200 ms stumm/aus.
  • Tick-Sync: Alle sichtbaren Akteure reagieren im Raster (kein „Schwimmen“).
  • Logs: Node-RED zeigt alle eingehenden Topics (kindverstĂ€ndlich).
  • Failsafe: 3 fehlende Ticks → alle ESPs gehen „sicher“.

10) Rollback / Notfall

  • Broker down → Clock stoppt → ESPs gehen sicher (Schwarz/Still).
  • MikroTik-Regeln off? Fallback-Profile bereit halten (export .rsc).
  • CUT bleibt lokal (auch ohne Broker) als letzte Instanz.

11) Backlog (kurz)

  • TouchOSC/MIDI-Mapping Templates versionieren.
  • „Scene-Makros“ als Node-RED Subflows.
  • Ableton-Link Bridge hĂ€rten (Jitter-Messung).
  • Telemetrie-Dashboard (LED-Zonen, RSSI, Tick-Lag).
  • Workshop-Kit: „Regel der 8“ als Boden-Hexa mit LED-Ring (Eule in der Mitte).

Nullfeld-Merksatz

Die 1 (Clock) fĂŒhrt, die 0 (CUT) schĂŒtzt.
Dazwischen sind nur so viele Nachrichten, wie KinderhÀnde zÀhlen können.