Miele (und andere Smarthome Geräte)

Hmm… event log?

@sathya, wer hat denn den Miele-Node entwickelt?

Sorry @pmayer hier noch das Eventlog:

2020-01-27T17:47:31.616Z Node 4553ee11.052378: Node is not fully configured.
2020-01-27T17:47:40.815Z Flows have been (re)started successfully.
2020-01-27T17:48:32.925Z Node 4553ee11.052378: Unknown error obtaining authorization code. E. g. server is not reachable.

Ok… ich müsste das jetzt debuggen. Habe aber kein Miele-Gerät und wahrscheinlich ist der urspüngliche Author da der bessere Ansprechpartnert.

Laut node-info müsste das @sathya sein.

Ich helfe gerne und “stelle” meine Waschmaschine zur Verfügung.

Wichtig scheint hier auch die korrekte Angabe des Landes unter “Country”. Denn meine Credentials funktionieren nur in der Schweiz. Wie finde ich heraus, welche Schreibweise das Feld “Country” erfordert?

06

PS: Wenn ich meine Credentials falsch eingebe, erscheint im Event log die selbe Fehlermeldung. Vielleicht kannst du so dennoch debuggen ?
Kann ich auch in der Konsole den Debugelevel hochschrauben, so wie in Homegear?

:star_struck:Halleluja, es funktioniert!!!
Country war falsch ausgefüllt! So funktionierts bei mir:
38

Es ist wichtig, dass alle Angaben korrekt eingefügt sind!

  1. Account bei Miele erstellen. Dabei ist die Länderauswahl später entscheidend und muss im Feld “Country” korrekt eingegeben werden. In meinem Fall (in der Schweiz) ch-ch.
  2. Auf der Miele App (Smartphone) die Geräte (in meinem Fall Waschmaschine) koppeln.
  3. Unter https://www.miele.com/developer/ API Credentials beantragen.
  4. In der Miele Node “Username” und “Password” (aus Punkt 1) und “Client ID” und “Client secret” (aus Schritt 3) sowie “Country” (aus Schritt 1) eingeben.

“Language” bestimmt, ob die Antworten vom Miele Server auf Deutsch (de) oder Englisch (en) zurück geschickt werden.

Weitere Infos:
Miele API: https://www.miele.com/developer/
Miele MQTT: https://github.com/oklona/Miele-MQTT

Wie immer herzlichen Dank an den ermüdungslosen Support von @pmayer und die Implementierung von @sathya!

Und hier noch die Payload von der Node:

$message : Object
object
payload: object
deviceName: ""
hash: "xxx"
serialNumber: "x"
state: object
ProgramID: object
dryingStep: object
elapsedTime: array[2]
light: 0
plateStep: array[0]
programPhase: object
programType: object
remainingTime: array[2]
remoteEnable: object
signalDoor: false
signalFailure: false
signalInfo: false
spinningSpeed: object
startTime: array[2]
status: object
targetTemperature: array[3]
temperature: array[3]
ventilationStep: object
typeId: 1
typeLabel: "Waschmaschine"
source: "xxx"

PS. So schaut es dann im Event log aus:

2020-01-27T18:08:24.436Z Flows have been (re)started successfully.
2020-01-27T18:09:18.077Z Node 4553ee11.052378: Successfully obtained access token.
3 Likes

Und damit ich der Community etwas zurückgeben kann. So sieht die gesamte Payload des Programmes “Maschine Reinigen” aus. laufzeit 33 Minuten.

Spannend wird wohl das Objekt remainingTime: array[2] sein. In 0: sind die Stunden und in 1: die Minuten. Das Programm dauert also noch 25 Minuten.

0: 0
1: 25


