12 Monate Crumbforest-Wachstum, sortiert nach Waldlogik. Struktur: - 454 Dokumente in 7 organischen Ebenen - Lichtung → Waldrand → Waldmitte → Wurzeln → Krone → Unterholz → Samen - INDEX.md für jede Ebene (eigene Stimme) - WALDKARTE.md (Master-Navigation) - crumbcodex.md (Das Versprechen zwischen Krümel & Bits) - lichtung/willkommen.md (Nullfeld-Einstieg für Kinder) Philosophie: - Waldlogik statt Ordnerlogik - Tiefe, Licht, Wurzeln - wie ein echter Wald - Schutz für Krümel, Tiefe für Gräber, Poesie für Atmende Repos verbunden: - OZM-Keks-Handbuch-v1 (Das Wissen) - Crumb-Core-v.1 (Das Herz) - 194.164.194.191 - crumbmissions (Das Spiel) Wuuuhuuuuu! 🦉✨
199 lines
5.0 KiB
Markdown
199 lines
5.0 KiB
Markdown
# Spirale, nicht Loop – Low-CO₂ Debug
|
||
|
||
**Typ:** Playbook • **Version:** v1.1 • **Scope:** ESP\_WALD → BROKER:1883 (nur dieser Pfad)
|
||
**Owner:** Eule + Vector • **Tags:** `mikrotik` `esp32` `mqtt` `low-co2` `firewall`
|
||
**Prinzip:** *Keine neuen Netze. Ein Pfad. Ein Test. Ein Log. Rollback in 1 Zeile.*
|
||
|
||
## Ziel
|
||
|
||
ESP-Clients aus `192.168.50.0/24` dürfen **nur** TCP/1883 zum Broker `192.168.88.227`. Alles andere bleibt isoliert. Entscheidungen **nach Messung**, nicht nach Gefühl.
|
||
|
||
## Null-Feuer Pledge
|
||
|
||
* Keine Upgrades / keine neuen Listen während des Debugs.
|
||
* Max. 2 Kommandos zwischen Messungen.
|
||
* Jeder Schritt liefert **Zähler** oder **Fehlercode**.
|
||
* Wenn 2 Zyklen ohne Evidenz → **Stopp & Reframe**.
|
||
|
||
---
|
||
|
||
## 0) Preflight (ohne Änderungen)
|
||
|
||
**Snapshot (RouterOS):**
|
||
|
||
```routeros
|
||
/export file=pre_debug
|
||
/ip firewall address-list print where list~"ESP|BROKER"
|
||
/ip firewall filter print terse where chain=forward
|
||
/ip firewall filter print stats where comment~"ESP|BROKER|1883|MQTT|Isolate|Block"
|
||
```
|
||
|
||
**Soll-Listen (nur sichten):**
|
||
|
||
* `ESP_WALD` → `192.168.50.0/24`
|
||
* `BROKER` → `192.168.88.227`
|
||
|
||
> Falls FastTrack aktiv: Zähler können „leer“ bleiben. Merk’ dir die FastTrack-Regel (meist in `forward`).
|
||
|
||
---
|
||
|
||
## 1) Broker lebt lokal? (am Broker-Host)
|
||
|
||
```bash
|
||
ss -ltnp | grep :1883
|
||
mosquitto_sub -h 127.0.0.1 -t crumb/test -u esp1 -P '***' -v &
|
||
mosquitto_pub -h 127.0.0.1 -t crumb/test -m ping -u esp1 -P '***'
|
||
```
|
||
|
||
**Erwartung:** `crumb/test ping` erscheint. ✅
|
||
|
||
---
|
||
|
||
## 2) Router → Broker TCP-Probe (RouterOS)
|
||
|
||
```routeros
|
||
/tool telnet 192.168.88.227 1883
|
||
# bei "connected" sofort Ctrl-] und 'quit'
|
||
```
|
||
|
||
**Erwartung:** „connected“.
|
||
**Wenn nicht:** Routing/ARP zwischen Router und Broker prüfen (dieses Playbook stoppt hier).
|
||
|
||
---
|
||
|
||
## 3) ESP reine TCP-Probe (kein MQTT nötig)
|
||
|
||
Auf dem ESP (REPL):
|
||
|
||
```python
|
||
import usocket as s
|
||
a=('192.168.88.227',1883)
|
||
s_=s.socket(); s_.settimeout(3)
|
||
try:
|
||
s_.connect(a); print("TCP OK")
|
||
except Exception as e:
|
||
print("TCP FAIL", e)
|
||
finally:
|
||
try: s_.close()
|
||
except: pass
|
||
```
|
||
|
||
**Erwartung:** `TCP OK`.
|
||
|
||
* `ETIMEDOUT` → Pfad blockiert.
|
||
* `ECONNREFUSED` → Broker/Port unerreichbar.
|
||
|
||
---
|
||
|
||
## 4) Zähler lesen (RouterOS)
|
||
|
||
```routeros
|
||
/ip firewall filter print stats where comment~"ESP|BROKER|1883"
|
||
```
|
||
|
||
**Fall A – Zähler > 0:** Regel greift. Weiter zu **5)**.
|
||
**Fall B – Zähler = 0:** Erlaubnisregel trifft nicht → **nur eine** saubere Allow-Regel setzen.
|
||
|
||
---
|
||
|
||
## 4b) (Nur wenn nötig) **eine** Allow-Regel hinzufügen
|
||
|
||
**Einmalig, ganz nach oben in `forward` — mit Rückweg:**
|
||
|
||
```routeros
|
||
/ip firewall filter add chain=forward action=accept protocol=tcp dst-port=1883 \
|
||
src-address-list=ESP_WALD dst-address-list=BROKER \
|
||
place-before=0 comment="ALLOW-ESP_WALD-TO-BROKER-1883 (FINAL)"
|
||
```
|
||
|
||
**Rollback:**
|
||
|
||
```routeros
|
||
/ip firewall filter remove [find comment="ALLOW-ESP_WALD-TO-BROKER-1883 (FINAL)"]
|
||
```
|
||
|
||
**Hinweis FastTrack:** Wenn eine FastTrack-Regel davor liegt, sieht man evtl. keine Zähler. Für den Test kurz deaktivieren und danach **wieder aktivieren**:
|
||
|
||
```routeros
|
||
/ip firewall filter disable [find where action=fasttrack-connection]
|
||
# Test fahren …
|
||
/ip firewall filter enable [find where action=fasttrack-connection]
|
||
```
|
||
|
||
---
|
||
|
||
## 5) End-zu-Ende-Check
|
||
|
||
**ESP MQTT (MicroPython):**
|
||
|
||
```python
|
||
import network,time
|
||
from umqtt.simple import MQTTClient
|
||
BROKER="192.168.88.227"; TOPIC=b"crumb/test"
|
||
c=MQTTClient("esp-test", BROKER, user="esp1", password="***", keepalive=30)
|
||
c.connect(); c.publish(TOPIC, b"wuuuhuuu"); c.disconnect(); print("MQTT OK")
|
||
```
|
||
|
||
**Broker-Host:**
|
||
|
||
```bash
|
||
mosquitto_sub -h 127.0.0.1 -t 'crumb/#' -u esp1 -P '***' -v
|
||
# Erwartung: crumb/test wuuuhuuu
|
||
```
|
||
|
||
**Router-Zähler (final):**
|
||
|
||
```routeros
|
||
/ip firewall filter print stats where comment~"ALLOW-ESP_WALD-TO-BROKER-1883"
|
||
```
|
||
|
||
**Done-Kriterium:**
|
||
|
||
* ESP meldet `MQTT OK` **und**
|
||
* Broker zeigt Nachricht **und**
|
||
* Allow-Regel hat >0 Pakete/Bytes.
|
||
|
||
---
|
||
|
||
## 6) Log-Spitzen (optional, nur kurz aktivieren)
|
||
|
||
Wenn du sehen willst, *was* geblockt würde:
|
||
|
||
```routeros
|
||
/ip firewall filter set [find comment~"Isolate ESP-Wald"] log=yes log-prefix="DROP ISOLATE "
|
||
# ... Sekunden testen ...
|
||
/ip firewall filter set [find comment~"Isolate ESP-Wald"] log=no
|
||
```
|
||
|
||
---
|
||
|
||
## 7) Rollback & Sicherung
|
||
|
||
**Backup sichern:**
|
||
|
||
```routeros
|
||
/system backup save name=esp_wald_ok
|
||
/export file=esp_wald_ok_rsc
|
||
```
|
||
|
||
**Schnell-Rollback der Allow-Regel (falls doch nicht gewollt):**
|
||
|
||
```routeros
|
||
/ip firewall filter remove [find comment="ALLOW-ESP_WALD-TO-BROKER-1883 (FINAL)"]
|
||
```
|
||
|
||
---
|
||
|
||
## Troubles-Mini (nur lesen)
|
||
|
||
* **Zähler bleiben 0, aber alles geht?** → FastTrack testweise wie oben kurz aus.
|
||
* **ESP TCP OK, MQTT FAIL (Auth):** Nutzer/Passwort im Broker (`/etc/mosquitto/passwd`) checken.
|
||
* **`ETIMEDOUT` vom ESP:** Pfad/Firewall. **Nur dann** 4b fahren.
|
||
* **Broker lokal ok, remote `REFUSED`:** Listen-IP auf dem Broker (0.0.0.0:1883) prüfen.
|
||
|
||
---
|
||
|
||
## CO₂-Budget Notiz
|
||
|
||
Max. 2 Diagnose-Zyklen (1 Zyklus = messen → eine Änderung → messen). Danach Stopp, Lagebild schreiben, nächste Session planen.
|