proto | ||
tests | ||
tsgrain_controller | ||
.bumpversion.cfg | ||
.editorconfig | ||
.gitignore | ||
.pre-commit-config.yaml | ||
.pylintrc | ||
.tool-versions | ||
LICENSE | ||
README.rst | ||
requirements.txt | ||
requirements_dev.txt | ||
requirements_test.txt | ||
setup.py | ||
tox.ini | ||
tsgrain.toml.example |
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.
- Auslösung der Bewässerung duch Zeitplan, Tastendruck oder RPC (von der Weboberfläche).
- Bewässerungsaufgabe wird erstellt und eingereiht.
- 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. - Der entsprechende Ventilausgang wird aktiviert und ein Timer über die entsprechende Bewässerungszeit gestartet.
- Ist der Timer abgelaufen, wird der Ventilausgang deaktivert und der Bewässerungsauftrag aus der Warteschlange entfernt.
- 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.
- 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