Ankündigung

Einklappen
Keine Ankündigung bisher.

Miele @Home mit MQTT

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

    #16
    Ist zum Glück kein Thema mit den "verschwundenen" Topics im MQTT Explorer. Zu kompliziert gedacht. Es funktioniert eigentlich so wie gewünscht.

    Als Beispiel mal die Items, so wie ich sie gerade habe.

    Code:
    # Miele.yaml
    
    Miele:
        Gefrierschrank:
            Status:
                type: str
                mqtt_topic_in: miele/7118xxxxx/ProgramStatus
            Ist_Temperatur:
                type: num
                mqtt_topic_in: miele/7118xxxxx/CurrentTemperature1
            Soll_Temperatur:
                type: num
                mqtt_topic_in: miele/7118xxxxx/TargetTemperature1
    #            mqtt_topic_out: miele/command/7118xxxxx/targetTemperature
            Tuer:
                type: bool
                mqtt_topic_in: miele/7118xxxxx/DoorSignal
            Superfrost:
                type: num
                mqtt_topic_out: miele/command/7118xxxxx/processAction
    #            eval: 4 if sh.Miele.Gefrierschrank.Status() == 'SuperFrost' else 5
    #            eval_trigger: Miele.Gefrierschrank.Status
    Damit wird der Betriebszustand als Text in der schon bei der Anfrage an den Miele Server selektierten Sprache angezeigt ("In Betrieb", "SuperFrost" oder "Fehler!", evtl. auch andere).
    Ist- und Solltemperatur anzeigen klappt auch.
    Türzustand ebenso.
    Superfrost Betrieb lässt sich per out Topic mit dem Wert "4" einschalten und mit "5" ausschalten.

    Probleme habe ich noch mit dem Superfrost, wenn der Modus nicht von SHNG gesetzt wird, sondern am Gefrierschrank selber oder über die Miele App. Dass Superfrost aktiv ist wird nämlich über den programStatus angezeigt, als Text. Damit bekommt das Superfrost Item das nicht mit. Deshalb habe ich das eval/eval_trigger probiert.
    Damit folgt das Item zwar dem ProgramStatus wie gewünscht, aber das Ein/Aus über SHNG/VISU geht nicht mehr. Da komme ich grad nicht weiter.

    Zweites Problem ist das Setzen der Soll-Temperatur. Entweder, ich habe da das falsche Topic (nirgends gefunden was das richtige ist, nur vermutet), oder die Payload ist falsch. Könnte sein, dass die Payload da nicht einfach "-17" oder sowas sein darf, sondern komplizierter, wie {zone: 1, targetTemperature: -17}. Keine Ahnung.

    Dass ein smarter Gefrierschrank ein wenig übertrieben ist, ist klar, mir geht's da eher um die Vorbereitung auf den Trockner, der Ende nächster Woche kommt. Da sollte schon alles klappen, damit man die Restlaufzeit, die Ende-Meldung, das Starten wegen PV-Überschuss etc. implementieren kann.

    Kommentar


      #17
      Hi Sipple ,

      ich habe zwar (noch) keine Miele@Home-Geräte habe mich aber mal mit der Authentifizierung beschäftigt.
      Folgende Vorgehensweise :

      Eine App unter http://"https://www.miele.com/f/com/...ster_api.aspx" registrieren. Nach Erhalt der Freischalt-Mail die Seite aufrufen und das Client-Secret und die Client-ID kopieren und merken (speichern).

      Dann einmalig über das Swagger-UI der App mittels Client-ID und Client-Secret über den Button "Authorize" (in grün, auf der rechten Seite) Zugriff erteilen. Wenn man Client-Id und Client-Secret eingetragen hat wird man einmalig aufgefordert mittels mail-Adresse, Passwort und Land der App-Zugriff zu erteilen.

      (ich weiß das hast du schon alles, schreibe es der Vollständigkeit halber nochmal)

      Danach kann mit folgendem Code ein Bearer abgefragt und refreshed werden.
      Ich habe hier das Anfordern eines Bearers, die Abfrage der Geräte und einen Token-Refresh implementiert.
      Man kann dann alles via requests in einem Python-Plugin direkt über die Miele API realisieren.

      Code:
      import requests
      import json
      
      
      myUrl='https://api.mcs3.miele.com/thirdparty/token/'
      
      client_id="<Your Client-ID>"
      client_secret ="<Your Client Secret>"
      userid = "<mail-address>"
      password = "<Your Password>"
      country = "de-DE"
      
      # get a new Bearer
      
      myHeaders = { "accept" : "application/json" }
      
      payload =  {"grant_type": "password",
                  "password" :password,
                  "username" : userid,
                  "client_id" : client_id,
                  "client_secret":client_secret,
                  "vg" :country
                  }
      
      myResult = requests.post(myUrl,data=payload,headers=myHeaders)
      
      print (myResult.status_code)
      myRespPayload=json.loads(myResult.content.decode())
      print ("Got Bearer Token")
      print (json.dumps(myRespPayload,indent=2))
      myAccesToken   = myRespPayload['access_token']
      myRefreshToken = myRespPayload['refresh_token']
      myExpiration = myRespPayload['expires_in']
      
      # Now get the devices
      
      myHeaders = {
                      "Authorization" : "Bearer {}".format(myAccesToken)
                  }
      myUrl = "https://api.mcs3.miele.com/v1/devices?language={}".format(country[1:2])
      myResult = requests.get(myUrl,headers=myHeaders)
      print (myResult.status_code)
      myRespPayload=json.loads(myResult.content.decode())
      print ("Got refresh Devices")
      print (json.dumps(myRespPayload,indent=2))
      
      # Refresh the Token
      
      myUrl = "https://api.mcs3.miele.com/thirdparty/token"
      myHeaders = {
                      "Authorization" : "Bearer {}".format(myAccesToken),
                      "Content-Type" : "application/x-www-form-urlencoded",
                      "accept": "application/json"
                  }
      payload = {
                  "client_id" : client_id,
                  "client_secret" : client_secret,
                  "refresh_token" : myRefreshToken,
                  "grant_type" :"refresh_token"
      }
      myResult = requests.post(myUrl,data=payload,headers=myHeaders)
      print (myResult.status_code)
      myRespPayload=json.loads(myResult.content.decode())
      print ("Got refresh Token")
      print (json.dumps(myRespPayload,indent=2))
      Zum setzen der "Target-Temperature" muss der Wert laut Swagger-UI in einem Array gesendet werden

      Code:
      {
        "targetTemperature": [
          {
            "zone": 2,
            "value": -20
          }
        ]
      }
      Die URL wäre dann "https://api.mcs3.miele.com/v1/devices/{deviceId}/actions" mit obigen Payload

      Vielleicht kann doch noch ein Miele@Home-Plugin entstehen

      Viele Grüsse

      Andre

      Kommentar


        #18
        Danke Andre, das wäre die Nonplusultra-Lösung, aber dafür reichts bei mir leider nicht
        Bin schon froh, dass ich bei dem einen oder anderen Plugin mitwirken und neulich mein erstes eigens Plugin für Grünbeck basteln konnte.
        Mit extrem viel Zeit könnte ich das, was SHNG/Python Profis in 1 Tag schaffen, vieleicht in einem Monat hinbekommen und die Zeit habe ich leider nicht.
        Momentan geht's nur drum da überhaupt einmal ne Lösung zu haben und das geht mit dem PHP Script ja ganz ok. Wenn noch einige Fragen geklärt sind und mit Hilfe die Logikprobleme behoben, ist das ja schon mal was. Wenn das dann mal läuft, kann ich in Ruhe (z.B. im Winter) mal damit rumspielen und sehen, ob ich es mit Python als Plugin hin bekomme, aber alleine sicher nicht.

        Die Swaggerbeschreibung zu der targetTemperature habe ich auch so gesehen, deshalb ist meine Vermutung, dass man auch über MQTT an das PHP Script Zone und Temperatur senden muss. Nur ob das Topic stimmt und wie exakt die Syntax der Payload aussehen muss, habe ich noch nicht rausgefunden. Vielleicht schreib ich mal den PHP Script Entwickler an. Der scheint noch aktiv zu sein.

        Wenn ich mal ganz naiv träumen darf: Die beste aller vorstellbaren Lösungen für so etwas wie die Miele Geräte einbinden, wäre eine lokale Emulation der Miele Cloud. Die Anfragen der Geräte lokal umrouten und den Dialog nachbilden. Utopisch.

        Kommentar


          #19
          Hallo Sipple,

          Zitat von Sipple Beitrag anzeigen
          Wenn ich mal ganz naiv träumen darf: Die beste aller vorstellbaren Lösungen für so etwas wie die Miele Geräte einbinden, wäre eine lokale Emulation der Miele Cloud. Die Anfragen der Geräte lokal umrouten und den Dialog nachbilden. Utopisch.
          das verstehe ich nicht, hol mich mal bitte ab, Danke

          Gruss Andre

          Kommentar


            #20
            Ich mag eigentlich keine Cloud Lösungen. Lehne ich ab. Wer weiß was die mit meinen Daten anfangen. Wer weiß, was passiert, wenn der Anbieter plötzlich keinen Bock mehr hat und die Cloud zusperrt. Nur, wenn es keine andere Lösung gibt, akzeptiere ich das zähneknirschend. Versuche aber, andere Wege zu gehen, also andere Lösungen zu finden.

            Die Miele Geräte, so wie viele andere auch, telefonieren ständig nach Hause. Greifen also auf eine Cloud-Resource zu. Diese Anfrage geht im lokalen Netz mindestens über einen Router. Dort könnte man die Anfrage ja umleiten. Das neue Ziel müsste nun so tun, als ob es die Miele Cloud wäre, damit die Geräte zufrieden sind.
            Wenn man also die Kommunikation der Geräte mit der Miele Cloud nachbilden könnte, bliebe alles lokal. In anderen Bereichen gibt es solche Ansätze ja.

            Kommentar


              #21
              Hallo Sipple

              guckst Du hier - ist aber sicherlich eine riesige Baustelle

              Wenn ich das PHP-Script und die Beschreibung richtig verstehe müsstet via PHP-Script das Topic "targetTemperature" wie folgt senden können, das Array für den Payload bildet das Script selbst


              Example:
              Topic: /miele/command/0010101010/powerOn
              Data: true


              Code:
              topic : /miele/command/{deviceId}/targetTemperature
              value : {"zone":2,"value":-20}
              
              also
              "/miele/command/{deviceId}/targetTemperature",{"zone":2,"value":-20}
              
              ( eventuell den Payload auch als String)
              
              "/miele/command/{deviceId}/targetTemperature","{"zone":2,"value":-20}"

              Gruss Andre
              Zuletzt geändert von AndreK; 29.08.2021, 14:28.

              Kommentar


                #22
                So habe ich das versucht, in allen Varianten, die mir eingefallen sind. Verschiedene Topics in verschiedenen Schreibweisen, mit und ohne Anführungszeichen, Zone variiert, usw. Mit dem MQTT Explorer. Kein Erfolg, es passiert schlicht gar nichts.
                Muss wohl mal den Entwickler anschreiben. Die Superfrostfunktion Ein/Aus ging sofort.

                Kommentar


                  #23
                  Hallo AndreK

                  Da das php Script im Zusammenhang mit MQTT nicht zuverlässig arbeitet (was eher auf der MQTT Seite liegt), werde ich versuchen ein Plugin zu bauen.
                  Ich habe mit deinem Beispiel schon etwas auf dem Python CLI gespielt. Zumindest was die Abfrage der Geräte angeht, wenn man schon ein Token hat. Das ist eigentlich keine Hexerei. Ein paar Fallstricke gibt's, z.B. mit deutschen Umlauten (UTF-8 Kodierung), aber das habe ich glaube ich im Griff.
                  Ich experimentiere im nächsten Schritt mit dem Token-Refresh etc. Wenn das auch klappt, dann mache ich mich mal ans Werk. Das wird aber sicherlich länger dauern, bin halt kein Profi. Aber mit Hilfe von den Meistern sollte es klappen.

                  Mir kommt die Authentifizierung fast schon zu simpel vor.

                  Gruß, Martin

                  Kommentar

                  Lädt...
                  X