Open epajfl00 opened 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!
(message by CodeOwnersMention)
daikin documentation daikin source (message by IssueLinks)
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.
There is a big warning on the integration page: https://www.home-assistant.io/integrations/daikin/
This is probably the same issue with your BRP084C44
.
Only solution as I see it is to use https://github.com/revk/ESP32-Faikin.
same issue with @epajfl00
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.
Same issue. Is it possible to downgrade the firmware version 1.9.0 of the AC ?"
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.
@home-assistant rename Daikin WIFI controller BRP084Cxx firmware update from 1.19.0 to 2.8.0 breaks local API
@home-assistant close
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:
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"
}
]
}
@home-assistant reopen
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.
@icovada can you help us with decipher and implement support for 2.8?
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)
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?
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
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?
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
@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.
Amazing, thank you very much.
I'm a little busy now but this will definitely help a lot to create something done properly
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.
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
Thanks, anything you have is of great help.
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?
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.
We should update doc once we have fw 2.8.0 support (see my PR above).
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.
``` 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.
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
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
@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! ♥️
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 🫡
@chrisp250 have you tried sending PUTs containing only single values and not entire blocks like the app does?
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?
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.
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!
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.
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.
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);
}
}
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.
See https://github.com/rospogrigio/daikin_residential/issues/182, Daikin announced there the Daikin Europe Developer Portal
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.
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.
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
Daikin is essentially broken for me as I cannot downgrade. 😕
Have anyone got BRP069B4 to work with the integration? I get this error as soon as I enter IP and API key For translation it says "Unable to connect". It appears immediately when clicking save.
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
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
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?
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:
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 🙏
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