home-assistant / core

:house_with_garden: Open source home automation that puts local control and privacy first.
https://www.home-assistant.io
Apache License 2.0
69.03k stars 28.27k forks source link

Daikin WIFI controller BRP084Cxx firmware update from 1.19.0 to 2.8.0 breaks local API #99251

Open epajfl00 opened 8 months ago

epajfl00 commented 8 months ago

The problem

Recently, there was an update to the Daikin mobile app, when this was updated, it showed that a firmware update was available for the wifi controller which was running at 1.19.0, and all good. The update was ver 2.8.0 so that was done. The mobile app is fine and controls as expected, all good.

However, HA latest on version 2023.8.3, failed to connect, so all entities are now unavailable. Tried to communicate directly with the API commands on the host address, “page not found”, was the result for any commands. So I can no longer communicate with it directly, as before.

A firmware roll-back of the update is not possible.

BTW, for information I’ve found that my controller must be a “BRP084C44”. See below link. Daikin (daikinthai.com) 2

Any thoughts?

What version of Home Assistant Core has the issue?

2023.8.3

What was the last working version of Home Assistant Core?

No response

What type of installation are you running?

Home Assistant OS

Integration causing the issue

Daikin AC

Link to integration documentation on our website

No response

Diagnostics information

No response

Example YAML snippet

No response

Anything in the logs that might be useful for us?

No response

Additional information

No response

home-assistant[bot] commented 8 months ago

Hey there @fredrike, mind taking a look at this issue as it has been labeled with an integration (daikin) you are listed as a code owner for? Thanks!

Code owner commands Code owners of `daikin` can trigger bot actions by commenting: - `@home-assistant close` Closes the issue. - `@home-assistant rename Awesome new title` Renames the issue. - `@home-assistant reopen` Reopen the issue. - `@home-assistant unassign daikin` Removes the current integration label and assignees on the issue, add the integration domain after the command.

(message by CodeOwnersMention)


daikin documentation daikin source (message by IssueLinks)

starryalley commented 8 months ago

I have 2 split systems (FTXM20WVMA and 35 one) installed today which both use BRP084C44. Both come with v1.1.30 firmware and I updated 1 of them to the latest 2.8.0 without knowing anything yet. And then I tried to configure both in Daikin Mobile Controller (I'm in Australia) and only the one with 2.8.0 can be controlled successfully. Weird thing is only in iOS can I see the "update firmware" choice. In Android I just see "adapter does not respond" error. Nothing I can do there in Android.

And now that I tried to configure them in HA, both can't be connected. When I tried to configure using Daikin AC integration and manually entered the IP, it just said Unexpected Error:

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/daikin/config_flow.py", line 74, in _create_device
    device = await Appliance.factory(
             ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/pydaikin/daikin_base.py", line 86, in factory
    await appl.init()
  File "/usr/local/lib/python3.11/site-packages/pydaikin/daikin_airbase.py", line 68, in init
    raise Exception("Empty values.")
Exception: Empty values.

Not sure if this is related, but just sharing what I had.

fredrike commented 8 months ago

There is a big warning on the integration page: https://www.home-assistant.io/integrations/daikin/

bild

This is probably the same issue with your BRP084C44.

Only solution as I see it is to use https://github.com/revk/ESP32-Faikin.

hank418 commented 8 months ago

same issue with @epajfl00

Zepherman commented 8 months ago

Same here, have lost connection in HA, was working perfectly prior to updating the daikin wifi module from 1.19.0 to 2.8.0 Daikin mobile controller app is working. Now getting Unexpected Error when trying to add to HA.

DKSUSHI commented 8 months ago

Same issue. Is it possible to downgrade the firmware version 1.9.0 of the AC ?"

fredrike commented 8 months ago

This is not a forum nor a support channel. Please open a discussion in the forum section of Home Assistant and file a complaint against Daikin that they have broken local integration.

fredrike commented 8 months ago

@home-assistant rename Daikin WIFI controller BRP084Cxx firmware update from 1.19.0 to 2.8.0 breaks local API

fredrike commented 8 months ago

@home-assistant close

starryalley commented 8 months ago

Yes the local API still works over http. I captured some using mitproxy from a iOS Daikin Mobile Controller just to take a quick look:

image

Unfortunately I can't figure out anything at all about the payload. For example this PUT payload is sent to adjust temperature from 19 to 18 in heat mode:

{
    "requests": [
        {
            "op": 3,
            "pc": {
                "pch": [
                    {
                        "pch": [
                            {
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "0100"
                                    },
                                    {
                                        "pn": "p_08",
                                        "pv": "000000"
                                    },
                                    {
                                        "pn": "p_03",
                                        "pv": "24"
                                    },
                                    {
                                        "pn": "p_07",
                                        "pv": "0F0000"
                                    },
                                    {
                                        "pn": "p_0A",
                                        "pv": "0A00"
                                    }
                                ],
                                "pn": "e_3001"
                            },
                            {
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "01"
                                    }
                                ],
                                "pn": "e_A002"
                            },
                            {
                                "pch": [
                                    {
                                        "pn": "p_2D",
                                        "pv": "02"
                                    }
                                ],
                                "pn": "e_3003"
                            }
                        ],
                        "pn": "e_1002"
                    }
                ],
                "pn": "dgc_status"
            },
            "to": "/dsiot/edge/adr_0100.dgc_status"
        }
    ]
}

And adjusting air flow direction also goes to the same endpoint for example. This is from vertical to off.

{
    "requests": [
        {
            "op": 3,
            "pc": {
                "pch": [
                    {
                        "pch": [
                            {
                                "pch": [
                                    {
                                        "pn": "p_2D",
                                        "pv": "02"
                                    }
                                ],
                                "pn": "e_3003"
                            },
                            {
                                "pch": [
                                    {
                                        "pn": "p_03",
                                        "pv": "24"
                                    },
                                    {
                                        "pn": "p_01",
                                        "pv": "0100"
                                    },
                                    {
                                        "pn": "p_07",
                                        "pv": "000000"
                                    },
                                    {
                                        "pn": "p_0A",
                                        "pv": "0A00"
                                    },
                                    {
                                        "pn": "p_08",
                                        "pv": "000000"
                                    }
                                ],
                                "pn": "e_3001"
                            },
                            {
                                "pch": [
                                    {
                                        "pn": "p_01",
                                        "pv": "01"
                                    }
                                ],
                                "pn": "e_A002"
                            }
                        ],
                        "pn": "e_1002"
                    }
                ],
                "pn": "dgc_status"
            },
            "to": "/dsiot/edge/adr_0100.dgc_status"
        }
    ]
}
fredrike commented 8 months ago

@home-assistant reopen

fredrike commented 8 months ago

With support for local api we might be able to make integration work again. Nice findings @starryalley!

Please send me pm in the forum so we can document the new api and implement support.

fredrike commented 8 months ago

@icovada can you help us with decipher and implement support for 2.8?

icovada commented 8 months ago

Interesting, looks like they moved to a more correct use of APIs: POST/PUT with payload instead of GET with args to change stuff!

This of course breaks everything...

@starryalley could you provide us with a pcap/log file of the requests you saw, possibly starting from when you open the app on your phone?

Also as many commands as you can with detailed instructions of what you changed (one thing at a time, obviously)

epajfl-00 commented 8 months ago

image

I'm hoping this is true, that Daikin is planning to make the cloud API opensource for DIY at the end of this year. Can anyone else confirm this?

epajfl-00 commented 8 months ago

Not sure if you or others have seen this doc, it may help in the methodology to decipher. https://backend.daikincomfort.com/docs/default-source/product-documents/residential/manuals/othermanual/im-dknapi.pdf

epajfl00 commented 8 months ago

Chrisp250, that is get news,!! I've installed "Postman" and can send requests too. What is the message to send to turn on unit? is it a PUT or still a POST?

SmartFoundations commented 8 months ago

Let me know how you go

Thank you, now I understand why all my requests was not working for me. My payload contained \/ instead of \/ Originally I replaced \" by " but did not notice \/ After replacing that too - all my requests work fine and return status 2004 instead of error (4041)

Funny thing - my AC does not have heating option but your request turned heater on it - at least the app says so. The AC itself is probably very confused about what to do XD

starryalley commented 8 months ago

@icovada Sorry for the delay. I've managed to captured all possible operations in Daikin Mobile Controller using an M1 Mac with Wireshark. There are 8 pcap files attached in the zip. All detailed steps below for each capture.

My setup:

Start of App:

Mode change:

Temperature setting of each mode (Current setting is Fan Speed set to Auto, Swing set to Off)

Swing:

Fan speed:

Let me know if I miss anything that isn't in the capture.

daikin-captures-pcap.zip

icovada commented 8 months ago

Amazing, thank you very much.

I'm a little busy now but this will definitely help a lot to create something done properly

starryalley commented 8 months ago

I really don't like how the Daikin's app work. There is no way to set the AC to "powerful". It is just a subset of what one can do with the AC's IR remote and it's just the basic. I even recorded the IR code for "comfort" and "powerful" which I use a lot on my 2 Dakin's in SmartIR so I can set them with HA. However there is no way to do it in the app, let alone that human sensing feature on/off etc.

icovada commented 7 months ago

OK I'm finally having a look at it.. and I'm hating it already! It's a mashup of data and schema all together.

Example 1:

{
    "pn": "p_29",
    "pt": 3,
    "pv": "00",
    "md": {
        "pt": "b",
        "st": 1,
        "mi": "00",
        "mx": "01"
    }
},

Variable "p_29", with value "00" is of type (md->pt) boolean, and it can go from 0 to 1

But oh no wait, how about

{
    "pn": "p_38",
    "pt": 3,
    "pv": "010000",
    "md": {
        "pt": "b",
        "st": 1,
        "mi": "000000",
        "mx": "FFFF00"
    }
},

Looks like "b" isn't "boolean" but stands for "array of bytes", which of course we're going to represent as a string, makes sense

Ugh.

Luckily I have experience working with this exact same kind of data format from work. I'll see what I can do

icovada commented 7 months ago

Thanks, anything you have is of great help.

starryalley commented 7 months ago

Awesome analysis thanks @chrisp250 and @icovada . I haven't worked on anything like that before. I gave up trying to understand it the moment I saw the payload.

Having only worked on several web Restful APIs before, just out of curiosity is it designed to be hard to understand on purpose (to avoid what we are doing here?) or is it following some pattern used in the industry?

