feat 🔌 TP17: statische Shelly-IP + in-pool-Reservierung + voller HA-MAC-Scan

- Entscheidung: alle Shellys bekommen statische IP (10.40.30.<octet>, gw/dns .30.1)
  + in-pool DHCP-Reservierung als Backup. set_sta auf static=true (Default) umgestellt
  (Ziel-IP aus Oktett), _sta_cfg-Helper.
- pool-v30 auf .100-.250 erweitert (Reservierungen jetzt in-pool, User-Konvention).
- s24 (14:33:5c:d8:2d:7c) ins inventory/bf.csv + .30.204-Reservierung.
- Voller HA-Device-Scan (alle MAC-Geräte, nicht nur configuration_url): fand
  Apple TV 4K + Philips TV (aus, VLAN40) — vor cudy-Teardown VLAN verifizieren;
  Apple TV = vmtl. Thread-Border-Router (TP17.1). Tasmota bestätigt tot (MAC nicht im Netz).
- .41.246/.247 = cudy1/cudy2 (Teardown-Ziele) dokumentiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 07:45:08 +02:00
parent 794082fd74
commit 248b1b5e74
4 changed files with 61 additions and 21 deletions

View File

@@ -68,14 +68,20 @@ Ziel-IP = letztes Oktett erhalten; alle Reservierungen existieren & MAC-verifizi
Der User-Auftrag ist **WLAN + IP + Geräte-Passwort** vereinheitlichen — nicht nur WLAN/IP.
Reihenfolge je Gerät, damit Recovery immer möglich bleibt:
**(1) WLAN→VLAN30** (Gen2+ RPC, identisch für alle Gen3/4, aktuell `auth=off`):
**(1) WLAN→VLAN30 mit STATISCHER IP** (Gen2+ RPC, identisch für alle Gen3/4, `auth=off`).
**Entscheidung (User 2026-07-11): alle Shellys bekommen ausnahmslos eine statische IP** (letztes Oktett erhalten → `10.40.30.<octet>`, gw/dns `.30.1`), **plus** die passende **in-pool** DHCP-Reservierung als Backup:
```bash
curl -s -X POST http://<VLAN1-IP>/rpc \
-H 'Content-Type: application/json' \
-d '{"id":1,"method":"WiFi.SetConfig","params":{"config":{"sta":{"ssid":"dirtyvader-iot","pass":"<IOT-PSK>","enable":true,"ipv4mode":"dhcp"}}}}'
-d '{"id":1,"method":"WiFi.SetConfig","params":{"config":{"sta":{
"ssid":"dirtyvader-iot","pass":"<IOT-PSK>","enable":true,
"ipv4mode":"static","ip":"10.40.30.<octet>","netmask":"255.255.255.0",
"gw":"10.40.30.1","nameserver":"10.40.30.1"}}}}'
curl -s -X POST http://<VLAN1-IP>/rpc -d '{"id":1,"method":"Shelly.Reboot"}'
```
→ Gerät kommt auf `.30.x` (letztes Oktett = Reservierung). **Verify** (`discover.py <neue-IP>`).
Oder via `shelly-mcp` **`set_sta {ip, confirm:true}`** (Default `static=true`, rechnet die Ziel-IP aus dem Oktett).
→ Gerät kommt exakt auf `10.40.30.<octet>`. **Verify** (`discover.py <neue-IP>`).
**Pool-Konvention:** `pool-v30` wurde 2026-07-11 auf `10.40.30.100-.250` erweitert, damit die Reservierungen (`.202–.244`) **in-pool** liegen (eine DHCP-Neuconfig liefert dann sofort brauchbare IPs).
**(2) Einheitliches Geräte-Passwort** (erst NACH erfolgreichem VLAN30-Verify):
```bash
@@ -109,7 +115,12 @@ Sweep über `configuration_url` aller HA-Devices (Container/Portainer/pve-„Ger
- **Shellys:** vollständig deckungsgleich mit dem Netz-Sweep. **`.30.204` aufgelöst:** = Shelly **„Bad/Spiegelschrank" (Shelly Plus RGBW PM, `14:33:5c:d8:2d:7c`)** → sehr wahrscheinlich das inventarlose **s24**; damit **6 Shellys** bereits auf VLAN30 (s14/16/18/22/23/24). ✅ Inventar `bf.csv` ergänzen (s24-MAC).
- **Naming-Drift (nur kosmetisch, KEINE Entity-Änderung ohne Freigabe):** s10 HA-Label „schlafzi/teststecker" vs. Inventar `bad_sonos`; s18-Label „küche/steckdose 3-2" bei `.30.202` (=s22-Reservierung). Vor cudy-Abbau Labels/Inventar konsolidieren.
- **Sonos ×7** → VLAN40 `.40.19x` (korrekt, MEDIA). **Brother MFC-J5720DW** `.10.199` (VLAN10), **Brother PT-P750W** `.30.5` (VLAN30) — beide korrekt platziert. **CCU/RaspberryMatic** `.20.232` (VLAN20/INFRA, korrekt).
- ⚠️ **`tasmota_plug9` (Nous A1, Tasmota)** in HA mit `.41.206` — aber `.41.206` gehört per ARP s20 (Shelly), also **stale**. **User-Ruling 2026-07-11:** „wenn kein aktives Tasmota-Gerät auffindbar, gibt es keine mehr" → **kein VLAN30-Mover**; **stale HA-Device/Entity entfernen** (User macht Aufräumen selbst).
- ⚠️ **`tasmota_plug9` (Nous A1, Tasmota)** in HA mit `.41.206` — aber `.41.206` gehört per ARP s20 (Shelly), also **stale**. **Vollständiger Scan 2026-07-11:** Tasmota-MAC `08:f9:e0:72:12:b6` ist **nicht in ap1-ARP** → **kein aktives Gerät** (bestätigt User-Ruling) → **kein VLAN30-Mover; stale HA-Device entfernen** (User).
**Nachtrag — vollständiger HA-Device-Scan (alle Geräte mit MAC-Connection, nicht nur `configuration_url`):** fördert **2 Media-Geräte ohne IP in der URL** zutage, die der erste Sweep verpasst hat:
- **Apple TV 4K** (`2a:77:fe:14:ad:5f`, „Wohnzimmer (2)") und **Philips TV 50PUS7304** (`44:d8:78:30:b8:d5`) — beide **aktuell aus/Standby** (nicht in ap1-ARP). Zielnetz = **VLAN40/MEDIA**. ⚠️ **Vor cudy-Abschuss verifizieren**, ob sie schon auf `dirtyvader-media` hängen oder **noch am cudy/VLAN1** — sonst fällt der Wohnzimmer-TV/AppleTV mit dem cudy weg. (Einschalten → ap1-ARP prüfen.)
- **Apple TV 4K = sehr wahrscheinlich der aktive Thread-Border-Router** für die bestehende IKEA-Matter-over-Thread-Flotte (22 Matter-Geräte in HA) → relevant für TP17.1 (Thread-Onboarding liefe über diesen BR bzw. einen HA-eigenen OTBR).
- Alle übrigen MAC-Geräte sind zugeordnet: Shellys, Sonos ×7 (VLAN40), Brother MFC (VLAN10). Radio-only-Geräte (Zigbee/Matter-over-Thread/BLE) haben keine IP → kein VLAN-Thema.
## Netzweite Aufstellung → „ist VLAN1 danach leer?" (Netz-Wahrheit via ap1 ARP+DHCP, 2026-07-11)
**Live in VLAN1 (bridge), klassifiziert nach Ziel-VLAN** (Phantom-/`failed`-ARP-Leichen weggelassen):
@@ -130,7 +141,9 @@ Sweep über `configuration_url` aller HA-Devices (Container/Portainer/pve-„Ger
**Nicht-Shelly-Mover (User-bestätigt 2026-07-11):** SwitchBot floor-lamp + Twinkly-Girlande + Creality Ender (fehlt noch, off). **Withings = schon übersiedelt** (nicht mehr offen). **Tasmota = existiert nicht mehr** (kein aktives Gerät). **EOS-Smartwatches / eBook-Reader** kommen später und macht **Christoph selbst** (eBook-Reader gehört lt. VLAN-Modell eher nach **VLAN50/UNTRUSTED**, nicht VLAN30) — nicht Teil dieses Go.
**Verdikt:** Nach TP17 (16 Shellys + SwitchBot/Twinkly/Ender → VLAN30) + pve-Host → VLAN20 + Christophs Endgeräte → VLAN10 (cudy-Abbau) ist VLAN1 **frei von Endgeräten**. **Nicht** automatisch leer: die **Switch-/AP-Mgmt-IPs (sw1/sw2/ap2)** sind *by design* interim in VLAN1 bis zum separaten **MGMT-VLAN99-Cutover** (kein TP17-Scope). Plus **`.41.246` muss identifiziert werden**, bevor „leer" behauptet werden kann. `defconf`/pool-v1-DHCP erst abschalten, wenn all das erledigt ist.
**`.41.246`/`.247` identifiziert (User):** = **cudy1/cudy2** (die alten WLAN-APs, zum Abbau freigegeben, nur für VLAN1). Kein Fremdkörper → das ist der cudy-Teardown selbst.
**Verdikt:** Nach TP17 (16 Shellys + SwitchBot/Twinkly/Ender → VLAN30) + pve-Host → VLAN20 + Christophs Endgeräte → VLAN10 ist VLAN1 **frei von Endgeräten**. **Prüf-Prereq vor cudy-Abschuss:** **Apple TV + Philips TV** (aktuell aus) einschalten und verifizieren, dass sie auf `dirtyvader-media`/VLAN40 hängen und **nicht** noch am cudy/VLAN1 — sonst mit umziehen. **Nicht** automatisch leer bleiben: die **Switch-/AP-Mgmt-IPs (sw1/sw2/ap2)** sind *by design* interim in VLAN1 bis zum separaten **MGMT-VLAN99-Cutover** (kein TP17-Scope). `defconf`/pool-v1-DHCP erst abschalten, wenn all das erledigt ist.
## Projektion: Gen4-Shellys auf Thread/Matter (experimentell, separate Spur)
User-Wunsch: prüfen, ob die **Gen4-Geräte** (S4PL Power-Strip-4, S4SW 2PM Gen4 — ~11 Stück: s9,s13,s16,s17,s18,s19,s20,s21,s24?,s25,s26) auf **Thread-Firmware geflasht** und dann via **Matter-over-Thread** in HA eingebunden werden können.
@@ -140,10 +153,15 @@ User-Wunsch: prüfen, ob die **Gen4-Geräte** (S4PL Power-Strip-4, S4SW 2PM Gen4
- ⚠️ **KONFLIKT mit „Entities bleiben unverändert":** Matter-Onboarding erzeugt in HA **neue** Entities (andere Integration) → die alten Shelly-WiFi-Entity-IDs würden brechen. Vor jedem Thread-Flash klären, ob Entity-Stabilität oder Thread-Migration Vorrang hat (ggf. Entity-`unique_id` manuell übernehmen / bewusst neu benennen). **Solange „Entities unverändert" gilt, ist die Thread-Spur nachrangig zur WiFi-Migration.**
- **Reihenfolge-Empfehlung:** morgen erst die **WiFi+IP+PW-Migration** komplett durchziehen (stabiler Zielzustand, HA unverändert). Thread als **eigene Folge-Spur (TP17.1)** danach evaluieren — nichts davon blockt den Go.
## Offene Datenlücken / To-verify (nicht go-blockierend)
- **`.41.246` (80:af:ca:7d:e5:b1)** identifizieren — einziges unklares Live-Gerät in VLAN1, nicht in HA.
- **Creality Ender** (3D-Drucker) beim nächsten Einschalten verorten (MAC/IST-IP) + `.30.x`-Reservierung anlegen (existiert noch nicht).
- **s24** MAC (`14:33:5c:d8:2d:7c`) ins Inventar `bf.csv` nachtragen; **`.30.204`-Reservierung fehlt noch** (Gerät hat aktuell vmtl. statische IP).
## Erledigt heute (2026-07-11, nicht-disruptiv)
- ✅ **s24** MAC (`14:33:5c:d8:2d:7c`) ins `inventory/bf.csv` + **`.30.204`-Reservierung** angelegt.
- ✅ **pool-v30 → `.100-.250`** erweitert (Reservierungen in-pool).
- ✅ **`set_sta` auf statische IP** umgestellt (Default), **`set_auth`-Tool** vorhanden (Digest-Auth-Fallback).
- ✅ **Tasmota** als nicht-existent bestätigt (MAC nicht im Netz).
## Offen / To-verify (nicht go-blockierend)
- **Apple TV + Philips TV** (aus): beim Einschalten VLAN prüfen (Ziel VLAN40) — **vor cudy-Abschuss** (s.o.).
- **Creality Ender** (3D-Drucker) beim nächsten Einschalten verorten (MAC/IST-IP) + `.30.x`-Reservierung anlegen.
- **Stale HA-Device `tasmota_plug9`** entfernen (kein reales Gerät mehr) — macht Christoph.
- `SHELLY_DEVICE_PW` (eigenes Admin-PW) von Christoph in `mcp/shelly/.env`; `set_auth`-Tool in `server.py` nachrüsten (ha1-Berechnung je realm).
- **`SHELLY_DEVICE_PW`** (eigenes Admin-PW, Wert liegt vor) von Christoph in `mcp/shelly/.env` ablegen (chmod600).
- Die **6 bereits Migrierten**: Reservierung `waiting/never` trotz Erreichbarkeit auf reservierter IP → wahrscheinlich **statische IP** am Gerät. Entscheiden: auf DHCP-Reservierung vereinheitlichen (Konsistenz) oder statisch belassen (funktional egal).