Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Einsteigerfragen
    4. Steuerung Gecko in Touch 2 per iob möglich? (Wellis)

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Steuerung Gecko in Touch 2 per iob möglich? (Wellis)

    This topic has been deleted. Only users with topic management privileges can see it.
    • T
      tklein @rrov1 last edited by

      @rrov1 ich rufe die auch alle 6 stu auf

      1 Reply Last reply Reply Quote 0
      • T
        tklein @rrov1 last edited by

        @rrov1

        hi, was hälst du davon einen dp mit dem jeweils aktuelle status code des calls (spa_updateBulk.py zb. 200 zu schreiben oder alternativ den zeitstempel des letzten erfolgreichen updates. so wie beim reminder.

        1 Reply Last reply Reply Quote 0
        • T
          tklein last edited by

          @rrov1 beim manuellen parsen der responseausgabe habe ich folgendes bekommen:

          pi@raspberrypi-iob:~/wellis/v2 $ python3.10 spa_updateBulk.py
          Connecting to Wellness ........ connected
          Water heater : Heater: Temperature 37.0°C, SetPoint 35.0°C, Real SetPoint 35.0°C, Operation Cooling
          sending temp and heater ops
          sending water care
          sending pumps
          Waterfall
          Pump 1
          Pump 2
          sending lights
          Lights
          sending sensors
          Circulating Pump
          Ozone
          Smart Winter Mode:Active
          Filter Status:Clean
          Filter Status:Purge
          javascript.0.Datenpunkte.SwimSpa.0.Temperatureinheit=%C2%B0C&ack=true& javascript.0.Datenpunkte.SwimSpa.0.AktuelleTemperatur=37.0&ack=true& javascript.0.Datenpunkte.SwimSpa.0.ZielTemperatur=35.0&ack=true& javascript.0.Datenpunkte.SwimSpa.0.EchteZielTemperatur=35.0&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Heizer=Cooling&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Modus=OFF&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P2.Modus=OFF&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI.Is_On=false&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.CIRCULATING_PUMP.State=off&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.OZONE.State=off&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.SMART_WINTER_MODE_ACTIVE.State=false&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.FILTER_STATUS_CLEAN.State=false&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.FILTER_STATUS_PURGE.State=false&ack=true
          Traceback (most recent call last):
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/connection.py", line 174, in _new_conn
              conn = connection.create_connection(
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/util/connection.py", line 95, in create_connection
              raise err
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/util/connection.py", line 85, in create_connection
              sock.connect(sa)
          ConnectionRefusedError: [Errno 111] Connection refused
          
          During handling of the above exception, another exception occurred:
          
          Traceback (most recent call last):
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/connectionpool.py", line 703, in urlopen
              httplib_response = self._make_request(
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/connectionpool.py", line 398, in _make_request
              conn.request(method, url, **httplib_request_kw)
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/connection.py", line 239, in request
              super(HTTPConnection, self).request(method, url, body=body, headers=headers)
            File "/usr/local/lib/python3.10/http/client.py", line 1282, in request
              self._send_request(method, url, body, headers, encode_chunked)
            File "/usr/local/lib/python3.10/http/client.py", line 1328, in _send_request
              self.endheaders(body, encode_chunked=encode_chunked)
            File "/usr/local/lib/python3.10/http/client.py", line 1277, in endheaders
              self._send_output(message_body, encode_chunked=encode_chunked)
            File "/usr/local/lib/python3.10/http/client.py", line 1037, in _send_output
              self.send(msg)
            File "/usr/local/lib/python3.10/http/client.py", line 975, in send
              self.connect()
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/connection.py", line 205, in connect
              conn = self._new_conn()
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/connection.py", line 186, in _new_conn
              raise NewConnectionError(
          urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0xb5260a78>: Failed to establish a new connection: [Errno 111] Connection refused
          
          During handling of the above exception, another exception occurred:
          
          Traceback (most recent call last):
            File "/home/pi/.local/lib/python3.10/site-packages/requests/adapters.py", line 489, in send
              resp = conn.urlopen(
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/connectionpool.py", line 787, in urlopen
              retries = retries.increment(
            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/util/retry.py", line 592, in increment
              raise MaxRetryError(_pool, url, error or ResponseError(cause))
          urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='192.168.0.20', port=8087): Max retries exceeded with url: /setBulk (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb5260a78>: Failed to establish a new connection: [Errno 111] Connection refused'))
          
          During handling of the above exception, another exception occurred:
          
          Traceback (most recent call last):
            File "/home/pi/wellis/v2/spa_updateBulk.py", line 79, in <module>
              oResponse = requests.post(IOBROKER_BASE_URL, data = sJson2Send)
            File "/home/pi/.local/lib/python3.10/site-packages/requests/api.py", line 115, in post
              return request("post", url, data=data, json=json, **kwargs)
            File "/home/pi/.local/lib/python3.10/site-packages/requests/api.py", line 59, in request
              return session.request(method=method, url=url, **kwargs)
            File "/home/pi/.local/lib/python3.10/site-packages/requests/sessions.py", line 587, in request
              resp = self.send(prep, **send_kwargs)
            File "/home/pi/.local/lib/python3.10/site-packages/requests/sessions.py", line 701, in send
              r = adapter.send(request, **kwargs)
            File "/home/pi/.local/lib/python3.10/site-packages/requests/adapters.py", line 565, in send
              raise ConnectionError(e, request=request)
          requests.exceptions.ConnectionError: HTTPConnectionPool(host='192.168.0.20', port=8087): Max retries exceeded with url: /setBulk (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0xb5260a78>: Failed to establish a new connection: [Errno 111] Connection refused'))
          

          Mal bekomme ich den 200 mal nicht. Wahrschienlich ähnlich deinem "Wackler", dass nicht immer das geschaltet wird, was eigentlich sollte.

          rrov1 1 Reply Last reply Reply Quote 0
          • rrov1
            rrov1 @tklein last edited by

            @tklein Hallo, sorry das ich mich ein paar Tage nicht gemeldet habe, aber jetzt habe ich etwas vom gewünschten Funktionsumfang (Pumpen/Licht) implementiert und es funktioniert auch einigermaßen stabil bei mir. Einigermaßen, weil die geckolib immer mal wieder Verbindungsprobleme hat und dann der Schaltvorgang nicht durchgeführt wird. Ich habe mir erst mal damit beholfen dies im Javascript abzufangen, ich muss mich mal mit dem Fehlerhandling in Python beschäftigen - ist halt nicht so die Programmiersprache mit der ich täglich umgehe. Ggf. muss man halt 2x drücken, ist bei mir noch nicht die Top Prio, weil der Whirlpool momentan kalt ist (steht draußen ).

            Zum neue Stand:

            • Download von github
            • als erstes unbedingt die Struktur der Datenpunkte aktualisieren mit dem Script: SpaVariablen.js, Achtung: Parameter von createDatapoints() anpassen!
            • die anderen Javascripte nach Anleitung einspielen
            • die Python Scripte aktualisieren (jetzt ebenfalls nach Anleitung im github)

            Deinen Vorschlag werde ich aufgreifen, allerdings muss ich erst mal schauen wie ich in Python sauber Fehler abfange. Kommt in der nächsten Version denk ich mit. Das Log schaue ich mir auch noch an.

            T 2 Replies Last reply Reply Quote 0
            • T
              tklein @rrov1 last edited by tklein

              @rrov1 kein ding, gibt ja wichtigere dinge -)

              UPDATE: es lag daran, dass der SPA nicht erreichbar war. LED am Intouch war wieder grün anstatt blau, so wie es sollte.

              habe das soweit alles gemacht. jedoch bekomme ich bei aufruf von *config und *update folgende meldung:

              pi@raspberrypi-iob:~/wellis/v3 $ python3.10 spa_updateBulk.py
              Traceback (most recent call last):
                File "/home/pi/.local/lib/python3.10/site-packages/geckolib/locator.py", line 133, in get_spa_from_identifier
                  return next(
              StopIteration
              
              During handling of the above exception, another exception occurred:
              
              Traceback (most recent call last):
                File "/home/pi/wellis/v3/spa_updateBulk.py", line 21, in <module>
                  facade = GeckoLocator.find_spa(CLIENT_ID, lSpas[nSpaNum]).get_facade(False)
                File "/home/pi/.local/lib/python3.10/site-packages/geckolib/locator.py", line 155, in find_spa
                  return locator.get_spa_from_identifier(spa_identifier)
                File "/home/pi/.local/lib/python3.10/site-packages/geckolib/locator.py", line 140, in get_spa_from_identifier
                  return self.spas[0]
              IndexError: list index out of range
              pi@raspberrypi-iob:~/wellis/v3 $ python3.10 spa_config.py
              Traceback (most recent call last):
                File "/home/pi/.local/lib/python3.10/site-packages/geckolib/locator.py", line 133, in get_spa_from_identifier
                  return next(
              StopIteration
              
              During handling of the above exception, another exception occurred:
              
              Traceback (most recent call last):
                File "/home/pi/wellis/v3/spa_config.py", line 12, in <module>
                  facade = GeckoLocator.find_spa(CLIENT_ID, lSpas[nSpaNum]).get_facade(False)
                File "/home/pi/.local/lib/python3.10/site-packages/geckolib/locator.py", line 155, in find_spa
                  return locator.get_spa_from_identifier(spa_identifier)
                File "/home/pi/.local/lib/python3.10/site-packages/geckolib/locator.py", line 140, in get_spa_from_identifier
                  return self.spas[0]
              IndexError: list index out of range
              

              Bin mir relativ sicher, dass die uuid, spa id etc passen.

              1 Reply Last reply Reply Quote 0
              • T
                tklein @rrov1 last edited by

                @rrov1 habe jetzt beim updatebulk einen 500er:

                pi@raspberrypi-iob:~/wellis/v3 $ python3.10 spa_updateBulk.py
                Connecting to Wellness ..... connected
                Water heater : Heater: Temperature 35.0°C, SetPoint 35.0°C, Real SetPoint 35.0°C, Operation Idle
                sending temp and heater ops
                sending water care
                sending pumps
                Pump 2: OFF, ['OFF', 'LO', 'HI']
                Pump 1: OFF, ['OFF', 'LO', 'HI']
                Waterfall: ON, ['OFF', 'ON']
                sending lights
                Lights
                sending sensors
                Circulating Pump
                Ozone
                Smart Winter Mode:Active
                Filter Status:Clean
                Filter Status:Purge
                javascript.0.Datenpunkte.SwimSpa.0.Temperatureinheit=%C2%B0C&ack=true& javascript.0.Datenpunkte.SwimSpa.0.AktuelleTemperatur=35.0&ack=true& javascript.0.Datenpunkte.SwimSpa.0.ZielTemperatur=35.0&ack=true& javascript.0.Datenpunkte.SwimSpa.0.EchteZielTemperatur=35.0&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Heizer=Idle&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Wasserpflege=Standard&ack=true& javascript.0.Datenpunkte.SwimSpa.0.WasserpflegeModi=['Abwesend', 'Standard', 'Energiesparen', 'Energiesparen Plus', 'Wochenende']&ack=true& javascript.0.Datenpunkte.SwimSpa.0.WasserpflegeIndex=1&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P2.Modus=OFF&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Modus=OFF&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Pumpen.Waterfall.Modus=ON&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI.Is_On=false&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.CIRCULATING_PUMP.State=on&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.OZONE.State=off&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.SMART_WINTER_MODE_ACTIVE.State=false&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.FILTER_STATUS_CLEAN.State=true&ack=true& javascript.0.Datenpunkte.SwimSpa.0.Sensoren.FILTER_STATUS_PURGE.State=false&ack=true
                500
                
                
                rrov1 1 Reply Last reply Reply Quote 0
                • rrov1
                  rrov1 @tklein last edited by

                  @tklein Hallo, ich bin gerade etwas offline, d.h. mein Reiserouter hat gestern seinen Geist aufgegeben und ich komme momentan nicht mehr per VPN in mein lokales Heimnetz rein (ich nutze blöder Weise zu Hause das gleiche Netz wie hier im Urlaub der Internetzugang hat 😐 und ich habe auch grad keine Idee, wie ich das umgehen kann). Somit kann ich auch nichts testen oder programmieren. Ich bin erst Ende nächster Woche wieder zu Hause, dann schau ich wieder.

                  Den ersten Fehler den du geschrieben hast der tritt in Python Codeteilen auf, die ich aus den Beispielscripten der geckolib kopiert habe. Hier muss ich denk ich auch noch etwas Fehlerbehandlung einbauen, damit das stabiler wird.
                  Der zweite Fehler tritt hoffentlich nicht bei jeder Ausführung auf, auch hier muss ich die Fehlerbehandlung verbessern, denn das Rest API gibt da noch etwas mehr zurück, was bei der Eingrenzung hilft. Zur not, nimm erst mal die alte Version des Scriptes, das sollte auch laufen.

                  Sonnige Grüße von den Kanaren...

                  T 1 Reply Last reply Reply Quote 0
                  • T
                    tklein @rrov1 last edited by

                    @rrov1 hey, dir erstmal einen schönen entspannenden urlaub mit tollem wetter.

                    rrov1 1 Reply Last reply Reply Quote 0
                    • rrov1
                      rrov1 @tklein last edited by

                      @tklein Kleines Update:
                      Ab sofort kannst du auch die Zieltemperatur setzen. Dazu gibt es die Scripte TargetTemp.js und spa_setTargetTemp.py. Wie üblich bitte die Datenpunkte vor dem Einsatz aktualisieren (ich habe den Datenpunkt actualPowerConsumption entfernt, da ich den nicht mehr brauche).

                      Die Umsetzung der Zieltemperatur ist noch etwas empfindlich ggü. mehrfachen, schnell aufeinanderfolgenden Änderungen, da das setzen im Spa ja nicht so schnell geht. Aus diesem Grund habe ich in der Visualisierung den Simple Slider horizontal von vis-invento genommen, der hat eine Option: "Update value on release", so das erst beim loslassen des Sliders der neue Zielwert genau einmal gesetzt wird. Ich muss mal überlegen wie man das "entprellen" kann in einer späteren Version.

                      Nächster Schritt ist jetzt den Wasserpflegemodus setzen.

                      T 1 Reply Last reply Reply Quote 0
                      • T
                        tklein @rrov1 last edited by

                        @rrov1 said in Steuerung Gecko in Touch 2 per iob möglich? (Wellis):

                        TargetTemp.js

                        Danke folgende Frage habe ich noch:

                        1. Light Switch
                        1241	2023-02-14 18:03:45.547	info	script.js.common.Draussen.Wellis_Whirlpool.LightToggle: *** setting state of:javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI.Switch to old value: true
                        1241	2023-02-14 18:03:45.547	info	script.js.common.Draussen.Wellis_Whirlpool.LightToggle: *** stderr: Error: Command failed: python3.10 /home/pi/wellis/v4 spa_toggleLight.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 LI javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI /usr/local/bin/python3.10: can't find '__main__' module in '/home/pi/wellis/v4'
                        1241	2023-02-14 18:03:45.542	info	script.js.common.Draussen.Wellis_Whirlpool.LightToggle: *** stdout:
                        1241	2023-02-14 18:03:45.329	info	script.js.common.Draussen.Wellis_Whirlpool.LightToggle: *** light key: LI
                        1241	2023-02-14 18:03:45.329	info	script.js.common.Draussen.Wellis_Whirlpool.LightToggle: *** spaId: SPAe8:eb:1b:1c:5e:46
                        1241	2023-02-14 18:03:45.328	info	script.js.common.Draussen.Wellis_Whirlpool.LightToggle: *** clientId: 916b0096-ab56-4344-8728-43a8259c63c2
                        
                        

                        Tmp setzen
                        Der muss für die Temp gesetzt werden?

                        javascript.0.Datenpunkte.SwimSpa.0.EchteZielTemperatur
                        

                        Habe keine Logs dazu gefunden

                        Pumpe Switch
                        Den muss ich setzen um die Pumpe zu steuern?

                        javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Switch
                        

                        Habe auch keine Logs dazu gefunden

                        LG
                        Thomas

                        rrov1 1 Reply Last reply Reply Quote 0
                        • rrov1
                          rrov1 @tklein last edited by rrov1

                          @tklein Hallo,
                          zu 1: Hm, ich und Python, ob wir jemals Freunde werden 🙄 . Ich kann den Fehler bei mir nicht nachvollziehen. Ich habe noch mal geprüft ob ich den richtigen Code auf github commited habe, aber alles fein. Kannst du bitte die Datei: spa_toggleLight.py noch mal von github laden, bei dir ablegen und die IP vom ioBroker eintragen. Danach an der Kommandozeile mal manuell ausführen:

                          phyton3 spa_toggleLight.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 LI javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI.Switch
                          

                          und mir noch mal die Ausgabe der Kommandozeile schicken. Das Script selbst ist total simpel, es ermittelt den aktuellen Status des Lichts und schaltet entweder an oder aus. Da kann fast nix schief gehen, vor allem kein "can't find 'main' module" 😐 .

                          zu 2.:
                          So wie ich's verstanden habe gibt es 3 Temperaturen:

                          • javascript.0.Datenpunkte.SwimSpa.0.AktuelleTemperatur -> die aktuelle Wassertemperatur, der DP ist read only
                          • javascript.0.Datenpunkte.SwimSpa.0.EchteZielTemperatur -> die Temperatur die der SpaController versucht zu erreichen (durch heizen oder abkühlen), der DP ist read only
                          • javascript.0.Datenpunkte.SwimSpa.0.ZielTemperatur -> die eingestellte Zieltemperatur, nur dieser DP ist read&write, den musst du verstellen über deine Visualisierung
                            Dazu brauchst du im Javascript Adapter das Script: TargetTemp.js und das Python Skript: spa_setTargetTemp.py
                            Das verstellen der ZielTemperatur sollte sowas im Protokoll produzieren:
                          2023-02-14 20:39:01.870 - info: javascript.0 (1349656) script.js.Spa.TargetTemp: *** clientId: 4dfed1c1-457a-ed4a-9760-1b8e80c24b7a
                          2023-02-14 20:39:01.871 - info: javascript.0 (1349656) script.js.Spa.TargetTemp: *** spaId: SPA68:aa:bb:cc:dd:ee
                          2023-02-14 20:39:01.872 - info: javascript.0 (1349656) script.js.Spa.TargetTemp: python3 spa_setTargetTemp.py 4dfed1c1-457a-ed4a-9760-1b8e80c24b7a SPA68:aa:bb:cc:dd:ee 24 javascript.0.Datenpunkte.SwimSpa.1.ZielTemperatur
                          2023-02-14 20:39:19.415 - info: javascript.0 (1349656) script.js.Spa.TargetTemp: *** stdout: Total arguments passed: 5
                          Connecting using client id 4dfed1c1-457a-ed4a-9760-1b8e80c24b7a
                          Connecting to spa id SPA68:aa:bb:cc:dd:ee
                          New target temp: 24
                          Got datapoint to update: javascript.0.Datenpunkte.SwimSpa.1.ZielTemperatur
                          Looking for spas on your network ...
                          *** connecting to spa
                          *** water heater present
                          *** current target temp: 23.0
                          *** target temp is now: 24.0
                          *** end
                          

                          Was vielleicht noch wichtig ist, die EchteZielTemperatur ist abhängig vom aktuellen Wasserpflegemodus. Wenn der "Abwesend" ist, dann zieht der gecko Controller 10°C von deiner gewählten Zieltemperatur ab.

                          zu 3.:
                          genau, den DP musst du setzen, wenn du kein "LO" hast, dann bau die Visualisierung halt so, das nur OFF bzw. HIGH gesetzt wird.
                          Damit das funktioniert brauchst du im Javascript Adapter: PumpSwitches.js und das Python Skript: spa_switchPump.py
                          Das Log sollte dann etwas wie bei 2. enthalten.

                          Mittlerweile habe ich bei allen Datenpunkten die nur Informationen enthalten die Möglichkeit zum manuellen setzen weggenommen. Du kannst das im Objektbaum auch am Icon des DP ganz gut erkennen an dem Schloss das da drinnen ist: 2023-02-14 20_47_39-Clipboard.png. Ggf. führe noch mal das aktuelle Script SpaVariablen.js aus.

                          T 2 Replies Last reply Reply Quote 0
                          • T
                            tklein @rrov1 last edited by

                            @rrov1

                            Mhmmm ok.

                            Zu1)
                            von der Kommandozeile geht es, bekomme aber weitere logs:

                            pi@raspberrypi-iob:~/wellis/v4 $ python3.10 spa_toggleLight.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 LI javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI.Switch
                            Total arguments passed: 5
                            Connecting using client id 916b0096-ab56-4344-8728-43a8259c63c2
                            Connecting to spa id SPAe8:eb:1b:1c:5e:46
                            Switching light: LI
                            Got channel for update: javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI.Switch
                            Looking for spas on your network ...
                            2023-02-15 10:01:07,024> INFO Found 1 spas ... [Wellness(SPAe8:eb:1b:1c:5e:46)]
                            *** connecting to spa
                            *** light count: 1
                            *** found light with key LI and name: Lights with state False
                            *** switching light on
                            2023-02-15 10:01:17,310> INFO Value for UdLightTime changed from 0 to 60
                            2023-02-15 10:01:17,313> INFO Value for UdLi changed from OFF to HI
                            2023-02-15 10:01:17,315> INFO Value for inTCipDelay changed from 1800 to 900
                            *** light mode is now: True
                            Traceback (most recent call last):
                              File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 434, in prepare_url
                                scheme, auth, host, port, path, query, fragment = parse_url(url)
                              File "/home/pi/.local/lib/python3.10/site-packages/urllib3/util/url.py", line 397, in parse_url
                                return six.raise_from(LocationParseError(source_url), None)
                              File "<string>", line 3, in raise_from
                            urllib3.exceptions.LocationParseError: Failed to parse: http://192:168:0:20:8087/set/javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI.Switch.Switch?value=true&ack=true
                            
                            During handling of the above exception, another exception occurred:
                            
                            Traceback (most recent call last):
                              File "/home/pi/wellis/v4/spa_toggleLight.py", line 99, in <module>
                                asyncio.run(main())
                              File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
                                return loop.run_until_complete(main)
                              File "/usr/local/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
                                return future.result()
                              File "/home/pi/wellis/v4/spa_toggleLight.py", line 80, in main
                                requests.get(f"{IOBROKER_BASE_URL}{IOBR_LIGHT_CHANNEL}.Switch?value={str(newLightMode).lower()}&ack=true")
                              File "/home/pi/.local/lib/python3.10/site-packages/requests/api.py", line 73, in get
                                return request("get", url, params=params, **kwargs)
                              File "/home/pi/.local/lib/python3.10/site-packages/requests/api.py", line 59, in request
                                return session.request(method=method, url=url, **kwargs)
                              File "/home/pi/.local/lib/python3.10/site-packages/requests/sessions.py", line 573, in request
                                prep = self.prepare_request(req)
                              File "/home/pi/.local/lib/python3.10/site-packages/requests/sessions.py", line 484, in prepare_request
                                p.prepare(
                              File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 368, in prepare
                                self.prepare_url(url, params)
                              File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 436, in prepare_url
                                raise InvalidURL(*e.args)
                            requests.exceptions.InvalidURL: Failed to parse: http://192:168:0:20:8087/set/javascript.0.Datenpunkte.SwimSpa.0.Lichter.LI.Switch.Switch?value=true&ack=true
                            

                            Ein erneuter Aufruf toggelt das Licht immer, egal was in dem DP steht.
                            Mal sehen, obich die rechte korrekt gesetzt habe:

                            pi@raspberrypi-iob:~/wellis/v4 $ ls -la
                            total 40
                            drwxrwxrwx 2 pi pi 4096 Feb 14 17:55 .
                            drwxrwxrwx 5 pi pi 4096 Feb 14 17:50 ..
                            -rwxr-xr-x 1 pi pi 4371 Feb 14 17:55 spa_config.py
                            -rwxr-xr-x 1 pi pi 4064 Feb 14 17:55 spa_setTargetTemp.py
                            -rwxr-xr-x 1 pi pi 4737 Feb 14 17:55 spa_switchPump.py
                            -rwxr-xr-x 1 pi pi 3606 Feb 14 17:55 spa_toggleLight.py
                            -rwxr-xr-x 1 pi pi 4704 Feb 14 17:55 spa_updateBulk.py
                            

                            Den Aufruf in der JS-Datei habe ich so angepasst:

                            exec('python3.10 /home/pi/wellis/v4 spa_toggleLight.py ' + clientId + " " + spaId + " " + lightKey + " " + obj.channelId, function (error, stdout, stderr) {
                            

                            Zu2)

                            Bei Update des DP wird nix getriggered. Keine Logausgabe.
                            Bei der Konsoleneingabe sieht es so aus:

                            Total arguments passed: 5
                            Connecting using client id 916b0096-ab56-4344-8728-43a8259c63c2
                            Connecting to spa id SPAe8:eb:1b:1c:5e:46
                            New target temp: 34
                            Got datapoint to update: javascript.0.Datenpunkte.SwimSpa.1.ZielTemperatur
                            Traceback (most recent call last):
                              File "spa_setTargetTemp.py", line 107, in <module>
                                asyncio.run(main())
                              File "/usr/lib/python3.7/asyncio/runners.py", line 43, in run
                                return loop.run_until_complete(main)
                              File "/usr/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
                                return future.result()
                              File "spa_setTargetTemp.py", line 48, in main
                                async with SampleSpaMan(CLIENT_ID, spa_identifier=SPA_ID) as spaman:
                              File "/usr/local/lib/python3.7/dist-packages/geckolib/async_spa_manager.py", line 199, in __aenter__
                                await AsyncTasks.__aenter__(self)
                              File "/usr/local/lib/python3.7/dist-packages/geckolib/async_tasks.py", line 15, in __aenter__
                                self.add_task(self._tidy(), "Tidy tasks", "ASYNC")
                              File "/usr/local/lib/python3.7/dist-packages/geckolib/async_tasks.py", line 22, in add_task
                                task = asyncio.create_task(coroutine, name=f"{key_}:{name_}")
                            TypeError: create_task() got an unexpected keyword argument 'name'
                            sys:1: RuntimeWarning: coroutine 'AsyncTasks._tidy' was never awaited`
                            ``
                            
                            Der Wert wird aber nicht im Spa geupdatet (zumindest nicht mit der Info aus der Gecko App
                            
                            Zu3)
                            Auch da wird nix getriggered wenn ich den DP mit "LO" oder "HI" steuer. Keine Logeinträge.
                            
                            Wie sieht da ein exemplarischer Aufruf auf der Kommandozeile aus? So korrekt?
                            
                            

                            pi@raspberrypi-iob:~/wellis/v4 $ python3.10 spa_switchPump.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 1 1 javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Switch
                            Total arguments passed: 6
                            Connecting using client id 916b0096-ab56-4344-8728-43a8259c63c2
                            Connecting to spa id SPAe8:eb:1b:1c:5e:46
                            Switching pump id 1
                            Switching pump to state id 1
                            Got channel for update: javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Switch
                            Looking for spas on your network ...
                            2023-02-15 10:24:50,547> INFO Found 1 spas ... [Wellness(SPAe8:eb:1b:1c:5e:46)]
                            *** connecting to spa
                            *** pump name: Pump 2
                            *** pump modes: ['OFF', 'LO', 'HI']
                            *** current pump mode: OFF
                            *** new pump state name: LO
                            *** found: 3 pumps
                            *** pump mode is now: OFF
                            Traceback (most recent call last):
                            File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 434, in prepare_url
                            scheme, auth, host, port, path, query, fragment = parse_url(url)
                            File "/home/pi/.local/lib/python3.10/site-packages/urllib3/util/url.py", line 397, in parse_url
                            return six.raise_from(LocationParseError(source_url), None)
                            File "<string>", line 3, in raise_from
                            urllib3.exceptions.LocationParseError: Failed to parse: http://192:168:0:20:8087/set/javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Switch.Switch?value=0&ack=true

                            During handling of the above exception, another exception occurred:

                            Traceback (most recent call last):
                            File "/home/pi/wellis/v4/spa_switchPump.py", line 114, in <module>
                            asyncio.run(main())
                            File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
                            return loop.run_until_complete(main)
                            File "/usr/local/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
                            return future.result()
                            File "/home/pi/wellis/v4/spa_switchPump.py", line 88, in main
                            requests.get(f"{IOBROKER_BASE_URL}{IOBR_PUMP_CHANNEL}.Switch?value={SET_PUMP_STATE}&ack=true")
                            File "/home/pi/.local/lib/python3.10/site-packages/requests/api.py", line 73, in get
                            return request("get", url, params=params, **kwargs)
                            File "/home/pi/.local/lib/python3.10/site-packages/requests/api.py", line 59, in request
                            return session.request(method=method, url=url, **kwargs)
                            File "/home/pi/.local/lib/python3.10/site-packages/requests/sessions.py", line 573, in request
                            prep = self.prepare_request(req)
                            File "/home/pi/.local/lib/python3.10/site-packages/requests/sessions.py", line 484, in prepare_request
                            p.prepare(
                            File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 368, in prepare
                            self.prepare_url(url, params)
                            File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 436, in prepare_url
                            raise InvalidURL(*e.args)
                            requests.exceptions.InvalidURL: Failed to parse: http://192:168:0:20:8087/set/javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Switch.Switch?value=0&ack=true
                            pi@raspberrypi-iob:~/wellis/v4 $

                            T rrov1 2 Replies Last reply Reply Quote 0
                            • T
                              tklein @tklein last edited by

                              Ergänzung/Update zu 2)

                              Aufruf mit Python3.10. Da wird die Temp im WP geändert. Jedoch das Update im DP schlägt fehl. Müssen die Temp-Werte mit "." oder "," angegeben werden? Z.B. 34.5 oder 37,5

                              pi@raspberrypi-iob:~/wellis/v4 $ python3.10 spa_setTargetTemp.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 34.0 javascript.0.Datenpunkte.SwimSpa.1.ZielTemperatur
                              Total arguments passed: 5
                              Connecting using client id 916b0096-ab56-4344-8728-43a8259c63c2
                              Connecting to spa id SPAe8:eb:1b:1c:5e:46
                              New target temp: 34.0
                              Got datapoint to update: javascript.0.Datenpunkte.SwimSpa.1.ZielTemperatur
                              Looking for spas on your network ...
                              2023-02-15 10:38:32,206> INFO Found 1 spas ... [Wellness(SPAe8:eb:1b:1c:5e:46)]
                              *** connecting to spa
                              *** water heater present
                              *** current target temp: 34.0
                              *** new target temp is identical to current, nothing to do
                              Traceback (most recent call last):
                                File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 434, in prepare_url
                                  scheme, auth, host, port, path, query, fragment = parse_url(url)
                                File "/home/pi/.local/lib/python3.10/site-packages/urllib3/util/url.py", line 397, in parse_url
                                  return six.raise_from(LocationParseError(source_url), None)
                                File "<string>", line 3, in raise_from
                              urllib3.exceptions.LocationParseError: Failed to parse: http://192:168:0:20:8087/set/javascript.0.Datenpunkte.SwimSpa.1.ZielTemperatur?value=34.0&ack=true
                              
                              During handling of the above exception, another exception occurred:
                              
                              Traceback (most recent call last):
                                File "/home/pi/wellis/v4/spa_setTargetTemp.py", line 107, in <module>
                                  asyncio.run(main())
                                File "/usr/local/lib/python3.10/asyncio/runners.py", line 44, in run
                                  return loop.run_until_complete(main)
                                File "/usr/local/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete
                                  return future.result()
                                File "/home/pi/wellis/v4/spa_setTargetTemp.py", line 88, in main
                                  requests.get(f"{IOBROKER_BASE_URL}{IOBR_TARGET_TEMP_DP}?value={str(spaman.facade.water_heater.target_temperature)}&ack=true")
                                File "/home/pi/.local/lib/python3.10/site-packages/requests/api.py", line 73, in get
                                  return request("get", url, params=params, **kwargs)
                                File "/home/pi/.local/lib/python3.10/site-packages/requests/api.py", line 59, in request
                                  return session.request(method=method, url=url, **kwargs)
                                File "/home/pi/.local/lib/python3.10/site-packages/requests/sessions.py", line 573, in request
                                  prep = self.prepare_request(req)
                                File "/home/pi/.local/lib/python3.10/site-packages/requests/sessions.py", line 484, in prepare_request
                                  p.prepare(
                                File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 368, in prepare
                                  self.prepare_url(url, params)
                                File "/home/pi/.local/lib/python3.10/site-packages/requests/models.py", line 436, in prepare_url
                                  raise InvalidURL(*e.args)
                              requests.exceptions.InvalidURL: Failed to parse: http://192:168:0:20:8087/set/javascript.0.Datenpunkte.SwimSpa.1.ZielTemperatur?value=34.0&ack=true
                              
                              
                              1 Reply Last reply Reply Quote 0
                              • T
                                tklein @rrov1 last edited by

                                @rrov1 mal was anderes. hasr du auch solche extrmen Schwankungen in dem Wert für die aktuelle Temp?
                                Scheint sich aber jetzt stabilisiert zu haben.

                                e8108b2b-c425-4a26-a029-2b866e43e3ad-grafik.png

                                rrov1 1 Reply Last reply Reply Quote 0
                                • rrov1
                                  rrov1 @tklein last edited by

                                  @tklein Nein, solche Ausreißer habe ich überhaupt nicht. Das wäre ja dann mein spa_BulkUpdate.py Skript, welches aus welchem Grund auch immer solche Werte dem REST API übergibt. Das kann ich ein bisschen heilen und zwar sagt mir die geckolib die minimale und maximale Temperatur die man einstellen kann (je nach dem ob Celsius oder Farenheit). Ich bau im Pyhton Skript eine Prüfung der 3 Temperaturwerte ein, damit keine Temperaturen sagen wir mal unter 0 °C und 40 °C an ioBroker gemeldet werden. Ich denke mal in dem Fall keinen Wert zu senden ist besser als einen falschen. Ich würde die falschen Werte aus der DB löschen. Bei SQL könnte ich dir sagen wie, bei InfluxDB leider nicht.

                                  1 Reply Last reply Reply Quote 0
                                  • rrov1
                                    rrov1 @tklein last edited by

                                    @tklein Hallo,
                                    zu 1.: ich sehe den Fehler 🙂 Du hast bei der IP-Adresse vom ioBroker als Trennzeichen einen ":" verwendet. Deswegen schaltet er zwar das Licht um kann den Datenpunkt aber nicht ändern. Dies betrifft auch spa_switchPump.py, dort ist der gleiche Fehler enthalten.

                                    zu 2: öffne mal das Skript TargetTemp.js im Javascript Editor. Zeile 2 müsste so lauten:

                                    on({id: /^javascript\.\d+\.Datenpunkte\.SwimSpa\.\d+\.ZielTemperatur$/, change: "ne", ack: false}, function (obj) {
                                    

                                    und drücke auf das "Restart" Icon oben drüber es müsste sowas im Protokoll stehen:

                                    20:25:16.549	info	javascript.0 (1349656) Stop script script.js.Spa.TargetTemp
                                    20:25:16.562	info	javascript.0 (1349656) Start javascript script.js.Spa.TargetTemp
                                    20:25:16.581	info	javascript.0 (1349656) script.js.Spa.TargetTemp: registered 1 subscription, 0 schedules, 0 messages, 0 logs and 0 file subscriptions
                                    

                                    Wichtig ist "registred 1 subscription"

                                    Was mich noch ein bisschen wundert, du hast doch nur einen gecko Controller. Der müsste unter javascript.0.Datenpunkte.SwimSpa.0.ZielTemperatur
                                    angesteuert werden und nicht unter: javascript.0.Datenpunkte.SwimSpa.1.ZielTemperatur. Wenn du unterhalb von javascript.0.Datenpunkte.SwimSpa zwei Zweige hat (also .0 und .1), dann lösche mal den .1er Zweig komplett im Objektbaum, den brauchst du nicht.

                                    zu 3: der Testaufruf ist fast korrekt:
                                    Argument 3: Pumpen ID 0 = Pumpe 1, 1 = Pumpe 2, 3 = Pumpe 3
                                    Argument 4: ist der Modus OFF = 0; LO = 1, HI = 2 -> da du geschrieben hast, deine Pumpen haben keinen LO-Mode, nimm dort bitte 0 oder 2
                                    Argument 5: ".Switch" weglassen
                                    Beispiel: Pumpe 2, HI

                                    python3.10 spa_switchPump.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 1 2 javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1
                                    

                                    Beispiel: Pumpe 2, OFF

                                    python3.10 spa_switchPump.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 1 0 javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1
                                    
                                    T 1 Reply Last reply Reply Quote 0
                                    • T
                                      tklein @rrov1 last edited by

                                      @rrov1 es wir langsam.

                                      Zu1)
                                      Oh man, Das sag ich besser nix zu....

                                      Zu2) Sieht bei mir auch so im Code und im Log aus mit dem subscription. Passiert aber immer noch nix wenn ich den DP unter Swim.Spa.0.Zieltemperatur ändere

                                      zu3) Danke für die Erklärung. Per Kommandozeile klappt es jetzt. Auch hier klappt das noch nicht per DP.

                                      rrov1 1 Reply Last reply Reply Quote 0
                                      • rrov1
                                        rrov1 @tklein last edited by rrov1

                                        @tklein Merkwürdig, warum die beiden Subscriptions nicht laufen, habe extra einen regulären Ausdruck genommen, der bei uns beiden funktionieren sollte.

                                        Plan A: Bitte ändere in der Objektansicht mal den Datenpunkt z.B. für's Licht durch klick auf die Glocke in der Spalte Value und prüfe ob das Javascript ausgeführt wird. Wenn das geht, dann ist die Ursache, dass deine Visualisierung beim setzen des DP den ack-Wert mit auf true setzt. Warum kann ich dir nicht erklären, der Normalzustand ist, dass der ack-Wert false ist.
                                        So eine Subscription die ich nutze hat 3 Parameter:
                                        1: id == Pfad zum Datenpunkt (entweder ein regulärer Ausdruck oder halt der Pfad)
                                        2: change == die Art der Änderung: ne -> der neue Wert des Datenpunkt muss anders sein als der alte Wert bzw. any -> es ist jeder beliebige (auch der gleiche) Wert akzeptabel um eine Reaktion auszulösen
                                        3: ack == der ack-Wert, bei mir muss er unbedingt false sein, damit die Subscription reagiert, wenn der true wäre, dann reagiert nichts. Der Parameter kann auch weggelassen werden.

                                        Plan B: Wenn Plan A nicht fruchtet, dann trägst du den Datenpunkt erst mal direkt ein:

                                        zu 2: öffne mal das Skript TargetTemp.js im Javascript Editor. In Zeile 2 musst du den regulären Ausdruck, welche mit "/" beginnt und mit "/" endet durch den Pfad zum Datenpunkt ersetzen (welcher von zwei doppelten Hochkomma eingeschlossen sein muss).
                                        ALT:

                                        on({id: /^javascript\.\d+\.Datenpunkte\.SwimSpa\.\d+\.ZielTemperatur$/, change: "ne", ack: false}, function (obj) {
                                        

                                        NEU

                                        on({id: "javascript.0.Datenpunkte.SwimSpa.0.ZielTemperatur", change: "ne", ack: false}, function (obj) {
                                        

                                        zu 3: Das ist komplizierter, lösche im Skript PumpSwitches.js als erstes die Zeilen 2-4 und dann musst du, da du vmtl. ja auch 3 Pumpen hast folgendes einsetzen:

                                        on({id: "javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P0.Switch", change: "any", ack: false}, function (obj) {
                                            switchPump(obj);
                                        });
                                        on({id: "javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Switch", change: "any", ack: false}, function (obj) {
                                            switchPump(obj);
                                        });
                                        on({id: "javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P2.Switch", change: "any", ack: false}, function (obj) {
                                            switchPump(obj);
                                        });
                                        

                                        Vergleiche bitte die Pfade die ich hier eingetragen habe bei dir nach, das die auch wirklich identisch sind. Damit muss das Javascript jetzt ausgeführt werden, wenn die den Datenpunkt in der Objektansicht änderst.

                                        T 1 Reply Last reply Reply Quote 0
                                        • T
                                          tklein @rrov1 last edited by

                                          @rrov1 ich rufe derzeit immer direkt die dp auf- habe noch keine vis.

                                          Danke für deine Top-Hilfe, aber das Problem liegt glaube ich eher beim Aufruf der Skripte. Selbst so kann ich die nicht starten.
                                          fc19a1e7-e276-4caa-bb17-47b35814558a-grafik.png

                                          Andere *.py kann ich per blockly ausführen. Ich muss erst schauen, was da im argen ist.

                                          rrov1 1 Reply Last reply Reply Quote 0
                                          • rrov1
                                            rrov1 @tklein last edited by

                                            @tklein Hm, die Lösung würde mich interessieren, auch wenn ich eher nicht mit Blockly arbeite, aber soweit ich weiß wird das auch nur in Javascript umgesetzt. Ich hätte ja spontan gesagt, das im Javascript Adapter "exec ausführen" nicht aktiv ist, aber das widerspricht ja dem, das du manche Python-Skripte ausführen kanns.

                                            T rrov1 2 Replies Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            724
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            8
                                            167
                                            16834
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo