Maytag Smart Washer/Dryer Integration

I have a smart washer/dryer from Maytag. Has anyone tried to connect it to Home Assistant? Also, any advice on how I might do it is appreciated! They connect to WiFi and are available to be viewed and controlled through their app.

1 Like

I would definitely like to know as well, just wondering if anyone has been able to reverse engineer them or would they even have an API?

Iā€™ve been thinking recently about reaching out to them to see if they have an API. Initially I assumed they didnā€™t. This all is pretty poorly documented, so Iā€™m not expecting much. Especially a public API

@CoopaKid / @Jeff146

I just started looking at this tonight. You can definitely reverse engineer the API call from the iOS app using Mitmproxy. Here is some of the calls i am finding. Will keep you updated as Iā€™m going to be adding this to my HA

curl --location --request POST 'https://api.whrcloud.com/oauth/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=maytag_ios' \
--data-urlencode 'client_secret=OfTy3A3rV4BHuhujkPThVDE9-SFgOymJyUrSbixjViATjCGviXucSKq2OxmPWm8DDj9D1IFno_mZezTYduP-Ig' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'password=********' \
--data-urlencode 'username=***********'

This gets you back a access token and then your SN of your appliances

{
    "access_token": "*************",
...
...
...
    "SAID": [
        "WPR*********",
        "WPR*******"
    ]

Then you can get the appliance status by
GET: https://api.whrcloud.com/api/v1/appliance/WPR*******
with the same headers as above while using a bearer token for the authorization to your new access_token

{
    "_id": "WPR*********",
    "applianceId": "WPR**********,
    "lastFullSyncTime": 1603482726740,
    "lastModified": 1603684878195,
    "attributes": {
        "Zip": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_ApplianceInfoSetSerialNumber": {
            "value": "MX3516115",
            "updateTime": 1603565146583
        },
        "DryCavity_CycleStatusStaticReduce": {
            "value": "0",
            "updateTime": 1603683636561
        },
        "DryCavity_ChangeStatusWrinkleShield": {
            "value": "1",
            "updateTime": 1603565148068
        },
        "Cavity_OpStatusDoorOpen": {
            "value": "0",
            "updateTime": 1603679411914
        },
        "Cavity_CycleSetSpecialtyCycleId": {
            "value": "0",
            "updateTime": 1603565147883
        },
        "Cavity_CycleStatusMachineState": {
            "value": "0",
            "updateTime": 1603683939240
        },
        "trid_result": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "ISPReasonCode": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "UtilityID": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "DryCavity_ChangeStatusManualDryTime": {
            "value": "1",
            "updateTime": 1603565147848
        },
        "DryCavity_ChangeStatusDryness": {
            "value": "1",
            "updateTime": 1603683636577
        },
        "ISP_PART_NUMBER": {
            "value": "W00000000",
            "updateTime": 1603565143376
        },
        "sys-parser-type": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "Sys_DisplaySetLanguage": {
            "value": "0",
            "updateTime": 1603565147892
        },
        "DryCavity_ChangeStatusCycleSelect": {
            "value": "0",
            "updateTime": 1603565147844
        },
        "ISP_DownloadEnd": {
            "value": "0",
            "updateTime": 1603487838632
        },
        "version": {
            "value": "1",
            "updateTime": 1603565145250
        },
        "XCat_PersistentInfoVersion": {
            "value": "18",
            "updateTime": 1603565146555
        },
        "trid": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "ISP_UpdateNotification": {
            "value": "1603487772",
            "updateTime": 1603487838632
        },
        "SetDNSNames": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_SmartGridStatusSmartGridCompliant": {
            "value": "2",
            "updateTime": 1603565146640
        },
        "ISP_RebootTime": {
            "value": "64",
            "updateTime": 1603487838632
        },
        "Relational_to_Appliance": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_OdometerStatusTotalHours": {
            "value": "369",
            "updateTime": 1603684877565
        },
        "ISP_InstallEnd": {
            "value": "0",
            "updateTime": 1603487838632
        },
        "DryCavity_CycleSetDryness": {
            "value": "4",
            "updateTime": 1603565147905
        },
        "ISP_TotalProcessInModule": {
            "value": "0",
            "updateTime": 1603487838632
        },
        "ISP_CurrentProcessInModule": {
            "value": "0",
            "updateTime": 1603487838632
        },
        "XCat_SmartGridSetSmartGridEnable": {
            "value": "0",
            "updateTime": 1603565146646
        },
        "XCat_PersistentInfoSaid": {
            "value": "WPR4DPCRK7BCA",
            "updateTime": 1603565146559
        },
        "Cavity_DisplaySetDrumLightOn": {
            "value": "0",
            "updateTime": 1603679414540
        },
        "XCat_RemoteSetRemoteControlEnable": {
            "value": "0",
            "updateTime": 1603679370476
        },
        "uid": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "UtcOffset": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "Cavity_TimeStatusEstTimeRemaining": {
            "value": "4140",
            "updateTime": 1603683939249
        },
        "PushTrigger": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_RemoteSetRebootAppliance": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "DryCavity_CycleStatusWet": {
            "value": "0",
            "updateTime": 1603565148025
        },
        "InServiceDate": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "DryCavity_CycleSetManualDryTime": {
            "value": "0",
            "updateTime": 1603565147952
        },
        "DryCavity_CycleSetStaticGuardEnable": {
            "value": "0",
            "updateTime": 1603565147956
        },
        "DryCavity_CycleSetWrinkleShield": {
            "value": "0",
            "updateTime": 1603565147909
        },
        "ISP_CurrentModule": {
            "value": "0",
            "updateTime": 1603487838632
        },
        "XCat_PersistentInfoMacAddress": {
            "value": "C8:2B:96:9D:F8:64",
            "updateTime": 1603565146564
        },
        "M2MSubList": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_DateTimeSetDateTimeSet": {
            "value": "2020-10-24T14:45:45+00.00",
            "updateTime": 1603565145280
        },
        "Cavity_CycleSetExtraPowerEnable": {
            "value": "0",
            "updateTime": 1603565147901
        },
        "DryCavity_CycleStatusAirFlowStatus": {
            "value": "0",
            "updateTime": 1603565148031
        },
        "XCat_OdometerStatusCycleCount": {
            "value": "19",
            "updateTime": 1603684877570
        },
        "DryCavity_CycleStatusDrying": {
            "value": "0",
            "updateTime": 1603683636552
        },
        "Online": {
            "value": "1",
            "updateTime": 1603565141716
        },
        "MAC_Address": {
            "value": "********",
            "updateTime": 1603565143663
        },
        "Cavity_ChangeStatusSteamChangeable": {
            "value": "1",
            "updateTime": 1603683636586
        },
        "ISPBundleAttributes": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "ISPStep": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "ControlLockChangedByAppliance": {
            "value": "false",
            "updateTime": 1603482726740
        },
        "Sys_AlertStatusCustomerFaultCode": {
            "value": "F0,E0,0",
            "updateTime": 1603565147978
        },
        "EnergyProfileSetting": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "GetSubscribeListVersion": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "DryCavity_ChangeStatusStaticGuard": {
            "value": "1",
            "updateTime": 1603683636590
        },
        "ModelNumber": {
            "value": "MED7230HW1",
            "updateTime": 1603565143663
        },
        "XCat_OdometerStatusRunningHours": {
            "value": "10",
            "updateTime": 1603684877560
        },
        "DryCavity_CycleSetCycleSelect": {
            "value": "6",
            "updateTime": 1603659862719
        },
        "ProjectReleaseNumber": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "ApplianceVersionNumber": {
            "value": "2",
            "updateTime": 1603565143376
        },
        "ccuri": {
            "value": "API144_LAUNDRY_V18",
            "updateTime": 1603565143663
        },
        "Cavity_CycleSetSteamEnable": {
            "value": "0",
            "updateTime": 1603565147961
        },
        "SerialNumber": {
            "value": "********",
            "updateTime": 1603565143663
        },
        "SmartID": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_WifiStatusRssiAntennaDiversity": {
            "value": "-45",
            "updateTime": 1603565146635
        },
        "Cavity_CycleSetCycleName": {
            "value": "",
            "updateTime": 1603565147878
        },
        "DryCavity_CycleStatusDamp": {
            "value": "0",
            "updateTime": 1603683939244
        },
        "XCat_WifiSetPublishApplianceState": {
            "value": "false",
            "updateTime": 1603482726740
        },
        "DryCavity_CycleSetTemperature": {
            "value": "6",
            "updateTime": 1603659862731
        },
        "SAID": {
            "value": "WPR4DPCRK7BCA",
            "updateTime": 1603565143663
        },
        "RatePlanID": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "Cavity_OpSetOperations": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_SmartGridSetSmartGridMode": {
            "value": "0,0,0,0,0",
            "updateTime": 1603565146657
        },
        "Cavity_ChangeStatusExtraPowerChangeable": {
            "value": "1",
            "updateTime": 1603683636610
        },
        "Sys_OpSetAlertToneVolume": {
            "value": "1",
            "updateTime": 1603565147888
        },
        "DstOffset": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "DateTimeMode": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_ApplianceInfoSetModelNumber": {
            "value": "MED7230HW1",
            "updateTime": 1603565146578
        },
        "CustomerFaultCodeNotification": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "XCat_ConfigSetMaxCustomCycles": {
            "value": "1",
            "updateTime": 1603565146620
        },
        "DrySys_OpSetDampNotificationToneVolume": {
            "value": "3",
            "updateTime": 1603659862735
        },
        "ISP_REASON_CODE": {
            "value": "0",
            "updateTime": 1603487838647
        },
        "DryCavity_CycleStatusSteaming": {
            "value": "0",
            "updateTime": 1603683636556
        },
        "DryCavity_CycleStatusSensing": {
            "value": "0",
            "updateTime": 1603683636547
        },
        "M2MSubscribeListVersion": {
            "value": "0",
            "updateTime": 1603482726740
        },
        "ISP_WIFI_VERSION": {
            "value": "0.0.0",
            "updateTime": 1603565143376
        },
        "DryCavity_CycleStatusCoolDown": {
            "value": "0",
            "updateTime": 1603683636567
        },
        "Cavity_CycleSetDownloadAndGo": {
            "value": "0",
            "updateTime": 1603565147861
        },
        "DryCavity_CycleStatusLimitedCycle": {
            "value": "0",
            "updateTime": 1603565147969
        },
        "DryCavity_ChangeStatusTemperature": {
            "value": "1",
            "updateTime": 1603683636581
        },
        "ISP_DownloadStart": {
            "value": "0",
            "updateTime": 1603487838632
        },
        "TimeZoneId": {
            "value": "America/New_York",
            "updateTime": 1603565145280
        },
        "ISP_WIFI_PART_NUMBER": {
            "value": "W11453754",
            "updateTime": 1603565143376
        },
        "ISP_InstallStart": {
            "value": "0",
            "updateTime": 1603487838632
        },
        "GetApplianceVersionNumber": {
            "value": "false",
            "updateTime": 1603482726740
        }
    }
}

