Der TSGRain Controller ist für die Ausführung der Bewässerungslogik zuständig.
Find a file
2022-02-22 08:27:28 +01:00
proto api improvements, fix job scheduler 2022-02-07 00:23:31 +01:00
tests fix inverted queuing mode for add_task 2022-02-09 15:51:21 +01:00
tsgrain_controller fix typo 2022-02-22 08:27:28 +01:00
.bumpversion.cfg Bump version: 0.1.4 → 0.1.5 2022-02-09 15:52:21 +01:00
.editorconfig Initial commit 2022-01-02 21:30:56 +01:00
.gitignore add system time configuration 2022-01-31 00:14:48 +01:00
.pre-commit-config.yaml add grpc models 2022-01-28 23:44:08 +01:00
.pylintrc api improvements, fix job scheduler 2022-02-07 00:23:31 +01:00
.tool-versions Initial commit 2022-01-02 21:30:56 +01:00
LICENSE add license 2022-02-07 02:11:17 +01:00
README.rst add output tests 2022-01-22 07:57:18 +01:00
requirements.txt add grpc models 2022-01-28 23:44:08 +01:00
requirements_dev.txt fix task queue when auto mode is interrupted 2022-02-08 00:40:46 +01:00
requirements_test.txt add db 2022-01-26 19:54:43 +01:00
setup.py Bump version: 0.1.4 → 0.1.5 2022-02-09 15:52:21 +01:00
tox.ini add system time configuration 2022-01-31 00:14:48 +01:00
tsgrain.toml.example fix --config cmdline argument, add config example 2022-02-07 02:48:09 +01:00

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