################## TSGRain Controller ################## Der TSGRain Controller ist für die Ausführung der Bewässerungslogik zuständig. Er liest die Tasten auf dem Bedienfeld ein und steuert die Ventile und LEDs. Architektur ########### Der Controller basiert auf einer Warteschlange aus Bewässerungsaufgaben, die nacheinander ausgeführt werden. Bei eingehenden Steuerungsereignissen (Tastendruck, RPC-Event, Zeitplan-Event) werden neue Aufgaben in die Warteschlange eingereiht. Wird der Controller beendet, kann die Warteschlange in der Datenbank gespeichert werden, wodurch das Bewässerungsprogramm beim Neustart fortgesetzt wird. 1. Auslösung der Bewässerung duch Zeitplan, Tastendruck oder RPC (von der Weboberfläche). 2. Bewässerungsaufgabe wird erstellt und eingereiht. 3. Sind freie Bewässerungskapazitäten vorhanden (gewählte Bewässerungszone noch nicht aktiv, nicht mehr als ``MAX_ACTIVE_ZONES`` aktive Bewässerungszonen), wird der Auftrag gestartet. 4. Der entsprechende Ventilausgang wird aktiviert und ein Timer über die entsprechende Bewässerungszeit gestartet. 5. Ist der Timer abgelaufen, wird der Ventilausgang deaktivert und der Bewässerungsauftrag aus der Warteschlange entfernt. 6. Wird ein Bewässerungsauftrag abgebrochen (entweder durch Tastendruck oder durch Löschen des Zeitplans, muss ebenfalls der Ventilausgang deaktiviert und der Bewässerungsauftrag aus der Warteschlange entfernt werden. 7. Wird der Controller beendet, werden alle laufenden Aufträge angehalten. Die Ventilausgänge werden deaktiviert und die gesamte Warteschlange inklusive der Restzeiten der Timer in der Datenbank gesichert. Die Bewässerungsaufgaben haben je nach Quelle unterschiedliche Prioritäten. Eine manuell gestartete Bewässerung hat gegenüber einer zeitplangesteuerten Vorrang. Läuft also gerade eine zeitplangesteuerte Bewässerung und es wird eine neue Aufgabe mittels Taster gestartet, so wird die zeitplangesteuerte Bewässerung angehalten und nach Abschluss der manuellen Bewässerungsaufgabe fortgesetzt. Pro Quelle und Zone darf nur ein Bewässerungsauftrag in der Warteschlange existieren. Hierdurch wird verhindert, dass sich Bewässerungsaufträge anhäufen, wenn zum Beispiel ein Zeitplan mit einem zu kurzen Intervall gewählt wurde. Bedienpanel ########### Das Bedienpanel besteht aus einem Taster und einer LED pro Bewässerungszone. Zusätzlich gibt es auch eine Modus-LED (RGB) und einen Taster, um die zeitplangesteuerte Bewässerung ein/auszuschalten. Die LEDs und Tasten werden über den I2C-Portexpander MCP23017 angesteuert. Bei Druck auf einen Zonen-Taster wird eine neue Bewässerungsaufgabe gestartet, sollten momentan Bewässerungskapazitäten verfügbar sein. Die Zonen-LEDs leuchten, wenn auf den entsprechenden Zonen eine Bewässerungsaufgabe aktiv ist. Wenn die übrige Bewässerungszeit unter einer Minute beträgt, sollen die LEDs blinken. Die Modus-LED leuchtet grün, wenn die zeitplangesteuerte Bewässerung aktiviert ist. Läuft gerade eine zeitplangesteuerte Bewässerungsaufgabe, blinkt die LED grün. Läuft gerade eine manuelle Bewässerungsaufgabe, blinkt die LED rot. Bei einer Fehlbedienung (z.B. fehlende Bewässerungskapazitäten) sollen alle Zonen-LEDs einmal aufblinken. GRPC ==== Der Controller kann über eine GRPC-Schnittstelle mit anderen Anwendungen kommunizieren. Datenmodelle ============ Source ------ ``name`` Name der Quelle: manual, schedule ``priority`` **Priorität:** Priorität der Quelle Task ---- ``source`` **Quelle:** Zeitplan (mit Zeitplan-ID), Tastendruck ``zone: int`` ID der Bewässerungszone (Platz) ``duration: int`` Bewässerungsdauer in Sekunden ``remaining: int`` Verbleibende Bewässerungsdauer in Sekunden Schedule -------- ``date: datetime`` Datum/Uhrzeit ``duration: int`` Bewässerungsdauer (pro Platz, in Sekunden) ``zones: List[int]`` Bewässerungszonen (Plätze) ``repeat: bool`` Zeitplan täglich wiederholen Konfiguration ============= ``MAX_ACTIVE_ZONES`` in/output pins