icovada commented 7 months ago

Having only worked on several web Restful APIs before, just out of curiosity is it designed to be hard to understand on purpose (to avoid what we are doing here?) or is it following some pattern used in the industry?

Never attribute to malice what can be attributed to incompetence.

fredrike commented 7 months ago

We should update doc once we have fw 2.8.0 support (see my PR above).

brianbienvenu commented 7 months ago

At a guess, they're peeking/poking directly at register values. Someone thought that this saved them firmware code, at the expense of making the API completely meaningless to humans. May also mean that this protocol is unstable and liable to change with each firmware update, which is a great choice. I hope it isn't.

I made a Python tool to read the pcap files from @starryalley and show coloured diffs of the HTTP payloads sent to a given IP: https://gist.github.com/brianbienvenu/1cfa067b5580610cb0fc3379211053eb

I've assumed that the order of the elements isn't important and sorted them before doing any comparisons. It's more readable with colours in your terminal.

Example output

``` py open_pcap.py 192.168.1.14 pcap\on-switch-to-auto-18-to-30-off.pcap -v Opening pcap\on-switch-to-auto-18-to-30-off.pcap, printing HTTP payloads for 192.168.1.14 Got 29 headers, 28 payloads and 0 leftovers {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0200'}, {'pn': 'p_02', 'pv': '40'}, {'pn': 'p_05', 'pv': '000000'}, {'pn': 'p_06', 'pv': '000000'}, {'pn': 'p_09', 'pv': '0A00'}, {'pn': 'p_0C', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '00'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '32'}, {'pn': 'p_20', 'pv': '00000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][0]['pv'] 0200 => 0300 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pn'] p_02 => p_1D ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 40 => 32 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pn'] p_05 => p_20 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pv'] 000000 => 00000000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pn'] p_06 => p_21 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][4]['pn'] p_09 => p_26 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][5]['pn'] p_0C => p_2F ['requests'][0]['pc']['pch'][0]['pch'][1]['pch'][0]['pv'] 00 => 02 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '24'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 32 => 24 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pv'] 00000000 => 000000 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '25'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 24 => 25 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '26'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 25 => 26 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '27'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 26 => 27 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '28'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 27 => 28 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '29'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 28 => 29 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '2A'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 29 => 2A {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '2B'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 2A => 2B {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '2C'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 2B => 2C {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '2D'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 2C => 2D {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '2E'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 2D => 2E {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '2F'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 2E => 2F {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '30'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 2F => 30 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '31'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 30 => 31 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '32'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 31 => 32 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '33'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 32 => 33 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '34'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 33 => 34 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '35'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 34 => 35 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '36'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 35 => 36 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '37'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 36 => 37 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '38'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 37 => 38 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '39'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 38 => 39 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '3A'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 39 => 3A {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '3B'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 3A => 3B {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '3C'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 3B => 3C {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '3C'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '01'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '00'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][1]['pch'][0]['pv'] 02 => 01 ['requests'][0]['pc']['pch'][0]['pch'][2]['pch'][0]['pv'] 01 => 00 ``` ``` py open_pcap.py 192.168.1.14 pcap\on-swing-ver-hor-3d-off.pcap -v Opening pcap\on-swing-ver-hor-3d-off.pcap, printing HTTP payloads for 192.168.1.14 Got 5 headers, 5 payloads and 0 leftovers {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0500'}, {'pn': 'p_22', 'pv': '000000'}, {'pn': 'p_23', 'pv': '000000'}, {'pn': 'p_27', 'pv': '0A00'}, {'pn': 'p_31', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '00'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0500'}, {'pn': 'p_22', 'pv': '0F0000'}, {'pn': 'p_23', 'pv': '000000'}, {'pn': 'p_27', 'pv': '0A00'}, {'pn': 'p_31', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 000000 => 0F0000 ['requests'][0]['pc']['pch'][0]['pch'][1]['pch'][0]['pv'] 00 => 02 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0500'}, {'pn': 'p_22', 'pv': '000000'}, {'pn': 'p_23', 'pv': '0F0000'}, {'pn': 'p_27', 'pv': '0A00'}, {'pn': 'p_31', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 0F0000 => 000000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pv'] 000000 => 0F0000 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0500'}, {'pn': 'p_22', 'pv': '0F0000'}, {'pn': 'p_23', 'pv': '0F0000'}, {'pn': 'p_27', 'pv': '0A00'}, {'pn': 'p_31', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 000000 => 0F0000 {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0500'}, {'pn': 'p_22', 'pv': '0F0000'}, {'pn': 'p_23', 'pv': '0F0000'}, {'pn': 'p_27', 'pv': '0A00'}, {'pn': 'p_31', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '01'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '00'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][1]['pch'][0]['pv'] 02 => 01 ['requests'][0]['pc']['pch'][0]['pch'][2]['pch'][0]['pv'] 01 => 00 ``` ``` py open_pcap.py 192.168.1.14 pcap\on-switch-to-auto-cool-heat-fanonly-dry-auto-off.pcap -v Opening pcap\on-switch-to-auto-cool-heat-fanonly-dry-auto-off.pcap, printing HTTP payloads for 192.168.1.14 Got 9 headers, 8 payloads and 0 leftovers {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0100'}, {'pn': 'p_03', 'pv': '3C'}, {'pn': 'p_07', 'pv': '000000'}, {'pn': 'p_08', 'pv': '000000'}, {'pn': 'p_0A', 'pv': '0A00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '00'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '3C'}, {'pn': 'p_20', 'pv': '00000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsio ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][0]['pv'] 0100 => 0300 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pn'] p_03 => p_1D ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pn'] p_07 => p_20 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pv'] 000000 => 00000000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pn'] p_08 => p_21 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][4]['pn'] p_0A => p_26 ['requests'][0]['pc']['pch'][0]['pch'][1]['pch'][0]['pv'] 00 => 02 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][5] Added {'pn': 'p_2F', 'pv': '00'} {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0200'}, {'pn': 'p_02', 'pv': '40'}, {'pn': 'p_05', 'pv': '00000000'}, {'pn': 'p_06', 'pv': '000000'}, {'pn': 'p_09', 'pv': '0A00'}, {'pn': 'p_0C', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][0]['pv'] 0300 => 0200 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pn'] p_1D => p_02 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 3C => 40 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pn'] p_20 => p_05 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pn'] p_21 => p_06 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][4]['pn'] p_26 => p_09 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][5]['pn'] p_2F => p_0C {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0100'}, {'pn': 'p_03', 'pv': '3C'}, {'pn': 'p_07', 'pv': '000000'}, {'pn': 'p_08', 'pv': '000000'}, {'pn': 'p_0A', 'pv': '0A00'}, {'pn': 'p_2D', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][0]['pv'] 0200 => 0100 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pn'] p_02 => p_03 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 40 => 3C ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pn'] p_05 => p_07 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pv'] 00000000 => 000000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pn'] p_06 => p_08 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][4]['pn'] p_09 => p_0A ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][5]['pn'] p_0C => p_2D {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0000'}, {'pn': 'p_24', 'pv': '00000000'}, {'pn': 'p_25', 'pv': '000000'}, {'pn': 'p_28', 'pv': '0A00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][0]['pv'] 0100 => 0000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pn'] p_03 => p_24 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 3C => 00000000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pn'] p_07 => p_25 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pn'] p_08 => p_28 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pv'] 000000 => 0A00 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][4] Removed {'pn': 'p_0A', 'pv': '0A00'} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][5] Removed {'pn': 'p_2D', 'pv': '00'} {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0500'}, {'pn': 'p_22', 'pv': '0F000000'}, {'pn': 'p_23', 'pv': '0F0000'}, {'pn': 'p_27', 'pv': '0A00'}, {'pn': 'p_31', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/ ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][0]['pv'] 0000 => 0500 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pn'] p_24 => p_22 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 00000000 => 0F000000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pn'] p_25 => p_23 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pv'] 000000 => 0F0000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pn'] p_28 => p_27 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][4] Added {'pn': 'p_31', 'pv': '00'} {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '3C'}, {'pn': 'p_20', 'pv': '00000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '02'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '01'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/ ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][0]['pv'] 0500 => 0300 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pn'] p_22 => p_1D ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][1]['pv'] 0F000000 => 3C ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pn'] p_23 => p_20 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pv'] 0F0000 => 00000000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pn'] p_27 => p_21 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][3]['pv'] 0A00 => 000000 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][4]['pn'] p_31 => p_26 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][4]['pv'] 00 => 0A00 ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][5] Added {'pn': 'p_2F', 'pv': '00'} {'requests': [{'op': 3, 'pc': {'pch': [{'pch': [{'pch': [{'pn': 'p_01', 'pv': '0300'}, {'pn': 'p_1D', 'pv': '3C'}, {'pn': 'p_20', 'pv': '000000'}, {'pn': 'p_21', 'pv': '000000'}, {'pn': 'p_26', 'pv': '0A00'}, {'pn': 'p_2F', 'pv': '00'}], 'pn': 'e_3001'}, {'pch': [{'pn': 'p_2D', 'pv': '01'}], 'pn': 'e_3003'}, {'pch': [{'pn': 'p_01', 'pv': '00'}], 'pn': 'e_A002'}], 'pn': 'e_1002'}], 'pn': 'dgc_status'}, 'to': '/dsiot/edge/adr_0100.dgc_status'}]} ['requests'][0]['pc']['pch'][0]['pch'][0]['pch'][2]['pv'] 00000000 => 000000 ['requests'][0]['pc']['pch'][0]['pch'][1]['pch'][0]['pv'] 02 => 01 ['requests'][0]['pc']['pch'][0]['pch'][2]['pch'][0]['pv'] 01 => 00 ```

