Please add support for maytronics dolphin pool cleaner

maytronics dolphin is probably the best pool cleaner but their mobile app is a disaster, so the HA integration would be great. The robot hardware is extremely good but they just cant write software…

Agree with Rancho. An integration with home assistant would be useful

5 Likes

Agree, great Robot, but the app is very flakey. The don’t seam to offer any kind of API so I assume that makes building HA support challenging.

Agreed! I have a WiFi compatible Dolphin now, but it’s time for a new one. I want to stick with Dolphin, but open to others that might already be compatible with HA - are there any now that would work?

1 Like

I’m going to try and reverse engineer the app over the next couple of weeks, and see if that gives me any joy.

It would operate via cloud but that’s better than not at all.

My use case is more about getting alerts when the cycle completes or the filter is clogged more than full blown control.

5 Likes

I would be interested of an integration as well. I am about to buy a pool robot cleaner and at the moment I am looking at the z3i.

1 Like

So reverse engineering the app wasnt the most helpful thing.

The status ends up just being a query to dynamodb, with a bunch of numbers that dont make a whole lot of sense.

Starting or stopping a clean doesnt seem to fire off a request at all.

If anyone wants to pick it up, this is where i got to:
set content type to application/x-www-form-urlencoded; charset=utf-8

POST to https://mbapp18.maytronics.com/api/users/Login/, with Email and Password as form-urlencoded
using the token in the response, as a header called token
POST to https://mbapp18.maytronics.com/api/IOT/getToken/
A single form-urlencoded key of Sernum, with the value of your serial number.
This gives you a token, access key and secret for dynamodb.

use these to create the AWS signature authorization, along with a content-type of application/x-amz-json-1.0 and X-Amz-Target of DynamoDB_20120810.Query, and the body content

{"TableName":"maytronics_iot_history","Limit":1,"KeyConditionExpression":"musn = :val ","ScanIndexForward":false,"ExpressionAttributeValues":{":val":{"S":"<SERIAL NUMBER>"}}}

This is the response i get, which isnt overly useful. None of the numbers make any sense or correspond to anytihng in the app itself.

{
    "Count": 1,
    "Items": [
        {
            "PickUpMode": {
                "BOOL": false
            },
            "RobotSerial": {
                "S": "XXXX"
            },
            "musn": {
                "S": "XXXX"
            },
            "rTurnOnCount": {
                "N": "65"
            },
            "NotificationID": {
                "S": "N/A"
            },
            "SystemDataTimeStamp": {
                "S": "2022-02-27T02:11:22.923Z"
            },
            "SystemData": {
                "L": [
                    {
                        "S": "XXXX"
                    },
                    {
                        "S": "700"
                    },
                    {
                        "S": "357"
                    },
                    {
                        "S": "150"
                    },
                    {
                        "S": "119"
                    },
                    {
                        "S": "21"
                    },
                    {
                        "S": "118"
                    },
                    {
                        "S": "39"
                    },
                    {
                        "S": "36"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "9"
                    },
                    {
                        "S": "6.01"
                    },
                    {
                        "S": "N/A"
                    },
                    {
                        "S": "N/A"
                    },
                    {
                        "S": "1.22"
                    },
                    {
                        "S": "208"
                    },
                    {
                        "S": "N/A"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "6"
                    },
                    {
                        "S": "50"
                    },
                    {
                        "S": "94"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "1"
                    },
                    {
                        "S": "31"
                    },
                    {
                        "S": "21"
                    },
                    {
                        "S": "1"
                    },
                    {
                        "S": "595"
                    },
                    {
                        "S": "2"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "06.104"
                    },
                    {
                        "S": "547"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "477"
                    },
                    {
                        "S": "14"
                    },
                    {
                        "S": "116"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "iot"
                    },
                    {
                        "S": "0.0.0.0"
                    },
                    {
                        "S": "SSID"
                    },
                    {
                        "S": "manualMobile"
                    },
                    {
                        "S": "1645967232"
                    },
                    {
                        "S": "4"
                    },
                    {
                        "S": "nonSmart"
                    },
                    {
                        "S": "all"
                    },
                    {
                        "S": "cloud"
                    },
                    {
                        "S": "255"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "1"
                    },
                    {
                        "S": "0"
                    },
                    {
                        "S": "3"
                    },
                    {
                        "S": "100"
                    },
                    {
                        "S": "65231"
                    },
                    {
                        "S": "65481"
                    },
                    {
                        "S": "65481"
                    },
                    {
                        "S": "65481"
                    },
                    {
                        "S": "1"
                    },
                    {
                        "S": "1"
                    },
                    {
                        "S": "65535"
                    },
                    {
                        "S": "240"
                    },
                    {
                        "S": "275"
                    },
                    {
                        "S": "240"
                    }
                ]
            },
            "LastModifiedTimeStamp": {
                "S": "2022-02-27T02:11:22.923Z"
            }
        }
    ],
    "LastEvaluatedKey": {
        "rTurnOnCount": {
            "N": "65"
        },
        "musn": {
            "S": "XXXX"
        }
    },
    "ScannedCount": 1
}
1 Like

Great start, @sh00t2kill! Wish I knew more language to continue what you started! I’ll do a bit of tinkering to see what I can learn, but please keep us posted if you happen to figure it out! Thank you!

Hi, searching in GitHub found this very interesting repo:
https://github.com/MaytronicsIT/MaytronicsIotSDK_AAR
It seems to contain the Android SDK for Maytronics IOT. No source code to be found, just the android archive. Decompiling with JD-GUI shows a small batch of public interfaces/classes and a lot of obfuscated classes that handle login and messaging thru Amazon services.
There’s no documentation to be found, but the repo is fairly recent so maybe Maytronics is preparing to launch an official SDK.

Hi @ivantoledo & @sh00t2kill

I also reversed the SDK, and found some more info. But I dont have a robot yet, so I cant test. But from what I have read, it uses AWS Mqtt to send command:

    public final void a(@NotNull final String str, @NotNull final String str2) {
        Intrinsics.checkNotNullParameter((Object)str, "message");
        Intrinsics.checkNotNullParameter((Object)str2, "topic");
        try {
            k.a(this, "AwsIOT ++++++++++++++++++ publishMessage topic = " + str2 + " message = " + str);
            final AWSIotMqttManager b;
            if ((b = this.b) != null) {
                b.publishString(str, str2, AWSIotMqttQos.QOS0);
            }
        }
        catch (Exception ex) {
            k.a(ex);
        }
    }

Let me know if I can be of any more help. Maybe we should setup a online room for knowledge sharing to speed up the process?

1 Like

Hello,
I have a Dolphin M 600 robot.
Tell me if I can help.
Regards

1 Like

@souf can I get an email to reach you? You can definitely help with that dolphin.

Thanks,

  • A -

I also have a Dolphin S300, if I can help.

1 Like

Happy to help as well, a friend got a Dolphin.

Interesting.
Did you manage to find the endpoint its sending those requests to ?

Maybe we can use DNS spoofing to get it to send them locally and intercept the data payloads.

i just bought a dolphin 40i any news on home assistant integration?

Hey there,

Were you testing this in Python or something? I’m trying in Python.

I’m struggling to get the initial post to come back with anything other than 401 unauthorized =(

Content type is important so make sure that is set.

The field names and Email and Password, capitalised.

I got it working in using php curl, so I don’t see why python wouldn’t work

Yeah, I’ve tried everything. I only get 401 unauthorized.

Would you mind posting your code or sending it to me?

Don’t know if I kept it, will see.

I used postman to generate it.

Edit: Sorry doesnt look like i kept it.