Dishwasher - Candy simply FI - CDI 6015 WiFi

As a Washer/Dryer owner here I would like to thank you all for the info shared. I just took a quick look on the go of the post but I will read more carefully when back home. Thanks guys!

@ [dzamlo] . From one of your posts I was able to start my machine via my web browser. But something strange happened. I managed to decode that Program 4 is a Rapid 14’ wash.
So I used http://xxx.xxx.xxx.xxx/http-write.json?encrypted=0&Write=1&StSt=1&DelVl=0&PrNm=4’
But the wash cycle it is on is Special 39’ which is Pr 1
Does anyone have what the PrCode means does this stay the same or does this change like the PrNm.
Once it has finished I think I might replace PrNm with Pr and see what happens.
As a side note has anyone not been able to use the Candy SimplyFi app. After an update last year or so it just doesn’t work.

Update:
Tried Pr=4 instead of PrNm=4 but it did the same thing, started on Special 39’.

Hey folks. Thanks for all your work on this. My Candy CSOEC10DE dryer uses the Hon app.

When I go to http://192.168.0.198/http-read.json?encrypted=1 or http://192.168.0.198/http-read.json?encrypted=0 I get 192.168.0.198 refused to connect.

Using the Simply-Fi tool I get get_candySimplyfi_data, could not get data from the server.

My Candy device is one that uses BLE for initial connection to WiFi.

What steps can I take to try and get my encryption data?