Some of the register map is reasonably apparent, and a fair bit isn't. I don't have time to take this further today.

Gtwizzy commented 6 months ago

Thank you to everyone who has FAR more technical knowledge in this area than I do. I miss having my Daikin unit working natively in HA I don't even know how my unit was switched to auto update but it did and I was already aware of this issue being a breaking change so when I reliased that was what had happened I was GUTTED as it had been really quite reliable up until that point.

I hope you wizzards are able to figure this out at some point and I am TRUELY grateful from the bottom of my heart to everyone who is working so dilligently on it

icovada commented 6 months ago

Thank you to everyone who has FAR more technical knowledge in this area than I do. I miss having my Daikin unit working natively in HA I don't even know how my unit was switched to auto update but it did and I was already aware of this issue being a breaking change so when I reliased that was what had happened I was GUTTED as it had been really quite reliable up until that point.

I hope you wizzards are able to figure this out at some point and I am TRUELY grateful from the bottom of my heart to everyone who is working so dilligently on it

Now I feel bad for not having been able to work on this any sooner, I'll try to get at least a little bit of progress in the coming days

werkstrom commented 6 months ago

@icovada You should absolutely not feel that way 😀 We are all very thankfull for your, and everyone elses efforts when and if you chose to offer your time. So thank you! ♥️

