MCP homelab-sensors: Raumtemperaturen + Klima-Leistung (Phase 2) #129

Open
opened 2026-06-25 08:21:23 +00:00 by orbitalo · 0 comments
Owner

Kontext

Phase 1 erledigt (Commit 14e32664): homelab-ai-bot/tools/grafana.py liest Raum-Satelliten jetzt aus InfluxDB DB sensors (nicht mehr ioBroker-Archiv). Hausmeister-Bot (CT 116) nutzt das.

Problem: Hermes2 (CT 151, hermes-agent) greift per Terminal auf falsche Hosts zu (z.B. 192.168.178.222) und liefert keine harten Zahlen. Braucht strukturierten MCP-Zugriff.

Supervisor: Cursor-Agent (Architektur + Review)
Implementierung: Cline (KI-Server)


Ziel

Neuer MCP-Server homelab-sensors für einheitlichen Zugriff auf:

  • Raumtemperaturen (esp-satellite-Knoten)
  • Klima-Leistung (Shelly PM Mini Gen3, sobald aktiv)
  • Sensor-Online-Status

Wiederverwendbar in: Cursor, Cline, OpenCode, später Hermes2.


Architektur (IST — nicht neu erfinden)

ESP-Satelliten (+/temp) ──► mosquitto CT143 :1883 (192.168.178.36)
Shelly PM Gen3 ──────────► klima_flur_oben/status/pm1:0 (JSON)
         │
         ▼
Telegraf (CT143 /etc/telegraf/telegraf.d/)
  satellites.conf → temperature, io_state
  klima.conf      → power
         │
         ▼
InfluxDB CT143 :8086
  DB sensors:  measurement temperature (tag node), power (tag node, geraet)
  DB iobroker: Archiv + openWB (NICHT für Satelliten!)
         │
         ▼
Grafana: satelliten-temps, klima-bewertung

WICHTIG:

  • Produktiver MQTT/InfluxDB-Host: CT 143 auf pve-mu-3 (192.168.178.36, Tailscale 100.66.78.56)
  • NICHT 192.168.178.222 (existiert nicht / falsch)
  • NICHT ioBroker für Satelliten-Daten
  • Telegraf-Configs versioniert: homelab-brain/infra/telegraf/

MCP-Tools (Vorschlag)

get_room_temperatures

  • Quelle: InfluxDB sensors, SELECT last(value), min(value), max(value) FROM temperature WHERE time > now()-24h GROUP BY node
  • Output: sortierte Liste mit deutschen Labels (siehe Mapping unten)
  • Bonus: Gradient (kältester → wärmster Raum)

get_temperature_history

  • Parameter: node (string), hours (int, default 24)
  • Quelle: InfluxDB sensors
  • Output: Zeitreihe oder min/max/mean

get_klima_power

  • Quelle: InfluxDB sensors, measurement power
  • Nodes: klima_flur_oben (Split oben), klima_flur_unten (Panasonic, vorbereitet)
  • Felder: watt, energy_wh_total

get_sensor_status

  • Quelle: MQTT retained +/status und +/temp auf 192.168.178.36:1883
  • Output: online/offline + letzter Temp-Wert + Datenalter

Optional: evaluate_klimatisierung

  • Korreliert power.watt > 500 mit fallenden Raumtemperaturen
  • Logik aus Doku projekte/klima-monitoring.md

Node-Mapping (deutsche Labels)

node Label
flur_oben Flur oben (Klima-Zone)
flur_unten Flur unten
wohnstube Wohnstube
kueche Küche
schlafzimmer Schlafzimmer
gaestezimmer Gästezimmer
trockenraum Trockenraum
oelraum Ölraum
heizraum Heizraum (ESP32)
garage Garage (Test)

Deploy-Empfehlung

Option Pro Contra
CT 143 (neben InfluxDB) localhost-Queries, keine Latenz mehr Last auf Raspi-Broker
CT 122 (OpenMemory) MCP-Konsolidierung Netzwerk-Zugriff auf CT143 nötig

Empfehlung Supervisor: CT 122 (wie OpenMemory) — Queries per http://100.66.78.56:8086 und MQTT per Tailscale/LAN.

Repo-Vorschlag: orbitalo/homelab-sensors-mcp oder Unterordner homelab-brain/mcp/sensors/


Referenzen

  • Doku CT999: /root/docs/projekte/klima-monitoring.md
  • Doku CT999: /root/docs/container/ct-143-raspi-broker.md
  • Doku CT999: /root/docs/container/ct-esp-satellite.md
  • Telegraf: homelab-brain/infra/telegraf/klima.conf, satellites.conf
  • Grafana JSON: homelab-brain/infra/grafana/klima-bewertung.json
  • Phase-1-Referenz: homelab-ai-bot/tools/grafana.py (gleiche Queries, als Vorlage)

Verifikation

# MQTT live
ssh pve-mu-3 'pct exec 143 -- mosquitto_sub -h localhost -t "+/temp" --retained-only -W 3 -v'

# InfluxDB
ssh pve-mu-3 'pct exec 143 -- influx -database sensors -execute "SELECT last(value) FROM temperature GROUP BY node"'

# MCP Tool-Test (nach Deploy)
# get_room_temperatures → Werte wie flur_unten ~24°C, wohnstube ~27°C

Akzeptanzkriterien

  • MCP-Server startet und registriert in Cline/Cursor
  • get_room_temperatures liefert aktuelle Werte aller online Satelliten
  • Kein Zugriff auf ioBroker-DB für Satelliten
  • get_klima_power funktioniert sobald Shelly klima_flur_oben MQTT sendet
  • README mit Architektur-Diagramm und Deploy-Anleitung
  • Doku CT999 nach Deploy aktualisieren

Nicht im Scope

  • ioBroker-Reparatur
  • Grafana-Dashboard-Änderungen (bereits deployed)
  • Hermes2-Integration (folgt nach MCP stabil)