Trying to add the integration to HA yeilds this in the logs.

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 986, in _wrap_create_connection
    return await self._loop.create_connection(*args, **kwargs)  # type: ignore[return-value]  # noqa
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1056, in create_connection
    raise exceptions[0]
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1041, in create_connection
    sock = await self._connect_sock(
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 955, in _connect_sock
    await self.sock_connect(sock, address)
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 502, in sock_connect
    return await fut
  File "/usr/local/lib/python3.9/asyncio/selector_events.py", line 537, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
ConnectionRefusedError: [Errno 111] Connect call failed ('192.168.0.198', 80)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/config/custom_components/candy/config_flow.py", line 45, in async_step_user
    encryption_type, key = await detect_encryption(
  File "/config/custom_components/candy/client/__init__.py", line 69, in detect_encryption
    async with session.get(url) as resp:
  File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 535, in _request
    conn = await self._connector.connect(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 542, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 907, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1206, in _create_direct_connection
    raise last_exc
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 1175, in _create_direct_connection
    transp, proto = await self._wrap_create_connection(
  File "/usr/local/lib/python3.9/site-packages/aiohttp/connector.py", line 992, in _wrap_create_connection
    raise client_error(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host 192.168.0.198:80 ssl:default [Connect call failed ('192.168.0.198', 80)
]

I did an nmap scan using my Ubuntu VM and port 80 is closed.

1 Like

As the Candy HACS integration does not work for me I have written a python script to output JSON values every minute saved to config/myscripts folder in homeassistant.
candy.json example:

{
        "statusLavatrice":{
                "WiFiStatus":"0",
                "Err":"255",
                "MachMd":"1",
                "Pr":"4",
                "PrPh":"0",
                "SLevel":"255",
                "Temp":"60",
                "SpinSp":"10",
                "Opt1":"0",
                "Opt2":"0",
                "Opt3":"0",
                "Opt4":"0",
                "Opt5":"0",
                "Opt6":"0",
                "Opt7":"0",
                "Opt8":"0",
                "Steam":"0",
                "DryT":"0",
                "DelVal":"255",
                "RemTime":"59",
                "RecipeId":"0",
                "CheckUpState":"0"
        }
}

When i try to read this with a command_line sensor in configuration.yaml I am getting stuck with always getting unknown as the value.

- platform: command_line
  name: 'Candy Washer Dryer'
  scan_interval: 60
  command_timeout: 29
  command: 'cat /myscripts/candy.json'
  value_template: '{{ value_json.statusLavatrice }}'
  json_attributes:
    - WiFiStatus
    - MachMd
    - Pr
    - PrPh
    - Temp
    - SpinSp
    - RemTime
    - DryT
    - DelVal
- platform: template
  sensors:
    candy_wifi:
      friendly_name: "Candy WiFi"
      icon_template: mdi:washing-machine
      value_template: "{% if value_json.WiFiStatus | int == 0 -%}On{%- else -%}Off{% endif %}"

Testing the logic in developer tools seems fine if I set value_json manually to the above values but does not work when obtained with cat. Any pointers as to where I am going wrong? Thank you

Did you ever figure this out? I’m having the same issue.

Afraid not… stuck using the HON app on my phone… and thanks… you’ve reminded me i need to set it going tonight!

1 Like

Issue I had with this was exceeding the 255 character limit on command_line value_template. As my python code was already loading as json i just del all the “Opt” keys. Working configuration.yaml sensor:

  - platform: command_line
    name: 'Candy Washer Dryer'
    scan_interval: 60
    command_timeout: 29
    command: 'cat /config/myscripts/candy.json | jq '
    value_template: '{{ value_json }}'
    json_attributes:
      - WiFiStatus
      - MachMd
      - Pr
      - PrPh
      - Temp
      - SpinSp
      - RemTime
      - DryT
      - DelVal
  - platform: template
    sensors:
      candy_wifi:
        friendly_name: "Candy WiFi"
        icon_template: mdi:washing-machine
        value_template: "{% if state_attr('sensor.candy_washer_dryer','WiFiStatus') == '0' %}On{% else %}Off{% endif %}"

Ciao a tutti,

Ho appena preso una lavastoviglie Candy qualcuno mi può aiutare con la ricerca della chiave e altro ?
Grazie

Hello everybody,

I just bought a Candy dishwasher can someone help me with the key search and more?
Thank you

Hi all

I’ve finally managed to sniff my way into my washer, and I’m able to start and stop it directly from node-red (http get calls).

The control is actually local, calling an json file directly on the washers IP address.

Right now I’m in the process of “decoding” all the different values, and when I’m done, I’ll post my findings :smiley:

This is what I got so far.

The following command (http get) starts the washer:

http://(WASHER IP)/http-write.json?encrypted=1&data=xxxxxxxxxx

the data (xxxxx) is xor encrypted with the key from the washer (use appropiate tools to get that)

I’ve used the following online tool for encode/decode the messages:
https://www.dcode.fr/xor-cipher (select “use the ascii key” and insert the key there to encode/decode)

the data that needs to be encoded looks something like this:

Write=1&StSt=1&DelVl=0&PrNm=1&PrCode=65&PrStr=Whites&TmpTgt=60&SLevTgt=3&SpdTgt=10&OptMsk1=0&OptMsk2=0&Lang=1&Stm=0&Dry=0&RecipeId=0&StartCheckUp=0&DispTestOn=1

I’ve found the following from trial and error :smiley:

StSt = Start (0 or 1)

DelVl = Delay value

PrNm = Program Number

PrCode = Program Code

PrStr = Program String (eg. Whites)

TmpTgt = Target Temperature

SLevTgt = Soil Level Target (1, 2 or 3)

SpdTgt = Speed target (10 = 1000 rpm)

Stm = Steam enabled (0 or 5)

OptMsk1=1 (prewash)

OptMsk1=2 (hygene)

OptMsk1=8 (Good Night)

OptMsk1=16 (1 x rinse, 2 and 3 x rinse not possible)

OptMsk1=32 (2x rinse, 1 and 3 x rinse not possible)

OptMsk1=64 (3x rinse, 2 and 3 x rinse not possible)

OptMsk1=128 (Aqua plus)

OptMsk2=1 (ZooM program enabled)

For the OptMsk1 you add up the values, so if you want both hygene (2) and Good night (8), you set the OptMsk1 to 10.

The following standard programs I have found:

Whites:
PrNr=1
PrCode=65
PrStr=Whites

Eco Cotton:
PrNr=2
PrCode=2
PrStr=Eco Cottons

To stop the washer, the payload has to be:

Write=1&StSt=0&PrNm=X (X is the current program number)
Remember to xor encode it. The url for this command is the same as above.

3 Likes

How do you get the encryption key?

1 Like

Ciao , sei italiano ? io ho una lavastoviglie Candy e sto poco poco impazzendo
sei poi riuscito a integrarla ?

Having same issue, although I can see port 80 is open for mine.

This page isn’t working

192.168.X.XX didn’t send any data.

ERR_EMPTY_RESPONSE

Maybe they (Candy) have updated the firmware and stopped /http-write.json?encrypted=1

Can anyone confirm or deny?

Thanks @Craig_McGowan , That helped me no end. Managed to get all the info I think I need. Top Man.

Do you use the hOn app?

I have the same issue using Haier dishwasher that connects to wifi using bluetooth (only for the first time) with Hon app. It uses Espresif chip (ESP32 I guess). In my case all ports are closed when I check with nmap and if I sniff the network I only see my laptop comunicating with dishwaser’s IP (port 443)

You can use this :slight_smile:

Anyone had any luck in getting the Hoover hwash 500 integrated?

+1 for this, I have tried but dont fully understand the instructions, A video tutorial would be nice.

Hi!

I just tried to use the tool thrugh CMD and Powershell but nothing happens. Could you please tell me how did you do to get the key of the appliance?

First I launch CMD/PowerShell, then I navigate to the /bin folder, then I type the command: ./simplyfi <ip> getkey , but nothing happens. And trying to open the .exe file rigt away gives me several errors one anfter the other…

Many thanks in advance :slight_smile:

On a windows machine you might have to use simplify.exe getkey