Seite 1 von 2

Miele@home

Verfasst: 16.12.2019, 21:30
von Hattermann
Hallo,
zum Zugriff auf Miele@home gibt es inzwischen eine API:
https://www.miele.com/developer/swagger-ui/index.html
Leider verstehe ich bisher zu wenig davon.
Hat jemand mehr Ahnung davon?

PS.: Im Symcom Forum wird das direkte Kommunikationsprotokoll analysiert
https://www.symcon.de/forum/threads/342 ... lyse/page5

Gruß Thomas

Re: Miele@home

Verfasst: 16.12.2019, 23:34
von Fonzo
Hattermann hat geschrieben:
16.12.2019, 21:30
Leider verstehe ich bisher zu wenig davon.
Hat jemand mehr Ahnung davon?
Die Authentifikation erfolgt über OAuth2 über eine registrierte App, die einen festen Endpunkt zur Authentifizierung vorhält. Mit dem Token, den Miele dann zur Verfügung stellt, kann man die Daten der Geräte abrufen. Das als Endkunde nur mit einer CCU alleine zu realisieren halte ich für schwierig.
Hattermann hat geschrieben:
16.12.2019, 21:30
PS.: Im Symcom Forum wird das direkte Kommunikationsprotokoll analysiert
https://www.symcon.de/forum/threads/342 ... lyse/page5
IP-Symcon hat einen offiziellen Zugang zur Miele API, hier kann man sich ganz normal mit dem Miele Benutzernamen und dem Miele Passwort anmelden indem man IPSymconMieleAtHome nutzt. Danach kann man die Geräte ganz normal wie mit der Miele App auch steuern und den Status auslesen. Man kann dann auch den Gerätestatus von einem Miele Gerät mit Homematic Aktoren verknüpfen. Bei Bedarf kann man so ein Miele Gerät dann auch in NEO visualisieren bzw. aus NEO schalten, falls man NEO zur Visualisierung von Homematic nutzten sollte.

Welche Werte man zur Verfügung hat hängt vom jeweiligen Gerät ab, eine Waschmaschine liefert logischerweise andere Werte als ein Herd.

Das wäre ein Beispiel für verfügbare Werte eine Miele Waschmaschine über Miele@home
miele_1.png
Abhängig von den Werten des Miele Geräts kann man dann auch etwas bei Homematic auslösen bzw. die Werte in NEO anzeigen lassen.

Re: Miele@home

Verfasst: 17.12.2019, 06:39
von Black
Die Kommunikation alleine auf der ccu nachzubauen halte ich für so nicht machbar.

In dem kosten und SUS freien open source Projekt iobroker z.b. gibt es einen miele@home Adapter der dies erledigt und dann in iobroker ein Teil der übergeordneten haussteuerung ist.

Black

Re: Miele@home

Verfasst: 06.01.2020, 10:18
von Hattermann
OK,
wenn man OAuth2 auser acht lässt und mit einem 30 Tage gültigen Token arbeitet, scheitert es offenbar an der SSL/TLS Version.
Die Webseite verlangt mindestens TLSv1.2 curl kann offensichtlich nur TLSv1.0

Code: Alles auswählen

 /usr/local/addons/cuxd/curl -X GET "https://api.mcs3.miele.com/v1/devices/?lan
guage=de" -H  "accept: application/json; charset=utf-8" -H  "Authorization: Bear
er DE_fa6acdeabb86384d386fcbfd0eba1054"
curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
Ein neues cURL soll ja in der CCU2-Firmware v2.49.18 sein. Die nutze ich aber noch nicht wegen der Probleme mit CUXD und USB.
Also abwarten ob bei CUXD mal was neues kommt.

Auf der Windows Kommandozeile geht der Befehl übrigens.
Eine Alternative wäre noch, den Befehl auf meinem Visiualisierungs Tablet unter Android in Javascript laufen zu lassen und dann der CCU2 zu schicken.

Thomas Hattermann

Re: Miele@home

Verfasst: 12.02.2020, 18:26
von Hattermann
So geht es:

Code: Alles auswählen