POST
https://api.whrcloud.com/api/v1/appliance/command

{
    "body": {
        "Cavity_DisplaySetDrumLightOn": "1"
    },
    "header": {
        "command": "setAttributes",
        "said": "WPR********"
    }
}
{
    "body": {
        "Cavity_CycleSetExtraPowerEnable": "1",
        "Cavity_CycleSetSteamEnable": "0",
        "Cavity_OpSetOperations": "3",
        "DryCavity_CycleSetCycleSelect": "1",
        "DryCavity_CycleSetDryness": "4",
        "DryCavity_CycleSetStaticGuardEnable": "0",
        "DryCavity_CycleSetTemperature": "6",
        "DryCavity_CycleSetWrinkleShield": "0",
        "DrySys_OpSetDampNotificationToneVolume": "0"
    },
    "header": {
        "command": "setAttributes",
        "said": "WPR********"
    }
}
2 Likes

Iā€™ve never played with mitmproxy before. I tried to get it going, but I had some issues logging into the app after connecting to the proxy. Definitely keep us updated. I will continue to try and capture my traffic

Iā€™ve been looking into Whirlpoolā€™s (closed) API for my AirCon. I think it is the same API used by Maytag so you can try using this. The plan is to eventually get it into HA, but since my AirCon looses connection too frequently, Iā€™m not sure when Iā€™ll be able to.

