Ankündigung

Einklappen
Keine Ankündigung bisher.

Neues Binding? Judo Entkalkungsanlage I Soft Plus

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Neues Binding? Judo Entkalkungsanlage I Soft Plus

    Es gibt von der Firma Judo einen Entkalkungsanlage mit Smarthomeanschluss. Eigentlich gibt es nur eine KNX Schnittstelle, aber ein findiger Blogger (Mario "µ" Mueh) hat eine Schnittstelle herausgefunden, wie man lokal von seiner Entkalkungsanlage die Werte (Wasserhärte, Wasserverbrauch, Salzmenge, Wasserstop etc.) abfragen kann.

    Das alles hat er in seinem Blog https://blog.muwave.de/2017/06/monitoring-and-controlling-a-judo-i-soft-plus-water-softening-device-via-lan/ beschrieben.

    In Kurzform man muss die IP der Entkalkungsanlage, Benutzname, Passwort und Gerätnummer haben, bekommt dafür bei einer Abfrage einen Token, mit dem man die Werte abfragen kann. Die Abfrage erfolgt durch https requests die Antworten sind wohl JSON.

    Beispiel für die Abfrage der Salzmenge:

    Code:
    https://192.168.178.99:8124/?group=consumption&command=salt%20range&msgnumber=1&token=c3e1586db92317a075a1625xxxxxxxxxxxxxxxxxx1ab63fa6f3d930aeb
    Beispiel für die Antwort der Salzmenge:

    Code:
    {"command":"salt range"[I],"data":"[B]113[/B]"[/I],"group":"consumption","msgnumber":"1","status":"o k","token":"c3e1586db92317a075a1625xxxxxxxxxxxxxxx xxx1ab63fa6f3d930aeb","wtuType":"i-soft plus","serial number":"XXXXXXX","tftStarted":1538078234695}
    Kann man mit diesen Voraussetzungen ein Binding erstellen, wenn ja, ist das schwierig? Was bräuchte man noch für Informationen für die Bindingerstellung? Ich bin leider eine programmiertechnische Null. Ich könnte aber gerne Tipäffchenarbeit übernehmen.
    Zuletzt geändert von Zippochonda; 28.09.2018, 10:50.

    #2
    Du kannst dafür einfach das Http Binding nehmen:
    https://www.openhab.org/addons/bindi...-configuration

    Kommentar


      #3
      Zitat von crazyfx Beitrag anzeigen
      Du kannst dafür einfach das Http Binding nehmen:
      https://www.openhab.org/addons/bindi...-configuration
      Hi,
      vielleicht gibst du mir noch einen Hinweis wie ich das bei einer HTTPS Verbindung hinkriege. Das hinterlegt Zertifikat ist wohl abgelaufen ich bekomme immer folgende Fehlermeldung
      Code:
       
             2018-10-03 20:21:11.757 [COLOR=red][ERROR][/COLOR] [ab.binding.http.internal.HttpBinding] - No response received from 'https://192.168.178.28:8124/?group=register&command=login&msgnumber=1&name=login&user=XXXXX&password=XXXXX&role=customer'
       
      2018-10-03 20:22:12.248 [COLOR=red][ERROR][/COLOR] [org.openhab.io.net.http.HttpUtil ] - Fatal transport error: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
      Im Browser funktioniert es, ich muss aber eine Ausnahme hinzufügen, da die Verbindung nicht sicher ist.

      Kommentar


        #4
        Ohne https funktioniert es nicht?
        Dann musst du wohl das Zertifikat runterladen und in den Java Keystore von deinem OpenHab Server installieren.

        Hier hat es schon jemand gemacht, evtl bringst du es hin:
        https://community.openhab.org/t/http...-https/21430/9

        Kommentar


          #5
          Zitat von crazyfx Beitrag anzeigen
          Ohne https funktioniert es nicht?
          Dann musst du wohl das Zertifikat runterladen und in den Java Keystore von deinem OpenHab Server installieren.

          Hier hat es schon jemand gemacht, evtl bringst du es hin:
          https://community.openhab.org/t/http...-https/21430/9
          Cool, ja hat geklappt...
          Eine Anschlussfrage habe ich dann noch, ich muss das erhaltene Token in allen Abfragen einsetzen. Leider ändert sich das Token immer wieder, das bedeutet ich müsste in dem Link für die Http-Abfrage eine Variable einsetzen. Das Token habe ich als HTTPBinding Item (String) durch deine Hilfe jetzt abfragen können. Geht das?

          Code:
          String JudoLogin  { http="<[https://192.168.178.28:8124?group=register&command=connect&msgnumber=5&token=[MARKIEREN]Judotoken[/MARKIEREN]&parameter=i-soft%20plus&serial%20number=serial:600000:JSONPATH($.data)]" }

          Kommentar


            #6
            Da weiß ich jetzt nicht, ob das direkt in der Item Definition geht.

            Ich würde dazu eine Rule schreiben, die regelmässig aufgerufen wird. In der Rule kannst du dir dann den Wert von dem Token holen (Judotoken.state). Diesen Token kannst du dann verwenden um mit sendHttpGetRequest dann die eigentliche Http Abfrage für die Werte zu machen. Dann mit postUpdate dein Ergebnisitem aktualisieren.

            Vielleicht weiß jemand anders, ob das direkt im Item geht. Ich bin kein openhab Profi, mein Haus wird gerade erst gebaut, somit habe ich noch keine Praxis

            Kommentar


              #7
              Nein, im Item (genauer: in der http-Binding Konfiguration) gibt es keine Möglichkeit, Variablen einzusetzen.
              Letztlich schreit das Ganze nach einem eigenen Binding, welches diese Arbeiten erledigt Aber bis dahin ist es vermutlich das Einfachste, die Abfrage manuell in einer Rule vorzunehmen oder alternativ ein externes Script dafür einzusetzen, welches dann per Exec Binding an openHAB gekoppelt ist.

              Kommentar


                #8
                Ich habe es jetzt mit einer Rule umgesetzt, die ich derzeit noch manuell trigger. Das klappt auch, aber damit es nicht langeweilig wird werden bestimmte Punkte, wie Wasser Total oder Wochenverbrauch in einem Feld ausgegeben. Das bedeutet das in dem JSON Data Feld, dann mehrere Zahlen auftauchen die durch Leerzeichen getrennt sind. Kann ich die irgendwie aufsplitten?

                Bsp.: Wasser total: 111667 76241

                JSON sieht so aus
                Code:
                 {"command":"water total",[MARKIEREN][B]"data":" 111667 76241",[/B][/MARKIEREN]"group":"consumption","msgnumber":"1","status":"ok","token":"fXXXX8","wtuType":"i-soft plus","serial number":"XXXXX","tftStarted":1538078234695}
                Die Rule sieht derzeit so aus:
                Code:
                val String BENUTZER= "XXXXX"
                val String PASSWORD= "XXXXXX"
                val String GERAETEID= "XXXXXX"
                val String JUDOIP= "192.168.178.28"
                val String PORT= "8124"
                
                
                
                
                rule "Judo"
                when
                  Item JUDOSCHALTER changed
                
                then
                
                var String tokenjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=register&command=login&msgnumber=2&name=login&user=" + BENUTZER + "&password=" + PASSWORD + "&role=customer")
                var String TOKEN = transform("JSONPATH", "$.token", tokenjson)
                var String loginjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=register&command=connect&msgnumber=5&token=" + TOKEN + "&parameter=i-soft%20plus&serial%20number=" + GERAETEID)
                var String LOGINSTATUS = transform("JSONPATH", "$.status", loginjson)
                
                if (LOGINSTATUS == "ok")
                {
                logInfo("Judo","Login erfolgreich")
                JUDOTEST.postUpdate(LOGINSTATUS)
                
                var String wcjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=water%20current&msgnumber=1&token=" + TOKEN )
                var String var_water_current = transform("JSONPATH", "$.data", wcjson)
                water_current.postUpdate(var_water_current)
                
                var String wtjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=water%20total&msgnumber=1&token=" + TOKEN )
                var String var_water_total = transform("JSONPATH", "$.data", wtjson)
                water_total.postUpdate(var_water_total)
                
                var String wajson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=water%20average&msgnumber=1&token=" + TOKEN )
                var String var_water_average = transform("JSONPATH", "$.data", wajson)
                water_average.postUpdate(var_water_average)
                
                var String aqjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=actual%20quantity&msgnumber=1&token=" + TOKEN )
                var String var_actual_quantity = transform("JSONPATH", "$.data", aqjson)
                actual_quantity.postUpdate(var_actual_quantity)
                
                var String sqjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=salt%20quantity&msgnumber=1&token=" + TOKEN )
                var String var_salt_quantity = transform("JSONPATH", "$.data", sqjson)
                salt_quantity.postUpdate(var_salt_quantity)
                
                var String srjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=salt%20range&msgnumber=1&token=" + TOKEN )
                var String var_salt_range = transform("JSONPATH", "$.data", srjson)
                salt_range.postUpdate(var_salt_range)
                
                var String rhjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=settings&command=residual%20hardness&msgnumber=1&token=" + TOKEN )
                var String var_residual_hardness = transform("JSONPATH", "$.data", rhjson)
                residual_hardness.postUpdate(var_residual_hardness)
                
                var String nhjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=settings&command=residual%20hardness&msgnumber=1&token=" + TOKEN )
                var String var_natural_hardness = transform("JSONPATH", "$.data", nhjson)
                natural_hardness.postUpdate(var_natural_hardness)
                
                var String vajson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=waterstop&command=valve&msgnumber=1&token=" + TOKEN )
                var String var_valve = transform("JSONPATH", "$.data", vajson)
                valve.postUpdate(var_valve)
                
                }
                end
                Zuletzt geändert von Zippochonda; 04.10.2018, 12:31.

                Kommentar


                  #9
                  Vermutlich suchst Du die Methode split:
                  Code:
                  var String MyString = "123456 7890123"
                  val Number firstNumber = Float::parseFloat(MyString.split(" ").get(0))
                  val Number secondNumber = Float::parseFloat(MyString.split(" ").get(1))

                  Kommentar


                    #10
                    Ein derartiges Binding SOLLTE machbar sein. Am Beispiel des Tankerkönig Binding könnte man sich langhangeln, dort wird auch eine https Anfrage genutzt.
                    Ohne die Hardware zum Testen wird es eher schwierig sein das Binding zu erstellen.

                    Kommentar


                      #11
                      So habe es mir als Rule umgesetzt, vielen Dank für die Unterstützung. Falls noch jemand die Entkalkungsanlage besitzt kann er ja vielleicht etwas mit meiner Lösung anfangen.

                      Judo.rule
                      Code:
                      val String BENUTZER= xxxxx"
                      val String PASSWORD= "xxxxxx"
                      val String GERAETEID= "xxxxxx"
                      val String JUDOIP= "192.168.178.xx"
                      val String PORT= "8124"
                      
                      rule "Judo"
                      when
                            Item residual_hardness_setpoint changed or
                            Item watervalveswitch changed or
                          Time is midnight or
                          Time is noon
                      
                      then
                      
                          var String tokenjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=register&command=login&msgnumber=2&name=login&user=" + BENUTZER + "&password=" + PASSWORD + "&role=customer")
                          var String TOKEN = transform("JSONPATH", "$.token", tokenjson)
                          var String loginjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=register&command=connect&msgnumber=5&token=" + TOKEN + "&parameter=i-soft%20plus&serial%20number=" + GERAETEID)
                          var String LOGINSTATUS = transform("JSONPATH", "$.status", loginjson)
                      
                          if (LOGINSTATUS == "ok")
                          {
                              logInfo("Judo","Login erfolgreich")
                      
                              var String wcjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=water%20current&msgnumber=1&token=" + TOKEN )
                              var String var_water_current = transform("JSONPATH", "$.data", wcjson)
                              water_current.postUpdate(var_water_current)
                      
                              var String wtjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=water%20total&msgnumber=1&token=" + TOKEN )
                              var String var_water_total = transform("JSONPATH", "$.data", wtjson)
                              var Number var_rawwater = Float::parseFloat(var_water_total.split(" ").get(1))
                              var Number var_decarbonatedwater = Float::parseFloat(var_water_total.split(" ").get(2))
                              water_total.postUpdate(var_water_total)
                              rawwater.postUpdate(var_rawwater)
                              decarbonatedwater.postUpdate(var_decarbonatedwater)
                      
                              var String wajson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=water%20average&msgnumber=1&token=" + TOKEN )
                              var String var_water_average = transform("JSONPATH", "$.data", wajson)
                              water_average.postUpdate(var_water_average)
                      
                              var String aqjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=actual%20quantity&msgnumber=1&token=" + TOKEN )
                              var String var_actual_quantity = transform("JSONPATH", "$.data", aqjson)
                              actual_quantity.postUpdate(var_actual_quantity)
                      
                              var String sqjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=salt%20quantity&msgnumber=1&token=" + TOKEN )
                              var String var_salt_quantity = transform("JSONPATH", "$.data", sqjson)
                              salt_quantity.postUpdate(var_salt_quantity)
                      
                              var String srjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=salt%20range&msgnumber=1&token=" + TOKEN )
                              var String var_salt_range = transform("JSONPATH", "$.data", srjson)
                              salt_range.postUpdate(var_salt_range)
                      
                              var String rhjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=settings&command=residual%20hardness&msgnumber=1&token=" + TOKEN )
                              var String var_residual_hardness = transform("JSONPATH", "$.data", rhjson)
                              residual_hardness.postUpdate(var_residual_hardness)
                      
                              var String nhjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=settings&command=residual%20hardness&msgnumber=1&token=" + TOKEN )
                              var String var_natural_hardness = transform("JSONPATH", "$.data", nhjson)
                              natural_hardness.postUpdate(var_natural_hardness)
                      
                              var String vajson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=waterstop&command=valve&msgnumber=1&token=" + TOKEN )
                              var String var_valve = transform("JSONPATH", "$.data", vajson)
                              valve.postUpdate(var_valve)
                      
                              var String wwjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=water%20weekly&msgnumber=1&token=" + TOKEN + "&year=%3CYEAR%3E&month=%3CMONTH%3E&day=%3CDAY%3E")
                              var String var_water_weekly = transform("JSONPATH", "$.data", wwjson)
                              var Number var_mon = Float::parseFloat(var_water_weekly.split(" ").get(1))
                              var Number var_tue = Float::parseFloat(var_water_weekly.split(" ").get(2))
                              var Number var_wed = Float::parseFloat(var_water_weekly.split(" ").get(3))
                              var Number var_thu = Float::parseFloat(var_water_weekly.split(" ").get(4))
                              var Number var_fri = Float::parseFloat(var_water_weekly.split(" ").get(5))
                              var Number var_sat = Float::parseFloat(var_water_weekly.split(" ").get(6))
                              var Number var_sun = Float::parseFloat(var_water_weekly.split(" ").get(7))
                              water_weekly.postUpdate(var_water_weekly)
                              watermon.postUpdate(var_mon)
                              watertue.postUpdate(var_tue)
                              waterwed.postUpdate(var_wed)
                              waterthu.postUpdate(var_thu)
                              waterfri.postUpdate(var_fri)
                              watersat.postUpdate(var_sat)
                              watersun.postUpdate(var_sun)
                      
                      
                              var String wyjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=consumption&command=water%20yearly&msgnumber=1&token=" + TOKEN + "&year=%3CYEAR%3E")
                              var String var_water_yearly = transform("JSONPATH", "$.data", wyjson)
                              var Number var_jan = Float::parseFloat(var_water_yearly.split(" ").get(1))
                              var Number var_feb = Float::parseFloat(var_water_yearly.split(" ").get(2))
                              var Number var_mar = Float::parseFloat(var_water_yearly.split(" ").get(3))
                              var Number var_apr = Float::parseFloat(var_water_yearly.split(" ").get(4))
                              var Number var_mai = Float::parseFloat(var_water_yearly.split(" ").get(5))
                              var Number var_jun = Float::parseFloat(var_water_yearly.split(" ").get(6))
                              var Number var_jul = Float::parseFloat(var_water_yearly.split(" ").get(7))
                              var Number var_aug = Float::parseFloat(var_water_yearly.split(" ").get(8))
                              var Number var_sep = Float::parseFloat(var_water_yearly.split(" ").get(9))
                              var Number var_okt = Float::parseFloat(var_water_yearly.split(" ").get(10))
                              var Number var_nov = Float::parseFloat(var_water_yearly.split(" ").get(11))
                              var Number var_dez = Float::parseFloat(var_water_yearly.split(" ").get(12))
                      
                              water_yearly.postUpdate(var_water_yearly)
                              waterjan.postUpdate(var_jan)
                              waterfeb.postUpdate(var_feb)
                              watermar.postUpdate(var_mar)
                              waterapr.postUpdate(var_apr)
                              watermai.postUpdate(var_mai)
                              waterjun.postUpdate(var_jun)
                              waterjul.postUpdate(var_jul)
                              wateraug.postUpdate(var_aug)
                              watersep.postUpdate(var_sep)
                              waterokt.postUpdate(var_okt)
                              waternov.postUpdate(var_nov)
                              waterdez.postUpdate(var_dez)
                      
                              if (residual_hardness_setpoint.state != residual_hardness)
                                  {
                                  var String rhsjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=settings&command=residual%20hardness&msgnumber=1&token=" + TOKEN + "&parameter=" + residual_hardness_setpoint.state )
                                  var String var_residual_hardness_status = transform("JSONPATH", "$.status", rhsjson)
                                  if ( var_residual_hardness_status == "ok")
                                      {
                                      var String var_residual_hardness_setpoint = transform("JSONPATH", "$.parameter", rhsjson)
                                      residual_hardness.postUpdate(var_residual_hardness_setpoint)
                                      residual_hardness_setpoint.postUpdate(var_residual_hardness_setpoint)
                                      }
                                  }
                      
                      
                              if (watervalveswitch.state == ON && valve.state.toString.contains("opened"))
                                  {
                                  var String vsjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=waterstop&command=valve&msgnumber=1&token=" + TOKEN + "&parameter=close")
                                  logInfo("Judo","Wassersperrventil GESCHLOSSEN")
                                  }
                      
                      
                              if (watervalveswitch.state == OFF && valve.state.toString.contains("closed"))
                                  {
                                  var String vsjson = sendHttpGetRequest("https://"+ JUDOIP +":" + PORT + "?group=waterstop&command=valve&msgnumber=1&token=" + TOKEN + "&parameter=open")
                                  logInfo("Judo","Wassersperrventil OFFEN")
                                  }
                      
                              }
                      end
                      Judo.items
                      Code:
                      Number residual_hardness_setpoint
                      
                      Switch watervalveswitch     "Wassersperrventil (normal AUS)"
                      
                      String water_current         "Wasserverbrauch aktuell"
                      String water_total        "Wasser gesamt"
                      String water_average        "Durchschnittlicher Wasserverbrauch [%1$s l]"
                      String actual_quantity        "aktueller Verbrauch"
                      String salt_quantity        "Salzmenge [%1$s g]"
                      String salt_range        "Salzreichweite [%1$s Tage]"
                      String residual_hardness    "eingestellte Härte [%1$s °d]"
                      String natural_hardness        "Natürliche Härte [%1$s °d]"
                      String valve            "Wasserstopventilstatus"    
                      Number rawwater            "verbrauchtes Rohwasser [%1$s l]"
                      Number decarbonatedwater    "verbrauchtes entkalktes Wasser [%1$s l]"
                      
                      //Wasserwochenverbrauch
                      String water_weekly
                      Number watermon            "Wasserverbrauch Montag [%1$s l]"
                      Number watertue            "Wasserverbrauch Dienstag [%1$s l]"
                      Number waterwed            "Wasserverbrauch Mittwoch [%1$s l]"
                      Number waterthu            "Wasserverbrauch Donnerstag [%1$s l]"
                      Number waterfri            "Wasserverbrauch Freitag [%1$s l]"
                      Number watersat            "Wasserverbrauch Samstag [%1$s l]"
                      Number watersun            "Wasserverbrauch Sonntag [%1$s l]"
                      
                      //Wasserjahresverbrauch
                      String water_yearly
                      Number waterjan            "Wasserverbrauch Januar [%1$s l]"
                      Number waterfeb            "Wasserverbrauch Februar [%1$s l]"
                      Number watermar            "Wasserverbrauch März [%1$s l]"
                      Number waterapr            "Wasserverbrauch April [%1$s l]"
                      Number watermai            "Wasserverbrauch Mai [%1$s l]"
                      Number waterjun            "Wasserverbrauch Juni [%1$s l]"
                      Number waterjul            "Wasserverbrauch Juli [%1$s l]"
                      Number wateraug            "Wasserverbrauch August [%1$s l]"
                      Number watersep            "Wasserverbrauch September [%1$s l]"
                      Number waterokt            "Wasserverbrauch Oktober [%1$s l]"
                      Number waternov            "Wasserverbrauch November [%1$s l]"
                      Number waterdez            "Wasserverbrauch Dezember  [%1$s l]"

                      Kommentar


                        #12
                        Zitat von Zippochonda Beitrag anzeigen

                        >Ohne https funktioniert es nicht?
                        >Dann musst du wohl das Zertifikat runterladen und in den Java Keystore von deinem OpenHab Server installieren.

                        >Hier hat es schon jemand gemacht, evtl bringst du es hin:
                        >https://community.openhab.org/t/http...-https/21430/9

                        Cool, ja hat geklappt...
                        Kannst Du mir vielleicht noch sagen wie Du das hier genau gemacht hast?
                        Ich blick da nicht ganz durch.

                        Gruß Tom

                        Kommentar


                          #13
                          Hat das schon jemand mit einer JUDO SOFTwell S mit Connectivity Modul ausprobiert? Da soll es auch ein Web Interface geben. Werte ändern geht dort nicht, aber ich würde diese gerne abfragen.

                          Kommentar


                            #14
                            Die Rule (im Grunde genommen ist es ja ein Binding...) holt sich die Werte über API Abfragen. Es kommt also nur darauf an, ob die SOFTwell S die gleiche API zur Verfügung stellt.

                            Beim Anschauen der Rule ist mir gerade aufgefallen, dass da in Zeile 117 ein .state fehlt, residual_hardness ist je ebenfalls ein Item.
                            Zuletzt geändert von udo1toni; 05.03.2022, 11:47.

                            Kommentar


                              #15
                              gelöscht...

                              Kommentar

                              Lädt...
                              X