Controller/README.rst
2022-01-22 07:57:18 +01:00

126 lines
4 KiB
ReStructuredText

##################
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