Skip to content

MrDarkvoid/growctrl

Repository files navigation

GROWCTRL Logo

🌱 GROWCTRL

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

Lizenz Home Assistant HACS Status

MrDarkvoid – entwickelt in Zusammenarbeit mit Claude (Anthropic), Vibe Coding


Was ist GROWCTRL?

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.


Was die Integration tut

GROWCTRL ist kein reines „Anzeige-Paket" – der Kern ist ein Controller, der pro Station und pro Zelt im Takt arbeitet und Entscheidungen trifft.

🌿 Systemtyp & Pflanzen-Preset

  • 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 unter growctrl/ anlegen (Vorlage: examples/plants.example.yaml) und den Dienst growctrl.reload_plants ausfü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.

💡 Lichtsteuerung

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

💧 Pumpen & Bewässerung

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

⏻ Phase „Aus" (Station ruht)

  • 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".

🌡️ Klima pro Phase (zeltweit)

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 Heizung Ziel 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 (Daily Light Integral)

  • 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 als number „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.

🔥 Germination-Heizung (optional, je Station)

  • 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 ab Ziel + Hysterese. Ziel (Standard 26 °C) und Hysterese (Standard ±0,5 K) sind je Station als number einstellbar.
  • 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 K bzw. absolut 40 °C), Plausibilitäts-Watchdog (heizt lange, Temperatur steigt nicht → Hinweis). Alle Ereignisse landen als Klartext im Protokoll.

✋ Manuelle Übernahme (Handschaltung)

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

🛡️ Schutz- & Diagnosefunktionen

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

📓 Ereignisprotokoll

  • 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).

💾 Konfiguration sichern (Backup)

  • Der Service growctrl.export_config schreibt 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_config liest 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.

Entitäten im Überblick

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

Installation

GROWCTRL besteht aus zwei HACS-Repositories: der Integration (Backend) und den Dashboard-Karten (Frontend).

1. Integration

  1. HACS → drei Punkte → Benutzerdefinierte Repositories.
  2. https://github.com/MrDarkvoid/growctrl als Integration hinzufügen.
  3. „GROWCTRL" installieren, Home Assistant neu starten.
  4. Einstellungen → Geräte & Dienste → Integration hinzufügen → GROWCTRL und dem Dialog folgen (Zelt anlegen, Stationen, Systemtyp & Sensoren zuordnen).

2. Karten

  1. https://github.com/MrDarkvoid/growctrl-cards als Dashboard (Lovelace) hinzufügen.
  2. Installieren – die Ressource wird von HACS automatisch eingebunden.

Migrationshinweise (v3 → v4) stehen in docs/migration.md.

Verwandte Projekte


Das Dashboard – Design „Soft Garden"

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-motion wird respektiert.

Per-Karte-Konfiguration mit Beispielen: cards/README.md.


Sicherheit & Haftung

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.


Lizenz & Namensnennung

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

Hinter dem Projekt: Vibe Coding

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"

About

Ein vollständiges Steuer- und Visualisierungs-System für hydroponische Growzelte – nativ in Home Assistant.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors