Als Client habe ich zwei Subsysteme eingerichtet. Einmal ein "Miele OAuth2", der Token-Erzeugung und -Refresh übernimmt. Und ein "Miele Cloud API", in der die eigentliche Gerätesteuerung stattfindet.
TWS HTTP-API Export - Miele OAuth2.json
Mit "Miele OAuth2" wird folgender Ablauf möglich:
Schritt A: Authorization URL manuell im Browser öffnen (siehe vorangegangener Post)
Schritt B: Mit den Miele-Login-Daten im Browser anmelden und die Geräte für den Zugriff bestätigen.
Schritt C: Access Token und Refresh Token erzeugen.
Schritt D: Regelmässig mit Refresh Token ein neues Paar Access Token + Refresh Token holen.
Hier Schritt C:

Die Logik-Engines sind KONKATENIERE mit dem jeweiligen Begriff als Input und einem Trigger.
Logik 78 und 112 braucht es nicht, hiermit wollte ich den Refresh mit der empfangenen Gültigkeit selbst triggern. Aber das ist unnötig kompliziert, denn das Intervall ist immer 60 Minuten, deshalb habe ich es stattdessen oben als Auslöser-Intervall "hard coded" eingestellt.
Für das Access-Token musste ich etwas basteln. Es muss das Wort "Bearer " (mit Leerzeichen) vor das empfangene Token geschrieben werden, damit es verwendet werden kann. Aber aufgrund der Länge des Tokens von rund 1000 Bytes geht das nicht mit dem Standard-Konkateniere aus dem Katalog, sondern ich musste eine Custom-Logik bauen, die eine entsprechend grosse Variable erstellt:
Code: Alles auswählen
{
"_Meta": { // Optional
"Description": "Schreibt 'Bearer ' vor das Token",
"Author": "André P.",
"Version": "1.00"
},
"Level": [
["$Bearer", "string", "Bearer "],
["$Token", "string", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx100xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx200xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx300xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx400xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx500xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx600xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx700xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx800xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx900xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1100"],
["$Result", "string", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx100xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx200xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx300xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx400xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx500xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx600xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx700xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx800xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx900xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1100"]
],
"Module": [
["Concat", ["$Bearer", "$Token"], "$Result"]
],
"Input": [
["AccessToken", "Access Token (1099 Bytes)", "$Token", "c"]
],
"Output": [
["BearerToken", "Bearer Token fuer Authorization-Header", "$Result", "a"]
]
}
Die Funktion D Token Refresh sieht so aus:

Hier könnte man noch vereinfachen und den Ausgang "Refresh Token Refresh" direkt auf den Eingang "Refresh Token" verknüpfen, statt über die Logik zwischenzuspeichern.
So ist die automatische Erneuerung des Tokens gesichert, und die Steuerung kann in einem eigenen Subsystem sauber getrennt dargestellt und genutzt werden. Über das Subsystem "Miele Cloud API" schreibe ich im nächsten Post.
Viel Spass beim Nachbauen.