curl -i -G -X POST "https://api.mcs3.miele.com/oauth/auth"  -H "content-type: application/x-www-form-urlencoded" --data "email=my_email&password=my_pass&redirect_uri=https%3A%2F%2Fapi.mcs3.miele.com%2Fthirdparty%2Flogin%2F&state=login&response_type=code&client_id=my_id&vgInformationSelector=de-DE"
Antwort:

Code: Alles auswählen

HTTP/1.1 302 Found
Date: Tue, 11 Feb 2020 19:55:58 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Location: https://api.mcs3.miele.com/thirdparty/login/?code=DE_7d0b0854a70237bf4eb59b4d887d669f&state=login
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: PUT, GET, POST, OPTIONS
Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
Strict-Transport-Security: max-age=15724800; includeSubDomains
Hier hinter "code=" auslesen und in 2. Befehl einsetzen

Code: Alles auswählen

curl -i -G -X POST "https://api.mcs3.miele.com/thirdparty/token/" -H "content-type: application/x-www-form-urlencoded" --data "grant_type=authorization_code&code=DE_7d0b0854a70237bf4eb59b4d887d669f&redirect_uri=https%3A%2F%2Fapi.mcs3.miele.com%2Fthirdparty%2Flogin%2F&client_id=my_id&client_secret=my_secret"
Antwort:

Code: Alles auswählen

HTTP/1.1 200 OK
Date: Tue, 11 Feb 2020 19:57:28 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 151
Connection: keep-alive
Location: https://api.mcs3.miele.com/thirdparty/login/
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: PUT, GET, POST, OPTIONS
Access-Control-Allow-Headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization
Strict-Transport-Security: max-age=15724800; includeSubDomains

{"access_token":"DE_119d1342d0b24c9bae7be93033c2ba51","refresh_token":"DE_999897dc258eb7c662b97ae4dc166317","token_type":"Bearer","expires_in":2592000}
Hier gibt es den access_token für die weiteren Zugriffe

Code: Alles auswählen

curl -i -X GET "https://api.mcs3.miele.com/v1/devices/000119742767?language=de" -H  "accept: application/json; charset=utf-8" -H  "Authorization: Bearer DE_119d1342d0b24c9bae7be93033c2ba51"
Mit dem können wir den Gerätestatus abfragen (oben ist meine GeräteId eingesetzt).
Ich habe alles unter Windows gemacht, da meine CCU2 das neuer TLS noch nicht unterstützt.

Gar nicht so schwer, wenn man weiss wie.
Gruß Thomas

Re: Miele@home

Verfasst: 12.02.2020, 19:51
von Hattermann
Und mit der aktuellen CCU2 Software (Danke an UWE für den CuXD Patch) geht das alles auch auf der CCU2!

Thomas

Re: Miele@home

Verfasst: 13.02.2020, 07:15
von dtp
Ich würde es trotzdem mit dem ioBroker realisieren, wie von @Black empfohlen.

Ich binde darüber z.B. unsere Siemens-Home-Connect-Geräte (inkl. optionaler Steuerung per IFTTT) und unseren BMW ein, um nur mal zwei zu nennen. Auch die Drucker- und NAS-Analyse sowie deren Statusanzeige klappt damit super.

Sowas muss man der armen CCU (insb. CCU2) nicht alles aufbürden, um irgendwann festzustellen, dass sie dicke Backen macht. 8)

Re: Miele@home

Verfasst: 08.03.2020, 19:05
von Hattermann
Kann das mal jemand oben anpinnen?

Rega Script zum Abfragen Miele@Home.
Folgende Systemvarablen müssen angelegt werden:

Code: Alles auswählen

Name - Name der Maschine, hier wird der komplette Status in JSON hinterlegt
NameStatus - Status des Gerätes "Name"
NameRestzeit - Restzeit des Gerätes "Name"
MieleBearerID - Hier wird der Abruftoken hinterlegt
Das Skript zum abrufen arbeitet auch mit mehreren Gräten!

Code: Alles auswählen

