Miele@home

Themen, die in keine andere Kategorie passen

Moderator: Co-Administratoren

Hattermann
Beiträge: 127
Registriert: 14.12.2015, 19:58
Danksagung erhalten: 4 Mal

Miele@home

Beitrag von Hattermann » 16.12.2019, 21:30

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
Zuletzt geändert von Roland M. am 17.12.2019, 10:41, insgesamt 1-mal geändert.
Grund: Thema verschoben

Fonzo
Beiträge: 6722
Registriert: 22.05.2012, 08:40
System: CCU
Hat sich bedankt: 25 Mal
Danksagung erhalten: 479 Mal

Re: Miele@home

Beitrag von Fonzo » 16.12.2019, 23:34

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.

Benutzeravatar
Black
Beiträge: 5472
Registriert: 12.09.2015, 22:31
System: Alternative CCU (auf Basis OCCU)
Wohnort: Wegberg
Hat sich bedankt: 419 Mal
Danksagung erhalten: 1071 Mal
Kontaktdaten:

Re: Miele@home

Beitrag von Black » 17.12.2019, 06:39

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
Wenn das Fernsehprogramm immer mehr durch nervende Werbung unterbrochen wird und der Radiomoderator nur noch Müll erzählt, ist es besser, die Zeit für sinnvolle Dinge zu nutzen -
mal aufs Klo zu gehen, ein Bier zu holen oder einfach mal den roten AUS-Knopf zu drücken. Klick - und weg

Script Time Scheduler V1.3
AstroSteuerung über Zeitmodul flexibel mit Offset / spätestens, frühestens
SDV 5.03.01 Das umfassende Entwicklungs und Diagnosetool für Homematik
Selektive Backups - Nützliche Dinge, die die WebUI nicht kann

Intel NUC6 Celeron 16GB mit 512GB SSD unter Proxxmox mit insgesamt 5 VM: 2 x bloatwarebefreiter Raspberrymatik, 2 x IOBroker als Middleware und einer MariaDB zur Archivierung. Verbrauch: 6W

technical contribution against annoying advertising

Hattermann
Beiträge: 127
Registriert: 14.12.2015, 19:58
Danksagung erhalten: 4 Mal

Re: Miele@home

Beitrag von Hattermann » 06.01.2020, 10:18

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

Hattermann
Beiträge: 127
Registriert: 14.12.2015, 19:58
Danksagung erhalten: 4 Mal

Re: Miele@home

Beitrag von Hattermann » 12.02.2020, 18:26

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

Hattermann
Beiträge: 127
Registriert: 14.12.2015, 19:58
Danksagung erhalten: 4 Mal

Re: Miele@home

Beitrag von Hattermann » 12.02.2020, 19:51

Und mit der aktuellen CCU2 Software (Danke an UWE für den CuXD Patch) geht das alles auch auf der CCU2!

Thomas

dtp
Beiträge: 10658
Registriert: 21.09.2012, 08:09
System: CCU
Wohnort: Stuttgart
Hat sich bedankt: 320 Mal
Danksagung erhalten: 501 Mal

Re: Miele@home

Beitrag von dtp » 13.02.2020, 07:15

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)
CCU3 mit stets aktueller FW und den Addons "CUxD" und "Programmedrucken", ioBroker auf Synology DiskStation DS718+ im Docker-Container;
einige Projekte: zentrales Push-Nachrichten-Programm zPNP, DoorPi-Videotürsprechanlage, An- und Abwesenheitsdetektion per Haustürschloss, zentrales Programm zur Steuerung von Beschattungsgeräten zBSP.

Hattermann
Beiträge: 127
Registriert: 14.12.2015, 19:58
Danksagung erhalten: 4 Mal

Re: Miele@home

Beitrag von Hattermann » 08.03.2020, 19:05

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;
  }
Zuletzt geändert von Hattermann am 23.05.2023, 18:03, insgesamt 1-mal geändert.

NikKo_67
Beiträge: 3
Registriert: 18.05.2023, 22:07
System: CCU und Access Point

Re: Miele@home

Beitrag von NikKo_67 » 18.05.2023, 22:15

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

Hattermann
Beiträge: 127
Registriert: 14.12.2015, 19:58
Danksagung erhalten: 4 Mal

Re: Miele@home

Beitrag von Hattermann » 23.05.2023, 18:05

Ja muss "MieleBearerID" heisen, habe ich oben korrigiert.
Thomas

Antworten

Zurück zu „OffTopic“