$message['payload'] : Object
object
deviceName: ""
hash: "xxx"
serialNumber: "000xxxxxxxxxxx"
state: object
ProgramID: object
key_localized: "Programmbezeichnung"
value_localized: "Maschine reinigen"
value_raw: 91
dryingStep: object
key_localized: "Trockenstufe"
value_localized: ""
value_raw: null
elapsedTime: array[2]
0: 0
1: 7
light: 0
plateStep: array[0]
programPhase: object
key_localized: "Programmphase"
value_localized: "Reinigen"
value_raw: 263
programType: object
key_localized: "Programmart"
value_localized: ""
value_raw: 4
remainingTime: array[2]
0: 0
1: 25
remoteEnable: object
fullRemoteControl: true
smartGrid: true
signalDoor: false
signalFailure: false
signalInfo: false
spinningSpeed: object
key_localized: "Schleuderdrehzahl"
unit: "U/min"
value_localized: "600"
value_raw: 600
startTime: array[2]
0: 0
1: 0
status: object
key_localized: "Status"
value_localized: "In Betrieb"
value_raw: 5
targetTemperature: array[3]
0: object
unit: "Celsius"
value_localized: 85
value_raw: 8500
1: object
unit: "Celsius"
value_localized: null
value_raw: -32768
2: object
unit: "Celsius"
value_localized: null
value_raw: -32768
temperature: array[3]
0: object
unit: "Celsius"
value_localized: null
value_raw: -32768
1: object
unit: "Celsius"
value_localized: null
value_raw: -32768
2: object
unit: "Celsius"
value_localized: null
value_raw: -32768
ventilationStep: object
key_localized: "Lüfterstufe"
value_localized: ""
value_raw: null
typeId: 1
typeLabel: "Waschmaschine"
2 Likes

Kann mir jemand helfen, wie ich die verbleibende Zeit als Payload rausfiltern kann?

Ic hversuchte es mit einer Change Node. Doch untenstehende Regel bring nur NULL.

Bildschirmfoto 2020-02-06 um 18.26.07

Gemäss https://nodered.org/docs/user-guide/messages zeigt Node-red Baloontips und lässt den Pfad eines Wertes kopieren, bei Node-blue wird mir dies leider nciht angezeigt.

Es sollte in Node-BLUE aber tatsächlich genauso funktionieren. Ist das Bildschirmfoto aus Node-RED oder Node-BLUE? Hast du einmal probiert, die beiden Zeilen umzudrehen?

Sollte node-blue sein, in node-red ist die Variable msg und nicht message,

Das stimmt, der Screenshot ist von Node-BLUE (ich habe kein Node-red mehr installiert). Leider kommen in dertat keien Balloontips.
Die beiden Zeilen habe ich umgekehrt und auch die Schreibweise message.[payload][remainingTime][1] ausprobiert. Das Ergebnis ist immer NULL.

Hallo @schmid01,

das ging auch nicht. Ist jetzt aber implementiert und im nächsten Nightly. Die korrekte Syntax ist:

payload.remainingTime[1]

Viele Grüße

Sathya

Danke @sathya, freue mich aufs nächste Nightly.

Liebe Community
Nach dem die Miele gelaufen ist, nun mal das neuste homegear Nightly upgedatet. Jetzt ist die Miele Node wieder verschwunden und ich bin einfach zu blöd, wie kriege ich diese jetzt wieder rein?

Darf ich hier nochmals kurz nachhacken?
Ich hab das mit diesen Nightly Updates noch immer nicht gecheckt! Also bei mir läuft: Homegear 0.8.0-3286 und UI 0.2.0-1086-dev.

Doch die tolle Miele Node, welche mir @sathya gebaut hat, steht in meinem Node-blue nicht mehr zur Auswahl. Dabei stehe ich kurz vor dem Display welches ich bauen wollte (MQTT Display mit M5Stack Core 2 und UIflow).

  1. Wie kann ich am einfachsten auf das nächste Nightly aktuallisieren?
  2. Wie kriege ich die Miele Node wieder?

Huhu,

wenn ich das richtig im Kopf habe, sind nur noch die “Core”-Nodes mit dabei. Alle anderen Nodes, die frueher im nodes-extra Paket waren, koennen/muessen ueber die Palettenverwaltung innerhalb von Node-BLUE nachinstalliert werden.

– Micha

Hoi @Micha kannst du mir auf die Sprünge helfen, wo ich diese Palettenverwaltung finde? Im Node-Blue UI oder via Konsole?

Hi @schmid01,

die findest du in Node-BLUE, unter dem “Hamburger-Icon” neben “Implementieren”. Und dort dann unter “Palette verwalten”.

– Micha

2 Likes

