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):

/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)

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)

/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):

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)

/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:

/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:

/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:

/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):

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:

mosquitto_sub -h 127.0.0.1 -t 'crumb/#' -u esp1 -P '***' -v
# Erwartung: crumb/test wuuuhuuu

Router-Zähler (final):

/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:

/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:

/system backup save name=esp_wald_ok
/export file=esp_wald_ok_rsc

Schnell-Rollback der Allow-Regel (falls doch nicht gewollt):

/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.