It would be great to get some contributions and make it more generic to include other appliances! :slight_smile:

1 Like

Just wanted to check in on this. I have Maytag smart washer/dryer so let me know how I can help test/validate.

This worked perfectlyā€¦ I wish it can be integrated into Home Assistantā€¦ Beyond my level of expertise unfortunately


Iā€™m now trying to integrate the whirlpool integration. It only supports air conditioners for now, but looking at what @jbronikowski posted, it is the same API. Iā€™ve implemented both controlling and receiving updates from the server (using a websocket, not polling).

Iā€™ve tried to make the lib able to easily support other appliances, so Iā€™ll be happy to help expand it and integrate more whirlpool appliances into HA!

2 Likes

abbmantis youā€™re the man

Want to help @CoopaKid ? :smiley: I still have to add tests to increase coverage and make the integration be accepted.
The docs page still need to be created, and shouldnā€™t be too extensive since the integration uses the Integrations UI. It would be nice if someone took care of it :slight_smile:

Sure! Iā€™ll take a look. Gonna be a bit short on time for a while, but Iā€™ll see what I can do!

Anything anyone needs tested on a Maytag W/D set? Let me know. Glad to get data or test.

1 Like

I too would be up for helping in getting the washing machine included in this if the integration is still being explored.

Following, would like to add the status of my washer/dryer in my dashboard

I too am very interested in a Maytag integration. Has there been any recent updates for this integration?

I would also like this! Hope it hasnā€™t been forgotten!

I tried @jbronikowskiā€™s method above today and it worked flawlessly. I was able to wrap a NodeJS app around it that gets statuses, formats them to JSON, and makes them available via a REST endpoint. I put it on a spare Pi I had laying around and then used the Home Assistant REST sensor to get the data into Home Assistant.

Not a direct integration but it works. I could put the Node app in a github repo if people were interested in it.

Iā€™m a novice when it comes to building HASS integrations, but if someone wants to port my Node app into one please be my guest. Iā€™ll try to get my code up on github this weekend.

1 Like

Would also be interested in this solution. I am not a programmer but would be willing to help and provide feedback, logs, or anything else that might be needed.

Please do that! That would be amazing!