Gtwizzy commented 6 months ago

Thank you to everyone who has FAR more technical knowledge in this area than I do. I miss having my Daikin unit working natively in HA I don't even know how my unit was switched to auto update but it did and I was already aware of this issue being a breaking change so when I reliased that was what had happened I was GUTTED as it had been really quite reliable up until that point. I hope you wizzards are able to figure this out at some point and I am TRUELY grateful from the bottom of my heart to everyone who is working so dilligently on it

Now I feel bad for not having been able to work on this any sooner, I'll try to get at least a little bit of progress in the coming days

Don't be silly. There is NO expectation of your time from me or anyone else here. I am (and I'm sure others are) just grateful for people like you who actively give their time to help the community with no expectation of personal gain. This is litterally one of the most selfless things that I find people engage in within the home automation community. I am working hard to try and skill myself up to the level of a lot of the amazing people who work on these integrations so that I can hopefully give back the way many others have given for me through my journey. I still have a lot to learn but I hope one day to be able to do something just as you have for the people like me. Thank you 🫡

icovada commented 6 months ago

@chrisp250 have you tried sending PUTs containing only single values and not entire blocks like the app does?

icovada commented 6 months ago

No it's not, but I was wondering if a smaller command would do the trick anyway.

It's not a matter of home assistant rather of the pydaikin dependency we're using.

I've been analysing the jsons from your packet captures and I am quite confident I can implement the basic calls, but I wouldn't know where to get inside/outside temperature. Have you figured out where it is?

SmartFoundations commented 6 months ago

Now I feel bad for not having been able to work on this any sooner, I'll try to get at least a little bit of progress in the coming days

You should definitely not feel like this! Don't feel bad but feel empowered instead because you have an ability to change other people's lives for the better.

Idk if this is appropriate but I want to put an award for fixing Daikin 2.8.0 support with HA. I will be happy to send 100$ once it is done. This is not much but this is another type of motivation that may help in this situation.

I too cannot live without this integration and can either wait for this fix or replace my AC with another brand which is going to be expensive and painful but I cannot live like this anymore. Shame on you Daikin for breaking this API, that was a bad move. Because of this unneeded change lives were lost, relationships were broken, and I am sure other bad things happened.

icovada commented 6 months ago

That is extremely nice of you to offer this "bug" bounty, @SmartFoundations!

Anyone who wants to contribute is welcome to come over onto @fredrike 's repo for the library used for this integration: https://bitbucket.org/mustang51/pydaikin

Unfortunately I was just going through a rewrite to fix another issue I was having (supporting power consumption cap). We just need to set priorities and decide whether this rewrite is beneficial for the future or not, though anyone's contribution is welcome

EDIT: Shame on Daikin! Shame!

icovada commented 6 months ago

Update on how it's going:

I've resumed work on the library, now I remember where I left off! Unfortunately the library in its current state is (AFAIK) unable to support this new data format without serious rewriting, which is what I was going through anyway.

The plan is to first rewrite the brp069 integration with the new paradigm, which is something I feel more confident on as I happen to own two of these and I can use my own aircon as guinea pigs for the greater good.

I'm using the DaikinClimate object from HASS as base for the new base Pydaikin class to streamline integration (and also avoid reinventing the wheel over and over)

Once this will be done, tested and released in v3.0 of the library I can start working on this new integration.

I'll keep you updated. If anyone wants to help, do contact me.

Gtwizzy commented 5 months ago

Update on how it's going:

I've resumed work on the library, now I remember where I left off! Unfortunately the library in its current state is (AFAIK) unable to support this new data format without serious rewriting, which is what I was going through anyway.

The plan is to first rewrite the brp069 integration with the new paradigm, which is something I feel more confident on as I happen to own two of these and I can use my own aircon as guinea pigs for the greater good.

I'm using the DaikinClimate object from HASS as base for the new base Pydaikin class to streamline integration (and also avoid reinventing the wheel over and over)

Once this will be done, tested and released in v3.0 of the library I can start working on this new integration.

I'll keep you updated. If anyone wants to help, do contact me.

Thank you for all your work on this dude. I know the whole community is cheering you on. I only wish my level of code knowledge was suitable to be able to help you.

DoopDip commented 5 months ago

I think this will help @icovada

NONE("", ""), MODEL("model", "dgc_status.e_1002.e_A001.p_0D"), MODEL_TYPE("type", "dgc_status.e_1002.e_A001.p_07"), MICOM_ID("mid", ""), SUPPORT_FLOW_DIRECTION("s_fdir", ""), ENABLE_HUMIDITY("humd", "dgc_status.e_1002.e_3001.p_01.md.mx"), SUPPORT_HUMIDITY("s_humd", "dgc_status.e_1002.e_A006.p_12"), AC_LED("acled", ""), LAUNDRY("land", ""), ELECTRIC_POWER("elec", "dgc_status.e_1002.e_A011.p_01"), ENABLE_OUTDOOR_TEMPERATURE("temp", "dgc_status.e_1003.e_A00D.p_01"), TEMPERATURE_RANGE("temp_rng", ""), MOTION_DETECTION("m_dtct", "dgc_status.e_1002.e_3003.p_27"), DESTINATION("ac_dst", "dgc_status.e_1002.e_A001.p_0E"), DRY_DISPLAY("disp_dry", "dgc_status.e_1002.e_A006.p_14"), DEMAND("dmnd", ""), ENABLE_FLOW_RATE("en_frate", ""), ENABLE_FLOW_DIRECTION("en_fdir", ""), ENABLE_RELATIVE_TEMPERATURE_IN_AUTO("en_rtemp_a", "dgc_status.e_1002.e_3003.p_28"), ENABLE_SPECIAL_MODE("en_spmode", ""), ENABLE_SEPARATION_COOL_AND_HEAT("en_ipw_sep", ""), AUTO_TEMPERATURE_LOW_LIMIT("atlmt_l", "dgc_status.e_1002.e_3001.p_1D.md.mi"), AUTO_TEMPERATURE_HIGH_LIMIT("atlmt_h", "dgc_status.e_1002.e_3001.p_1D.md.mx"), HEAT_TEMPERATURE_LOW_LIMIT("hmlmt_l", "dgc_status.e_1002.e_3001.p_03.md.mi"), ENABLE_SCHEDULE_TIMER("en_scdltmr", "adp_i.func.en_scdltmr"), ENABLE_MOMENT_POWER("en_mompow", "dgc_status.e_1003.e_A005.p_01"), ENABLE_PATROL("en_patrol", "dgc_status.e_1002.e_A011.p_05"), ENABLE_FLOW_DIRECTION2("en_fdir2", ""), ENABLE_FILTER_SIGN("en_filter_sign", "dgc_status.e_1002.e_3001.p_15"), TYPE_AMENITY("shtyp", "dgc_status.e_1002.e_3003.p_29"), ENABLE_CJ_LINK("en_cjlink", "dgc_status.e_1002.e_A001.p_0C"), EN_VENTILATION_24HOUR_3E("en_ventilation_24hour_3e", "dgc_status.e_1002.e_3003.p_3E"), EN_VENTILATION_24HOUR_39("en_ventilation_24hour_39", "dgc_status.e_1002.e_3003.p_39"), S_VENTILATION_24HOUR_3E("en_ventilation_24hour_3E.md.mx", "dgc_status.e_1002.e_3003.p_3E.md.mx"), EN_VENTILATION("en_ventilation", "dgc_status.e_1002.e_3001.p_36"), SUPPORT_HUMD_MODE_AUTO("sh1", "dgc_status.e_1002.e_3001.p_2F.md.mx"), SUPPORT_HUMD_MODE_DRY("sh2", "dgc_status.e_1002.e_3001.p_31.md.mx"), SUPPORT_HUMD_MODE_COOL("sh3", "dgc_status.e_1002.e_3001.p_0C.md.mx"), SUPPORT_HUMD_MODE_HEAT("sh4", "dgc_status.e_1002.e_3001.p_2D.md.mx"), SUPPORT_HUMD_MODE_HUM("shh", "dgc_status.e_1002.e_3001.p_33.md.mx"), SHUM_STEP_VALUE_AUTO("shum_step_val_1", "dgc_status.e_1002.e_3001.p_2E.md.st"), SHUM_STEP_VALUE_DRY("shum_step_val_2", "dgc_status.e_1002.e_3001.p_30.md.st"), SHUM_STEP_VALUE_COOL("shum_step_val_3", "dgc_status.e_1002.e_3001.p_0B.md.st"), SHUM_STEP_VALUE_HEAT("shum_step_val_4", "dgc_status.e_1002.e_3001.p_2C.md.st"), SHUM_STEP_VALUE_HUM("shum_step_val_shh", "dgc_status.e_1002.e_3001.p_32.md.st"), POWER("pow", "dgc_status.e_1002.e_A002.p_01"), VENTILATION_24HOUR_3E("ventilation_24hour", "dgc_status.e_1002.e_3003.p_3E"), VENTILATION_24HOUR_39("ventilation_24hour", "dgc_status.e_1002.e_3003.p_39"), VENTILATION_POWER("ventilation_power", "dgc_status.e_1002.e_3001.p_36"), VENTILATION_SPEED("ventilation_speed", "dgc_status.e_1002.e_3001.p_1C"), ROOM_TEMPERATURE("htemp", "dgc_status.e_1002.e_A00B.p_01"), ROOM_HUMIDITY("hhum", "dgc_status.e_1002.e_A00B.p_02"), OUTDOOR_TEMPERATURE("otemp", "dgc_status.e_1003.e_A00D.p_01"), OUTDOOR_COMPRESSOR_FREQUENCY("cmpfreq", "dgc_status.e_1003.e_2006.p_04"), MOMENTARY_POWER("mompow", "dgc_status.e_1003.e_A005.p_01"), FILTER_SIGN("filter_sign", "dgc_status.e_1002.e_3001.p_15"), WATER_INTERNAL_CLEANING("water_internal_cleaning", "dgc_status.e_1002.e_3003.p_52"), FORMAT("format", ""), F_DETAIL("f_detail", ""), SCHEDULE_NUMBER("scdl_num", ""), SCHEDULE_PER_DAY("scdl_per_day", "per_day"), ENABLE_SCHEDULE("en_scdltimer", "en_scdltimer"), SCHEDULE_ACTIVE_NUMBER("active_no", "active_no"), SCHEDULE_NAME1("scdl1_name", "name"), SCHEDULE_NAME2("scdl2_name", ""), SCHEDULE_NAME3("scdl3_name", ""), SCHEDULE_MONDAY("mo", "body.mo"), SCHEDULE_TUESDAY("tu", "body.tu"), SCHEDULE_WEDNESDAY("we", "body.we"), SCHEDULE_THURSDAY("th", "body.th"), SCHEDULE_FRIDAY("fr", "body.fr"), SCHEDULE_SATURDAY("sa", "body.sa"), SCHEDULE_SUNDAY("su", "body.su"), PRICE_INT("price_int", "price.int"), PRICE_DEC("price_dec", "price.dec"), TARGET("target", "target"), TODAY_RUNTIME("today_runtime", "week_power.today_runtime"), DATAS("datas", "week_power.datas"), PREVIOUS_YEAR("previous_year", "year_power.previous_year"), THIS_YEAR("this_year", "year_power.this_year"), PATROL_MODE("patrol_mode", "setting.mode"), PATROL_HIGH_TEMP("patrol_hi_stemp", "setting.hi_stemp"), PATROL_LOW_TEMP("patrol_lo_stemp", "setting.lo_stemp"), PATROL_STATUS("patrol_status", "status.status"), PATROL_HIGH_TEMP_MIN("hi_temp_min", "spec.hi_temp_min"), PATROL_HIGH_TEMP_MAX("hi_temp_max", "spec.hi_temp_max"), PATROL_LOW_TEMP_MIN("lo_temp_min", "spec.lo_temp_min"), PATROL_LOW_TEMP_MAX("lo_temp_max", "spec.lo_temp_max"), PATROL_OFF_FLAG("patrol_off_flg", "notify.off_flg"), PATROL_OFF_TIME("patrol_off_tm", "notify.off_tm");