!-------- Hier die eigenen Daten Eintragen------------------ 
string email = "your@email";
string pass  = "password";
string client_id = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
string client_secret = "xxxxxxxxxxxxxxxxxxxx";
string ID_Ger   = "000xxxxxxxxx,000xxxxxxxxx,000xxxxxxxxx";
string Name_Ger = "Waschmaschine,Spuelmaschine,Trockner";
!-----------------------------------------------------------

!Variablen
string ID;
string bash_cmd;
string JSON_All;
string JSON_Geraet;
string char;
string Geraet;
string Text;
string Status;
string GerName;
string bash_cmd;
string bash_res;
integer StrPos = 0;
integer StrLen;
integer Ebene = 0;
integer StartPosGeraet;
real Time;
integer pos;
integer pos1;
var v_Maschine;
var v_State;
var v_Time;
var v_MB_ID;
integer reauth = 1;

while( reauth < 3 )
  {
!Daten der Geräte mit dem alten Token abrufen
  v_MB_ID = dom.GetObject( "MieleBearerID" );
  bash_cmd = "curl -X GET \"https://api.mcs3.miele.com/v1/devices?language=de\"  -H \"Authorization: Bearer "  # v_MB_ID.Variable() # "\" -H \"accept: application/json; charset=utf-8\"";
  dom.GetObject("CUxD.CUX2801002:1.CMD_SETS").State(bash_cmd);
  dom.GetObject("CUxD.CUX2801002:1.CMD_QUERY_RET").State(1);
  JSON_All = dom.GetObject("CUxD.CUX2801002:1.CMD_RETS").State().ToLatin();
  StrLen = JSON_All.Length();
  WriteLine( JSON_All );

  pos = JSON_All.Find( "\"code\":" );
!Test auf Fehler
  if( pos != -1 )
    {
    if( reauth == 2 )
      {
      WriteLine( "Error Read" );
      quit;
      }

    reauth = reauth + 1;

!Neu authentifizieren    
    bash_cmd = "curl -i -G -X POST \"https://api.mcs3.miele.com/oauth/auth\"  -H \"content-type: application/x-www-form-urlencoded\" --data \"email=" # email # "&password=" # pass # "&redirect_uri=https%3A%2F%2Fapi.mcs3.miele.com%2Fthirdparty%2Flogin%2F&state=login&response_type=code&client_id=" # client_id # "&vgInformationSelector=de-DE\"";
    dom.GetObject("CUxD.CUX2801002:1.CMD_SETS").State(bash_cmd);
    dom.GetObject("CUxD.CUX2801002:1.CMD_QUERY_RET").State(1);
    bash_res = dom.GetObject("CUxD.CUX2801002:1.CMD_RETS").State();
    pos = bash_res.Find( "code=" );
    bash_res = bash_res.Substr( pos+5, 35 );
    if( bash_res.Substr( 0, 2 ) != "DE" )
      {
      WriteLine( "Error Auth 1" );
      quit;
      }

!Neuen Token abholen
    bash_cmd = "curl -i -G -X POST \"https://api.mcs3.miele.com/thirdparty/token/\" -H \"content-type: application/x-www-form-urlencoded\" --data \"grant_type=authorization_code&code=" # bash_res # "&redirect_uri=https%3A%2F%2Fapi.mcs3.miele.com%2Fthirdparty%2Flogin%2F&client_id=" # client_id # "&client_secret=" # client_secret # "\"";
    dom.GetObject("CUxD.CUX2801002:1.CMD_SETS").State(bash_cmd);
    dom.GetObject("CUxD.CUX2801002:1.CMD_QUERY_RET").State(1);
    bash_res = dom.GetObject("CUxD.CUX2801002:1.CMD_RETS").State();
    pos = bash_res.Find( "\"access_token\":\"" );
    bash_res = bash_res.Substr( pos+16, 35 );
    if( bash_res.Substr( 0, 2 ) != "DE" )
      {
      WriteLine( "Error Auth 2" );
      quit;
      }

!Neuen Token merken
    v_MB_ID = dom.GetObject( "MieleBearerID" );
    v_MB_ID.State( bash_res );
    }

  else
    {
    reauth = 3;
    }
  }