Hey Danke @Micha danke, das ist ja wahnsinnig konfortabel gelöst. Ihr rockt das so cool!
Kleine Frage trotzdem noch auch an @sathya. Ich habe die Miele Node wieder aktiviert und mit meinen Angaben von oben gefüttert. Leider passiert überhaupt nix. Auch im Event Log sehe ich leider nichts von der Node, wie damals:

Gibt es noch andere User hier, die die Node schon genutzt haben?
Habt ihr mir einen Tipp, wie ich prüfen kann, ob die Verbindung zur Miele Cloud via API erfolgreich aufgebaut werden konnte?

Scheinbar wurde die Miele API angepasst. GitHub - oklona/Miele-MQTT: A very simple script to read data from Miele@home cloud services, and beschriebt das sehr gut.
Es muss erst unter Miele 3rd party API - API documentation authenisiert werden. Danach kannt man unter selbiger Adresse testen.

@sathya kannst du angucken, ob es einer anpassung inder Node benötigt?

Ich habe unterdessen ein gebraucht WLAN Modul für meinen Trockner eingebaut. Und kann somit gerne auch Daten von diesem hier reingeben für andere Interessenten.

1 Like

Hier der Output meines Trockners mit dem Miele-Swagger: Miele 3rd party API - API documentation

000012345678 entspricht der Device ID.

Curl

curl -X 'GET' \
  'https://api.mcs3.miele.com/v1/devices/000012345678?language=de' \
  -H 'accept: application/json; charset=utf-8' \
  -H 'Authorization: Bearer CH_f*******************************'

Request Url
https://api.mcs3.miele.com/v1/devices/000012345678?language=de

Server response

{
  "ident": {
    "type": {
      "key_localized": "Gerätetyp",
      "value_raw": 2,
      "value_localized": "Trockner"
    },
    "deviceName": "",
    "protocolVersion": 2,
    "deviceIdentLabel": {
      "fabNumber": "000012345678",
      "fabIndex": "TK",
      "techType": "TKS350WP",
      "matNumber": "01234567",
      "swids": [
        "2916",
        "25000",
        "20162",
        "3102",
        "20182",
        "25016",
        "25001"
      ]
    },
    "xkmIdentLabel": {
      "techType": "XKM3100W",
      "releaseVersion": "02.72"
    }
  },
  "state": {
    "ProgramID": {
      "value_raw": 21,
      "value_localized": "Baumwolle",
      "key_localized": "Programmbezeichnung"
    },
    "status": {
      "value_raw": 5,
      "value_localized": "In Betrieb",
      "key_localized": "Status"
    },
    "programType": {
      "value_raw": 2,
      "value_localized": "Automatikprogramm",
      "key_localized": "Programmart"
    },
    "programPhase": {
      "value_raw": 520,
      "value_localized": "Bügelfeucht 1",
      "key_localized": "Programmphase"
    },
    "remainingTime": [
      0,
      20
    ],
    "startTime": [
      0,
      0
    ],
    "targetTemperature": [
      {
        "value_raw": 65,
        "value_localized": 0.65,
        "unit": "Celsius"
      }
    ],
    "temperature": [
      {
        "value_raw": -32768,
        "value_localized": null,
        "unit": "Celsius"
      },
      {
        "value_raw": -32768,
        "value_localized": null,
        "unit": "Celsius"
      },
      {
        "value_raw": -32768,
        "value_localized": null,
        "unit": "Celsius"
      }
    ],
    "signalInfo": false,
    "signalFailure": false,
    "signalDoor": false,
    "remoteEnable": {
      "fullRemoteControl": false,
      "smartGrid": true,
      "mobileStart": false
    },
    "ambientLight": null,
    "light": null,
    "elapsedTime": [
      1,
      56
    ],
    "spinningSpeed": {
      "unit": "U/min",
      "value_raw": null,
      "value_localized": null,
      "key_localized": "Schleuderdrehzahl"
    },
    "dryingStep": {
      "value_raw": null,
      "value_localized": "",
      "key_localized": "Trockenstufe"
    },
    "ventilationStep": {
      "value_raw": null,
      "value_localized": "",
      "key_localized": "Lüfterstufe"
    },
    "plateStep": [],
    "ecoFeedback": null,
    "batteryLevel": null
  }
}