Anyone still using the Miele@home (XGW 3000) binding?

One more thing to add: When there is ExtendedDeviceState available, this should be logged explicitly with TRACE level:

[TRACE] [ternal.handler.MieleApplianceHandler] - Extended device state for miele:fridge:home:fridge: 01[...]

In the payload it will look like this:

				{
					"Name": "extendedDeviceState",
					"Value": "\u0001",
					"Polling": 0,
					"Metadata": {
						"Filter": "false",
						"description": "Extended Device State",
						"access": "RE"
					}
				},

(truncated after “\u0001” in text above)

Here is the response to the HTTP GET (dryer not running now):

{"SignalFailure":false,"TargetTemperature":[],"Temperature":[],"SignalInfo":false,"ProgramID":6,"InternalState":0,"RemainingTime":[0,0],"RemoteEnable":[7,0,0],"Status":1,"ProgramPhase":521,"ProgramType":3,"ExtendedState":"","ElapsedTime":[0,0],"SignalDoor":false,"Light":0,"ProcessAction":0,"StartTime":[0,0],"DryingStep":null}

Thus, this string contains “ExtendedState”.

Think that i have to repeat this because i have two devices at the gateway:

  • One with ID 000178022763 which is a miele cloud device.
  • One with ID 000178022763#0 which is the miele@home device.

For a HTTP GET the 000178022763#0 seems to be expected as 000178022763_0 (???) and provides a different response:

{"SignalFailure":false,"TargetTemperature":[-32768],"Temperature":[-32768,-32768,-32768],"SignalInfo":false,"ProgramID":40,"InternalState":0,"RemainingTime":[0,0],"RemoteEnable":[15,1,0],"Status":2,"ProgramPhase":512,"ProgramType":0,"ExtendedState":"","SignalDoor":false,"Light":0,"ProcessAction":0,"StartTime":[0,0]}

Yes, but empty: "ExtendedState": ""

Most likely it’s also empty when running, but you could of course test that. If this is the case, sadly, you are out of luck.

Have you restarted the XGW 3000 gateway since you added the tumble dryer? If not, that could be one last shot.

Sorry, missed this part. You can see correct uids here: http://<gateway IP>/Rest/Devices/

Thanks for this hint. At the moment the washing machine is running. Here i already have water- and power-consumption working. The HTTP GET string looks like this:

{"SignalFailure":false,"TargetTemperature":[3000],"Temperature":[],"SignalInfo":false,"ProgramID":3,"InternalState":3,"RemainingTime":[1,17],"RemoteEnable":[15,0,0],"Status":5,"ProgramPhase":260,"ProgramType":0,"SpinningSpeed":1200,"ExtendedState":"000101010B8C04B00102000064642EE0025801C2025801C20000000000000000000000000000000000000000000000000000000200060002FF5800","ElapsedTime":[0,21],"SignalDoor":false,"Light":0,"ProcessAction":0,"StartTime":[0,0]}

The data under “ExtendedState” looks complicated. But this job is already done. The dryer will come in the afternoon, and then i will check again.

The dryer is running now. But using http://192.168.1.200/Rest/Devices/ i only get the washing machine (000119707209) which ran earlier and is off now.

{"000119707209":{"Pairing":false,"href":"000119707209/","Group":"0025DC69B7206847"}}

But the tumbledryer data from the binding is present. Am confused now. Do you have any idea why the dryer device is not shown?

Using http://192.168.1.200/Rest/Devices/000178022763/State, i get a similar response than yesterday:

{"SignalFailure":false,"TargetTemperature":[],"Temperature":[],"SignalInfo":false,"ProgramID":3,"InternalState":0,"RemainingTime":[0,29],"RemoteEnable":[15,0,0],"Status":5,"ProgramPhase":514,"ProgramType":3,"ExtendedState":"","ElapsedTime":[0,0],"SignalDoor":false,"Light":0,"ProcessAction":0,"StartTime":[0,0],"DryingStep":4}

This is the tumbledryer’s data, can see this from remaining time. But then, having no “Extended State” data, i conclude, that i am out of luck :thinking:.

Yes, Wi-Fi devices are not included in the list. You can still use the API though, they are just not listed. The UIDs can be fetched using the even older API: http://192.168.1.200/homebus

Am probably not completely out of luck :smiley:

Found a method to retrieve the data through the Miele API:

Adress:

https://api.mcs3.miele.com/v1/devices/000178022763

HTTP GET command (applied the Exec binding for this):

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

For Windows users (Curl for Windows):

C:\Curl\bin\curl -i "https://api.mcs3.miele.com/v1/devices/000178022763?language=de" -H "accept: application/json; charset=utf-8" -H "Authorization: Bearer DE_xxxxxxxxxxxxxxxxxxxx"

Remember that such commands for the Exec binding have to be added to the exec.whitelist.

Answer:

{
  "ident": {
    "type": {
      "key_localized": "Device type",
      "value_raw": 2,
      "value_localized": "Tumble dryer"
    },
    "deviceName": "TWH780WP",
    "protocolVersion": 4,
    "deviceIdentLabel": {
      "fabNumber": "000178022763",
      "fabIndex": "40",
      "techType": "TWH780WP",
      "matNumber": "11819590",
      "swids": [
        "5678",
        "25359",
        "25360",
        "20559",
        "25277",
        "5136",
        "20445",
        "25234",
        "4657"
      ]
    },
    "xkmIdentLabel": {
      "techType": "EK057",
      "releaseVersion": "08.10"
    }
  },
  "state": {
    "ProgramID": {
      "value_raw": 2,
      "value_localized": "Cottons",
      "key_localized": "Program name"
    },
    "status": {
      "value_raw": 5,
      "value_localized": "In use",
      "key_localized": "status"
    },
    "programType": {
      "value_raw": 3,
      "value_localized": "Cleaning/Care programme",
      "key_localized": "Program type"
    },
    "programPhase": {
      "value_raw": 514,
      "value_localized": "Drying",
      "key_localized": "Program phase"
    },
    "remainingTime": [
      2,
      7
    ],
    "startTime": [
      0,
      0
    ],
    "targetTemperature": [
      {
        "value_raw": -32768,
        "value_localized": null,
        "unit": "Celsius"
      },
      {
        "value_raw": -32768,
        "value_localized": null,
        "unit": "Celsius"
      },
      {
        "value_raw": -32768,
        "value_localized": null,
        "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": true,
      "smartGrid": false,
      "mobileStart": false
    },
    "ambientLight": null,
    "light": null,
    "elapsedTime": [
      1,
      9
    ],
    "spinningSpeed": {
      "unit": "rpm",
      "value_raw": null,
      "value_localized": null,
      "key_localized": "Spin speed"
    },
    "dryingStep": {
      "value_raw": 0,
      "value_localized": "Extra dry",
      "key_localized": "Drying level"
    },
    "ventilationStep": {
      "value_raw": null,
      "value_localized": "",
      "key_localized": "Fan level"
    },
    "plateStep": [],
    "ecoFeedback": {
      "currentWaterConsumption": {
        "unit": "l",
        "value": 0
      },
      "currentEnergyConsumption": {
        "unit": "kWh",
        "value": 0.5
      },
      "waterForecast": 0,
      "energyForecast": 0.6
    },
    "batteryLevel": null
  }
}
Response headers
 content-length: 695 

Here i see the power consumption. The task is now to extract the value using some transformation code. Will see if i get this done?

In that case the best solution would be to have the Miele Cloud binding support this. I don’t know if @BjoernLange would be interested in adding channels for water/energy consumption? :slight_smile:

1 Like

Retrieved the power consumption value of the tumble dryer by application of the following JSONPath transformation :

$.state.ecoFeedback.currentEnergyConsumption.value

Coverted the retrieved string to a number in order to calculate power consumption cost.

@BjoernLange
Nevertheless, i would also very much appreciate if you could support the “ecoFeedback” data within the Miele cloud binding. Actually i anyway need both Miele bindings, “Miele@home” and “Miele cloud”, to use all interesting parameters. Both bindings have their advantages versus the other one.

Hi @laursen, hi @dk8pn, I will have a look into this over the christmas holidays.

1 Like

@laursen and @BjoernLange

My power consumption solution using the Miele server is as reliable as the server itself. The Miele 3rd-party API services seem to be dead since at least 2 weeks now.

The page where i granted the credentials is also not available or dead.

Hi @dk8pn,

I just tried it out in my test environment and it seems to work. Could there be anything that blocks access to the API URL? I can also access the website for Miele Developer Account registration.

Could you check whether your access token works? I described how to do that here.

1 Like

Hi,
at the beginning of the year I no longer had a connection to the MIELE server.
My MIELE device was shown as not available in the app.
At the same time, an update was offered for the app.
Conclusion: Update performed, washing machine reconnected to the app, washing machine once disconnected/connected from the network.
After that it worked immediately again.

Many thanks for this hint.

Recognized that the token in the “Miele@home Account” thing has changed for some reason versus the token which i applied within my CURL Get command. Initially this token has been a copy of the other one and worked for a wile. I only apply this workarround method because the dryer power consumption is not yet available through the “tumble dryer” thing.

It is working out now again.

Edit:
Maybe that the issue appeared due to a Miele app update. Will observe this for the next time.

Hi @dk8pn, this is no issue with an update by Miele. The token you copied to your CURL command is an OAuth token and these tokens expire after some time. The binding automatically exchanges the token for a new one when this happens. So the problem will occur again on a regular interval.

1 Like

Hi Bjoern, thanks for this explanation, understood. Means, that i will have to update my token within the CURL command string and the exec.whitelist manually. Perhaps i can automate this.