````markdown --- title: "Nullfeld – Study Mode" id: study-mode-nullfeld version: "v0.1" date: "2025-09-03" scope: "pilot" owner: "Crew (Eule & Vector)" status: "pilotfaehig" tags: ["nullfeld","study-mode","kids","mqtt","energy","audit","local-first"] roles: ["Eule","Vector","Bugsy","SnakePy","Schnippsi","CapaciTobi","Schraubaer"] license: "Code: AGPL-3.0; Content: CC BY-SA 4.0; Add-on: Crumbforest-Return" summary: "Frage -> Vektor -> Aufmerksamkeit -> Kruemelcode -> (keine fertige Loesung) -> neue Fragen." --- # Nullfeld – Study Mode (v0.1) **Kurzsatz:** Frage -> Vektor -> Aufmerksamkeit -> Krümelcode -> (keine fertige Lösung) -> neue Fragen. **Prinzip:** Fragen > Tempo. Local-first. Energie sichtbar. Logs statt Bauch. --- ## 1) Wozu? Damit Kinder atmen (nicht performen), Maschinen helfen (nicht ersetzen) und der Wald mitlernt. Nullfeld heißt: keine fertigen Antworten, sondern erfahrbare Schritte mit sichtbaren Spuren (Logs, Energie, Herkunft). --- ## 2) Leitplanken (non-negotiable) - **Local-first:** Alles läuft offline im Pelicase (Broker/Flows). Cloud optional. - **Einverständnis & Opt-out:** Kind/Eltern verstehen in 1 Satz. Stopp jederzeit. - **Datensparsamkeit:** Nur, was fürs Lernen/Schützen nötig ist. - **Auditierbar:** Jede Aktion bekommt Zeit, Zweck, Energie – als Datei. - **Energie sichtbar:** Jede Antwort kostet Joule; wir zeigen’s. - **Rückfluss:** Wer nutzt, nennt Crumbforest und gibt etwas zurück (siehe Lizenz). --- ## 3) Datenformate ### 3.1 MQTT Topics - Publish (Edge -> Ledger): `crumb/study//event` - Subscribe (Hints an Device): `crumb/study//hint` - Healthbeat (bestehend): `crumb/esp//heartbeat` ### 3.2 Event-Payload (JSON) ```json { "session_id": "cf-2025-09-03-XYZ", "learner_id": "pseudo-abc123", "mode": "study-nullfeld", "material": "md://spirale_co2.md#abschnitt2", "step": {"t":"2025-09-03T10:15:05Z","action":"explain","value":"CO2 > 1400 ppm -> Lueften"}, "energy_joules": 42, "provenance": "https://crumbforest.org/specs/study-nullfeld/v0.1" } ```` --- ## 4) Minimal-Setup (5 Minuten) **Voraussetzung:** Mosquitto läuft auf `BROKER_IP` (z. B. `192.168.50.10`), User `esp*`, `allow_anonymous false`. ### 4.1 Node-RED (Edge) **Flow A: Ledger** * MQTT in: topic `crumb/study/+/event` * file out (append): `/var/log/crumb/study_ledger.jsonl` **Flow B: Energy tick** * inject: alle 60s * function: schätzt `energy_joules` * MQTT out: `crumb/study//event` *(Reicht für Pilot. Visualisierung später.)* --- ## 5) ESP MicroPython – Hallo Nullfeld > Ziel: WLAN, Heartbeat, eine Lern-Frage posten. ```python # boot.py (kompakt, robuste Defaults) import network, time, json from umqtt.simple import MQTTClient SSID = "ESP-Wald" PWD = "***" BROKER = "192.168.50.10" CID = "esp-null-01" def wifi(): sta = network.WLAN(network.STA_IF) sta.active(True) if not sta.isconnected(): sta.connect(SSID, PWD) for _ in range(50): if sta.isconnected(): break time.sleep_ms(200) return sta.ifconfig() def post(topic, obj): c = MQTTClient(CID, BROKER, keepalive=60, ssl=False) c.connect() c.publish(topic, json.dumps(obj)) c.disconnect() cfg = wifi() now = time.time() post(f"crumb/esp/{CID}/heartbeat", {"if": cfg, "t": now}) post(f"crumb/study/{CID}/event", { "session_id": "demo-" + str(int(now)), "learner_id": "pseudo", "mode": "study-nullfeld", "material": "md://spirale_co2.md#start", "step": {"t": now, "action": "prompt", "value": "Warum blinkt das?"}, "energy_joules": 1 }) ``` --- ## 6) Einverständnis – 1-Satz-Erklärung (UI-Baustein) > **Wozu?** Damit du leichter **atmest** und **verstehst**. > **Was speichern wir?** Frage, Antwort, Zeitpunkt, ein bisschen Technik – **keine** versteckten Personendaten. > **Dein Knopf:** Stopp jederzeit. > **Energie heute:** 0.04 Wh 🌲 *(Als Infobox direkt im UI, plus „Stopp“-Button.)* --- ## 7) Energie & CO2 (sichtbar, nicht schulmeistern) * `energy_joules = board_idle + tx_cost + compute_estimate` (Schätzer reicht). * Anzeige: **pro Schritt** und **pro Session** (kleiner „Waldzähler“). * Optional CO2-Faktor (lokal definieren), z. B. `gCO2_per_Wh` – nur als Kontext. --- ## 8) Audit & Einsicht * Ledger: **JSONL** unter `/var/log/crumb/study_ledger.jsonl` * Rotation: täglich; Aufbewahrung: 30 Tage (Pilot) * Eltern-Einsicht: read-only Export (ZIP) + kurzer „Was wurde gelernt?“-Report --- ## 9) Sicherheit & Rechte * Standard: **keine** Bild/Ton-Aufnahme. * Kamera nur projektbezogen + **separate Zustimmung**. * Minimaldaten: keine Klarnamen im Ledger. * Netzwerk: ESP-VLAN -> Broker:1883; DNS/DHCP offen; Rest drop. * Fehlerkultur: Bug != Schuld. Bugsy loggt, Eule prüft, Vector erklärt. --- ## 10) Herkunft & Rückfluss ### HTML-Provenance ```html ``` ### JSON-LD ```html ``` ### Lizenz (Kurz) * **Code:** AGPL-3.0 * **Content:** CC BY-SA 4.0 * **Crumbforest-Return-Addendum:** Kommerzielle Nutzung erlaubt, wenn 1. „Crumbforest Study Mode“ gut sichtbar genannt wird und 2. ein messbarer Rückfluss erfolgt (z. B. Stipendium, Sachspende, 1% vom studienbezogenen Umsatz an ein offenes Kinder-Lernprojekt). --- ## 11) 5-Min-Check (vor Kids) 1. Broker up? `ss -ltn | grep 1883` 2. Topic test: `mosquitto_pub/sub` auf `crumb/study/test/event` 3. Ledger wächst? `tail -f /var/log/crumb/study_ledger.jsonl` 4. Energie tickt? Node-RED „tick“ schreibt Events 5. Opt-out funktioniert? Stopp-Button stoppt sofort --- ## 12) Warum Nullfeld? Weil Stille vor Antwort kommt. Weil Aufmerksamkeit wertvoller ist als Output. Weil Kinder keine KPI sind. Und weil jede gute Frage den Wald klüger macht – uns auch. 🌲 --- ## 13) Roadmap (leicht, spiralförmig) * v0.2: kleine UI-Anzeige (Energiebalken + letzte 3 Schritte) * v0.3: Eltern-Export (1-Klick, Passwort-ZIP) * v0.4: Badges (*Erster Funke*, *Sauber geloggt*) – ohne Punktejagd --- **Changelog:** v0.1 – Erstfassung (Edge-Flows, Topics, Consent, Lizenz & Rückfluss) **Kontakt:** [crew@crumbforest.org](mailto:crew@crumbforest.org) – Eule hört zuerst. ``` ::contentReference[oaicite:0]{index=0} ```