IN_HOME_TO = "/dsiot/edge/adr_0100.dgc_status" OUT_OF_HOME_TO_1 = "/dsiot/edges/" OUT_OF_HOME_TO_2 = "/adr_0100.dgc_status" PROPERTY_NAME_DGC_STATUS = "dgc_status" PROPERTY_NAME_E_1002 = "e_1002" PROPERTY_NAME_E_3001 = "e_3001" PROPERTY_NAME_E_3007 = "e_3007" PROPERTY_NAME_E_A002 = "e_A002" PROPERTY_NAME_P_01 = "p_01" PROPERTY_NAME_P_03 = "p_03" PROPERTY_NAME_P_04 = "p_04" PROPERTY_NAME_P_06 = "p_06" PROPERTY_NAME_P_13 = "p_13" PROPERTY_NAME_P_14 = "p_14" PROPERTY_NAME_P_15 = "p_15" PROPERTY_NAME_P_16 = "p_16" PROPERTY_NAME_P_18 = "p_18" PROPERTY_NAME_P_2A = "p_2A" PROPERTY_NAME_P_3F = "p_3F"

KEY_MAX_VALUE = "mx" KEY_META_DATE = "md" KEY_MIN_VALUE = "mi" KEY_PRIMITIVE_CONTENT = "pc" KEY_PROPERTY_CHILDREN = "pch" KEY_PROPERTY_RESOURCE_NAME = "pn" KEY_PROPERTY_RESOURCE_TYPE = "pt" KEY_PROPERTY_VALUE = "pv" KEY_STEP_VALUE = "st" OPERATION_DELETE = 4 OPERATION_GET = 2 OPERATION_UPDATE = 3 REQUEST_URI = "/dsiot/multireq"

And Ex. get pv value in Java