!nun können wir die Gerätedaten auslesen
while( StrPos < StrLen )
  {
  char = JSON_All.Substr( StrPos, 1 );

  if( char == "{" )
    {
    Ebene = Ebene + 1;
    }

  if( char == "}" )
    {
    Ebene = Ebene - 1;
    if( Ebene == 1)
      {
!Daten eines Gerätes
      JSON_Geraet = JSON_All.Substr( StartPosGeraet, StrPos - StartPosGeraet ) # "}";
      pos = 0;
      ID_Ger = ID_Ger.Split( "," ); 
!Gerät in der Liste suchen
      foreach( ID, ID_Ger )
        {
        if( Geraet == ID )    
          {
          GerName = Name_Ger.StrValueByIndex( ",", pos );
!JSON String speichern
          v_Maschine = dom.GetObject( GerName );
          v_Maschine.State( JSON_Geraet.ToLatin() );

!Geräte Status suchen
          pos = JSON_Geraet.Find( "\"status\":" );
          JSON_Geraet = JSON_Geraet.Substr( pos, JSON_Geraet.Length() - pos );
          pos = JSON_Geraet.Find( "\"value_localized\":" ) + 19;
          JSON_Geraet = JSON_Geraet.Substr( pos, JSON_Geraet.Length() - pos );
          pos = JSON_Geraet.Find( "\"" );
          v_State = dom.GetObject( GerName # "Status" );
          Status = JSON_Geraet.Substr( 0, pos );
          v_State.State( Status );

!Restzeit suchen
          pos = JSON_Geraet.Find( "\"remainingTime\":" ) + 17;
          JSON_Geraet = JSON_Geraet.Substr( pos, JSON_Geraet.Length() - pos );
          pos = JSON_Geraet.Find( "," );
          Text = JSON_Geraet.Substr( 0, pos );
          Time = Text.ToFloat() * 60;
          pos1 = JSON_Geraet.Find( "]" );
          Text = JSON_Geraet.Substr( pos+1, pos1 - pos - 1 );
          Time = Time + Text.ToFloat();
          if( (Time == 0) || (Status == "Aus") )
            {
!Erspart später die Abfrage des Status
            Time = 65535;
            }
          v_Time = dom.GetObject( GerName # "Restzeit" );
          v_Time.State( Time );
          }
        pos = pos + 1;
        }
      }
    }

  if( (Ebene == 1) && ((char == "{") || (char == ",")) )
    {
    Geraet = JSON_All.Substr( StrPos+2, 12 );
    StartPosGeraet = StrPos+16;
    } 
  StrPos = StrPos + 1;
  }

Re: Miele@home

Verfasst: 18.05.2023, 22:15
von NikKo_67
Hallo zusammen,

ich habe 2 Fragen zu dem oben genannten Script.
1. Müsste die anzulegende Variable MieleBearerID statt MB_ID heißen?
Das würde ich aus dem Code vermuten:
v_MB_ID = dom.GetObject( "MieleBearerID" );
Ich habe zur Sicherheit beide Variablen angelegt, habe aber ein anderes Problem.
Als Meldung kommt folgendes zurück:
{ "code": 401, "message": "Unauthorized" }

Error Auth 1
Kann mir da jemand einen Tip geben, worauf ich meine Fehlersuche richten soll?

Meine EMail, PWD sowie Client ID und Secret habe ich überprüft, die stimmen.
Ich habe mich auch hierüber mal angemeldet, da bekomme ich einen code zurück.

Code: Alles auswählen

https://api.mcs3.miele.com/thirdparty/login/?client_id=zzzDEIN_CLIENTIDzzzz&redirect_uri=https%3A%2F%2Fapi.mcs3.miele.com%2Fthirdparty%2Flogin%2F&state=login&response_type=code
Jetzt weiß ich nicht mehr so recht weiter.
Gruß
Nikolas

Re: Miele@home

Verfasst: 23.05.2023, 18:05
von Hattermann
Ja muss "MieleBearerID" heisen, habe ich oben korrigiert.
Thomas