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.

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********"
    }
}
1 Like

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:

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