import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        System.out.println(getDecimalFromBinary("0A00"));
        System.out.println(getBinaryFromDecimal(10, true));
    }

    public static final String getBinaryFromDecimal(int i, boolean z) {
        if (z) {
            String format = String.format("%04X", Arrays.copyOf(new Object[]{Integer.valueOf(i)}, 1));
            return convertByteData(format);
        }
        String format2 = String.format("%02X", Arrays.copyOf(new Object[]{Integer.valueOf(i)}, 1));
        return format2;
    }

    public static final int getDecimalFromBinary(String str) {
        if (str.length() == 4) {
            Integer q = q(convertByteData(str), 16);
            if (q == null) {
                return 0;
            }
            return q.intValue();
        }
        Integer q2 = q(str, 16);
        if (q2 == null) {
            return 0;
        }
        return q2.intValue();
    }

    private static final String convertByteData(String str) {
        StringBuilder sb = new StringBuilder();
        int length = (str.length() / 2) - 1;
        if (length >= 0) {
            while (true) {
                int i = length - 1;
                int i2 = length * 2;
                String substring = str.substring(i2, i2 + 2);
                sb.append(substring);
                if (i < 0) {
                    break;
                }
                length = i;
            }
        }
        String sb2 = sb.toString();
        return sb2;
    }

    public static final Integer q(String str, int i) {
        int i2;
        int i3;
        int length = str.length();
        if (length == 0) {
            return null;
        }
        int i4 = 0;
        char charAt = str.charAt(0);
        boolean z = true;
        int i5 = -2147483647;
        if ((charAt < '0' ? (char) 65535 : charAt == '0' ? (char) 0 : (char) 1) >= 0) {
            i2 = 0;
            z = false;
        } else if (length == 1) {
            return null;
        } else {
            if (charAt == '-') {
                i5 = Integer.MIN_VALUE;
                i2 = 1;
            } else if (charAt != '+') {
                return null;
            } else {
                i2 = 1;
                z = false;
            }
        }
        int i6 = -59652323;
        while (i2 < length) {
            int digit = Character.digit((int) str.charAt(i2), i);
            if (digit < 0) {
                return null;
            }
            if ((i4 < i6 && (i6 != -59652323 || i4 < (i6 = i5 / i))) || (i3 = i4 * i) < i5 + digit) {
                return null;
            }
            i4 = i3 - digit;
            i2++;
        }
        return z ? Integer.valueOf(i4) : Integer.valueOf(-i4);
    }
}
tasict commented 5 months ago

Dear guys, I found that this author has dissected most of the syntax used in the new API and shared it in the articles they wrote.

https://ydn.jp/archives/12367

jwillemsen commented 5 months ago

See https://github.com/rospogrigio/daikin_residential/issues/182, Daikin announced there the Daikin Europe Developer Portal

Gtwizzy commented 5 months ago

See rospogrigio/daikin_residential#182, Daikin announced there the Daikin Europe Developer Portal

This is AMAZING news thanks for finding this #jwillemsen. Hopefully this will mean we'll be able to get this integration back on track relatively quickly once all of this comes online. Who knows we might even be able to get a local API running from it which would be EVEN better.

denismilanovic commented 5 months ago

Not really good news at all that Daikin wants everyone to switch to a cloud integration with ridiculously low polling limits. Might as well use a Sensibo at that point.

MikeatLorne commented 4 months ago

is there any update on this? it must be affecting lots of people (me included) but unfortunately I do not have the skills to address it

blakeseufert commented 3 months ago

Daikin is essentially broken for me as I cannot downgrade. 😕

blindahl commented 3 months ago

Have anyone got BRP069B4 to work with the integration? I get this error as soon as I enter IP and API key image For translation it says "Unable to connect". It appears immediately when clicking save.

jwillemsen commented 3 months ago

Is the BRP069B4 using the daikin onecta app? If so, you need an integration using the daikin cloud, fe https://github.com/jwillemsen/daikin_residential_altherma

sammularczyk commented 3 months ago

This Rust app works with my Australian 2022 Daikin Alira X on 2.8.0, adapter BRP084C44, when all HA integrations don't: https://github.com/mzyy94/daikin-homekit

Can confirm that this works without having to provide a username and password to login, so assuming it operates with some kind of local API. Running the app autodiscovers the Aircon and creates a new Homekit device. Once added to the phone, the aircon responds instantly.

I personally don't know enough to do anything with this, but maybe it will help to develop a solution?

EDIT: Homebridge plugin based on undocumented local API in active development here https://github.com/tasict/homebridge-daikin-local-platform

Gtwizzy commented 3 months ago

This Rust app works with my Australian 2022 Daikin Alira X on 2.8.0, adapter BRP084C44, when all HA integrations don't: https://github.com/mzyy94/daikin-homekit

Can confirm that this works without having to provide a username and password to login, so assuming it operates with some kind of local API. Running the app autodiscovers the Aircon and creates a new Homekit device. Once added to the phone, the aircon responds instantly.

I personally don't know enough to do anything with this, but maybe it will help to develop a solution?

EDIT: Homebridge plugin based on undocumented local API in active development here https://github.com/tasict/homebridge-daikin-local-platform

@sammularczyk I'm on an android device could you please explain how this works and or how it bridges the gap in the HA functionality?

icovada commented 3 months ago

is there any update on this? it must be affecting lots of people (me included) but unfortunately I do not have the skills to address it

Hi, unfortunately the pydaikin library isn't flexible enough to support adding a new model out of the box. I've been working on a possible v3, modified to support other models and further data formats. Unfortunately, I haven't really been that much up to do much at all for the past... 6 months. My bad.

The plan is:

blakeseufert commented 3 months ago

is there any update on this? it must be affecting lots of people (me included) but unfortunately I do not have the skills to address it

Hi, unfortunately the pydaikin library isn't flexible enough to support adding a new model out of the box. I've been working on a possible v3, modified to support other models and further data formats. Unfortunately, I haven't really been that much up to do much at all for the past... 6 months. My bad.

The plan is:

  • release a completely rewritten v3 with equal functionality to the current version
  • update hass dependencies to v3 and hope no one complains
  • meanwhile work on the new integration
  • update hass with v3.1 with support for this new data format

Your efforts would be incredibly appreciated 🙏