NEWS
Steuerung Gecko in Touch 2 per iob möglich? (Wellis)
-
@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...
-
@rrov1 hey, dir erstmal einen schönen entspannenden urlaub mit tollem wetter.
-
@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.
-
@rrov1 said in Steuerung Gecko in Touch 2 per iob möglich? (Wellis):
TargetTemp.js
Danke folgende Frage habe ich noch:
- 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 -
@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: . Ggf. führe noch mal das aktuelle Script SpaVariablen.js aus.
-
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=trueDuring 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 $ -
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
-
@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. -
@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.
-
@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, HIpython3.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
-
@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.
-
@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.
-
@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.
Andere *.py kann ich per blockly ausführen. Ich muss erst schauen, was da im argen ist.
-
@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.
-
@rrov1 es sieht so aus, als wenn ich per blockly nicht python3.10 aufrufen kann. die datei spa_updateBulk.py kann ich mit python fehlerlos aufrufen. bei den steuerungen skripten bekomme ich bei der 3er version immer errors
-
@rrov1 Aber warum gehen dann einige der Scripte!?
Ruf mal:which python3.10
auf, dann hast du den vollständigen Pfad. Dann bau mal ein Blockly mit einem exec wie folgt zusammen:
/vollständiger/pfad/zu/python3.10 -c "print('hello world.')"
Im Ergebnis müsstest als Ausgabe in der Blockly Variable result dann "hello world" ausgegeben bekommen.
Wenn das funktioniert, dann könnte er die py-Skripte nicht finden, da könntest du vor den Skriptnamen auch noch den vollständigen Pfad einfügen.
-
Zwischenupdate:
es wird immer besser an den Pfad habe ich gar nicht gedacht. Hatte eine Shebang am Anfang der PY-Dateien ohne Erfolg hinzugefügt gehabt.Das klappt. Juhu!
Aufrufen kann ich die Skripte immer noch nicht aus dem blockly. Mal sehen was es noch ist
Derzeit sieht es so aus inkl. vollständigen Pfad zur Datei:
pi@raspberrypi-iob:~/wellis/v4 $ 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.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 0 Got channel for update: javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1.Switch Looking for spas on your network ... 2023-02-19 11:04:01,189> 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: HI *** new pump state name: OFF *** found: 3 pumps 2023-02-19 11:04:11,461> INFO Value for UdP2 changed from HI to OFF 2023-02-19 11:04:11,464> INFO Value for P2 changed from HIGH to OFF 2023-02-19 11:04:11,467> INFO Value for UdPumpTime changed from 14 to 0 *** pump mode is now: OFF *** end pi@raspberrypi-iob:~/wellis/v4 $ pwd /home/pi/wellis/v4
-
@rrov1 habe den pythonpath in den *.py dateien erweitert.
Dennoch bekomme ich folgenden Log beim Update eines DP:
31288 2023-02-19 12:53:22.178 info script.js.common.Draussen.Wellis_Whirlpool.PumpSwitches: *** stderr: Error: Command failed: /usr/local/bin/python3.10 /home/pi/wellis/v4 spa_switchPump.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 0 2 javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1 /usr/local/bin/python3.10: can't find '__main__' module in '/home/pi/wellis/v4'
Zugriff auf diesen Ordener ist möglich. Rufe per blockly cron minütlich spa_updateBulk.py auf. jedoch mit python3
-
@tklein Hallo, also ich würde sagen, dass die Ursache das Leerzeichen zwischen Pfad zum Skript und dem Skriptnamen ist. Der Aufruf müsste so lauten:
/usr/local/bin/python3.10 /home/pi/wellis/v4/spa_switchPump.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 0 2 javascript.0.Datenpunkte.SwimSpa.0.Pumpen.P1
Du kannst nicht den Pfad zum Skript vom Skriptnamen durch ein Leerzeichen trennen, damit bekommt python3.10 2 Parameter und interpretiert den Verzeichnisnamen als aufzurufendes Skript - was zu der aus meiner Sicht unpassenden und irreführenden Fehlermeldung führt.
Hinweis zum Blockly Screenshot:
Das "-c" funktioniert so nicht, das "-c" sagt dem Python Interpreter, das im nächsten Parameter Python-Quellcode kommt (siehe auch hier). Du hast aber ein Skript.Wahrscheinlich kannst du dir den vollständigen Pfad zu python3.10 wieder sparen.
Prüfe auch mal ob nicht python3 und python3.10 nicht auf das gleiche zeigen:ls -la /usr/local/bin/python3*
Bei mir sieht das Ergebnis so aus:
ls -la /usr/bin/python3* lrwxrwxrwx 1 root root 9 Apr 5 2021 /usr/bin/python3 -> python3.9 -rwxr-xr-x 1 root root 5479736 Feb 28 2021 /usr/bin/python3.9
python3 ist nur ein Link der auf python3.9 zeigt. Ich benutze den Link, denn wenn bei meiner Distro doch mal Python auf eine höhere Version aktualisiert, dann wird python3 immer noch funktionieren, wohingegen python3.9 dann nicht mehr geht.
-
@rrov1 ok, jetzt sieht es so im log aus hne den blank:
script.js.common.Draussen.Wellis_Whirlpool.TargetTemp_js: *** stderr: Error: Command failed: /usr/local/bin/python3.10 /home/pi/wellis/v4/spa_setTargetTemp.py 916b0096-ab56-4344-8728-43a8259c63c2 SPAe8:eb:1b:1c:5e:46 37 javascript.0.Datenpunkte.SwimSpa.0.ZielTemperatur Traceback (most recent call last): File "/home/pi/wellis/v4/spa_setTargetTemp.py", line 5, in <module> import requests ModuleNotFoundError: No module named 'requests'
Es wir 3.10 wohl nicht aufgerufen?
pi@raspberrypi-iob:/usr/local/bin $ ls -la /usr/local/bin/python3* -rwxr-xr-x 1 root root 17752176 Jan 7 17:21 /usr/local/bin/python3.10 -rwxr-xr-x 1 root root 3096 Jan 7 17:22 /usr/local/bin/python3.10-config
Anderer Ordner:
pi@raspberrypi-iob:/usr/local/bin $ ls -la /usr/bin/python3* lrwxrwxrwx 1 root root 9 Mar 26 2019 /usr/bin/python3 -> python3.7 -rwxr-xr-x 2 root root 4275580 Oct 31 15:04 /usr/bin/python3.7 lrwxrwxrwx 1 root root 36 Oct 31 15:04 /usr/bin/python3.7-config -> arm-linux-gnueabihf-python3.7-config -rwxr-xr-x 2 root root 4275580 Oct 31 15:04 /usr/bin/python3.7m lrwxrwxrwx 1 root root 37 Oct 31 15:04 /usr/bin/python3.7m-config -> arm-linux-gnueabihf-python3.7m-config lrwxrwxrwx 1 root root 16 Mar 26 2019 /usr/bin/python3-config -> python3.7-config lrwxrwxrwx 1 root root 10 Mar 26 2019 /usr/bin/python3m -> python3.7m lrwxrwxrwx 1 root root 17 Mar 26 2019 /usr/bin/python3m-config -> python3.7m-config