Ein vollständiges Steuer- und Visualisierungs-System für hydroponische Growzelte – nativ in Home Assistant.
Automatik für Licht, Pumpen, Klima und O₂ · Pflanzen-Preset für pH/EC/DLI-Idealwerte · DLI-Tracking · Handschaltungs-Erkennung · mehrstufige Schutzfunktionen · persistentes Ereignisprotokoll · ein durchgestyltes Dashboard im Design „Soft Garden".
MrDarkvoid – entwickelt in Zusammenarbeit mit Claude (Anthropic), Vibe Coding
GROWCTRL verwandelt Home Assistant in eine vollwertige Growzelt-Steuerung. Statt dutzender loser Automationen, Helfer und Template-Sensoren installierst du eine Integration, legst deine Zelte und Stationen über den Konfigurations-Dialog an – und bekommst eine konsistente Menge an Entitäten, eine robuste Regel-Logik und ein dazu passendes Dashboard.
Das Leitprinzip ist einfach: Eine Station = eine Pflanze. Du legst beliebig viele Zelte an (jedes mit eigenem Namen und eigener Farbe); jedes Zelt enthält eine oder mehrere Stationen (z. B. ein DWC-Becken oder einen Topf), und jede Station steuert genau eine Pflanze – mit eigener Wachstumsphase, eigenen Aktoren und – je nach gewähltem Systemtyp und gewählter Kultur – passenden Idealwerten aus dem Pflanzen-Preset.
GROWCTRL ist kein reines „Anzeige-Paket" – der Kern ist ein Controller, der pro Station und pro Zelt im Takt arbeitet und Entscheidungen trifft.
- Jede Station hat einen Systemtyp: Generisch, DWC oder Erde.
- Bei DWC und Erde wählst du über die
select-Entität „Pflanze" aus 17 Kulturen (Generisch, Cannabis, Tomate, Gurke, Paprika, Chili, Aubergine, Erdbeere, Salat (allg.), Spinat, Mangold, Pak Choi, Basilikum, Kräuter (allg.), Bohnen, Zucchini, Microgreens). - Das Preset liefert je Pflanze × System × Phase:
- pH-Idealbereich (getrennt für DWC und Erde),
- EC-Idealbereich (Erde-Werte ~12 % niedriger als DWC; Flush sehr niedrig, Trocknung ohne Nährlösung),
- DLI-Tagesziel (systemunabhängig je Phase; Flush wie Bloom, Trocknung = 0).
- Wichtig: pH und EC werden nicht geregelt. Sie sind reine Lesewerte vom ESP; das Preset liefert nur den Idealbereich für die farbige Zonen-Darstellung im Dashboard. Bei Generisch gelten generische Richtwerte ohne Pflanzen-Auswahl.
- Jede Kultur trägt zusätzlich ein Klima-Ziel je Phase (VPD/RH), das die Zelt-Automatik im Modus „Klima automatisch aus Pflanzen" nutzt (siehe unten).
- Eigene Sorten/Kulturen ohne Code ergänzen: Datei
plants.yaml(oder.json) im Konfigurationsordner untergrowctrl/anlegen (Vorlage:examples/plants.example.yaml) und den Dienstgrowctrl.reload_plantsausführen. Felder je Pflanze:ph,ec,dli,tage,klima. So kann eine Station z.B. „Apple Fritter" heißen, während die Pflanze „Cannabis" bleibt.
- Phasenabhängige AN/AUS-Zeiten: getrennte Ausschaltzeiten für Seedling/Veg und für Bloom/Flush, damit der Lichtzyklus beim Phasenwechsel automatisch umschaltet.
- 24-Stunden-Licht wird korrekt erkannt (AN-Zeit = AUS-Zeit) und durchgehalten.
- Live-Sensor „Licht-Restzeit" mit Klartext („Licht an für 5 h 40 min"), Zustand und prozentualem Fortschritt der laufenden Phase.
- Zyklische Pumpensteuerung (z. B. 30 s alle 60 min) mit Restzeit-Sensor; die Karte zeigt Zustand (läuft/Pause), Fortschrittsbalken und „zuletzt bewässert vor …".
- Trockenlauf-Schutz: ist ein Tank-Füllstand konfiguriert und fällt unter den Mindeststand, wird die Pumpe gesperrt und ein Diagnose-Hinweis gesetzt.
- Erde / Bodenfeuchte (optional): mit Feuchtesensor wird nur bewässert, wenn die Feuchte unter die Schwelle fällt – sonst läuft der Zyklus rein zeitbasiert.
- Steht eine Station auf „Aus", ruht sie vollständig: Licht, Pumpe, Heizung und Umluft/O₂ bleiben aus, es gibt kein DLI-Ziel, und die Phase fließt nicht in die zeltweite Klima-Gewichtung ein.
- Stehen alle Stationen eines Zelts auf „Aus", wird zusätzlich die Klima-Automatik des Zelts abgeschaltet (kein automatischer Wiederanlauf – bewusst wieder einschalten).
- In Karte und CheckUp wird eine ruhende Station klar als gestoppt dargestellt (ausgegraute Punkte inkl. Sensoren), nie fälschlich „alles OK".
Zwei Betriebsarten, beim Anlegen des Zelts wählbar (Option „Klima: automatisch aus Pflanzen"):
- Automatik: das Sollband entsteht je Zyklus aus den Stationen – pro Station Pflanze × aktuelle
Phase → hinterlegtes Klima-Ziel, über alle aktiven Stationen gleichgewichtet gemittelt
(Stationen auf „Aus" zählen nicht). Drei Ziel-Sensoren (
Ziel VPD,Ziel RH, bei HeizungZiel Temp) zeigen das aktuell berechnete Band; die „Klima-Phase" steht fest auf Auto. - Manuell: pro Zelt 16 Sollwert-Zahlen (VPD- und RH-Min/Max für Seedling, Veg, Bloom, Trocknung; Flush erbt die Bloom-Werte). Die „Klima-Phase"-Auswahl bestimmt die Quelle: Auto folgt der führenden Stationsphase, oder du setzt die Phase fest.
- Der VPD-Sensor legt die wirksame Phase (
phase_effektiv), die Sollwerte (sollwerte), den Modus (klima_auto), den Taupunkt (taupunkt,schimmelrisiko) sowie – bei konfiguriertem CO2-Sensor (optional je Zelt) – CO2 (co2,co2_status: low/ok/high) als Attribute offen. Das Dashboard zeigt daraus Zonen-Balken und (im Automatik) die Ziel-Kacheln. Der Klima-Modus (VPD/RH) bestimmt, ob nach VPD oder relativer Feuchte geregelt wird.
- DLI wird je Station aus dem (ggf. geteilten) Lux-Sensor und dem konfigurierten Lichtplan berechnet; ein Tagesreset setzt den Zähler um Mitternacht zurück.
- Lux → PPFD → DLI – so wird gerechnet:
PPFD [µmol·m⁻²·s⁻¹] ≈ Lux × Faktor. Standard-Faktor 0,015 (LED-Vollspektrum); er ist spektrumabhängig (Sonne ≈ 0,0185, HPS ≈ 0,013) und je Station alsnumber„Lux→PPFD-Faktor" (0,005–0,05) einstellbar.- Solange Lux > 500 (Licht gilt als „an") summiert sich der Tages-DLI minütlich.
- Prognose: der bisherige Tagesschnitt wird auf die geplante Lichtzeit der Phase hochgerechnet.
- Dazu ein phasenabhängiges Ziel aus dem Preset; eine Überschreitung markiert die Karte bernsteinfarben.
- Für warme Anzucht/DWC: eine geschaltete Steckdose (Heizmatte) + ein Temperaturfühler (Substrat/Wurzelzone empfohlen, Luft als Fallback) genügen.
- Zweipunkt-Regelung mit Hysterese (bewusst kein PID – die Steckdose schaltet nur AN/AUS):
AN unter
Ziel − Hysterese, AUS abZiel + Hysterese. Ziel (Standard 26 °C) und Hysterese (Standard ±0,5 K) sind je Station alsnumbereinstellbar. - Eigener Automatik-Schalter „Germination-Heizung"; die Heizungszeile der Station hat einen integrierten An/Aus-Schalter direkt im Balken-Bereich.
- Zwangssperre: Bei Zelt-Gate aus, Automatik aus oder Wartung wird die Heizung zwangsweise ausgeschaltet und der Schalter gesperrt. Nach dem Aufheben der Sperre bleibt sie aus und muss bewusst wieder eingeschaltet werden – kein automatischer Wiederanlauf.
- Sicherheitskette: Sensor-Guard (Fühler fehlt/eingefroren → gesperrt),
Übertemperatur-Notaus (über
Ziel + 5 Kbzw. absolut 40 °C), Plausibilitäts-Watchdog (heizt lange, Temperatur steigt nicht → Hinweis). Alle Ereignisse landen als Klartext im Protokoll.
- Schaltest du einen Aktor von Hand, erkennt GROWCTRL das (zwei aufeinanderfolgende Zyklen, in denen Ist- und Soll-Zustand auseinanderlaufen) und respektiert deinen Eingriff.
- Nach einer einstellbaren Dauer („Manuelle Übernahme", Standard 60 min;
0= sofort) kehrt die Automatik selbsttätig zum Lichtplan zurück. - Bei geteilten Lichtern wird der manuelle Zustand während des Fensters über die ODER-Logik korrekt mitgeführt.
- Sensor-Stale-Erkennung: eingefrorene Klima-Sensoren werden nach einer einstellbaren Frist erkannt; die Karte zeigt „—" statt veralteter Werte.
- Leistungs-Plausibilität: Licht „an", aber keine Leistungsaufnahme → Hinweis.
- Licht-Failsafe überwacht den Regelbetrieb.
- Wartungsmodus: die Automatik greift bewusst nicht ein, alle Aktoren bleiben von Hand schaltbar. (Der frühere Testmodus ist entfallen – Wartung deckt den Fall ab.)
- Zelt-Schalter (Gate): deaktiviert ein Zelt komplett. Die Klima-Automatik-Einstellung bleibt erhalten, damit das Klima beim Reaktivieren sofort weiterläuft.
- Jede relevante Aktion wird in einem persistenten Log festgehalten (übersteht Neustarts).
- Drei Schweregrade (Info / Warnung / Kritisch); das Dashboard kann ab einer Stufe filtern.
- Der Sensor „Letztes Ereignis" trägt den Schweregrad des jüngsten Eintrags und legt den
Datenbus für die Karten offen (
gc_pflanze,gc_system,gc_phase,gc_ph_bereich,gc_ec_bereich,gc_dli_ziel,gc_sensors,verlauf).
- Der Service
growctrl.export_configschreibt ein JSON-Backup aller Zelte und Stationen (Setup + aktuelle Einstellungen wie Phase, Pflanze, Systemtyp, Automatik) nach/config(growctrl_backup_<Zeitstempel>.json) und gibt das Backup zusätzlich als Service-Antwort zurück. - Wiederherstellen: der Service
growctrl.import_configliest eine Backup-Datei (ohne Angabe die neueste in/config) und legt fehlende Zelte/Stationen wieder an (Setup: Sensoren/Aktoren/ Systemtyp); bereits vorhandene werden übersprungen. Hinweis: laufende Werte wie Phase/Pflanze/ Klimagrenzen stellt Home Assistant nur wieder her, solange die Entitäten erhalten sind – nach einer Neuinstallation also kurz prüfen und ggf. neu wählen. - Aufruf über Entwicklerwerkzeuge → Aktionen oder bequem als Button der Actions-Karte.
GROWCTRL legt die Entitäten deterministisch nach dem Muster
<domain>.growctrl_<zelt>_<station>_<funktion> an (z. B.
switch.growctrl_gross_main1_automatik). Auf Zelt-Ebene entfällt der Stationsteil.
Pro Station
| Plattform | Funktion | Zweck |
|---|---|---|
switch |
Automatik | Regelbetrieb der Station an/aus |
switch |
Wartung | Automatik pausieren, manuell schalten |
switch |
Germination-Heizung (mit Heizung) | Heizungs-Automatik an/aus (sperrt bei Gate/Automatik/Wartung) |
select |
Wachstumsphase | Aus · Seedling · Veg · Bloom · Flush · Trocknung |
select |
Pflanze (nur DWC/Erde) | Kultur für die Preset-Idealwerte |
time |
Licht AN / AUS (Seed-Veg) / AUS (Bloom) | Lichtplan je Phase |
date |
Keimstart | Basis für die Altersberechnung (Tagzähler) |
button |
Keimstart zurücksetzen | Keimdatum löschen (kein Alter / keine Empfehlung) |
number |
Manuelle Übernahme; Lux→PPFD-Faktor (mit Lux); Heizung Zieltemperatur & Hysterese (mit Heizung); Pumpenzeiten je Phase; Füllstand-/Feuchte-Schwellen | Rückkehr-Dauer, DLI-Faktor, Heizungs-Sollwerte, Zyklus, Schutz |
sensor |
Licht-Restzeit, Pumpe-Restzeit | Live-Status mit Klartext & Fortschritt |
sensor |
Alter seit Keimung, Phasen-Empfehlung | Tagzähler, Richtwert-Hinweis |
sensor |
DLI heute, DLI-Prognose | Lichtsumme & Hochrechnung (Ziel aus Preset) |
sensor |
Letztes Ereignis | jüngster Log-Eintrag inkl. Schweregrad + Datenbus |
binary_sensor |
Manueller Eingriff, Licht-Failsafe, Zeiten unvollständig, Pumpe gesperrt, Licht ohne Leistung; Heizung aktiv / Übertemperatur / Sensorfehler (mit Heizung) | Status & Diagnose |
Pro Zelt
| Plattform | Funktion | Zweck |
|---|---|---|
switch |
Zelt aktiv | Gate für das ganze Zelt |
switch |
Klima-Automatik | VPD/RH-Regelung an/aus |
select |
Klima-Modus, Klima-Phase | Betriebsart & Phasenquelle (Auto/manuell) |
number |
16× VPD/RH Min/Max je Phase (Manuell-Modus), Sensor-Timeout | phasenabhängige Sollwerte & Stale-Frist |
sensor |
VPD, Ziel VPD/RH/Temp (Automatik), Status, Letztes Ereignis | Klimakennzahlen, berechnetes Sollband & Protokoll |
todo |
Aufgaben | Aufgabenliste je Zelt (Phasen-Empfehlungen landen automatisch) |
binary_sensor |
Klima-Sensoren eingefroren | Stale-Diagnose |
GROWCTRL besteht aus zwei HACS-Repositories: der Integration (Backend) und den Dashboard-Karten (Frontend).
- HACS → drei Punkte → Benutzerdefinierte Repositories.
https://github.com/MrDarkvoid/growctrlals Integration hinzufügen.- „GROWCTRL" installieren, Home Assistant neu starten.
- Einstellungen → Geräte & Dienste → Integration hinzufügen → GROWCTRL und dem Dialog folgen (Zelt anlegen, Stationen, Systemtyp & Sensoren zuordnen).
https://github.com/MrDarkvoid/growctrl-cardsals Dashboard (Lovelace) hinzufügen.- Installieren – die Ressource wird von HACS automatisch eingebunden.
Migrationshinweise (v3 → v4) stehen in docs/migration.md.
growctrl– diese Integration (Backend).growctrl-cards– die Dashboard-Karten (Frontend).growctrl-esp– optionale ESPHome-Firmware für die GROWCTRL-Hardware.
Das Frontend besteht aus aufeinander abgestimmten Karten. Alle sind integrations-nativ:
Entity-IDs werden aus Zelt- und Stationsname abgeleitet, du musst sie nicht von Hand eintragen
(overrides: als Notausgang bleibt).
| # | Karte | Aufgabe |
|---|---|---|
| 1 | Hero | Zelt-Übersicht: Schalter, Klima-KPIs, VPD-Zone, Stationsliste, Infosystem |
| 2 | Station | Herzstück: zwei Dropdowns (Pflanze + Phase mit Tagzähler), Phasen-Empfehlung als Text, Versorgungszeilen Licht/DLI/Heizmatte/Pumpe/Tank (Heizungszeile mit integriertem, bei Sperre deaktiviertem Schalter), Aktoren (4/Reihe), Sensorwerte (pH/EC als Zonen-Balken aus dem Preset, Temp/RH als Mini-Verlauf), Protokoll-Auszug, gruppierter Einstellbereich |
| 3 | Checkup | Ampel-Matrix: Sensor-Gesundheit je Station (pH/EC/Temp/RH/Wasser-/Bodentemperatur – grün im Ideal, gelb knapp daneben, rot Problem, leere Zelle = kein Sensor), Steuerung (Licht/Pumpe/Heizung/Auto/Eingriff/Status) und Zelt getrennt, mit Legende |
| 4 | Status / Protokoll | Ereignisprotokoll, chronologisch über mehrere Stationen, Filter (Alle/Warnungen/Infos) |
| 5 | History | Klima-Verlauf (Temp/RH), 24 h / 48 h |
| 6 | Metric | Einzelwert mit Sollband (z. B. Wassertemperatur) |
| 7 | Tank | Füllstand mit Visual, Mindeststand-Marke, Liter und Reichweiten-Prognose (~Tage bis Mindeststand) |
| 8 | Controls | Aktoren-Raster pro Zelt (inkl. Heizmatte/Befeuchter) |
| 9 | Sensors | freie Wertübersicht, optionale Verlaufs-Charts (z. B. pH & EC) mit Sollband |
| 10 | Tent (kompakt) | platzsparende Zelt-Karte mit VPD-Zone |
| 11 | Actions (Schnellaktionen) | konfigurierbare Buttons, die einen Service aufrufen (z. B. „alle Lichter aus", Konfig-Backup, eigenes Script) – mit optionaler Bestätigung |
Designprinzipien
- Warmes Schwarzgrün als Fläche, ein frei wählbarer Akzent je Zelt – Sonderfarben (z. B. Heizmatte orange, Befeuchter blau) bleiben themenunabhängig.
- Status (OK/Warnung/Kritisch) ist überall gleich kodiert; Farbe ist nie der einzige Träger.
- Automatische Sprache: Deutsch oder Englisch je nach Home-Assistant-Sprache (Deutsch ist die Quelle; fehlt eine Übersetzung, bleibt es Deutsch).
- Skaliert mit dem Gerät: auf dem PC etwas größer, am Handy kompakt.
- Barrierearm: große Touchziele, sichtbare Fokus-Ringe, ausreichender Kontrast,
prefers-reduced-motionwird respektiert.
Per-Karte-Konfiguration mit Beispielen: cards/README.md.
GROWCTRL schaltet Pumpen, Licht und Heizung. Für sichere Installation, elektrische
Sicherheit (Fehlerstromschutz, geeignete Relais/Schütze) und die Aufsicht bist allein du
verantwortlich. Das System wird ohne Gewähr bereitgestellt – siehe LICENSE.
Veröffentlicht unter der GROWCTRL Source-Available License (GC-SAL) 1.0
(LICENSE, Deutsch maßgeblich, vollständige englische Fassung enthalten):
- ✅ Ansehen, privat & nicht-kommerziell nutzen, Fehler melden, PRs einreichen.
- ❗ Namensnennung „MrDarkvoid" ist Pflicht; Urheber- und Lizenzvermerke dürfen nicht entfernt werden.
- ⛔ Kommerzielle Nutzung, Re-Hosting und das Veröffentlichen modifizierter Versionen nur mit schriftlicher Zustimmung. (GitHubs Plattform-Fork-Recht bleibt unberührt.)
GROWCTRL ist „Vibe Coding" – iterativ entworfen und gebaut im Dialog zwischen MrDarkvoid
und Claude (Anthropic). Mehr dazu in docs/vibe_coding.md;
Kontext, Architektur und die wichtigsten technischen Erkenntnisse in
docs/projektgeschichte.md.
🌱 GROWCTRL · GC-SAL 1.0 · MrDarkvoid — „Soft Garden"