- ioBroker Skript Integration von Gecko Alliance spa pack systems bzw. in.touch2 mit geckolib
- Todo's
- Unterstützung mehrere Spa Controller
- Bereitstellen von Datenpunkten mit der Konfiguration des Spa Controllers
- Bereistellen von Datenpunkten mit aktuellen Laufzeitinformationen (z.B. Temperatur usw.)
- Schalten der Pumpen
- Schalten der Beleuchtung
- Einstellen der Zieltemperatur
- Einstellen des Wasserpflegemodus
- Erinnerungen
- ToDos unten umsetzen
Hier auf Github werden 2 Arten von Skripten bereitgestellt:
- Python-Skripte im Ordner: Pyhton, über die das geckolib API angesprochen wird
- Javascript-Skripte im Ordner: Javascript, welche im Javascript Adapter angelegt werden müssen
Quelle: https://github.com/gazoodle/geckolib
Voraussetzung zur Installation: Python3 mind. v3.8 & Pip (am besten unter einem Linux, nur Versionen die unter Support sind)
Installation: sudo pip install geckolib
Update: sudo pip install geckolib --upgrade
Auch die geckolib muss ab und an mal aktualisiert werden.
Für die Python-Skripte sind noch folgende Bibliotheken bereitzustellen:
- requests:
sudo pip3 install requests
Alle Python Skripte aus dem Repository (Ordner: Python) müssen in einem Verzeichnis bereitgestellt werden. Im Beispiel nutzen wir jetzt direkt einen Order unterhalb /
, clonen das Github Repo und kompieren die Dateien aus dem Ordner Python ans eigentliche Ziel. Danach wird noch der owner angepasst.
~$ sudo mkdir /SpaController
~$ git clone https://github.com/rrov1/SwimSpa.git
Cloning into 'SwimSpa'...
remote: Enumerating objects: 268, done.
remote: Counting objects: 100% (268/268), done.
remote: Compressing objects: 100% (199/199), done.
remote: Total 268 (delta 124), reused 202 (delta 64), pack-reused 0
Receiving objects: 100% (268/268), 774.44 KiB | 5.16 MiB/s, done.
Resolving deltas: 100% (124/124), done.
~$ sudo cp SwimSpa/Python/*.py /SpaController/
~$ sudo chown -R iobroker:iobroker /SpaController
~$ ls -la /SpaController
total 56
drwxr-xr-x 2 iobroker iobroker 4096 Apr 2 11:51 .
drwxr-xr-x 23 root root 4096 Apr 2 11:37 ..
-rw-r--r-- 1 iobroker iobroker 9147 Apr 2 11:51 spa_config.py
-rw-r--r-- 1 iobroker iobroker 4353 Apr 2 11:51 spa_setTargetTemp.py
-rw-r--r-- 1 iobroker iobroker 4844 Apr 2 11:51 spa_setWatercareMode.py
-rw-r--r-- 1 iobroker iobroker 5022 Apr 2 11:51 spa_switchPump.py
-rw-r--r-- 1 iobroker iobroker 4064 Apr 2 11:51 spa_toggleLight.py
-rw-r--r-- 1 iobroker iobroker 7566 Apr 2 11:51 spa_updateBulk.py
Die Python-Skripte werden von den Javascript-Skripten aus aufgerufen mit den nötigen Parametern.
Wichtig: ioBroker benötigt Zugriff auf die Python-Skripte, der Ablageort kann z.B. auch /opt/iobroker/node_modules/iobroker.javascript
sein, das könnte allerdings mal Probleme mit Adapter oder ioBroker Updates geben.
- Adapter: "Simple RESTful API" installiert und eine konfigurierte Instanz am laufen (bitte prüfen, dass die IP in der Instanzkonfiguration passend eingestellt ist, getestet sind die Skripte mit IPv4, egal ob 0.0.0.0 oder die IP des Netzwerkadapters)
- Adapter: Javascript/Blockly installiert und eine Instanz am laufen
- Konfiguration des Javascript Adapters anpassen:
- Option: Enable Command "setObject" - ist aktiviert
- Option: Enable Command "exec" - ist aktiviert
- "Expert Mode" im Adapter aktivieren, damit der Ordner
global
angezeigt wird - im Ordner
global
ein neues SkriptSpaGlobal
anlegen und den Inhalt der Datei SpaGlobal.js hineinkopieren und evtl. Konfiguration anpassen:
Variable | Verwendungszweck/Wert |
---|---|
BASE_ADAPTER |
Basispfad zum Adapter unter dem die Datenpunkte angelegt werden. Standard ist der erste Javascript Adapter: "javascript.0". |
BASE_FOLDER |
Basispfad unter dem die Datenpunkte angelegt werden sollen, Standardwert ist: "Datenpunkte.SwimSpa" |
SPA_EXECUTEABLE |
Auszuführendes Programm, Standard ist "python3" |
PY_SCRIPTS_FOLDER |
Verzeichnis in dem sich die Python-Skripte befinden. Standard ist/SpaController damit das mit der Anleitung zusammenpasst. |
- Neuen Ordner
Spa
im Javascript Adapter anlegen um alle folgenden Skripte an einen Ort zu abzulegen - Neues Skript
SpaVariablen
in diesem Ordner anlegen und den Inahlt von SpaVariablen.js einspielen - den Aufruf der Funktion createDatapoints() anpassen:
Parameter | Wert |
---|---|
1 | Anzahl Spa Controller im Netz, typ. Weise: 1 |
2 | Anzahl Pumpen pro Spa Controller, typ. Weise 3 |
3 | Datenpukte für Wasserfall mit anlegen |
- Nach dem Speichern, das Script 1x ausführen
- Prüfen ob die Datenpunkte vorhanden sind, der Objektbau sollte so aussehen:
Konfigurationswerte, die sich seltener ändern werden alle 6h von SpaUpdateConfig
aktualisiert:
- Neues Skript:
SpaUpdateConfig
im OrdnerSpa
erstellen und den Inhalt von SpaUpdateConfig.js einfügen - Die Javascript Funktion:
updateSpaConfig()
wird beim speichern 1x ausgeführt, danach aller 6h. - Jetzt prüfen ob die Datenpunkte die eher statische Konfigurationswerte darstellen, wie (z.B.: Temepratureinheit, ID, U_ID) aktualisiert worden sind
Werte die sich häufig ändern werden minütlich von `SpaUpdateValues` aktualisiert:
- Neues Skcript:
SpaUpdateValues
im OrdnerSpa
erstellen und den Inhalt von SpaUpdateValues.js einfügen - Das Skript wird minütlich aufgerufen und aktualisiert alle anderen Werte wie z.B. die Wassertemperaturen, Pumpenstatus, Licht usw.
- Jetzt überprüfen, on die Wassertemperatur aktualisiert wurde
- Falls nicht vorhanden einen neuen Ordner
Spa
im JavaScript-Adapter anlegen (um die Skripte etwas zu sortieren) - Skripte bereitstellen:
Zweck | Javascript | Python Skript |
---|---|---|
Schalten der Pumpen | PumpSwitches (Datei: PumpSwitches.js) |
spa_switchPump.py clientId restApiUrl spaId spaIP pumpId newPumpState pumpChannel |
Schalten der Beleuchtung | LightToggle (Datei: LightToggle.js) |
spa_toggleLight.py clientId restApiUrl spaId spaIP lightKey lightChannel |
Setzen der Zieltemperatur | TargetTemp (Datei: TargetTemp.js) |
spa_setTargetTemp.py clientId restApiUrl spaId spaIP targetTemp targetTempDatapoint |
Setzen des Wasserpflegemodus | WatercareMode (Datei: WatercareMode.js) |
spa_setWatercareMode.py clientId restApiUrl spaId spaIP waterCareModeIdx devicePath |
Automaische Nachführung der Zieltemperatur | SpaMoveTargetTemp (Datei: SpaMoveTargetTemp.js) |
nicht benötigt |
Hinweis: Wenn im vorhergehenden Schritt bei BASE_ADAPTER bzw. BASE_FOLDER abweichende Pfade angegeben worden sind, müssen diese in den on()-Aufrufen ebenfalls angepasst werden.
Diese Skripte werden jede Minute gestartet (Zeile 4 in SpaUpdateValues.js
) um Änderungen von Werten wie z.B. der Wassertemperatur, Pumpenstatus usw. vom SpaController auszulesen. Von den 1.440 Aufrufen pro Tag schlagen bei mir lt. Protokoll: ~50 Aufrufe fehl. Eine Quote so in der Höhe, vielleicht bis zu 200 je Tag, kann als normal betrachtet werden. Das hängt u.a. damit zusammen wie die geckolib mit dem SpaController kommuniziert, dann natürlich das minütliche pollen, vielleicht noch die App die parallel was tut, leider jenseits von perfekt von der Implementierung her :-(.
Wenn ioBroker in einem Docker Container betrieben wird funktioniert die automatische Erkennung der SpaController nicht, da diese auf einem Broadcast beruht und der Container in einem separaten Netzsegment läuft. Für diese Fälle gibt es den Datenpunkt: javascript.0.Datenpunkte.SwimSpa.discoverIP
in dem in diesem Fall die IP-Adresse bzw. eine Komma separierte Liste von IP-Adressen der SpaController hinterlegt werden kann.
Dieser Datenpunkt kann auch verwendet werden, wenn sich die SpaController in einem nicht per Broadcast erreichbaren Netzwerksegment befinden.
Hier mal ein Beispiel für eine Visualisierung mit vis im ioBroker.
- Momentan ist der Pfad zu den Datenpunkten in den Python Scripten noch fest codiert - umstellen auf Parameter nötig
- Die URL vom ioBroker Rest API muss als Parameter mit übergeben werden
- Alle Python Skripte sollen ohne Konstanten aufrufbar sein
- Statt cron soll der regelmäßige Aufruf mit ioBroker Schedule möglich sein
- Status der Erreichbarkeit des Spa in Datenpunkt darstellen (Ebene Netzwerk, Online/Offline), sowie Fehler bei letzten Kommando
- Richtiges Discovery der Eigenschaften des Spa Controllers anstatt feste Anlage der Datenpunkte via Skript
- Das setzen der Zieltemperatur ist empfindlich ggü. mehreren schnell auseinanderfolgenden Wertänderungen. Momentan am besten einen Slider nutzen, der eine Funktion "Update value on release" untersützt, so dass der DP nur einmal geändert wird. Das Script braucht immer ein paar Sekunden bis der Wert im Hintergrund gesetzt wurde.
- Aktuell funktionieren die Erinnerungen nicht, da die geckolib keine Werte zurückgibt
- Das Auslösen einer Aktion (Licht an/aus, Pumpe an/aus) braucht ca. 15 Sekunden bis es umgesetzt ist (liegt am Verbindungsaufbau der recht lange dauert bei der geckolib)
- Pfad zu den Python Skripten global konfigurierbar machen und die Anleitung dahingehend anpassen (auch Skriptbereitstellung)
- Struktur der Datenpunkte noch mal etwas straffen:
-
javascript.0.Datenpunkte.SwimSpa.x.WasserpflegeIndex
-> entfällt zugunstenWasserpflegeSwitch
- ...
-
- Python Scripte melden keine Statustexte mehr in Datenpunkte:
-
javascript.0.Datenpunkte.SwimSpa.x.Wasserpflege
-> entfällt zugunstenWasserpflegeSwitch
, den zugehörigen z.B. deutschen Statustext kann ein Widget selbst darstellen (z.B. vis basic - ValueList Text oder eine Combobox) - ...
-
- Statussensor (
javascript.0.Datenpunkte.SwimSpa.x.Sensoren.Status.State
) Funktion herstellen (funktioniert momentant überhaupt nicht bzw. zeigt immer: Connected) - Nutzbarkeit im Docker Container herstellen (durch die besonderen Netzwerksituation geht Discovery nicht und auch die Steuerung)