Ankündigung

Einklappen
Keine Ankündigung bisher.

Miele @Home mit MQTT

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

  • AndreK
    antwortet
    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.

    Einen Kommentar schreiben:


  • Sipple
    antwortet
    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.

    Einen Kommentar schreiben:


  • AndreK
    antwortet
    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

    Einen Kommentar schreiben:


  • Sipple
    antwortet
    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.

    Einen Kommentar schreiben:


  • AndreK
    antwortet
    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

    Einen Kommentar schreiben:


  • Sipple
    antwortet
    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.

    Einen Kommentar schreiben:


  • Sipple
    antwortet
    Was passiert eigentlich auf MQTT Server und Client Seite, wenn ein Client ein Topic subscriben will, was es zu dem Zeitpunkt noch gar nicht gibt?

    Edit: ok, geklärt. Klappt. Macht auch Sinn.

    Und was passiert, wenn das Topic später dazu kommt. Hat der Server sich gemerkt, dass da mal einer danach gefragt hat?

    Siehe oben. geklärt, macht auch Sinn.

    Und was passiert letztendlich, wenn ein Topic, das Clients subscribed haben, entfernt wird?

    Da habe ich irgendein Verständnisproblem, denn "entfernt" oder "gelöscht" wird ein Topic in dem Sinne ja nicht.
    Trotzdem bleibt die Frage, wie ich das löse. Der Zustand Tür offen wird mit einer "1" auf das Topic miele/7118xxxxx/DoorSignal signalisiert. Wird die Tür geschlossen, sehe ich aber keine 0 im MQTT Explorer, sondern das Topic ist schlicht weg.
    Zuletzt geändert von Sipple; 27.08.2021, 13:31.

    Einen Kommentar schreiben:


  • Sipple
    antwortet
    Also:
    Was der Gefrierschrank kann/könnte:

    Code:
    IDENT
    type -> Gerätetyp, also Gefrierschrank
    deviceName -> kann man selber setzen, siehe unten bei ACTIONS
    deviceIdentLabel -> Seriennummer (=fabNumber, ist auch die Geräte ID, braucht man um ein Gerät separat abzufragen) und einiges
    xkmIdentLabel -> Wohl irgendwas zum WLAN-Stick, nicht ganz klar, aber uninteressant
    
    STATE
    status -> z.B. "In Betrieb", "SuperFrost" oder "Fehler!"
    targetTemperature -> Solltemperatur
    temperature -> Isttemperatur
    signalInfo -> Bit, das bei 1 signalisiert, dass es irgendeine Meldung gibt
    signalFailure -> Bit, das bei 1 signalisiert, dass es einen Fehler gibt (z.B. die Tür ist zu lange offen und der Türalarm geht los)
    signalDoor -> Bit, das signalisiert, dass die Tür offen ist
    remoteEnable -> einige Bits, die die externen Zugriffsberechtigungen anzeigen, z.B. smartGrid, fullRemoteControl
    
    ACTIONS
    processAction -> zeigt an, was im aktuellen Betriebszustand für Befehle akzeptiert werden. Also z.B. SuperFrost ist AUS, dann zeigt das an, dass man es EIN schalten kann. Und umgekehrt.
    targetTemperature -> Klar, ne?
    deviceName -> eigener Name, siehe oben
    modes -> kennt nur einen speziellen und das ist der Sabbat Modus
    Einige dieser Variablen sind nicht nur einfache Strings oder Zahlen, sondern Arrays. Beispiel: deviceIdentLabel besteht aus mehreren Infos.

    Das Problem ist nun, was das PHP Script draus macht.
    Im Ruhezustand des Gefrierschranks sieht das so aus:


    Screenshot 2021-08-27 130654.png

    Da sind einige Infos drin, die eh keinen Sinn machen (StartTime...), dafür fehlen die ganzen signal... Infos. Die erscheinen z.B. wenn die Tür offen ist, verschwinden aber wieder, wenn die Tür zu ist. Also das ganze Topic ist nur temporär, anstatt das Topic permanent zu machen und nur den Wert von FALSE auf TRUE zu setzen etc.

    Damit hat man IMHO ein Problem. Wertet man z.B. den Türalarm mit SHNG aus, bekommt man das dort signalisiert, sobald die Tür länger offen steht, aber wenn der Alarm beendet ist, bekommt es SHNG nicht mit, weil das ganze Topic weg ist anstatt nur einfach FALSE zu setzen.

    Keine Ahnung, wie ich das gelöst bekomme.

    Einen Kommentar schreiben:


  • Haiphong
    antwortet
    Suuuuuper, danke

    Einen Kommentar schreiben:


  • Sipple
    antwortet
    Ja. Ist- und Solltemperatur (letztere änderbar), Status wie z.B. In Betrieb und Superfrost (kann man setzen), Türalarm und evtl. noch was. Muss ich selber noch sehen was geht, vor allem das Schreiben.

    Einen Kommentar schreiben:


  • Haiphong
    antwortet
    Servus Martin,

    bekommst Du vom Miele Gefrierschrank die Innentemeratur ( per MQTT ) geliefert ??

    Welche Daten werden noch geliefert??

    Einen Kommentar schreiben:


  • Sipple
    antwortet
    Ich kram das mal wieder raus.
    Wir haben einen Miele Gefrierschrank und nächste Woche kommt ein Trockner dazu.
    Ich habe mir das oben erwähnte php Script geholt und Zugangsdaten von Miele. Ging sofort und nach 20min hatte ich die Daten per MQTT in SmartHomeNG.
    Einfacher geht's fast nicht. Werte/Parameter setzen kommt als nächstes.
    Mir wäre es auch lieber das php durch ein Python Plugin zu ersetzen, aber der Aufwand ist schon nicht unerheblich (OAuth etc.).
    Wenn man einen SmartHomeNG Server betreibt und evtl. auch noch die smartVISU, dann ist PHP eh vorhanden. MQTT ist inzwischen ja auch kein Thema mehr. Also mit dem Script kann ich leben.

    Einen Kommentar schreiben:


  • whe
    antwortet
    das habe ich schon vor Monaten durchforstet; um dies umzusetzen benötigt man aber höhere Weihen.
    Ist m.E. nur verständlich für Entwickler und Security Profis.

    Einen Kommentar schreiben:


  • bmx
    antwortet
    Jau, sollte hier dokumentiert sein.

    Einen Kommentar schreiben:


  • whe
    antwortet
    die Kommunikation lässt sich sicher auch zu Fuß mittels HTTP lösen (ist ja ein REST api)
    der Knackpunkt ist m.E. die Authorization via OAUTH2

    Einen Kommentar schreiben:

Lädt...
X