JUDO iSoft Plus: Unterschied zwischen den Versionen

Aus FHEMWiki
(Neuer Abschnitt Problemlösung: DHCP / Salzbehälter)
K (Typos / language)
 
(7 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 13: Zeile 13:
|HWDeviceFHEM=[[HTTPMOD]]
|HWDeviceFHEM=[[HTTPMOD]]
<!-- |ModOwner=  -->
<!-- |ModOwner=  -->
|HWManufacturer=Judo GmbH
|HWManufacturer=JUDO GmbH
}}
}}
__TOC__
__TOC__


Die JUDO i-soft plus Enthärtungsanlage [https://judo.eu/produkt/judo-i-soft-plus-vollautomatische-enthaertungsanlage/] ist eine Wasserenthärtungsanlage mit IP-Konnektivität.  
Die JUDO i-soft plus Enthärtungsanlage [https://judo.eu/produkt/judo-i-soft-plus-vollautomatische-enthaertungsanlage/] ist eine Wasserenthärtungsanlage mit IP-Konnektivität.  
Sie verfügt über LAN und WLAN-Anschluss und ist auf die Steuerung via App des Herstellers ausgelegt.
Sie verfügt über LAN- und WLAN-Anschluss und ist auf die Steuerung via App des Herstellers ausgelegt.


Für eine erfolgreiche Integration in FHEM muss die Anlage über das Menü beim Hersteller registriert werden.
== Geräte-Registrierung ==
 
Für eine erfolgreiche Integration in FHEM muss die Anlage über das Menü beim Hersteller registriert werden (wohl nur i-soft plus; z.B. i-soft safe kann das wohl nicht, schlechtere Display-Ausstattung - hier gilt dann [https://www.ju-control.app/] oder die Handy-Apps).
Die folgenden Informationen sind erforderlich:
Die folgenden Informationen sind erforderlich:


Zeile 27: Zeile 29:
* Seriennummer: Seriennummer des Geräts. Diese ist entweder über das Menü auslesbar oder alternativ auch über die APP des Herstellers.
* Seriennummer: Seriennummer des Geräts. Diese ist entweder über das Menü auslesbar oder alternativ auch über die APP des Herstellers.
* IP-Adresse:  Die IP-Adresse des Geräts im Heimnetz.  
* IP-Adresse:  Die IP-Adresse des Geräts im Heimnetz.  
Bei den Registrier-Prozessen ist zwingend zu beachten, dass es '''mehrere''' Labels mit QR-Codes / Gerätedaten geben kann (zumindest bei i-soft safe): auf den Gehäuse-Seite'''n''' und auf dem Connectivity Module - man sollte also tunlichst die '''richtige''' Referenz erwischen, sonst Fehlschlag!
(Ich hatte mehrere Prozess-Probleme, somit in Beschwerdemail mehrere momentan existierende gravierende Registrier-Prozess-Impräzisionen angem***t, daraufhin INSTANTAN (8 Uhr) Rückruf durch Kundendienst! *daumenhoch*)
Bei Geräten neuerer Generation scheint es so zu sein, dass die Schnittstelle über Port 8124 nur den Login erlaubt, wenn bei der Geräteregistrierung die Datenschutzerklärung '''nicht''' akzeptiert wird. Falls also trotz korrekter Einstellungen "login failed" kommt, versuchen bei der Registrierung die Datenschutzeinstellungen zu ändern.


== Einbindung in FHEM ==
== Einbindung in FHEM ==
Zeile 39: Zeile 46:
Wem das nicht reicht, der kann den Zyklus herunter setzen oder auch nach anderen Standard-Werten abfragen. Wer das kontinuierliche Pollen vermeiden will, setzt den Wert auf 0.
Wem das nicht reicht, der kann den Zyklus herunter setzen oder auch nach anderen Standard-Werten abfragen. Wer das kontinuierliche Pollen vermeiden will, setzt den Wert auf 0.


Nach erfolgreicher Authentifizierung wird von der i-soft ein Token generiert und muss bei jedem Aufruf übergeben werden:
Nach erfolgreicher Authentifizierung wird von der i-soft ein Token generiert, welches bei jedem Aufruf übergeben werden muss:


<pre>
<pre>
Zeile 64: Zeile 71:
</pre>
</pre>


Die Authentifizierung der Anlage erfolgt zwei-stufig. Zunächst muss ein Aufruf mit Benutzername und Kennwort erfolgen. Als Antwort erhält man einen JSON-String, der das Token beinhaltet. Mit diesem Token wird anschließend die Funktion connect aufgerufen und die Seriennummer des Geräts mit übergeben.  
Die Authentifizierung der Anlage erfolgt zweistufig. Zunächst muss ein Aufruf mit Benutzername und Kennwort erfolgen. Als Antwort erhält man einen JSON-String, der das Token beinhaltet. Mit diesem Token wird anschließend die Funktion connect aufgerufen und die Seriennummer des Geräts mit übergeben.  
HTTPMOD erkennt, wenn ein neues Login erforderlich ist, wenn die Judo die Rückmeldung "no token" oder "not logged in" liefert.
HTTPMOD erkennt, wenn ein neues Login erforderlich ist, wenn die JUDO die Rückmeldung "no token" oder "not logged in" liefert.


Achtung: Als Parameter muss ebenfalls der Typ "i-soft plus" übergeben werden. Vermutlich ist dieser bei anderen Geräten des Herstellers anders. Ich habe ihn hier fix eingetragen, da ich keine Möglichkeit zum Testen anderer Geräte habe.  
Achtung: Als Parameter muss ebenfalls der Typ "i-soft plus" übergeben werden. Vermutlich ist dieser bei anderen Geräten des Herstellers anders. Ich habe ihn hier fix eingetragen, da ich keine Möglichkeit zum Testen anderer Geräte habe.  
Zeile 79: Zeile 86:


Damit ist die Grundkonfiguration hergestellt und die Anlage kann sich connecten.  
Damit ist die Grundkonfiguration hergestellt und die Anlage kann sich connecten.  
In den einzelnen JSON-Rückantworten der Anlage werden die Werte zur jeweilige Anfrage immer als "data" zurück geliefert. Mit der Standard-Konfiguration
In den einzelnen JSON-Rückantworten der Anlage werden die Werte zur jeweilige Anfrage immer als "data" zurückgeliefert. Mit der Standard-Konfiguration


<pre>
<pre>
Zeile 94: Zeile 101:
attr JUDO_iSoft reading02JSON group
attr JUDO_iSoft reading02JSON group
attr JUDO_iSoft reading03JSON command
attr JUDO_iSoft reading03JSON command
attr JUDO_iSoft reading03OExpr $val =~ s/\s/-/;; $val; readingsBulkUpdate($hash,$val,ReadingsVal("JUDO_iSoft","data",""))
attr JUDO_iSoft reading03OExpr $val =~ s/\s/-/;; $val;; readingsBulkUpdate($hash,$val,ReadingsVal("JUDO_iSoft","data",""))
</pre>
</pre>
Noch ein paar ergänzende Attribute gesetzt:
Noch ein paar ergänzende Attribute gesetzt:
Zeile 102: Zeile 109:
attr JUDO_iSoft getHeader2 Accept: */*
attr JUDO_iSoft getHeader2 Accept: */*
attr JUDO_iSoft room 10_Räume->UG->Keller,
attr JUDO_iSoft room 10_Räume->UG->Keller,
attr JUDO_iSoft showError  
attr JUDO_iSoft showError 1
attr JUDO_iSoft timeout 5
attr JUDO_iSoft timeout 5
</pre>
</pre>
Zeile 227: Zeile 234:
</pre>
</pre>


Um 1x pro Stunde gegen Ende der vollen Stunde den Wasserbrauch der aktuellen Stunde abzugreifen setze ich einen weiteren Timer auf. Bei mir jeweils um :58 der aktuellen Stunde.  Das ist natürlich nicht ganz exakt. Wenn sich die Uhr der Judo und von FHEM auseinander driften bekommt man ggf. schon wieder den Wert der nächsten Stunde.  
Um 1x pro Stunde gegen Ende der vollen Stunde den Wasserbrauch der aktuellen Stunde abzugreifen, setze ich einen weiteren Timer auf. Bei mir jeweils um :58 der aktuellen Stunde.  Das ist natürlich nicht ganz exakt. Wenn die Uhr der JUDO und von FHEM auseinander driften bekommt man ggf. schon wieder den Wert der nächsten Stunde.  
<pre>
<pre>
Internals:
Internals:
Zeile 260: Zeile 267:
== Darstellung in Tablet UI ==
== Darstellung in Tablet UI ==
Ich nutze Tablet UI für die Visualisierung.  
Ich nutze Tablet UI für die Visualisierung.  
Zur Darstellung der Restmengen Salz nutze ich das knob-widget, für das Setzen des Härtegrades den spinner.
Zur Darstellung der Restmengen Salz nutze ich das knob-widget, für das Setzen des Härtegrades den spinner.


[[Datei:Screenshot judo 2.jpg|mini|Visualisierung der Judo im TabletUI|200px]]
[[Datei:Screenshot judo 2.jpg|mini|Visualisierung der JUDO im TabletUI|200px]]


<pre>
<pre>
Zeile 463: Zeile 470:


== Ähnliche Systeme ==
== Ähnliche Systeme ==
=== JUDO iSoft Safe ===
Auch auf der IP Adresse der iSoft Safe im lokalen Netzwerk bekommt man eine Übersichtsseite mit einigen Daten, die besten Ergebnisse hatte ich allerdings, als ich Requests an #myJudo [[https://www.myjudo.eu/]] geschickt habe. Ich habe hier nur die Änderungen zur Anleitung der JUDO iSoft Plus notiert.
Das Grundkonzept ist hier sehr ähnlich. Die Adresse ist allerdings nicht lokal.
Ein weiterer Unterschied ist, dass das Passwort als Hash(MD5) des Passwortes erwartet wird.
<pre>
attr JUDO_iSoft reAuthRegex (error)|(login failed)
attr JUDO_iSoft replacement02Value www.myjudo.eu
attr JUDO_iSoft replacement03Regex %JUDO_password%
attr JUDO_iSoft replacement03Value <hier MD5 geHashtes Kennwort eintragen>
attr JUDO_iSoft replacement05Regex %JUDO_serial%
attr JUDO_iSoft replacement05Value <hier Seriennummer (MAC Adresse) eintragen>
</pre>
Der Login ist nur einstufig:
<pre>
attr JUDO_iSoft sid01URL https://%JUDO_ipaddress%/interface/?group=register&command=login&name=login&user=%JUDO_username%&password=%JUDO_password%&nohash=Service&role=customer
</pre>
Die URL um eine JSON File mit im Prinzip allen wichtigen Informationen zu bekommen habe ich so definiert. Der Request liefert ein JSON mit vermutlich allen registrierten Geräten zurück die über die "serialnumber" (MAC Adresse) identifiziert werden können. Ich habe leider nur ein Gerät und kann das daher nicht mit Sicherheit verifizieren.
<pre>
attr JUDO_iSoft get01JSON data
attr JUDO_iSoft get01Name DeviceData
attr JUDO_iSoft get01URL https:///%JUDO_ipaddress%/interface/?token=%token%&group=register&command=get%20device%20data
</pre>
Da ich auf dem JSON / FHEM Gebiet noch wenig Erfahrung habe, habe ich keinen extra Konvertierer gebaut. Das JSON File wird vom HTTPMOD Modul automatisch angelegt und ich konnte mir über UserReadings die Informationen herauslesen (sie werden "verschlüsselt" im JSON abgelegt daher die seltsamen Abfragen).
Hier einige Beispiele:
<pre>
waterTotal { ( hex ( substr(ReadingsVal("JUDO_iSoft","DeviceData-41", ''), 6, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-41", ''), 4, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-41", ''), 2, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-41", ''), 0, 2)) / 1000 ). ' m³'},
waterProcessed { ( hex ( substr(ReadingsVal("JUDO_iSoft","DeviceData-53", ''), 6, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-53", ''), 4, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-53", ''), 2, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-53", ''), 0, 2)) / 1000 ). ' m³'},
saltLevel { ( hex ( substr(ReadingsVal("JUDO_iSoft","DeviceData-50", ''), 2, 2).substr(ReadingsVal("JUDO_iSoft","data_01_data_01_data_94_data", ''), 0, 2))  ). ' g'},
saltRange { hex ( substr(ReadingsVal("JUDO_iSoft","DeviceData-50", ''), 6, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-50", ''), 4, 2)). " Tage" }
</pre>
Es gibt auch die Möglichkeit, den Tagesverbrauch in 3h Paketen zu ermitteln - dazu müsste man folgendes definieren
User Reading:
<pre>
date {(strftime '%d%m%Y', localtime)},
</pre>
und folgende Attribute:
<pre>
attr JUDO_iSoft replacement05Mode reading
attr JUDO_iSoft replacement05Regex %date%
attr JUDO_iSoft replacement05Value date
attr JUDO_iSoft get02JSON data
attr JUDO_iSoft get02Name WaterConsumptionDay
attr JUDO_iSoft get02URL https://%JUDO_ipaddress%/interface/?token=%token%&group=register&command=get_chart_data&serialnumber=%JUDO_serial%date=%date%&parameter=day
</pre>
Hier bekommt man eine Zeile zurück wobei immer 8 Zeichen zusammen die LiterZahl (als Hex) bilden.
Zeichen 0-8 - Verbrauch von 0-3 Uhr
Zeichen 9-16 - Verbrauch von 3-6 Uhr usw.


== Projekte der FHEM-Community ==
== Projekte der FHEM-Community ==
[[https://forum.fhem.de/index.php/topic,112147.msg1064693.html#msg1064693|JUDO isoft Plus - Eine andere Definition]]


== Links ==
== Links ==
* {{Link2Forum|Topic=56455|Message=800960}}
* {{Link2Forum|Topic=56455|Message=800960}}
* [https://blog.muwave.de/2017/06/monitoring-and-controlling-a-judo-i-soft-plus-water-softening-device-via-lan/ ursprünglicher Beitrag bzgl. des verwendeten Protokolls]
* [https://blog.muwave.de/2017/06/monitoring-and-controlling-a-judo-i-soft-plus-water-softening-device-via-lan/ ursprünglicher Beitrag bzgl. des verwendeten Protokolls]


[[Kategorie:IP Components]]
[[Kategorie:IP Components]]
[[Kategorie:Other Components]]
[[Kategorie:Other Components]]

Aktuelle Version vom 20. Januar 2022, 23:26 Uhr

JUDO iSoft Plus
JUDO i-soft plus Wasserenthärtungsanlage
Allgemein
Protokoll IP
Typ Wasserenthärter
Kategorie IP
Technische Details
Kommunikation n/a
Kanäle n/a
Betriebsspannung 230 V
Leistungsaufnahme ?
Versorgung AC
Abmessungen 39x67x45 cm (BxHxT)
Sonstiges
Modulname HTTPMOD
Hersteller JUDO GmbH

Die JUDO i-soft plus Enthärtungsanlage [1] ist eine Wasserenthärtungsanlage mit IP-Konnektivität. Sie verfügt über LAN- und WLAN-Anschluss und ist auf die Steuerung via App des Herstellers ausgelegt.

Geräte-Registrierung

Für eine erfolgreiche Integration in FHEM muss die Anlage über das Menü beim Hersteller registriert werden (wohl nur i-soft plus; z.B. i-soft safe kann das wohl nicht, schlechtere Display-Ausstattung - hier gilt dann [2] oder die Handy-Apps). Die folgenden Informationen sind erforderlich:

  • Benutzername: Selbst gewählter Login-Name auf der i-soft plus (vgl. Gerätehandbuch)
  • Kennwort: Selbst gewähltes Kennwort
  • Seriennummer: Seriennummer des Geräts. Diese ist entweder über das Menü auslesbar oder alternativ auch über die APP des Herstellers.
  • IP-Adresse: Die IP-Adresse des Geräts im Heimnetz.

Bei den Registrier-Prozessen ist zwingend zu beachten, dass es mehrere Labels mit QR-Codes / Gerätedaten geben kann (zumindest bei i-soft safe): auf den Gehäuse-Seiten und auf dem Connectivity Module - man sollte also tunlichst die richtige Referenz erwischen, sonst Fehlschlag! (Ich hatte mehrere Prozess-Probleme, somit in Beschwerdemail mehrere momentan existierende gravierende Registrier-Prozess-Impräzisionen angem***t, daraufhin INSTANTAN (8 Uhr) Rückruf durch Kundendienst! *daumenhoch*)

Bei Geräten neuerer Generation scheint es so zu sein, dass die Schnittstelle über Port 8124 nur den Login erlaubt, wenn bei der Geräteregistrierung die Datenschutzerklärung nicht akzeptiert wird. Falls also trotz korrekter Einstellungen "login failed" kommt, versuchen bei der Registrierung die Datenschutzeinstellungen zu ändern.

Einbindung in FHEM

Das Gerät wird mittels des Moduls HTTPMOD eingebunden. Dazu gilt zunächst die folgende Konfiguration als Basis. Zunächst legen wir die Standardanfrage an das Modul fest. Die Portnummer 8124 ist vom Hersteller vorgegeben. Wir vergeben gleich ein paar Platzhalter, die später in den Aufrufen und den Antworten ersetzt werden, damit wir die Werte nur an einer zentralen Stelle konfigurieren müssen.

define JUDO_iSoft HTTPMOD https://%JUDO_ipaddress%:8124/?group=waterstop&command=valve&msgnumber=4&token=%token% 300

Mit dieser Definition wird als Standard-Anfrage die Statusabfrage nach dem Wasserstop gesendet. Diese wird zyklisch alle 300 Sekunden wiederholt. Wem das nicht reicht, der kann den Zyklus herunter setzen oder auch nach anderen Standard-Werten abfragen. Wer das kontinuierliche Pollen vermeiden will, setzt den Wert auf 0.

Nach erfolgreicher Authentifizierung wird von der i-soft ein Token generiert, welches bei jedem Aufruf übergeben werden muss:

attr JUDO_iSoft replacement01Mode reading
attr JUDO_iSoft replacement01Regex %token%
attr JUDO_iSoft replacement01Value token

Anschließend legen wir die Ersetzungen für die anderen Platzhalter fest:

attr JUDO_iSoft replacement02Mode text
attr JUDO_iSoft replacement02Regex %JUDO_ipaddress%
attr JUDO_iSoft replacement02Value <hier eigene IP Adresse im lokalen Netz eintragen>
attr JUDO_iSoft replacement03Mode text
attr JUDO_iSoft replacement03Regex %JUDO_password%
attr JUDO_iSoft replacement03Value <hier Kennwort eintragen>
attr JUDO_iSoft replacement04Mode text
attr JUDO_iSoft replacement04Regex %JUDO_username%
attr JUDO_iSoft replacement04Value <hier Benutzername eintragen>
attr JUDO_iSoft replacement05Mode text
attr JUDO_iSoft replacement05Regex %JUDO_serial%
attr JUDO_iSoft replacement05Value <hier Seriennummer eintragen>

Die Authentifizierung der Anlage erfolgt zweistufig. Zunächst muss ein Aufruf mit Benutzername und Kennwort erfolgen. Als Antwort erhält man einen JSON-String, der das Token beinhaltet. Mit diesem Token wird anschließend die Funktion connect aufgerufen und die Seriennummer des Geräts mit übergeben. HTTPMOD erkennt, wenn ein neues Login erforderlich ist, wenn die JUDO die Rückmeldung "no token" oder "not logged in" liefert.

Achtung: Als Parameter muss ebenfalls der Typ "i-soft plus" übergeben werden. Vermutlich ist dieser bei anderen Geräten des Herstellers anders. Ich habe ihn hier fix eingetragen, da ich keine Möglichkeit zum Testen anderer Geräte habe.

attr JUDO_iSoft showError 1
attr JUDO_iSoft authRetries 2
attr JUDO_iSoft reAuthRegex (no token)|(not logged in)
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%&parameter=i-soft%20plus&serial%20number=%JUDO_serial%

Damit ist die Grundkonfiguration hergestellt und die Anlage kann sich connecten. In den einzelnen JSON-Rückantworten der Anlage werden die Werte zur jeweilige Anfrage immer als "data" zurückgeliefert. Mit der Standard-Konfiguration

attr JUDO_iSoft extractAllJSON 1

werden daraus automatisch entsprechende Readings angelegt. Da wir aber dann immer das Reading "data" überschreiben würden, kommt eine weitere Ersetzung zum Einsatz. In der Antwort steht neben einer Kaskadierung (group) auch der zugehörige Befehl (command). Ich habe mich dafür entschieden, ein neues Reading mit dem jeweiligen Command-Namen anzulegen. Die zugehörigen Ersetzungen sind wie folgt. Erklärung zum Ausdruck reading03OExpr: Zunächst werden die Leerzeichen im Rückgabewert ($val) durch "-" ersetzt. Mit dem so veränderten String erzeugen wir ein neues Reading mit dem Wert aus dem Reading data.

attr JUDO_iSoft reading01JSON data
attr JUDO_iSoft reading01Name token
attr JUDO_iSoft reading01Regex "token":"([^"]+)"
attr JUDO_iSoft reading02JSON group
attr JUDO_iSoft reading03JSON command
attr JUDO_iSoft reading03OExpr $val =~ s/\s/-/;; $val;; readingsBulkUpdate($hash,$val,ReadingsVal("JUDO_iSoft","data",""))

Noch ein paar ergänzende Attribute gesetzt:

attr JUDO_iSoft enableControlSet 1
attr JUDO_iSoft getHeader1 Content-Type: application/json
attr JUDO_iSoft getHeader2 Accept: */*
attr JUDO_iSoft room 10_Räume->UG->Keller,
attr JUDO_iSoft showError 1
attr JUDO_iSoft timeout 5

Damit sind alle Voraussetzungen erledigt. Ab jetzt können wir die einzelnen Get-Befehle implementieren:

attr JUDO_iSoft get01Name SerialNumber
attr JUDO_iSoft get01URL https://%JUDO_ipaddress%:8124/?group=spare%20part&command=serial%20number&msgnumber=5&token=%token%

attr JUDO_iSoft get02Name WaterCurrent
attr JUDO_iSoft get02URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20current&msgnumber=1&token=%token%

attr JUDO_iSoft get03Name SaltRange
attr JUDO_iSoft get03URL https://%JUDO_ipaddress%:8124/?group=consumption&command=salt%20range&msgnumber=1&token=%token%

attr JUDO_iSoft get04Name SaltQuantity
attr JUDO_iSoft get04URL https://%JUDO_ipaddress%:8124/?group=consumption&command=salt%20quantity&msgnumber=1&token=%token%

attr JUDO_iSoft get05Name ResidualHardness
attr JUDO_iSoft get05URL https://%JUDO_ipaddress%:8124/?group=settings&command=residual%20hardness&msgnumber=1&token=%token%

attr JUDO_iSoft get06Name NaturalHardness
attr JUDO_iSoft get06URL https://%JUDO_ipaddress%:8124/?group=info&command=natural%20hardness&msgnumber=1&token=%token%

attr JUDO_iSoft get07Name WaterStop
attr JUDO_iSoft get07URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=valve&msgnumber=1&token=%token%

attr JUDO_iSoft get08Name FlowRate
attr JUDO_iSoft get08URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=flow%20rate&msgnumber=1&token=%token%

attr JUDO_iSoft get09Name SoftwareVersion
attr JUDO_iSoft get09URL https://%JUDO_ipaddress%:8124/?group=version&command=software%20version&msgnumber=1&token=%token%

attr JUDO_iSoft get10Name HardwareVersion
attr JUDO_iSoft get10URL https://%JUDO_ipaddress%:8124/?group=version&command=hardware%20version&msgnumber=1&token=%token%

attr JUDO_iSoft get11Name InstallationDate
attr JUDO_iSoft get11URL https://%JUDO_ipaddress%:8124/?group=contract&command=init%20date&msgnumber=1&token=%token%

attr JUDO_iSoft get12Name ServiceDate
attr JUDO_iSoft get12URL https://%JUDO_ipaddress%:8124/?group=contract&command=service%20date&msgnumber=1&token=%token%

attr JUDO_iSoft get13Name WaterTotal
attr JUDO_iSoft get13URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20total&msgnumber=1&token=%token%

attr JUDO_iSoft get14Name WaterAverage
attr JUDO_iSoft get14URL https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20average&msgnumber=1&token=%token%

attr JUDO_iSoft get15Name Vacation
attr JUDO_iSoft get15URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=vacation&msgnumber=1&token=%token%

attr JUDO_iSoft get16Name Quantity
attr JUDO_iSoft get16URL https://%JUDO_ipaddress%:8124/?group=waterstop&command=quantity&msgnumber=1&token=%token%

attr JUDO_iSoft  get17Name  WaterDaily
attr JUDO_iSoft  get17URL   https://%JUDO_ipaddress%:8124/?group=consumption&command=water%20daily&msgnumber=1&token=%token%

attr JUDO_iSoft  get18Name  ValveState
attr JUDO_iSoft  get18URL   https://%JUDO_ipaddress%:8124/?group=waterstop&command=valve&msgnumber=4&&token=%token%

Zum Setzen einiger Werte werden die folgenden Kommandos zum Schließen und Öffnen des Wasserstopps sowie das Setzen der Wunschwasserhärte implementiert

attr JUDO_iSoft  set01Name  CloseValve
attr JUDO_iSoft  set01URL   https://%JUDO_ipaddress%:8124/?group=waterstop&command=valve&msgnumber=1&token=%token%&parameter=close
attr JUDO_iSoft  set02Name  OpenValve
attr JUDO_iSoft  set02URL   https://%JUDO_ipaddress%:8124/?group=waterstop&command=valve&msgnumber=1&token=%token%&parameter=open
attr JUDO_iSoft  set03Name  residual-hardness
attr JUDO_iSoft  set03URL   https://%JUDO_ipaddress%:8124/?group=settings&command=residual%20hardness&msgnumber=1&token=%token%&parameter=$val


Userreadings

Um die Originalwerte aus der Anlage benutzerfreundlicher darzustellen, werden noch Userreadings angelegt.

Die Salzrestdauer soll in Wochen angegeben (rückgemeldet werden Tage) werden, die verbleibende Salzmenge in Prozent. Die Salzmenge wird in Gramm angegeben, 50.000 entsprechen 100%. Wichtig: Bei den Userreadings muss darauf geachtet werden, dass diese mit Komma separiert und in einer Zeile geschrieben werden.


attr JUDO_iSoft saltRangeInWeeks { int( (ReadingsVal("JUDO_iSoft","salt-range",0)/7))} , saltQuantityInPercent { int( (ReadingsVal("JUDO_iSoft","salt-quantity",0)/50000)*100)}

Readings auslesen

Die Art der Anbindung liefert veränderte Readings nur, wenn man sie regelmäßig abfragt. Dazu habe ich dazu einen Timer aufgesetzt, der 1x am Tag die relevanten Werte abfragt. Das ist eigentlich nur wichtig, falls man ab und an doch noch über einen anderen Weg z.B. die Apps des Herstellers auf die JUDO zugreift und Werte verändert. Bei mir sieht das dann so aus:

Internals:
   COMMAND    get JUDO_iSoft SaltQuantity;
              get JUDO_iSoft SaltRange;
              get JUDO_iSoft WaterDaily;
              get JUDO_iSoft WaterTotal;
              get JUDO_iSoft WaterAverage;
              get JUDO_iSoft FlowRate;
              get JUDO_iSoft ResidualHardness;

   DEF        *23:55:00 
              get JUDO_iSoft SaltQuantity;
              get JUDO_iSoft SaltRange;
              get JUDO_iSoft WaterDaily;
              get JUDO_iSoft WaterTotal;
              get JUDO_iSoft WaterAverage;
              get JUDO_iSoft FlowRate;
              get JUDO_iSoft ResidualHardness;
 NAME       at_Judo_DailyStats
   NR         1595
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 23:55:00
   TIMESPEC   23:55:00
   TRIGGERTIME 1538862900
   TRIGGERTIME_FMT 2018-10-06 23:55:00
   TYPE       at
   READINGS:
     2018-10-06 06:06:14   state           Next: 23:55:00
Attributes:
   room       ,00_Masterswitches,10_Räume->UG->Keller

Um 1x pro Stunde gegen Ende der vollen Stunde den Wasserbrauch der aktuellen Stunde abzugreifen, setze ich einen weiteren Timer auf. Bei mir jeweils um :58 der aktuellen Stunde. Das ist natürlich nicht ganz exakt. Wenn die Uhr der JUDO und von FHEM auseinander driften bekommt man ggf. schon wieder den Wert der nächsten Stunde.

Internals:
   CFGFN      
   COMMAND    get JUDO_iSoft WaterCurrent
   DEF        +*01:00:00 get JUDO_iSoft WaterCurrent
   NAME       at_Judo_HourlyStats
   NR         34559
   NTM        06:58:00
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 06:58:00
   TIMESPEC   01:00:00
   TRIGGERTIME 1538801880
   TRIGGERTIME_FMT 2018-10-06 06:58:00
   TYPE       at
   READINGS:
     2018-10-06 06:20:53   state           Next: 06:58:00
Attributes:
   alignTime  00:58
   room       ,00_Masterswitches,10_Räume->UG->Keller

Statistiken

Die i-soft plus liefert verschiedene Statistiken zum Wasserverbrauch zurück. Die werden allerdings etwas eigentümlich zurückgemeldet. Unter water-current ist der jeweilige Verbrauch je Stunde zusammengefasst. Ich hole kurz vor der vollen Stunde diesen Wert ab, damit er danach im Logfile landet. Unter water-daily werden Tagesstatistiken geliefert. Kurioserweise in 3-Stunden-Paketen, d.h. 8 Werte. Die ersten Werte sind von 0h-3h, 3h-6h usw. Ich habe mich aktuell darauf beschränkt, den stündlichen Verbrauch zu erfassen und zu protokollieren. Es lassen sich aber auch bei Bedarf detaillierte Datumsbezogene Statistiken abrufen. Ich habe noch keinen sinnvollen Weg gefunden, das mit FHEM zu verbinden.


Darstellung in Tablet UI

Ich nutze Tablet UI für die Visualisierung. Zur Darstellung der Restmengen Salz nutze ich das knob-widget, für das Setzen des Härtegrades den spinner.

Visualisierung der JUDO im TabletUI
<div class="hbox">

<div class="vbox phone-width">
    <div class="card lift">
        <header>Zustand Salz</header>
            <div class="sheet">
                
                <div class="row">
                    <div class="cell-50 top-align center-align left-space">
                        <div class="big">Restmenge</div>
                            <div data-type="knob" data-device="JUDO_iSoft"
                                        data-get="saltQuantityInPercent"
                                        data-unit="%"
                                        data-step="1"
                                        data-min="0"
                                        data-max="100"
                                        data-bgcolor="#FF0000"
                                        data-fgcolor="#00FF1A"
                                        class="small  readonly">
                            </div>

    
                    </div>
                    <div class="cell-50 top-align center-align left-space">
                        <div class="big">Reichweite</div>

                            <div data-type="knob" data-device="JUDO_iSoft"
                                        data-get="saltRangeInWeeks"
                                        data-unit="w"
                                        data-step="1"
                                        data-min="0"
                                        data-max="52"
                                        data-bgcolor="#FF0000"
                                        data-fgcolor="#00FF1A"
                                        class="small readonly">
                            </div>
    
                    </div>
                </div>
            </div>
    </div>
</div>
<div class="vbox phone-width">
<div class="card lift">
    <header>Wasserstopp</header>
        <div class="sheet">  
            <div class="row top-space">
        
                <div class="cell left-align top-align left-space">
                    <div data-type="symbol" data-device="JUDO_iSoft" data-get="valve"
                        data-icons='["fa-close","fa-close","oa-sani_water_tap","oa-sani_water_tap"]'
                        data-get-on='["closed","closing","opening","opened"]'
                        data-on-colors='["#ad3333","#ff6633","#3399ff","#33ad33"]' class="big compressed"></div>
                </div>
                <div class="cell-60 top-align center-align">
                    <div class="big">
                        
                              <div data-type="label"
                                  data-get="valve"
                                  class="valueonly"
                                  data-substitution='["opened","geöffnet","opening","öffnet gerade","closed","geschlossen","closing","schließt gerade"]'
                                  data-device="JUDO_iSoft"
                                  data-color="lightgrey">
                            </div>
                    </div>
                    
                </div>
    
                <div class="cell left-align top-align left-space">
                    <div data-type="push" data-device="JUDO_iSoft" data-set-on="CloseValve 1" data-get-on="valve" data-background-icon="fa-stop-circle-o" data-icon="" class="small"></div>
                
                </div>
                <div class="cell right-align top-align right-space">
        
                    <div data-type="push" data-device="JUDO_iSoft" data-set-on="OpenValve 1" data-get-on="valve" data-background-icon="mi-play_circle_filled" data-icon="" class="small"></div>								
                </div>
            </div>
        </div>
</div>
</div>


        
        
        
        
        

<div class="vbox phone-width">
    <div class="card lift">
        <header>Wasserhärtegrad</header>

        <div class="sheet">
                <div class="row">	
                
                <div class="cell-20 center-align top-align left-space">
                    <div data-type="symbol"
                          data-device="JUDO_iSoft"
                          data-icon="none"
                          data-color='none'
                          data-height="100"
                          data-background-icon="fa-circle"
                          data-background-colors='["red","blue"]'
                          data-limits='["0","1"]'>
                          <div data-type="label"
                                  data-get="natural-hardness"
                                  data-unit="°h"
                                  class="valueonly"
                                  data-device="JUDO_iSoft"
                                  data-color="lightgrey">
                          </div>
                    </div>
                </div>
            
                <div class="cell-20 top-align center-align left-space">
                        <div data-type="image"  data-size="50%" data-url="images/judo.png"></div>
                </div>
                        
                <div class="cell-60 top-align center-align left-space">
            
                    <div data-type="spinner"
                        data-device="JUDO_iSoft"
                        data-get="residual-hardness"
                        data-set="residual-hardness"
                        data-min=5"
                        data-max="12"
                        data-step="1"
                        data-unit="°h"
                        data-longdelay="800"
                        data-width="200"
                        data-height="60"
                        data-icon-left-color="blue"
                        data-icon-right-color="red"
            
                        class="valueonly">
                        
                    </div>
                </div>
            </div>
        </div>
    </div>

</div>

<div class="vbox phone-width">
<div class="card lift">
        <header>Wasserverbrauch</header>
        <section> 
            <div id="JUDO_iSoft"
                  data-type="highchart"
                  data-device="JUDO_iSoft"
                  data-logdevice="FileLog_JUDO_ISoft"
                  data-columnspec="4:water-current"
                  data-style="ftui l0fill"
                  data-linenames="Verbrauch"
                  data-linetypes="line"
                  data-yaxis="0,1"
                  data-height="300"
                  data-xunit="Uhrzeit"
                  data-yunit="l"
                  data-tooltip="{series.name} <b>{point.y:,.1f}</b>"
                  data-daysago="7"
                  data-yticks="auto"
                  data-legendalign="right">

            </section>

    </div
</div>
</div>

Problemlösung

DHCP (keine IP-Adress-Zuweisung)

Ich hatte bei der Inbetriebnahme erstaunliche Probleme, erfolgreich eine IP-Adresse zu bekommen. Das hat bei mir nur einmal initial funktioniert (und die Verbindung hab ich dann verloren), und dann "nie wieder".

Diagnose z.B. per DHCP-Status-Seite im Router (verbundene Geräte).

Es hat bei mir NICHT geholfen, das Netzwerk-Kabel abzuziehen (--> link state change == Wink mit dem Zaunpfahl, dass es erneuert werden sollte), und auch NICHT, das i-soft stromlos zu machen.

Erst nach Entfernen aller Backup-9V-Blocks und stromlos machen (--> jetzt waren alle Status-LEDs des Connectivity Module erfolgreich aus!) hat er sich endlich wieder eine IP geholt.

Weitere Diagnose-Möglichkeiten:

  • anderes Netzwerkkabel verwenden
  • Netzwerkkabel mit Kabel-Tester durchklingeln (z.B. COMMUNICATION CABLE TESTER S1007)

Bitte hier weiter updaten, falls klarer wird, wie der Sachverhalt ist.

Salzbehälter

Der Salzbehälter kann an der Boden-Platten-Naht undicht sein (vermutlich seltener Fall; jedenfalls möglich bei Systemen ~ <= 08/2019, danach hoffentlich besser), somit Leckage, mit daraus folgenden schwerwiegenden Problemen (mglw. Versalzung der - evt. auch etwas weiteren: Luftströmungen! - Umgebung; hygroskopisch / kapillar - AUA! Salpeter-Reiniger scheint eine ziemlich gute Behandlung zu sein). Wenn man auf ganz sicher gehen will hinsichtlich Leckage-Vermeidung, dann ist es wohl empfehlenswert, Entkalker-Systeme in eine Wanne zu stellen, z.B. Baumarkt-Mörtelkübel (80l? 90l?).

Der Behälterrand an der Oberkante hat zu scharfen Rand / ist nicht entgratet (Kunststoff-Spritzform?) --> Pulli-Ärmel-Killer --> aufpassen.

Ähnliche Systeme

JUDO iSoft Safe

Auch auf der IP Adresse der iSoft Safe im lokalen Netzwerk bekommt man eine Übersichtsseite mit einigen Daten, die besten Ergebnisse hatte ich allerdings, als ich Requests an #myJudo [[3]] geschickt habe. Ich habe hier nur die Änderungen zur Anleitung der JUDO iSoft Plus notiert.

Das Grundkonzept ist hier sehr ähnlich. Die Adresse ist allerdings nicht lokal. Ein weiterer Unterschied ist, dass das Passwort als Hash(MD5) des Passwortes erwartet wird.

 
attr JUDO_iSoft reAuthRegex (error)|(login failed)
attr JUDO_iSoft replacement02Value www.myjudo.eu
attr JUDO_iSoft replacement03Regex %JUDO_password%
attr JUDO_iSoft replacement03Value <hier MD5 geHashtes Kennwort eintragen>
attr JUDO_iSoft replacement05Regex %JUDO_serial%
attr JUDO_iSoft replacement05Value <hier Seriennummer (MAC Adresse) eintragen>

Der Login ist nur einstufig:

attr JUDO_iSoft sid01URL https://%JUDO_ipaddress%/interface/?group=register&command=login&name=login&user=%JUDO_username%&password=%JUDO_password%&nohash=Service&role=customer

Die URL um eine JSON File mit im Prinzip allen wichtigen Informationen zu bekommen habe ich so definiert. Der Request liefert ein JSON mit vermutlich allen registrierten Geräten zurück die über die "serialnumber" (MAC Adresse) identifiziert werden können. Ich habe leider nur ein Gerät und kann das daher nicht mit Sicherheit verifizieren.

 
attr JUDO_iSoft get01JSON data
attr JUDO_iSoft get01Name DeviceData
attr JUDO_iSoft get01URL https:///%JUDO_ipaddress%/interface/?token=%token%&group=register&command=get%20device%20data

Da ich auf dem JSON / FHEM Gebiet noch wenig Erfahrung habe, habe ich keinen extra Konvertierer gebaut. Das JSON File wird vom HTTPMOD Modul automatisch angelegt und ich konnte mir über UserReadings die Informationen herauslesen (sie werden "verschlüsselt" im JSON abgelegt daher die seltsamen Abfragen). Hier einige Beispiele:

waterTotal { ( hex ( substr(ReadingsVal("JUDO_iSoft","DeviceData-41", ''), 6, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-41", ''), 4, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-41", ''), 2, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-41", ''), 0, 2)) / 1000 ). ' m³'},
waterProcessed { ( hex ( substr(ReadingsVal("JUDO_iSoft","DeviceData-53", ''), 6, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-53", ''), 4, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-53", ''), 2, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-53", ''), 0, 2)) / 1000 ). ' m³'},
saltLevel { ( hex ( substr(ReadingsVal("JUDO_iSoft","DeviceData-50", ''), 2, 2).substr(ReadingsVal("JUDO_iSoft","data_01_data_01_data_94_data", ''), 0, 2))  ). ' g'},
saltRange { hex ( substr(ReadingsVal("JUDO_iSoft","DeviceData-50", ''), 6, 2).substr(ReadingsVal("JUDO_iSoft","DeviceData-50", ''), 4, 2)). " Tage" }

Es gibt auch die Möglichkeit, den Tagesverbrauch in 3h Paketen zu ermitteln - dazu müsste man folgendes definieren User Reading:

date {(strftime '%d%m%Y', localtime)},

und folgende Attribute:

attr JUDO_iSoft replacement05Mode reading
attr JUDO_iSoft	replacement05Regex %date%
attr JUDO_iSoft replacement05Value date
attr JUDO_iSoft get02JSON data
attr JUDO_iSoft get02Name WaterConsumptionDay
attr JUDO_iSoft get02URL https://%JUDO_ipaddress%/interface/?token=%token%&group=register&command=get_chart_data&serialnumber=%JUDO_serial%date=%date%&parameter=day

Hier bekommt man eine Zeile zurück wobei immer 8 Zeichen zusammen die LiterZahl (als Hex) bilden. Zeichen 0-8 - Verbrauch von 0-3 Uhr Zeichen 9-16 - Verbrauch von 3-6 Uhr usw.

Projekte der FHEM-Community

[isoft Plus - Eine andere Definition]

Links