## Kontext **Phase 1 erledigt** (Commit `14e32664`): `homelab-ai-bot/tools/grafana.py` liest Raum-Satelliten jetzt aus InfluxDB DB `sensors` (nicht mehr ioBroker-Archiv). Hausmeister-Bot (CT 116) nutzt das. **Problem:** Hermes2 (CT 151, `hermes-agent`) greift per Terminal auf falsche Hosts zu (z.B. `192.168.178.222`) und liefert keine harten Zahlen. Braucht strukturierten MCP-Zugriff. **Supervisor:** Cursor-Agent (Architektur + Review) **Implementierung:** Cline (KI-Server) --- ## Ziel Neuer MCP-Server **`homelab-sensors`** für einheitlichen Zugriff auf: - Raumtemperaturen (esp-satellite-Knoten) - Klima-Leistung (Shelly PM Mini Gen3, sobald aktiv) - Sensor-Online-Status Wiederverwendbar in: **Cursor**, **Cline**, **OpenCode**, später **Hermes2**. --- ## Architektur (IST — nicht neu erfinden) ``` ESP-Satelliten (+/temp) ──► mosquitto CT143 :1883 (192.168.178.36) Shelly PM Gen3 ──────────► klima_flur_oben/status/pm1:0 (JSON) │ ▼ Telegraf (CT143 /etc/telegraf/telegraf.d/) satellites.conf → temperature, io_state klima.conf → power │ ▼ InfluxDB CT143 :8086 DB sensors: measurement temperature (tag node), power (tag node, geraet) DB iobroker: Archiv + openWB (NICHT für Satelliten!) │ ▼ Grafana: satelliten-temps, klima-bewertung ``` **WICHTIG:** - Produktiver MQTT/InfluxDB-Host: **CT 143** auf pve-mu-3 (`192.168.178.36`, Tailscale `100.66.78.56`) - **NICHT** `192.168.178.222` (existiert nicht / falsch) - **NICHT** ioBroker für Satelliten-Daten - Telegraf-Configs versioniert: `homelab-brain/infra/telegraf/` --- ## MCP-Tools (Vorschlag) ### `get_room_temperatures` - Quelle: InfluxDB `sensors`, `SELECT last(value), min(value), max(value) FROM temperature WHERE time > now()-24h GROUP BY node` - Output: sortierte Liste mit deutschen Labels (siehe Mapping unten) - Bonus: Gradient (kältester → wärmster Raum) ### `get_temperature_history` - Parameter: `node` (string), `hours` (int, default 24) - Quelle: InfluxDB sensors - Output: Zeitreihe oder min/max/mean ### `get_klima_power` - Quelle: InfluxDB `sensors`, measurement `power` - Nodes: `klima_flur_oben` (Split oben), `klima_flur_unten` (Panasonic, vorbereitet) - Felder: `watt`, `energy_wh_total` ### `get_sensor_status` - Quelle: MQTT retained `+/status` und `+/temp` auf `192.168.178.36:1883` - Output: online/offline + letzter Temp-Wert + Datenalter ### Optional: `evaluate_klimatisierung` - Korreliert `power.watt > 500` mit fallenden Raumtemperaturen - Logik aus Doku `projekte/klima-monitoring.md` --- ## Node-Mapping (deutsche Labels) | node | Label | |------|-------| | flur_oben | Flur oben (Klima-Zone) | | flur_unten | Flur unten | | wohnstube | Wohnstube | | kueche | Küche | | schlafzimmer | Schlafzimmer | | gaestezimmer | Gästezimmer | | trockenraum | Trockenraum | | oelraum | Ölraum | | heizraum | Heizraum (ESP32) | | garage | Garage (Test) | --- ## Deploy-Empfehlung | Option | Pro | Contra | |--------|-----|--------| | **CT 143** (neben InfluxDB) | localhost-Queries, keine Latenz | mehr Last auf Raspi-Broker | | **CT 122** (OpenMemory) | MCP-Konsolidierung | Netzwerk-Zugriff auf CT143 nötig | Empfehlung Supervisor: **CT 122** (wie OpenMemory) — Queries per `http://100.66.78.56:8086` und MQTT per Tailscale/LAN. Repo-Vorschlag: `orbitalo/homelab-sensors-mcp` oder Unterordner `homelab-brain/mcp/sensors/` --- ## Referenzen - Doku CT999: `/root/docs/projekte/klima-monitoring.md` - Doku CT999: `/root/docs/container/ct-143-raspi-broker.md` - Doku CT999: `/root/docs/container/ct-esp-satellite.md` - Telegraf: `homelab-brain/infra/telegraf/klima.conf`, `satellites.conf` - Grafana JSON: `homelab-brain/infra/grafana/klima-bewertung.json` - Phase-1-Referenz: `homelab-ai-bot/tools/grafana.py` (gleiche Queries, als Vorlage) --- ## Verifikation ```bash # MQTT live ssh pve-mu-3 'pct exec 143 -- mosquitto_sub -h localhost -t "+/temp" --retained-only -W 3 -v' # InfluxDB ssh pve-mu-3 'pct exec 143 -- influx -database sensors -execute "SELECT last(value) FROM temperature GROUP BY node"' # MCP Tool-Test (nach Deploy) # get_room_temperatures → Werte wie flur_unten ~24°C, wohnstube ~27°C ``` --- ## Akzeptanzkriterien - [ ] MCP-Server startet und registriert in Cline/Cursor - [ ] `get_room_temperatures` liefert aktuelle Werte aller online Satelliten - [ ] Kein Zugriff auf ioBroker-DB für Satelliten - [ ] `get_klima_power` funktioniert sobald Shelly `klima_flur_oben` MQTT sendet - [ ] README mit Architektur-Diagramm und Deploy-Anleitung - [ ] Doku CT999 nach Deploy aktualisieren --- ## Nicht im Scope - ioBroker-Reparatur - Grafana-Dashboard-Änderungen (bereits deployed) - Hermes2-Integration (folgt nach MCP stabil)
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: orbitalo/homelab-brain#129
No description provided.