Hallo zusammen,
ich hab für Geräte des Herstellers JUDO ein Modul entwickelt, mit dem man übers lokale Netz ohne Cloud alle wesentlichen Funktionen der JUDO Geräte steuern/lesen kann, welche die JUDO REST API unterstützen.
Die Einbindung erfolgt über
define <name> JUDO <IP/HOST>
Im Anschluss muss über das Attribut "username" der Benutzername und über das setting password, dass Passwort gesetzt werden. Das Passwort wird verschlüsselt im Key Value Store von FHEM abgelegt. Das Modul aktualisiert im angegebenen Attribut Interval (default 60s) die Verbrauchswerte und schreibt bei Tageswechsel die Gesamtverbräuche des Tages für Statistikzwecke.
Die SSL Schnittstelle kann über das Attribut ssl genutzt werden. Allerdings hat mein Gerät ungültige Zertifikate, so dass es Fehler gibt. Im lokalen Netz ist SSL aber nun auch nicht wirklich wichtig. Muss ich mir jedenfalls noch anschauen. Gleiches gilt für die Statistik Funktionen der JUDO Api. Diese funktionieren nicht wie in der Doku beschrieben, weshalb diese auch nicht implementiert sind. Die sind aber auch nicht wirklich wichtig, da Statisken direkt über FHEM abgebildet werden sollten. Der Salzverbrauch ist noch nicht passend, da die internen Werte ohne Verbrauch ständig schwanken. Doku fehlt auch noch, wird aber demnächst ergänzt.
Meine i-Soft Pro funktioniert damit jedenfalls sehr gut. Wenn jemand ein anderes JUDO Gerät hat, dann sollte es auch funktionieren - jedenfalls die Funktionen, die auch die i-soft PRO hat, wobei andere Geräte weniger Funktionalität haben. Feedback ist willkommen.
Moin,
ich habe jetzt auch mal einen ersten Versuch gestartet, um meine HTTPMOD Kopplung zu ersetzen.
Beim reload werden leider die Crypto Biliotheken nicht gefunden
Can't locate Crypt/OpenSSL/RSA.pm in @INC (you may need to install the Crypt::OpenSSL::RSA module) (@INC entries checked: ./FHEM/lib ./lib fhem.p/lib fhem.p/FHEM/lib ./FHEM ./ /usr/local/FHEM/share/fhem/FHEM/lib . /usr/src/app/core/lib/perl5/5.38.3/aarch64-linux-gnu /usr/src/app/core/lib/perl5/5.38.3 /usr/src/app/core/lib/perl5/aarch64-linux-gnu /usr/src/app/core/lib/perl5 /usr/src/app/3rdparty/lib/perl5/5.38.3/aarch64-linux-gnu /usr/src/app/3rdparty/lib/perl5/5.38.3 /usr/src/app/3rdparty/lib/perl5/aarch64-linux-gnu /usr/src/app/3rdparty/lib/perl5 /usr/local/lib/perl5/site_perl/5.38.3/aarch64-linux-gnu /usr/local/lib/perl5/site_perl/5.38.3 /usr/local/lib/perl5/vendor_perl/5.38.3/aarch64-linux-gnu /usr/local/lib/perl5/vendor_perl/5.38.3 /usr/local/lib/perl5/5.38.3/aarch64-linux-gnu /usr/local/lib/perl5/5.38.3) at ./FHEM/50_JUDO.pm line 14.
BEGIN failed--compilation aborted at ./FHEM/50_JUDO.pm line 14.
Ich verwende der FHEM docker Container und da sind sie jedoch bereits drin.
root@raspberrypi:/opt/fhem# apt list libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl
Listing... Done
libcrypt-openssl-bignum-perl/stable 0.09-2+b1 arm64
libcrypt-openssl-rsa-perl/stable 0.33-3+b1 arm64
Es ist eine JUDO_iSoft Plus von ca. 2015, die jedoch mal wegen eines bekannten Controllerproblems eine aktuellere Baugruppe bekommen hat.
contract_InitDate 2022-08-12 14:31
version_HardwareVersion 5.10
Integriert hatte ich das nach dieser Blog Seite. (https://blog.muwave.de/2017/06/monitoring-and-controlling-a-judo-i-soft-plus-water-softening-device-via-lan/)
VG Christian
du hast bookworm installiert? welche perl version? auch arm64?
Zitat von: Guybrush am 04 Juni 2025, 19:58:12du hast bookworm installiert? welche perl version? auch arm64?
Es ist der standard FHEM Docker Container
root@raspberrypi:/opt/fhem# uname -a
Linux raspberrypi 6.12.25+rpt-rpi-2712 #1 SMP PREEMPT Debian 1:6.12.25-1+rpt1 (2025-04-30) aarch64 GNU/Linux
Aus der .yaml
services:
fhem:
build:
context: .
dockerfile_inline: |
FROM ghcr.io/fhem/fhem-docker:latest
RUN <<EOF
LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get update
LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -qqy --no-install-recommends python3-pandas python3-pymysql python3-sqlalchemy python3-sklearn python3-sklearn-lib
LC_ALL=C DEBIAN_FRONTEND=noninteractive apt-get install -qqy --no-install-recommends libcryptx-perl libpbkdf2-tiny-perl libcrypt-urandom-perl
LC_ALL=C apt-get autoremove -qqy && LC_ALL=C apt-get clean
pip3 install fhem --break-system-packages
EOF
pull_policy: build
restart: always
network_mode: host
privileged: true
# devices:
# - "/dev/ttyACM0:/dev/ttyACM0"
volumes:
- "./fhem/:/opt/fhem/"
# - "./fhem/contrib/configDB/configDB.conf:/opt/fhem/configDB.conf"
environment:
FHEM_UID: 6061
FHEM_GID: 6061
TIMEOUT: 10
RESTART: 1
TELNETPORT: 7072
TZ: Europe/Berlin
# CONFIGTYPE: configDB
depends_on:
- "mysql"
libssl-dev ist installiert?
im zweifel auch mal libnet-ssleay-perl libcrypt-ssleay-perl libio-socket-ssl-perl installieren
Zitat von: Guybrush am 04 Juni 2025, 22:12:29libssl-dev ist installiert?
im zweifel auch mal libnet-ssleay-perl libcrypt-ssleay-perl libio-socket-ssl-perl installieren
Das wäre mir im laufenden FHEM zuviel ausprobieren und für eine Testinstanz habe ich momentan keine Zeit, sorry.
Die von Dir jetzt aufgelisteten Bibliotheken werden doch im Modul garnicht mit use aufgerufen, sondern nur die beiden, die im vorherigen Post nicht gefunden werden. Da verstehe ich nicht die Vorgehensweise beim Testen. Für mich ist es jetzt auch nicht so dringend, da die HTTPMOD Abfrage ja seit Jahren stabil läuft.
VG Christian
ich versuch dir nur zu helfen... es kann sein, dass die abhängigkeiten der pakete nicht passen. daher mal die pakete installieren. wenns dann immer noch so ist kannst du die ja wieder entfernen. das ist überhaupt kein problem das live zu machen
Zitat von: Guybrush am 05 Juni 2025, 08:36:44ich versuch dir nur zu helfen... es kann sein, dass die abhängigkeiten der pakete nicht passen. daher mal die pakete installieren. wenns dann immer noch so ist kannst du die ja wieder entfernen. das ist überhaupt kein problem das live zu machen
Okay, danke,
Ich stell das nur etwas zurück:-)
Hallo,
ich habe eine Judo Dosieranlage "i-dos eco" und dein Modul damit getestet. Das Connectivity Modul im Gerät scheint das selbe zu sein und dein Modul kann connecten. Ich bekomme in fhem ein paar Readings mit 0 als Wert aber STATE bleibt ??. Ich hätte Interesse mit Dir das Modul zu erweitern so, dass auch meine Judo Dosieranlage unterstützt wird. Welche Infos braucht amn dazu über das Gerät und wie kann ich sie auslesen?
VG Klaus
in jedem fall die defs und readings mit werten von deiner i-dos
Ich hab das i-dos eco Gerät definiert wie oben beschrieben:
define Judo JUDO 192.168.XXX.YYY
attr Judo username admin
set Judo password ccccccc
Ich erhalten dann die Readings:
usageSaltDay 0 g 2025-06-08 14:46:01
usageSaltDayTotal 0 2025-06-08 23:59:59
usageSoftWaterDay 0 l 2025-06-08 14:46:01
usageSoftWaterDayTotal 0 2025-06-08 23:59:59
usageTotalWaterDay 0 l 2025-06-08 14:46:01
usageTotalWaterDayTotal 0 2025-06-08 23:59:59
Komisch sind die Timestamps an jedem 2. Reading. 14:46 Uhr passt für gerade. 23:49 Uhr ist in der Zukunft. Die Werte sind alle 0. Hast Du eine Idee dazu?
funktioniert denn
get Judo model
get Judo version
da müssten dann 2 neue readings mit modell und version erscheinen
Wenn ich die Abfragen per GUI mache kommt keine Reaktion. Gebe ich die get-Befehle in der Kommandline ein, dann bekomme ich ein unvollständiges Fenster mit einem OK Button. Es gibt keine neuen Readings.
dann musst du mal verbose 5 setzen und das nochmal ausführen. die logs davon brauche ich dann
Ok - klar. Ich muss mir nur erst eine Test-Instanz von fhem bauen. Ich hatte bisher in meiner produktiven Installation getestet. In deren Logfile findest du nichts bzw. zu viel. Ich melde mich wenn ich die Test-Instanz am Laufen habe.
das kann nicht sein. mit verbose 5 wird so ziemlich jeder schritt vom modul gelogt. ich brauch jedenfalls input. ohne dem kann ich nicht viel machen
Ich dachte ich hätte verbose auf 5 gestellt. Egal - ich habe nochmal die Schritter wiederholt und dir geschickt
- Gerät Judo definieren, incl. attr username und set password
- get Judo model
- get Judo version
Die letzten beiden Schritte jeweils 1x per GUI (ohne Reaktion) und 1x per Kommandline (und halbem Fenster mit ok Button.
dass das bei dir nicht geht liegt an dem redirect, der wohl von http auf https erfolgt. https bzw ssl funktioniert bei mir nicht, da das zertifikat der judo nicht korrekt ist. ich hab das im eingangspost aber auch geschrieben, dass das noch ein problem sein könnte. daher bitte ssl/https an dem judogerät ausmachen. dann müsste es jedenfalls gehen. zumindest sind die redirects in deinem log wohl das problem warum es nicht geht
Den Punkt mit SSL hatte ich nicht gesehen. Ist jetzt aus. Ich schicke Dir gleich einen Screenshot und den Log. Der 2 File beginnt dort wo der erste aufhört. Dazwischen hatte ich SSL ausgeschaltet.
das scheint ja jetzt zu gehen. die usage* readings muss ich mir noch angucken. die werden derzeit unabhängig vom modell gefüllt. salzverbrauch dürfte deine i-dos aber nicht haben 8) geht auch die modell abfrage jetzt?
Super. Vielen Dank! Der State ist jetzt "online" und die Readings werden upgedated. Das Reading für version ist gesetzt. Ein Reading für model gibt es nicht. Ich setze das in der Testumgebung nachher nochmal auf. Ich denke, dass dann auch die Readings mit Datum in der Zukunft weg sind.
schick mir dann bitte nochmal ein log mit verbose 5. das inbetriebnahmedatum wird da z.b. noch falsch dekodiert
Die Judo i-dos verwendet eine Salzlösung um das Wasser chemisch zu stabilisieren. https://judo.eu/produkt/judo-i-dos-eco-3-60-dosierpumpe-mit-app-steuerung/ (https://judo.eu/produkt/judo-i-dos-eco-3-60-dosierpumpe-mit-app-steuerung/) Das verhindert Rost im Wasser von den Rohren und Verkalkung der Rohre. Also Salzverbrauch ist ok, aber eher in Volumen als Gramm.
Ich habe das Gerät nochmal neu aufgesetzt und mit verbose 5 alle get Abfragen durchgeführt. Die Readings zu commissioningDate, deviceNumber und operatingHours stimmen nicht. Das Gerät wurde vor 1 Woche installiert (03.05.2025). Die Seriennummer ist 70xxx, Hardware-Version 4.0 und Software-Version 3.13.
kannst du bitte mal die Ausgabe der Aufrufe folgender URLS jeweils hier posten?
http://admin:xxxxx@192.168.77.239/api/rest/0100
http://admin:xxxxx@192.168.77.239/api/rest/0E00
statt xxxx musst du natürlich dein gesetztes passwort setzen. den fehler bzgl. deviceNumber habe ich behoben - muss das aber nochmal abgleichen, weil die doku da eigentlich was anderes sagt. neue datei im Anhang (Ins Verzeichnis /FHEM kopieren und danach reload 50_Judo.pm)
Mit dem neuen Modul. Device Nummer stimmt jetzt. Toll!
http://admin:xxxxx@192.168.77.239/api/rest/0100:
{"data": "681101"}
http://admin:xxxxx@192.168.77.239/api/rest/0E00:
{"data": "683ee189"}
kontrolliere bitte nochmal deine Version. Der Wert 681101 steht für 1.17.104. das ist also richtig wie es dekodiert wird. meine Version ist übrigens auch nur 1.35.x und die ist auch erst im mai direkt von Judo geliefert worden.
Der Rückgabewert der Adresse 0E00 (Inbetriebnahme) ist allerdings schräg! Bei mir wird 090507E9 zurückgegeben, was für 09 - 05 - 07E9 steht. das entspricht 09.05.2025. bei dir steht 683ee189 was 68 - 3e - e189 entsprechen sollte. das ist übersetzt 104 (Tag).62 (Monat).57737 (Jahr). der rückgabewert ist also totaler unsinn. wenn ich das richtig sehe, dann ist die API auch hier nicht konsistent. Bei der iSoft-Pro ist das nämlich so richtig. Bei deiner i-dos scheint es aber so zu sein, dass dort ein timestamp zurückgeliefert wird. Das müsste dann 03.06.2025 11:50:33 bei dir sein. stimmt das? das ist ja mal echt bescheiden, wenn das so ist. dann muss ich mir da noch was überlegen wie ich das unterscheide..
Du hast recht mit der Version. Ich hatte im Web-Interface des Connection Moduls geschaut. Siehe Bilder. In der Judo App steht 1.17. Deine Versionsdekodierung stimmt also.
Das Installationsdatum war der 03.06.2025, die Uhrzeit 11:50:33 kann passen. Als ich mir die i-dos angesehen hatte, war Datum und Uhrzeit nicht eingestellt. Ich hatte das am Abend des 03.06. gemacht. Die 4,7m³ für totalWater zeigt mir die App auch.
versuch mal die anhängende datei. hier hab ich eine Abfrage beim Inbetriebnahmedatum eingebaut. das sollte funktionieren. kanns hier leider gerade nicht testen.
Damit crashed fhem. Wenn ich es richtig sehe, hast Du einen Typo in strftime().
2025.06.09 15:38:42.934 4: JUDO (Judo) JUDO_Callback(): cmd: totalWater (called by __ANON__)
2025.06.09 15:38:42.934 5: JUDO (Judo) JUDO_Callback(): received content: {"data": "ae120000"} (code: 200) (called by __ANON__)
2025.06.09 15:38:42.934 5: JUDO (Judo) JUDO_DecodeJson(): (called by JUDO_Callback)
2025.06.09 15:38:42.935 5: JUDO (Judo) JUDO_CheckDayUsage(): timestampUpdate: 1749476266.62599 now: 2025-06-09 15:38:42 (called by JUDO_Callback)
Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at ./FHEM/50_JUDO.pm line 497.
2025.06.09 15:39:00.588 3: From the FHEM_GLOBALATTR environment: attr global pidfilename log/fhem.pid
2025.06.09 15:39:00.589 3: From the FHEM_GLOBALATTR environment: attr global updateInBackground 1
2025.06.09 15:39:00.589 3: From the FHEM_GLOBALATTR environment: attr global logfile log/fhem-%Y-%m-%d.log
2025.06.09 15:39:00.590 3: From the FHEM_GLOBALATTR environment: attr global nofork 0
wie das so ist ohne testen.. :P fehler sollte mit der version im Anhang behoben sein. Läuft bei mir jedenfalls
Ist jetzt ok, aber commissioningDate auch nach einem get 104.62.57737.
mach mal
get Judo model
und danach nochmal commissioningDate abfragen
modell sollte eigentlich beim verbinden automatisch abgefragt werden. Wenn model nichts zurückliefert, dann brauch ich mal den Wert von
http://admin:xxxxx@192.168.77.239/api/rest/FF00
get Judo model liefert nichts zurück. Es gibt auch kein reading zu model. Nach get Judo model bleibt das commissioningDate immer noch "104.62.57737".
http://admin:xxxxx@192.168.77.239/api/rest/FF00
{"data": "41"}
Zitat von: klausg am 09 Juni 2025, 16:25:36get Judo model liefert nichts zurück. Es gibt auch kein reading zu model. Nach get Judo model bleibt das commissioningDate immer noch "104.62.57737".
http://admin:xxxxx@192.168.77.239/api/rest/FF00
{"data": "41"}
mit der neuen Datei im Anhang sollte es nun gehen. Danach sollte auch das Inbetriebnahmedatum passen.
Beinahe. Jetzt ist das Datum 03.05.125.
jetzt aber
Perfekt!
wenn du magst, dann schick mir mal die werte folgender adressen+werte (bitte immer beide paare, da ich das zum abgleich zwecks richtiger kodierung brauche - müssten ansich alle werte auch in der app stehen):
Datum+Uhrzeit vom Gerät
http://admin:xxxxx@192.168.77.239/api/rest/6100
Status
http://admin:xxxxx@192.168.77.239/api/rest/4300
Dosierung
http://admin:xxxxx@192.168.77.239/api/rest/6300
Betriebart Pumpe
http://admin:xxxxx@192.168.77.239/api/rest/5300
ich bau dann bei Gelegenheit die Sonderfunktionen der i-dos ins Modul ein
Datum+Uhrzeit vom Gerät
http://admin:xxxxx@192.168.77.239/api/rest/6100:
{"data": "090619112703"}
09.06.2025 17:39:55
Status
http://admin:xxxxx@192.168.77.239/api/rest/4300:
{"data": "02000001000000000000000000000000000000380068010000aa130000"}
?? sehe ich in der App nicht
Dosierung
http://admin:xxxxx@192.168.77.239/api/rest/6300:
{"data": "0102"}
minimal (es gibt minimal, normal, maximal)
Betriebart Pumpe
http://admin:xxxxx@192.168.77.239/api/rest/5300:
{"data": ""}
?? auch nicht in der App zu ersehen
teste mal die neue Version. Damit sollten nun folgende Kommandos bei der i-dos funktionieren:
get Judo status
get Judo datetime
get Judo dosage
die Api ist leider nicht gut dokumentiert. Status liefert einige Werte zurück und legt neue readings an. Ob die passen, bzw was die einzelnen values bedeuten kann ich nicht bei allen beurteilen. waterFlow/concentration etc sind klar, aber operatingMode & circuitMode sagen mir nichts. Möglicherweise ist erstes der Betriebsmodus der Pumpe (ein,aus,auto,manuell).
über
set Judo datetime 2025-06-09 23:43:00
solltest du auch das Datum/Uhrzeit setzen können. das ist vielleicht nützlich um die zeit mit fhem zu synchronisieren:
set Judo datetime {FmtDateTime(time)}
kannst ja mal testen und feedback geben. testen kann ichs leider nicht, da ich keine i-dos hab
Super - danke! Teste ich heute im Laufe des Tages und gebe dir Rückmeldung. Ich habe beim Stöbern im Netz eine Doku zum Judo RestAPI gefundet. Darin sind zur i-dos ein paar interessante Punkte erwähnt. Die Art der Salzlösung (Jul-W, etc.), die größe der Verpackung, die verbleibende Restmenge und Meldung falls der Behälter leer ist sind interessant. Ich schau mal was ich dazu beitragen kann.
Zitat von: klausg am 10 Juni 2025, 08:43:52Super - danke! Teste ich heute im Laufe des Tages und gebe dir Rückmeldung. Ich habe beim Stöbern im Netz eine Doku zum Judo RestAPI gefundet. Darin sind zur i-dos ein paar interessante Punkte erwähnt. Die Art der Salzlösung (Jul-W, etc.), die größe der Verpackung, die verbleibende Restmenge und Meldung falls der Behälter leer ist sind interessant. Ich schau mal was ich dazu beitragen kann.
die doku habe ich. die ist leider nicht gut. im vergleich zu anderen herstellern aber zumindest brauchbar. bin ja froh dass die überhaupt was haben. ohne freie schnittstelle hätte ich mir die judo aber auch nicht gekauft
Wow. Da hast du viel getan. Toll was jetzt geht.
Ich hatte heute morgen einen Crash von fhem. Ich glaube wegen des Tagwechsels. Im Log habe ich diese Fehlermeldung gefunden:
Usage: POSIX::strftime(fmt, sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1) at ./FHEM/50_JUDO.pm line 542.
Ansonsten gibt es ein paar kleine Ungenauigkeiten. Ich bekomme als dosageType Jul-C angezeigt. Das Gerät gibt aber wie für die Api beschrieben 102 zurück (JUL-W, 6l). Ist vielleicht ein Problem mit der Byte-Order. Das Reading dosageLitres ist bei mir nicht vorhaden. In deinem Code ist der readingsSingleUpdate dazu direkt nach dosageType.
Für dosageRemaining bekomme ich 56l. Muss man wahrscheinlich durch 10 teilen. Da ist die Doku wieder mal zu oberflächlich.
Die folgenden Readings werden nicht updated bzw. haben einen Timestamp in der Zukunft. Siehe Screenshot.
usageSaltDay
usageSaltYesterday
usageSoftWaterDay
usageSoftWaterYesterday
usageSaltDay
usageSaltYesterday
usageSoftWaterDay
usageSoftWaterYesterday
usageTotalWaterYesterday
Wahrscheinlich betreffen die dein Gerät. Schau mal ob Du die für i-dos ausblenden kannst.
Toller Fortschritt.
das mit dem strftime fehler ist schon behoben. wegen der Dosierung: Es ist 1:1 so umgesetzt wie in der API. Habs gerade nochmal getestet. Mit 0102 als Rückgabewert kommt JUL-W und 6l. Beides wird bei mir gesetzt. Versuchs daher mal mit der neuen Version. Restdosierung habe ich auch mal durch 10 geteilt. keine Ahnung ob das richtig ist... beobachte das mal. Ansonsten finde ich nichts zu den fehler/warncodes. wenn du dort welche am gerät hast, dann poste diese bitte hier mit dem wert aus warningCode/errorCode.
dass die readings usage* einen Zeitstempel in der Zukunft haben ist nicht kritisch. Ich bau da bei Gelegenheit noch was ein, dass die erst bei Tageswechsel geschrieben werden. Derzeit passiert das schon direkt beim Start wenn diese nicht vorhanden sind.
Nur die Funktionen / Readings anzeigen, die das jeweilige Gerät unterstützt ist etwas aufwendiger. Das wollte ich schon umsetzen, ist aber etwas Aufwand, da ich hier eine map aus geräteid->adresse bauen muss. das mach ich die Tage. Das ist aber nicht kritisch
Ist bei mir immer noch gleich. Ich habe das Gerät gelöscht und neu angelegt. Ich bekomme Jul-C angezeigt. Die Restmenge ist jetzt konsistent mit der App.
Im Log sehe ich Fehlermeldungen zu den Abfragen zu 0100, 2500, 3E00, 2800, 2900 und 5600.
2025.06.10 14:55:14.582 1: JUDO (Judo) JUDO_RequestAPI(): Fatal error. not defined! (called by JUDO_Connect)
2025.06.10 14:56:14.592 3: JUDO (Judo) JUDO_Callback(): error while requesting http://admin:nax77dax@192.168.77.239/api/rest/0100 - connect to http://192.168.77.239:80 timed out (called by HttpUtils_TimeoutErr)
2025.06.10 14:56:14.594 3: JUDO (Judo) JUDO_Callback(): error while requesting http://admin:nax77dax@192.168.77.239/api/rest/2500 - connect to http://192.168.77.239:80 timed out (called by HttpUtils_TimeoutErr)
2025.06.10 14:56:14.596 3: JUDO (Judo) JUDO_Callback(): error while requesting http://admin:xxxxxx@192.168.77.239/api/rest/3E00 - connect to http://192.168.77.239:80 timed out (called by HttpUtils_TimeoutErr)
2025.06.10 14:56:14.602 3: JUDO (Judo) JUDO_Callback(): error while requesting http://admin:xxxxxx@192.168.77.239/api/rest/2800 - connect to http://192.168.77.239:80 timed out (called by HttpUtils_TimeoutErr)
2025.06.10 14:56:14.604 3: JUDO (Judo) JUDO_Callback(): error while requesting http://admin:xxxxxx@192.168.77.239/api/rest/2900 - connect to http://192.168.77.239:80 timed out (called by HttpUtils_TimeoutErr)
2025.06.10 14:56:14.606 3: JUDO (Judo) JUDO_Callback(): error while requesting http://admin:xxxxxx@192.168.77.239/api/rest/5600 - connect to http://192.168.77.239:80 timed out (called by HttpUtils_TimeoutErr)
Wenn ich per Browser die Codes abfrage dann bekomme ich normal Antworten. Fängst Du damit was an?
Die Errors sind vielleicht ein Artefakt vom reload. Ignorier den Post.
Ich habe mal beim Update der Dosage $data in den Log geschrieben.
2025.06.10 15:22:42.208 5: JUDO (Judo) JUDO_Callback(): updating dosage -> data 0200000100000000000000000000000000000038000f00000073160000 (called by __ANON__)
2025.06.10 15:22:42.209 1: PERL WARNING: Use of uninitialized value in concatenation (.) or string at ./FHEM/50_JUDO.pm line 750.
2025.06.10 15:22:42.209 5: JUDO (Judo) JUDO_Callback(): updating dosage -> type: JUL-C (2) - litres: (0) (called by __ANON__)
2025.06.10 15:22:42.210 5: Starting notify loop for Judo, 1 event(s), first is dosageType: JUL-C
$data kommt hier falsch an. Ist '0200000100000000000000000000000000000038000f00000073160000' nicht 0102.
Gefunden. In my %addresses ist dosage => '4300' statt '6300'. Jetzt bekomme ich Jul-W angezeigt.
Hier die Readings jetzt.
du hast recht. da war ein typo in der Adresse.
operatingHours passt bei dir aber noch nicht. schick mir bitte mal das result von
requesting http://admin:xxxxxx@192.168.77.239/api/rest/2500
ist in der api nicht dokumentiert, aber die adresse scheint es ja zu geben. Du könntest sonst auch mal bei aktivierten verbose 5 ein checkAddresses (geht nur mit verbose 5) machen. das ruft alle verfügbaren Adressen auf und schreibt bei einem ergebnis die verfügbaren adressen in ein reading.
http://admin:xxxxxx@192.168.77.239/api/rest/2500
{"data": "1e010700"}
In meiner Judo App gibt es keine Betriebsstunden, aber es gibt den Punkt 'Nächste Wartung'. Hier wird angezeigt: 357 Tage.
das ist echt schräg. bei der i-dos werden die betriebsstunden in reverse order zurückgegeben. bei der i-safe PRO ist das genau anders rum. Offensichtlich arbeiten bei Judo wohl mehrere Entwickler ohne Führung :o
mit der neuen Version sollte das jetzt aber gehen. Ich hab auch eine Funktion eingebaut, mit der nur noch die verfügbaren Funktionen angezeigt werden. Dies setzt vorraus, dass das reading model existiert, da hieran bestimmt wird welche Funktionen zur Verfügung stehen. Es sollten jetzt auch deine Werte automatisch aktualisiert werden
Danke - gut gelöst.
Ich sehe jetzt 'get Judo operationHours' nicht mehr in der Drop down Liste der get-Befehle und wird das Reading nicht updated. Auch wenn ich in der Kommandline den Befehl absetze wird das Reading nicht aktualisiert.
Btw. Ich bin ab morgen einige Tage schlecht erreichbar. Poste wenn ich etwas tun kann. Ich versuche es zeitnah zu machen.
das ist gut, dass du das nicht mehr gesehen hast. ansonsten wäre es ein bug gewesen. ich hab aber vergessen operatingHours in die Config für die i-dos einzutragen. ist behoben und sollte nun gehen
Hallo zusammen,
ich denke ich habe da noch eine ältere Judo-iSoft Plus, bei der die API noch ohne Encryption läuft.
Im httpmod mache ich folgendermaßen einen Login
reAuthRegex (no token)|(not logged in)|(not connected)|(Connection refused)
sid01ParseResponse 1
sid01URL https://%JUDO_ipaddress%:8124/?group=register&command=login&msgnumber=1&name=login&user=%JUDO_username%&password=%JUDO_password%&role=customer
sid02URL https://%JUDO_ipaddress%:8124/?group=register&command=connect&msgnumber=6&token=%token%¶meter=i-soft%20plus&serial%20number=%JUDO_serial%
Somit würde ich bei meinem Geräte Model auch nicht die Kommunikation mit den Crypto Bibliotheken benötigen.
use Crypt::OpenSSL::RSA;
use Crypt::OpenSSL::Bignum;
Wäre es trotzdem denkbar diese iSoft auch mit ins Modul aufzunehmen?
Könnte man dann dynamisch auf die OpenSSL Bibliotheken verzichten, da die ja momentan im Docker Container nicht gefunden werden, obwohl sie installiert sind?
Sollte das nicht gehen würde ich im entsprechenden Thread vom Docker Container mal nach einer Lösung forschen.
VG Christian
die crypt module werden benötigt um das passwort verschlüsselt im key value store von fhem zu speichern. das werde ich daher nicht umbauen. du kannst aber gerne mal alle urls aufschlüsseln und dort die results jeweils mit angeben. wenn die systematik ähnlich ist, könnte mans recht einfach machen.
ich meine aber auch, dass man bei judo das aktuelle/neue connectivity modul umsonst bekommt, wenn man dort anfragt. damit ginge dann die rest api auch bei deiner
Zitat von: Guybrush am 11 Juni 2025, 20:02:48die crypt module werden benötigt um das passwort verschlüsselt im key value store von fhem zu speichern. das werde ich daher nicht umbauen.
Okay, bei einem anderen Device verwende ich den key value store auch, da geht das jedoch ohne Verschlüsselung.
Ich habe da von irgend jemanden das hier in meine 99_myUtils.pm eingebaut. Gibt es da jetzt was besseres?
######################################################
# {KeyValue("read|store","<key>","<passwort>")}
######################################################
sub KeyValue {
my ($step, $index, $value) = @_;
my $key = getUniqueId().$index;
my $e_value = "";
my $error;
if (eval "use Digest::MD5;1") {
$key = Digest::MD5::md5_hex(unpack "H*", $key);
$key .= Digest::MD5::md5_hex($key);
}
if ($step eq "read") {
($error, $value) = getKeyValue($index);
if ( defined($error) ) {
Log3 $index,3, "$index, can't read key from FhemUtils/uniqueID: $error";
return undef;
}
if ( defined($value) ) {
my $dec_value = '';
for my $char (map { pack('C', hex($_)) } ($value =~ /(..)/g)) {
my $decode = chop($key);
$dec_value .= chr(ord($char)^ord($decode));
$key = $decode.$key;
}
return $dec_value;
}
else {
Log3 $index,3,"$index, no key found in FhemUtils/uniqueID";
return undef;
}
}
if ($step eq "store") {
for my $char (split //, $value) {
my $encode = chop($key);
$e_value .= sprintf("%.2x",ord($char)^ord($encode));
$key = $encode.$key;
}
$error = setKeyValue($index, $e_value);
return "error while saving key : $error" if(defined($error));
return "Key successfully saved in FhemUtils/uniqueID Key $index";
}
};
ZitatDu kannst aber gerne mal alle urls aufschlüsseln und dort die results jeweils mit angeben. wenn die systematik ähnlich ist, könnte mans recht einfach machen.
Hier wäre meine httpmod definition mit allen urls und regex. Mit Followget gibt es dabei zusätzlich sinnvolle Reihefolgen. Die userReading muss ich nochmal prüfen, da ich seit meinem FHEM Umzug einen Syntaxfehler gemeldet bekomme.
defmod JUDO_iSoft HTTPMOD https://%JUDO_ipaddress%:8124/?group=waterstop&command=valve&msgnumber=4&token=%token% 0
attr JUDO_iSoft DbLogExclude .*
attr JUDO_iSoft DbLogInclude consumption_WaterCurrent.*,consumption_WaterAverage,consumption_Water.*Summe,consumption_WaterTotal.*,consumption_Salt.*
attr JUDO_iSoft alias JUDO_iSoft
attr JUDO_iSoft authRetries 2
attr JUDO_iSoft comment Version 2022.08.22 08:00\
Web API auf :8000\
https://blog.muwave.de/2017/06/monitoring-and-controlling-a-judo-i-soft-plus-water-softening-device-via-lan/
attr JUDO_iSoft disable 0
attr JUDO_iSoft enableControlSet 0
attr JUDO_iSoft event-on-change-reading consumption_.*,waterstop_.*
attr JUDO_iSoft event-on-update-reading consumption_WaterDaily3Hour-01.*,consumption_report_WaterDaily3Hour-01.*,consumption_report_WaterDailyDate.*,consumption_WaterWeeklyByDay-01.*,consumption_report_WaterWeeklyByDay-01.*,consumption_report_WaterWeeklyDate.*,consumption_WaterMonthlyByDay-01.*,consumption_report_WaterMonthlyByDay-01.*,consumption_report_WaterMonthlyDate.*,consumption_WaterYearByMonth-01.*,consumption_report_WaterYearByMonth-01.*,consumption_report_WaterYearDate.*
attr JUDO_iSoft extractAllJSON 0
attr JUDO_iSoft get11Name Event_list
attr JUDO_iSoft get11URL https://%JUDO_ipaddress%:8124/?group=state&command=event%20list&line=0&offset=0&token=%token%
attr JUDO_iSoft get22Name Info_SoftwareVersion
attr JUDO_iSoft get22URL https://%JUDO_ipaddress%:8124/?group=version&command=software%20version&msgnumber=1&token=%token%
attr JUDO_iSoft get23Name Info_HardwareVersion
attr JUDO_iSoft get23URL https://%JUDO_ipaddress%:8124/?group=version&command=hardware%20version&msgnumber=1&token=%token%
attr JUDO_iSoft get28Name Info_SerialNumber
attr JUDO_iSoft get28URL https://%JUDO_ipaddress%:8124/?group=spare%20part&command=serial%20number&msgnumber=5&token=%token%
attr JUDO_iSoft get32Name Info_InitDate
attr JUDO_iSoft get32URL https://%JUDO_ipaddress%:8124/?group=contract&command=init%20date&msgnumber=1&token=%token%
attr JUDO_iSoft get33Name Info_ServiceNumber
attr JUDO_iSoft get33URL https://%JUDO_ipaddress%:8124/?group=contract&command=service%20number&msgnumber=1&token=%token%
attr JUDO_iSoft get34Name Info_ServiceDate
attr JUDO_iSoft get34URL https://%JUDO_ipaddress%:8124/?group=contract&command=service%20date&msgnumber=1&token=%token%
attr JUDO_iSoft get35Name Water_Current
attr JUDO_iSoft get35URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20current&msgnumber=1&token=%token%
attr JUDO_iSoft get36-10Name consumption_WaterDaily3Hour-06
attr JUDO_iSoft get36-11Name consumption_WaterDaily3Hour-07
attr JUDO_iSoft get36-12Name consumption_WaterDaily3Hour-08
attr JUDO_iSoft get36-5Name consumption_WaterDaily3Hour-01
attr JUDO_iSoft get36-6Name consumption_WaterDaily3Hour-02
attr JUDO_iSoft get36-7Name consumption_WaterDaily3Hour-03
attr JUDO_iSoft get36-8Name consumption_WaterDaily3Hour-04
attr JUDO_iSoft get36-9Name consumption_WaterDaily3Hour-05
attr JUDO_iSoft get361-10Name consumption_report_WaterDaily3Hour-06
attr JUDO_iSoft get361-11Name consumption_report_WaterDaily3Hour-07
attr JUDO_iSoft get361-12Name consumption_report_WaterDaily3Hour-08
attr JUDO_iSoft get361-5Name consumption_report_WaterDaily3Hour-01
attr JUDO_iSoft get361-6Name consumption_report_WaterDaily3Hour-02
attr JUDO_iSoft get361-7Name consumption_report_WaterDaily3Hour-03
attr JUDO_iSoft get361-8Name consumption_report_WaterDaily3Hour-04
attr JUDO_iSoft get361-9Name consumption_report_WaterDaily3Hour-05
attr JUDO_iSoft get361DeleteIfUnmatched 1
attr JUDO_iSoft get361MaxAge 86400
attr JUDO_iSoft get361Name Report_Water_Daily
attr JUDO_iSoft get361RegOpt g
attr JUDO_iSoft get361Regex [ ](-?[0-9]{1,4})
attr JUDO_iSoft get361URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20daily&msgnumber=1&token=%token%&year=%_YEAR%&month=%_MONTH%&day=%_DAY%
attr JUDO_iSoft get36DeleteIfUnmatched 1
attr JUDO_iSoft get36Name Water_Daily
attr JUDO_iSoft get36RegOpt g
attr JUDO_iSoft get36Regex [ ](-?[0-9]{1,4})
attr JUDO_iSoft get36URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20daily&msgnumber=1&token=%token%
attr JUDO_iSoft get37-10Name consumption_WaterWeeklyByDay-06
attr JUDO_iSoft get37-11Name consumption_WaterWeeklyByDay-07
attr JUDO_iSoft get37-5Name consumption_WaterWeeklyByDay-01
attr JUDO_iSoft get37-6Name consumption_WaterWeeklyByDay-02
attr JUDO_iSoft get37-7Name consumption_WaterWeeklyByDay-03
attr JUDO_iSoft get37-8Name consumption_WaterWeeklyByDay-04
attr JUDO_iSoft get37-9Name consumption_WaterWeeklyByDay-05
attr JUDO_iSoft get371-10Name consumption_report_WaterWeeklyByDay-06
attr JUDO_iSoft get371-11Name consumption_report_WaterWeeklyByDay-07
attr JUDO_iSoft get371-5Name consumption_report_WaterWeeklyByDay-01
attr JUDO_iSoft get371-6Name consumption_report_WaterWeeklyByDay-02
attr JUDO_iSoft get371-7Name consumption_report_WaterWeeklyByDay-03
attr JUDO_iSoft get371-8Name consumption_report_WaterWeeklyByDay-04
attr JUDO_iSoft get371-9Name consumption_report_WaterWeeklyByDay-05
attr JUDO_iSoft get371AutoNumLen 2
attr JUDO_iSoft get371MaxAge 86400
attr JUDO_iSoft get371Name Report_Water_Weekly
attr JUDO_iSoft get371RegOpt g
attr JUDO_iSoft get371Regex [ ](-?[0-9]{1,4})
attr JUDO_iSoft get371URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20weekly&msgnumber=1&token=%token%&year=%_YEAR%&month=%_MONTH%&day=%_DAY%
attr JUDO_iSoft get37AutoNumLen 2
attr JUDO_iSoft get37Name Water_Weekly
attr JUDO_iSoft get37RegOpt g
attr JUDO_iSoft get37Regex [ ](-?[0-9]{1,4})
attr JUDO_iSoft get37URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20weekly&msgnumber=1&token=%token%
attr JUDO_iSoft get38-10Name consumption_WaterMonthlyByDay-06
attr JUDO_iSoft get38-11Name consumption_WaterMonthlyByDay-07
attr JUDO_iSoft get38-12Name consumption_WaterMonthlyByDay-08
attr JUDO_iSoft get38-13Name consumption_WaterMonthlyByDay-09
attr JUDO_iSoft get38-14Name consumption_WaterMonthlyByDay-10
attr JUDO_iSoft get38-15Name consumption_WaterMonthlyByDay-11
attr JUDO_iSoft get38-16Name consumption_WaterMonthlyByDay-12
attr JUDO_iSoft get38-17Name consumption_WaterMonthlyByDay-13
attr JUDO_iSoft get38-18Name consumption_WaterMonthlyByDay-14
attr JUDO_iSoft get38-19Name consumption_WaterMonthlyByDay-15
attr JUDO_iSoft get38-20Name consumption_WaterMonthlyByDay-16
attr JUDO_iSoft get38-21Name consumption_WaterMonthlyByDay-17
attr JUDO_iSoft get38-22Name consumption_WaterMonthlyByDay-18
attr JUDO_iSoft get38-23Name consumption_WaterMonthlyByDay-19
attr JUDO_iSoft get38-24Name consumption_WaterMonthlyByDay-20
attr JUDO_iSoft get38-25Name consumption_WaterMonthlyByDay-21
attr JUDO_iSoft get38-26Name consumption_WaterMonthlyByDay-22
attr JUDO_iSoft get38-27Name consumption_WaterMonthlyByDay-23
attr JUDO_iSoft get38-28Name consumption_WaterMonthlyByDay-24
attr JUDO_iSoft get38-29Name consumption_WaterMonthlyByDay-25
attr JUDO_iSoft get38-30Name consumption_WaterMonthlyByDay-26
attr JUDO_iSoft get38-31Name consumption_WaterMonthlyByDay-27
attr JUDO_iSoft get38-32Name consumption_WaterMonthlyByDay-28
attr JUDO_iSoft get38-33Name consumption_WaterMonthlyByDay-29
attr JUDO_iSoft get38-34Name consumption_WaterMonthlyByDay-30
attr JUDO_iSoft get38-35Name consumption_WaterMonthlyByDay-31
attr JUDO_iSoft get38-5Name consumption_WaterMonthlyByDay-01
attr JUDO_iSoft get38-6Name consumption_WaterMonthlyByDay-02
attr JUDO_iSoft get38-7Name consumption_WaterMonthlyByDay-03
attr JUDO_iSoft get38-8Name consumption_WaterMonthlyByDay-04
attr JUDO_iSoft get38-9Name consumption_WaterMonthlyByDay-05
attr JUDO_iSoft get381-10Name consumption_report_WaterMonthlyByDay-06
attr JUDO_iSoft get381-11Name consumption_report_WaterMonthlyByDay-07
attr JUDO_iSoft get381-12Name consumption_report_WaterMonthlyByDay-08
attr JUDO_iSoft get381-13Name consumption_report_WaterMonthlyByDay-09
attr JUDO_iSoft get381-14Name consumption_report_WaterMonthlyByDay-10
attr JUDO_iSoft get381-15Name consumption_report_WaterMonthlyByDay-11
attr JUDO_iSoft get381-16Name consumption_report_WaterMonthlyByDay-12
attr JUDO_iSoft get381-17Name consumption_report_WaterMonthlyByDay-13
attr JUDO_iSoft get381-18Name consumption_report_WaterMonthlyByDay-14
attr JUDO_iSoft get381-19Name consumption_report_WaterMonthlyByDay-15
attr JUDO_iSoft get381-20Name consumption_report_WaterMonthlyByDay-16
attr JUDO_iSoft get381-21Name consumption_report_WaterMonthlyByDay-17
attr JUDO_iSoft get381-22Name consumption_report_WaterMonthlyByDay-18
attr JUDO_iSoft get381-23Name consumption_report_WaterMonthlyByDay-19
attr JUDO_iSoft get381-24Name consumption_report_WaterMonthlyByDay-20
attr JUDO_iSoft get381-25Name consumption_report_WaterMonthlyByDay-21
attr JUDO_iSoft get381-26Name consumption_report_WaterMonthlyByDay-22
attr JUDO_iSoft get381-27Name consumption_report_WaterMonthlyByDay-23
attr JUDO_iSoft get381-28Name consumption_report_WaterMonthlyByDay-24
attr JUDO_iSoft get381-29Name consumption_report_WaterMonthlyByDay-25
attr JUDO_iSoft get381-30Name consumption_report_WaterMonthlyByDay-26
attr JUDO_iSoft get381-31Name consumption_report_WaterMonthlyByDay-27
attr JUDO_iSoft get381-32Name consumption_report_WaterMonthlyByDay-28
attr JUDO_iSoft get381-33Name consumption_report_WaterMonthlyByDay-29
attr JUDO_iSoft get381-34Name consumption_report_WaterMonthlyByDay-30
attr JUDO_iSoft get381-35Name consumption_report_WaterMonthlyByDay-31
attr JUDO_iSoft get381-5Name consumption_report_WaterMonthlyByDay-01
attr JUDO_iSoft get381-6Name consumption_report_WaterMonthlyByDay-02
attr JUDO_iSoft get381-7Name consumption_report_WaterMonthlyByDay-03
attr JUDO_iSoft get381-8Name consumption_report_WaterMonthlyByDay-04
attr JUDO_iSoft get381-9Name consumption_report_WaterMonthlyByDay-05
attr JUDO_iSoft get381DeleteIfUnmatched 1
attr JUDO_iSoft get381MaxAge 86400
attr JUDO_iSoft get381Name Report_Water_Monthly
attr JUDO_iSoft get381RegOpt g
attr JUDO_iSoft get381Regex [ ](-?[0-9]{1,4})
attr JUDO_iSoft get381URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20monthly&msgnumber=1&token=%token%&year=%_YEAR%&month=%_MONTH%
attr JUDO_iSoft get38DeleteIfUnmatched 1
attr JUDO_iSoft get38Name Water_Monthly
attr JUDO_iSoft get38RegOpt g
attr JUDO_iSoft get38Regex [ ](-?[0-9]{1,4})
attr JUDO_iSoft get38URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20monthly&msgnumber=1&token=%token%
attr JUDO_iSoft get39-10Name consumption_WaterYearByMonth-06
attr JUDO_iSoft get39-11Name consumption_WaterYearByMonth-07
attr JUDO_iSoft get39-12Name consumption_WaterYearByMonth-08
attr JUDO_iSoft get39-13Name consumption_WaterYearByMonth-09
attr JUDO_iSoft get39-14Name consumption_WaterYearByMonth-10
attr JUDO_iSoft get39-15Name consumption_WaterYearByMonth-11
attr JUDO_iSoft get39-16Name consumption_WaterYearByMonth-12
attr JUDO_iSoft get39-5Name consumption_WaterYearByMonth-01
attr JUDO_iSoft get39-6Name consumption_WaterYearByMonth-02
attr JUDO_iSoft get39-7Name consumption_WaterYearByMonth-03
attr JUDO_iSoft get39-8Name consumption_WaterYearByMonth-04
attr JUDO_iSoft get39-9Name consumption_WaterYearByMonth-05
attr JUDO_iSoft get391-10Name consumption_report_WaterYearByMonth-06
attr JUDO_iSoft get391-11Name consumption_report_WaterYearByMonth-07
attr JUDO_iSoft get391-12Name consumption_report_WaterYearByMonth-08
attr JUDO_iSoft get391-13Name consumption_report_WaterYearByMonth-09
attr JUDO_iSoft get391-14Name consumption_report_WaterYearByMonth-10
attr JUDO_iSoft get391-15Name consumption_report_WaterYearByMonth-11
attr JUDO_iSoft get391-16Name consumption_report_WaterYearByMonth-12
attr JUDO_iSoft get391-5Name consumption_report_WaterYearByMonth-01
attr JUDO_iSoft get391-6Name consumption_report_WaterYearByMonth-02
attr JUDO_iSoft get391-7Name consumption_report_WaterYearByMonth-03
attr JUDO_iSoft get391-8Name consumption_report_WaterYearByMonth-04
attr JUDO_iSoft get391-9Name consumption_report_WaterYearByMonth-05
attr JUDO_iSoft get391AutoNumLen 2
attr JUDO_iSoft get391MaxAge 86400
attr JUDO_iSoft get391Name Report_Water_Yearly
attr JUDO_iSoft get391RegOpt g
attr JUDO_iSoft get391Regex [ ](-?[0-9]{1,4})
attr JUDO_iSoft get391URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20yearly&msgnumber=1&token=%token%&year=%_YEAR%
attr JUDO_iSoft get39AutoNumLen 2
attr JUDO_iSoft get39Name Water_Yearly
attr JUDO_iSoft get39RegOpt g
attr JUDO_iSoft get39Regex [ ](-?[0-9]{1,4})
attr JUDO_iSoft get39URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20yearly&msgnumber=1&token=%token%
attr JUDO_iSoft get40Name Water_Total
attr JUDO_iSoft get40URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20total&msgnumber=1&token=%token%
attr JUDO_iSoft get41Name Report_WaterOfDays
attr JUDO_iSoft get41URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20weekly&msgnumber=1&token=%token%&year=%_YEAR%&month=%_MONTH%&day=%_DAY%&offset=%_OFFSET%
attr JUDO_iSoft get42Name Water_Average
attr JUDO_iSoft get42URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20average&msgnumber=1&token=%token%
attr JUDO_iSoft get43Name Water_Actual_Abstraction_Time
attr JUDO_iSoft get43URL https://%JUDO_ipaddress%:8124/?group=consumption&command=actual%20abstraction%20time&msgnumber=1&token=%token%
attr JUDO_iSoft get44Name Waterstop_Actual_Quantity
attr JUDO_iSoft get44URL https://%JUDO_ipaddress%:8124/?group=consumption&command=actual%20quantity&msgnumber=1&token=%token%
attr JUDO_iSoft get45Name Salt_Quantity
attr JUDO_iSoft get45URL https://%JUDO_ipaddress%:8124/?group=consumption&command=salt%20quantity&msgnumber=1&token=%token%
attr JUDO_iSoft get47Name Salt_Range
attr JUDO_iSoft get47URL https://%JUDO_ipaddress%:8124/?group=consumption&command=salt%20range&msgnumber=1&token=%token%
attr JUDO_iSoft get49Name Hardness_Residual
attr JUDO_iSoft get49URL https://%JUDO_ipaddress%:8124/?group=settings&command=residual%20hardness&msgnumber=1&token=%token%
attr JUDO_iSoft get50Name Hardness_Natural
attr JUDO_iSoft get50URL https://%JUDO_ipaddress%:8124/?group=info&command=natural%20hardness&msgnumber=1&token=%token%
attr JUDO_iSoft get53Name Regeneration
attr JUDO_iSoft get53URL https://%JUDO_ipaddress%:8124/?group=settings&command=regeneration&msgnumber=1&token=%token%
attr JUDO_iSoft get55Name Waterstop_Standby
attr JUDO_iSoft get55URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=standby&msgnumber=1&token=%token%
attr JUDO_iSoft get58Name Waterstop_Valve
attr JUDO_iSoft get58URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=valve&msgnumber=1&token=%token%
attr JUDO_iSoft get60Name Waterstop_Abstraction_Time
attr JUDO_iSoft get60URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=abstraction%20time&msgnumber=1&token=%token%
attr JUDO_iSoft get62Name Waterstop_Flow_Rate
attr JUDO_iSoft get62URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=flow%20rate&msgnumber=1&token=%token%
attr JUDO_iSoft get64Name Waterstop_Quantity
attr JUDO_iSoft get64URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=quantity&msgnumber=1&token=%token%
attr JUDO_iSoft get66Name Waterstop_Vacation
attr JUDO_iSoft get66URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=vacation&msgnumber=1&token=%token%
attr JUDO_iSoft getHeader1 Content-Type: application/json
attr JUDO_iSoft getHeader2 Accept: */*
attr JUDO_iSoft group Wasser
attr JUDO_iSoft reAuthRegex (no token)|(not logged in)|(not connected)|(Connection refused)
attr JUDO_iSoft reading01Name token
attr JUDO_iSoft reading01Regex "token":"([^"]+)"
attr JUDO_iSoft reading22Name version_SoftwareVersion
attr JUDO_iSoft reading22Regex "software version","data":"(.*)","group":"version"
attr JUDO_iSoft reading23Name version_HardwareVersion
attr JUDO_iSoft reading23Regex "hardware version","data":"(.*)","group":"version"
attr JUDO_iSoft reading28Name spare_part_SerialNumber
attr JUDO_iSoft reading28Regex "serial number","data":"(.*)","group":"spare part"
attr JUDO_iSoft reading32Name contract_InitDate
attr JUDO_iSoft reading32OExpr POSIX::strftime("%Y-%m-%d %H:%M",localtime($val))
attr JUDO_iSoft reading32Regex "init date","data":"(.*)","group":"contract"
attr JUDO_iSoft reading34Name contract_ServiceDate
attr JUDO_iSoft reading34OExpr POSIX::strftime("%Y-%m-%d %H:%M",localtime($val))
attr JUDO_iSoft reading34Regex "service date","data":"(.*)","group":"contract"
attr JUDO_iSoft reading351Name consumption_WaterCurrentRaw
attr JUDO_iSoft reading351Regex "command":"water current","data":"(.*) .*","group":"consumption"
attr JUDO_iSoft reading352Name consumption_WaterCurrentSoft
attr JUDO_iSoft reading352Regex "command":"water current","data":".* (.*)","group":"consumption"
attr JUDO_iSoft reading401Name consumption_WaterTotalRaw
attr JUDO_iSoft reading401Regex "command":"water total","data":" (\d+) \d+","group":"consumption"
attr JUDO_iSoft reading402Name consumption_WaterTotalSoft
attr JUDO_iSoft reading402Regex "command":"water total","data":" \d+ (\d+)","group":"consumption"
attr JUDO_iSoft reading411Name consumption_WaterOfDaysDate
attr JUDO_iSoft reading411Regex "command":"water weekly.*"day":(\d+),"group".*"month":(\d+),"msg.*"offset":"(-?\d+)","status.*"week":(\d+),"year":(\d+),"wtu
attr JUDO_iSoft reading412Name consumption_WaterOfDaysByDay
attr JUDO_iSoft reading412Regex "command":"water weekly","data":" (-?\d+) (-?\d+) (-?\d+) (-?\d+) (-?\d+) (-?\d+) (-?\d+).*offset
attr JUDO_iSoft reading42Name consumption_WaterAverage
attr JUDO_iSoft reading42Regex "command":"water average","data":"(\d+)","group":"consumption"
attr JUDO_iSoft reading43Name consumption_ActualAbstractionTime
attr JUDO_iSoft reading43Regex "command":"actual abstraction time","data":"(\d+)","group":"consumption"
attr JUDO_iSoft reading44Name consumption_ActualQuantity
attr JUDO_iSoft reading44Regex "command":"actual quantity","data":"(\d+)","group":"consumption"
attr JUDO_iSoft reading451Name consumption_SaltQuantityIn_kg
attr JUDO_iSoft reading451OExpr int($val/1000)
attr JUDO_iSoft reading451Regex "command":"salt quantity","data":"(\d+)","group":"consumption"
attr JUDO_iSoft reading45Name consumption_SaltQuantityInPercent
attr JUDO_iSoft reading45OExpr int($val/50000*100)
attr JUDO_iSoft reading45Regex "command":"salt quantity","data":"(\d+)","group":"consumption"
attr JUDO_iSoft reading471Name consumption_SaltRangeInWeeks
attr JUDO_iSoft reading471OExpr int($val/7)
attr JUDO_iSoft reading471Regex "command":"salt range","data":"(\d+)","group":"consumption"
attr JUDO_iSoft reading47Name consumption_SaltRangeInDays
attr JUDO_iSoft reading47Regex "command":"salt range","data":"(\d+)","group":"consumption"
attr JUDO_iSoft reading49Name settings_ResidualHardness
attr JUDO_iSoft reading49Regex "residual hardness","data":"(\d+)","group":"settings"
attr JUDO_iSoft reading50Name info_NaturalHardness
attr JUDO_iSoft reading50Regex "natural hardness","data":"(\d+)","group":"info"
attr JUDO_iSoft reading53Name settings_Regeneration
attr JUDO_iSoft reading53Regex "command":"regeneration","data":"(.*)","group":"settings"
attr JUDO_iSoft reading55Name waterstop_Standby
attr JUDO_iSoft reading55Regex "command":"standby","data":"(\d+)","group":"waterstop"
attr JUDO_iSoft reading58Name waterstop_State
attr JUDO_iSoft reading58Regex "command":"valve","data":"(\w+)","group":"waterstop"
attr JUDO_iSoft reading60Name waterstop_AbstractionTime
attr JUDO_iSoft reading60Regex "command":"abstraction time","data":"(\w+)","group":"waterstop"
attr JUDO_iSoft reading62Name waterstop_FlowRate
attr JUDO_iSoft reading62Regex "flow rate","data":"(\d+)","group":"waterstop"
attr JUDO_iSoft reading64Name waterstop_Quantity
attr JUDO_iSoft reading64Regex "command":"quantity","data":"(\d+)","group":"waterstop"
attr JUDO_iSoft reading66Name waterstop_Vacation
attr JUDO_iSoft reading66Regex "command":"vacation","data":"(.*)","group":"waterstop"
attr JUDO_iSoft replacement01Mode reading
attr JUDO_iSoft replacement01Regex %token%
attr JUDO_iSoft replacement01Value token
attr JUDO_iSoft replacement02Mode text
attr JUDO_iSoft replacement02Regex %JUDO_ipaddress%
attr JUDO_iSoft replacement02Value <IP-Adresse>
attr JUDO_iSoft replacement03Mode text
attr JUDO_iSoft replacement03Regex %JUDO_password%
attr JUDO_iSoft replacement03Value <Passwort>
attr JUDO_iSoft replacement04Mode text
attr JUDO_iSoft replacement04Regex %JUDO_username%
attr JUDO_iSoft replacement04Value <User Name>
attr JUDO_iSoft replacement05Mode text
attr JUDO_iSoft replacement05Regex %JUDO_serial%
attr JUDO_iSoft replacement05Value <Seriennummer>
attr JUDO_iSoft replacement06Mode reading
attr JUDO_iSoft replacement06Regex %_YEAR%
attr JUDO_iSoft replacement06Value _YEAR
attr JUDO_iSoft replacement07Mode reading
attr JUDO_iSoft replacement07Regex %_MONTH%
attr JUDO_iSoft replacement07Value _MONTH
attr JUDO_iSoft replacement08Mode reading
attr JUDO_iSoft replacement08Regex %_DAY%
attr JUDO_iSoft replacement08Value _DAY
attr JUDO_iSoft replacement09Mode reading
attr JUDO_iSoft replacement09Regex %_OFFSET%
attr JUDO_iSoft replacement09Value _OFFSET
attr JUDO_iSoft replacement10Mode reading
attr JUDO_iSoft replacement10Regex %_OFFSET%
attr JUDO_iSoft replacement10Value _OFFSET
attr JUDO_iSoft room Wasser
attr JUDO_iSoft set46FollowGet Salt_Quantity
attr JUDO_iSoft set46IExpr $val*1000
attr JUDO_iSoft set46Name Salt_Quantity
attr JUDO_iSoft set46URL https://%JUDO_ipaddress%:8124/?group=consumption&command=salt%20quantity&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft set48FollowGet Hardness_Residual
attr JUDO_iSoft set48Hint slider,6,1,10
attr JUDO_iSoft set48Name Hardness_Residual
attr JUDO_iSoft set48URL https://%JUDO_ipaddress%:8124/?group=settings&command=residual%20hardness&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft set51FollowGet Regeneration
attr JUDO_iSoft set51Hint start,stop
attr JUDO_iSoft set51Name Regeneration
attr JUDO_iSoft set51NoArg 1
attr JUDO_iSoft set51TextArg 1
attr JUDO_iSoft set51URL https://%JUDO_ipaddress%:8124/?group=settings&command=regeneration&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft set54FollowGet Waterstop_Standby
attr JUDO_iSoft set54Hint 0,1
attr JUDO_iSoft set54Name Waterstop_Standby
attr JUDO_iSoft set54URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=standby&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft set56FollowGet Waterstop_Vacation
attr JUDO_iSoft set56Hint close,open
attr JUDO_iSoft set56Name Waterstop_Valve
attr JUDO_iSoft set56NoArg 1
attr JUDO_iSoft set56TextArg 1
attr JUDO_iSoft set56URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=valve&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft set59FollowGet Waterstop_Abstraction_Time
attr JUDO_iSoft set59Hint slider,1,1,31
attr JUDO_iSoft set59Name Waterstop_Abstraction_Time
attr JUDO_iSoft set59URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=abstraction%20time&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft set61FollowGet Waterstop_Flow_Rate
attr JUDO_iSoft set61Hint slider,0,500,5000
attr JUDO_iSoft set61Name Waterstop_Flow_Rate
attr JUDO_iSoft set61URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=flow%20rate&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft set63FollowGet Waterstop_Quantity
attr JUDO_iSoft set63Hint slider,100,100,3000
attr JUDO_iSoft set63Name Waterstop_Quantity
attr JUDO_iSoft set63URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=quantity&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft set65FollowGet Waterstop_Vacation
attr JUDO_iSoft set65Hint slider,0,1,31
attr JUDO_iSoft set65Name Waterstop_Vacation
attr JUDO_iSoft set65URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=vacation&msgnumber=1&token=%token%¶meter=$val
attr JUDO_iSoft showBody 1
attr JUDO_iSoft showError 1
attr JUDO_iSoft sid01ParseResponse 1
attr JUDO_iSoft sid01URL https://%JUDO_ipaddress%:8124/?group=register&command=login&msgnumber=1&name=login&user=%JUDO_username%&password=%JUDO_password%&role=customer
attr JUDO_iSoft sid02URL https://%JUDO_ipaddress%:8124/?group=register&command=connect&msgnumber=6&token=%token%¶meter=i-soft%20plus&serial%20number=%JUDO_serial%
attr JUDO_iSoft stateFormat {\
my $l1 = ReadingsVal("$name","waterstop_State", "");;\
my $l2 = ReadingsVal("$name","waterstop_FlowRate", "")." l";;\
my $l3 = ReadingsVal("$name","waterstop_Quantity", "")." l";;\
my $l4 = ReadingsVal("$name","waterstop_AbstractionTime", "")." Min";;\
my $l5 = ReadingsVal("$name","waterstop_Vacation", "");;\
my $l6 = ReadingsVal("$name","waterstop_Standby", "");;\
my $d1 = ReadingsVal("$name","consumption_ActualQuantity", "")." l";;\
my $d2 = ReadingsVal("$name","consumption_WaterAverage", "")." l";;\
my $d3 = ReadingsVal("$name","consumption_WaterCurrentSoft", "")." l";;\
my $d4 = ReadingsVal("$name","consumption_WaterCurrentRaw", "")." l";;\
my $d5 = round(ReadingsVal("$name","consumption_WaterTotalSoft_X", "")/1000 ,3)." m³";;\
my $d6 = round(ReadingsVal("$name","consumption_WaterTotalRaw_X", "")/1000 ,3)." m³";;\
my $v1 = round(ReadingsVal("$name","consumption_WaterTotalRaw_X", "")/1000 ,3)." m³";;\
my $v2 = ReadingsVal("$name","consumption_WaterDailySumme", "")." l";;\
my $v3 = ReadingsVal("$name","consumption_WaterWeeklySumme", "")." l";;\
my $h1 = ReadingsVal("$name","info_NaturalHardness", "")." °dH";;\
my $h2 = ReadingsVal("$name","settings_ResidualHardness", "")." °dH";;\
my $s1 = ReadingsVal("$name","consumption_SaltQuantityInPercent", "")." %";;\
my $s2 = ReadingsVal("$name","consumption_SaltRangeInWeeks", "")." W";;\
my $s3 = ReadingsVal("$name","consumption_SaltRangeInDays", "")." T";;\
\
"<html><table border=2 bordercolor='darkgreen' cellspacing=0>\
<tr><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Leckageschutz</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Einstellung</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Wasser</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Verbrauch</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Status</td><td style='padding-right:5px;;padding-left:5px'>".$l1."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>gesamt</td><td style='padding-right:5px;;padding-left:5px'>".$v1."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Max Durchfluss</td><td style='padding-right:5px;;padding-left:5px'>".$l2."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>aktuell</td><td style='padding-right:5px;;padding-left:5px'> </td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ; ; ; ; ;Entnahme</td><td style='padding-right:5px;;padding-left:5px'>".$l3."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> ; ; ; ; ; ;Tag</td><td style='padding-right:5px;;padding-left:5px'>".$v2."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ; ; ; ; ;Entnahmedauer</td><td style='padding-right:5px;;padding-left:5px'>".$l4."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> ; ; ; ; ; ;Woche</td><td style='padding-right:5px;;padding-left:5px'>".$v3."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Urlaubsmodus</td><td style='padding-right:5px;;padding-left:5px'>".$l5."</td><td style='padding-right:5px;;padding-left:5px'> </td><td style='padding-right:5px;;padding-left:5px'> </td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Sleepmodusdauer</td><td style='padding-right:5px;;padding-left:5px'>".$l6."</td><td style='padding-right:5px;;padding-left:5px'> </td><td style='padding-right:5px;;padding-left:5px'> </td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> </td><td style='padding-right:5px;;padding-left:5px'> </td><td style='padding-right:5px;;padding-left:5px'> </td><td style='padding-right:5px;;padding-left:5px'> </td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Wasser</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Menge</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Wasserhärte</td><td style='padding-right:5px;;padding-left:5px'> </td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'>Durchfluss aktuell</td><td style='padding-right:5px;;padding-left:5px'>".$d1."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> ; ; ; ; ; ;natürlich</td><td style='padding-right:5px;;padding-left:5px'>".$h1."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ; ; ; ; ;Durchschnitt</td><td style='padding-right:5px;;padding-left:5px'>".$d2."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> ; ; ; ; ; ;wunsch</td><td style='padding-right:5px;;padding-left:5px'>".$h2."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ; ; ; ; ;Soft</td><td style='padding-right:5px;;padding-left:5px'>".$d3."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'>Salzvorrat</td><td style='padding-right:5px;;padding-left:5px'> </td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ; ; ; ; ;Raw</td><td style='padding-right:5px;;padding-left:5px'>".$d4."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> ; ; ; ; ; ;Menge</td><td style='padding-right:5px;;padding-left:5px'>".$s1."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ; ; ; ; ;Soft gesamt</td><td style='padding-right:5px;;padding-left:5px'>".$d5."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> ; ; ; ; ; ;Reichweite</td><td style='padding-right:5px;;padding-left:5px'>".$s2."</td></tr>\
<tr><td style='padding-right:5px;;padding-left:5px;;text-align:left;;font-weight:bold'> ; ; ; ; ; ;Raw gesamt</td><td style='padding-right:5px;;padding-left:5px'>".$d6."</td><td style='padding-right:5px;;padding-left:5px;;font-weight:bold'> ; ; ; ; ; ;Reichweite</td><td style='padding-right:5px;;padding-left:5px'>".$s3."</td></tr>\
</table></html>"\
}
attr JUDO_iSoft timeout 20
attr JUDO_iSoft userReadings consumption_WaterDailySumme:consumption_WaterDaily3Hour-01.* {my $NAME="JUDO_iSoft" ;; my $s=0 ;; for ( my $i=1;; $i<=8;; $i++ ) { (ReadingsVal("$NAME","consumption_WaterDaily3Hour-".sprintf("%02d",$i),0) gt 0)?$s += ReadingsVal("$NAME","consumption_WaterDaily3Hour-".sprintf("%02d",$i),0):$s=$s;;};; CommandDeleteReading(undef, $NAME." Water_Daily-.*");; $s},\
\
consumption_report_WaterDailyDate:consumption_report_WaterDaily3Hour-01.* {my $date=sprintf("%4d-%02d-%02d",ReadingsVal("$NAME","_YEAR",0),ReadingsVal("$NAME","_MONTH",0),ReadingsVal("$NAME","_DAY",0) );; $date },\
\
consumption_report_WaterDailySumme:consumption_report_WaterDailyDate.* {my $NAME="JUDO_iSoft" ;; my $s=0 ;; for ( my $i=1;; $i<=8;; $i++ ) { (ReadingsVal("$NAME","consumption_report_WaterDaily3Hour-".sprintf("%02d",$i),0) gt 0)?$s += ReadingsVal("$NAME","consumption_report_WaterDaily3Hour-".sprintf("%02d",$i),0):$s=$s;;};; CommandDeleteReading(undef, $NAME Report_Water_Daily-.*");; $s},\
\
consumption_WaterWeeklySumme:consumption_WaterWeeklyByDay-01.* {my $NAME="JUDO_iSoft" ;; my $s=0 ;; for ( my $i=1;; $i<=7;; $i++ ) { (ReadingsVal("$NAME","consumption_WaterWeeklyByDay-".sprintf("%02d",$i),0) gt 0)?$s += ReadingsVal("$NAME","consumption_WaterWeeklyByDay-".sprintf("%02d",$i),0):$s=$s;;};; CommandDeleteReading(undef, $NAME Water_Weekly-.*");; $s},\
\
consumption_report_WaterWeeklyDate:consumption_report_WaterWeeklyByDay-01.* {my $date=sprintf("%4d-%02d-%02d",ReadingsVal("$NAME","_YEAR",0),ReadingsVal("$NAME","_MONTH",0),ReadingsVal("$NAME","_DAY",0) );; $date },\
\
consumption_report_WaterWeeklySumme:consumption_report_WaterWeeklyDate.* {my $NAME="JUDO_iSoft" ;; my $s=0 ;; for ( my $i=1;; $i<=7;; $i++ ) { (ReadingsVal("$NAME","consumption_report_WaterWeeklyByDay-".sprintf("%02d",$i),0) gt 0)?$s += ReadingsVal("$NAME","consumption_report_WaterWeeklyByDay-".sprintf("%02d",$i),0):$s=$s;;};; CommandDeleteReading(undef, $NAME." Report_Water_Weekly-.*");; $s},\
\
consumption_WaterMonthlySumme:consumption_WaterMonthlyByDay-01.* {my $NAME="JUDO_iSoft" ;; my $s=0 ;; for ( my $i=1;; $i<=31;; $i++ ) { (ReadingsVal("$NAME","consumption_WaterMonthlyByDay-".sprintf("%02d",$i),0) gt 0)?$s += ReadingsVal("$NAME","consumption_WaterMonthlyByDay-".sprintf("%02d",$i),0):$s=$s;;};; CommandDeleteReading(undef, $NAME." Water_Monthly-.*");; $s},\
\
consumption_report_WaterMonthlyDate:consumption_report_WaterMonthlyByDay-01.* {my $date=sprintf("%4d-%02d",ReadingsVal("$NAME","_YEAR",0),ReadingsVal("$NAME","_MONTH",0) );; $date },\
\
consumption_report_WaterMonthlySumme:consumption_report_WaterMonthlyDate.* {my $NAME="JUDO_iSoft" ;; my $s=0 ;; for ( my $i=1;; $i<=31;; $i++ ) { (ReadingsVal("$NAME","consumption_report_WaterMonthlyByDay-".sprintf("%02d",$i),0) gt 0)?$s += ReadingsVal("$NAME","consumption_report_WaterMonthlyByDay-".sprintf("%02d",$i),0):$s=$s;;};; CommandDeleteReading(undef, $NAME." Report_Water_Monthly-.*");; $s},\
\
consumption_WaterYearSumme:consumption_WaterYearByMonth-01.* {my $NAME="JUDO_iSoft" ;; my $s=0 ;; for ( my $i=1;; $i<=31;; $i++ ) { (ReadingsVal("$NAME","consumption_WaterYearByMonth-".sprintf("%02d",$i),0) gt 0)?$s += ReadingsVal("$NAME","consumption_WaterYearByMonth-".sprintf("%02d",$i),0):$s=$s;;};; CommandDeleteReading(undef, $NAME." Water_Yearly-.*");; $s},\
\
consumption_report_WaterYearDate:consumption_report_WaterYearByMonth-01.* {my $date=sprintf("%4d",ReadingsVal("$NAME","_YEAR",0) );; $date },\
\
consumption_report_WaterYearSumme:consumption_report_WaterYearDate.* {my $NAME="JUDO_iSoft" ;; my $s=0 ;; for ( my $i=1;; $i<=31;; $i++ ) { (ReadingsVal("$NAME","consumption_report_WaterYearByMonth-".sprintf("%02d",$i),0) gt 0)?$s += ReadingsVal("$NAME","consumption_report_WaterYearByMonth-".sprintf("%02d",$i),0):$s=$s;;};; CommandDeleteReading(undef, $NAME." Report_Water_Yearly-.*");; $s},\
\
consumption_WaterOfDaysDate:consumption_WaterOfDaysDate-1.* {my $NAME="JUDO_iSoft" ;; my $date=sprintf("%4d-%02d-%02d Week %02d used Offset %d", ReadingsVal("$NAME","consumption_WaterOfDaysDate-5",0),ReadingsVal("$NAME","consumption_WaterOfDaysDate-2",0),ReadingsVal("$NAME","consumption_WaterOfDaysDate-1",0),ReadingsVal("$NAME","consumption_WaterOfDaysDate-4",0),ReadingsVal("$NAME","_OFFSET",0) );; CommandDeleteReading(undef, $NAME." consumption_WaterOfDaysDate-.*");; $date },\
\
consumption_WaterTotalRaw_X:consumption_WaterTotalRaw.* monotonic { ReadingsVal($NAME,"consumption_WaterTotalRaw",0) },\
consumption_WaterTotalSoft_X:consumption_WaterTotalSoft.* monotonic { ReadingsVal($NAME,"consumption_WaterTotalSoft",0) }
attr JUDO_iSoft verbose 0
Zitatich meine aber auch, dass man bei judo das aktuelle/neue connectivity modul umsonst bekommt, wenn man dort anfragt. damit ginge dann die rest api auch bei deiner
Und wie bekommt man das auf die Steuerungsbaugruppe?
Ich werde bald eh eine Wartung machen lassen und das dann direkt mit anfragen.
Am Anfang gab es da mal viele Probleme mit der FW in der Judo iSoft, da wurde sogar die komplette Baugruppe getauscht und ich hatte mit der Judo Entwicklung sehr tiefe Fehlersuche gemacht. Am besten schreibe ich den Techniker nochmal direkt an :-)
Ich habe es jetzt mal getestet und im Log erscheint diese Meldung.
Das Passwort ist das, was ich eingetragen habe, jedoch gibt es diesen API Call nicht.
2025.06.11 20:14:27.524 3: JUDO (JUDO_iSoft_test) JUDO_Callback(): error while requesting http://judoMaster:<Passwort>@192.168.178.12/api/rest/FF00 - 192.168.178.12: Connection refused (111) (called by __ANON__)
Ich habe mir gerade mal die JUDO_StorePassword($$) angeschaut und das sieht so aus wie bei mir.
Die Crypto Bibliotheken sind auf Kommentar
# use Crypt::OpenSSL::RSA;
# use Crypt::OpenSSL::Bignum;
Den username und das Passwort habe ich im Device gesetzt und im Log sieht man den ersten Versuch
2025.06.11 20:14:27.524 3: JUDO (JUDO_iSoft_test) JUDO_Callback(): error while requesting http://<username>:<Passwort>@<IP-Addresse>/api/rest/FF00 - 192.168.178.12: Connection refused (111) (called by __ANON__)
Davon leite ich nun ab, dass ich die beiden Bibliotheken im Docker Container nicht benötige. Ich kann in der Funktion aber auch keinen Verschlüsselungsaufruf erkennen, bin jedoch auch kein Entwickler.
Wenn wir die Judo iSoft Plus auch ins Modul bekommen könnten, würde ich mich risig freuen :-)
VG Christian
ich brauche nicht nur die urls, sondern auch das was auf diesen ausgegeben wird. sonst kann ich da nicht viel zu sagen
operatingHours sind jetzt perfekt!
operatingHours 8d 18h 27m 2025-06-12 09:33:01
Hast du eine Idee was diese Readings bedeuten:
operatingMode 0 2025-06-12 09:37:04
warningCode 256 2025-06-12 09:34:04
Zitat von: klausg am 12 Juni 2025, 09:39:19Hast du eine Idee was diese Readings bedeuten:
operatingMode 0 2025-06-12 09:37:04
warningCode 256 2025-06-12 09:34:04
Leider nein. Die api gibt nichts her und im Netz ist da nichts zu finden. Wenn ich eine i-dos hätte könnte ich das selbst umsetzen.
Funktioniert jetzt sonst soweit alles bei dir?
Zitat von: Guybrush am 12 Juni 2025, 08:40:22ich brauche nicht nur die urls, sondern auch das was auf diesen ausgegeben wird. sonst kann ich da nicht viel zu sagen
Ich kümmere mich drum und bereite jede Abfrage noch etwas auf.
Danke
Christian