IRremoteESP8266
IRremoteESP8266 copied to clipboard
Argo Ulisse 13 IR messages not decoding correctly
Version/revision of the library used
2.8.2/master
Describe the bug
IR messages captured from an Argo Ulisse 13 remote are not detected as such. Also there seem to be messages of different length while the library only tries to match the longer ones.
To Reproduce
Use IRremoteESP8266: IRrecvDumpV2 to capture messages
Output of raw data from IRrecvDumpV2.ino or V3 (if applicable)
10:18:33.818 -> Library : v2.8.2
Manual ON
10:18:33.818 -> Protocol : UNKNOWN
10:18:33.818 -> Code : 0x5D1B22E5 (92 Bits)
10:18:33.818 -> uint16_t rawData[183] = {6418, 3168, 442, 836, 442, 834, 442, 2114, 442, 2114, 442, 836, 442, 2114, 442, 836, 440, 2114, 442, 2114, 442, 836, 442, 2112, 442, 834, 442, 2112, 442, 2112, 444, 2112, 442, 2114, 442, 836, 442, 836, 442, 834, 442, 834, 442, 2112, 442, 836, 442, 834, 442, 836, 440, 2114, 442, 836, 440, 2114, 442, 836, 442, 836, 440, 836, 442, 2112, 442, 2114, 442, 836, 442, 2114, 442, 2114, 442, 836, 442, 836, 442, 836, 440, 836, 442, 836, 442, 836, 442, 836, 442, 836, 440, 836, 442, 836, 440, 2114, 442, 2114, 442, 2114, 442, 836, 440, 838, 440, 836, 442, 836, 440, 838, 440, 836, 440, 836, 440, 836, 442, 2114, 440, 2116, 440, 2114, 442, 2114, 440, 2114, 440, 2114, 442, 2114, 442, 836, 440, 2114, 440, 836, 442, 2114, 442, 836, 440, 836, 442, 836, 442, 836, 440, 836, 440, 836, 440, 836, 440, 836, 440, 836, 440, 836, 440, 2114, 442, 836, 440, 2114, 442, 836, 440, 2114, 442, 836, 440, 2116, 440, 836, 440, 836, 440, 836, 440, 836, 442, 836, 440, 2114, 442}; // UNKNOWN 5D1B22E5
Manual OFF
10:18:40.641 -> Protocol : UNKNOWN
10:18:40.641 -> Code : 0x4162A6F0 (92 Bits)
10:18:40.641 -> uint16_t rawData[183] = {6384, 3206, 414, 864, 414, 864, 412, 2144, 412, 2142, 412, 864, 412, 2142, 414, 864, 412, 2144, 412, 2144, 410, 866, 412, 2142, 412, 866, 412, 2142, 412, 2144, 412, 2144, 412, 2170, 386, 866, 412, 864, 412, 866, 410, 866, 412, 2144, 412, 866, 412, 864, 412, 864, 412, 2144, 410, 866, 412, 2144, 412, 890, 386, 864, 412, 866, 412, 2144, 410, 2144, 412, 866, 410, 2172, 386, 2168, 386, 892, 360, 916, 386, 892, 386, 892, 386, 892, 386, 890, 386, 892, 384, 892, 386, 868, 408, 892, 386, 2170, 386, 2170, 384, 2170, 384, 892, 384, 892, 362, 916, 384, 892, 360, 916, 360, 916, 360, 916, 360, 918, 360, 2194, 360, 2194, 362, 2194, 386, 2170, 360, 2196, 360, 2196, 358, 2196, 360, 916, 384, 2172, 360, 918, 360, 2194, 360, 918, 358, 918, 362, 916, 360, 918, 360, 918, 360, 918, 360, 918, 360, 918, 360, 916, 360, 918, 360, 916, 360, 918, 360, 2196, 360, 918, 360, 2194, 362, 916, 360, 2196, 360, 918, 360, 918, 360, 918, 360, 2196, 360, 2196, 360, 918, 360}; // UNKNOWN 4162A6F0
Manual target temperature change 24->25
10:19:45.713 -> Protocol : UNKNOWN
10:19:45.713 -> Code : 0xD21627D (93 Bits)
10:19:45.713 -> uint16_t rawData[185] = {634, 402, 5320, 3258, 362, 916, 360, 916, 384, 2144, 412, 2170, 386, 892, 384, 2170, 360, 916, 360, 2194, 384, 2170, 360, 916, 362, 2194, 360, 916, 360, 2194, 362, 2194, 362, 2194, 360, 2168, 388, 916, 360, 916, 360, 916, 360, 916, 362, 2194, 360, 916, 362, 2194, 360, 916, 360, 2196, 360, 918, 360, 2194, 360, 918, 360, 916, 360, 918, 360, 2194, 360, 2194, 362, 916, 360, 2196, 360, 2194, 362, 916, 360, 916, 360, 918, 358, 918, 360, 918, 360, 916, 360, 918, 360, 918, 360, 916, 360, 918, 360, 2196, 358, 2196, 360, 2196, 360, 918, 358, 918, 360, 918, 360, 918, 360, 918, 360, 918, 360, 918, 360, 918, 358, 2196, 360, 2196, 360, 2196, 360, 918, 358, 918, 358, 918, 362, 916, 360, 2196, 358, 2196, 360, 918, 358, 2196, 358, 918, 360, 918, 358, 918, 358, 918, 358, 918, 360, 918, 360, 918, 358, 918, 358, 920, 358, 918, 358, 2198, 358, 918, 358, 2196, 358, 918, 358, 2196, 358, 1010, 268, 2198, 358, 920, 356, 2198, 358, 920, 358, 1010, 266, 2198, 358, 2198, 358}; // UNKNOWN D21627D
Manual target temperature change 25->24
10:20:14.030 -> Protocol : UNKNOWN
10:20:14.030 -> Code : 0xE923CB07 (92 Bits)
10:20:14.030 -> uint16_t rawData[183] = {6386, 3206, 414, 862, 416, 862, 414, 2140, 414, 2140, 414, 862, 416, 2140, 414, 864, 414, 2140, 414, 2142, 414, 862, 414, 2142, 414, 864, 414, 2142, 414, 2142, 414, 2142, 414, 2140, 414, 862, 414, 864, 414, 862, 414, 864, 414, 2142, 414, 864, 412, 862, 416, 862, 414, 2142, 414, 864, 412, 2142, 414, 864, 414, 866, 412, 864, 412, 2142, 414, 2142, 414, 864, 412, 2142, 412, 2142, 412, 864, 414, 862, 414, 864, 414, 864, 412, 864, 412, 864, 414, 888, 388, 874, 404, 864, 414, 890, 386, 2142, 414, 2142, 412, 2142, 412, 866, 412, 890, 388, 890, 386, 890, 388, 890, 388, 890, 386, 866, 412, 890, 388, 2168, 388, 2168, 388, 2168, 386, 890, 386, 890, 386, 890, 386, 890, 386, 2168, 388, 2168, 388, 890, 386, 2168, 386, 892, 386, 890, 386, 890, 386, 890, 388, 890, 386, 892, 386, 890, 386, 892, 386, 890, 386, 890, 386, 2170, 386, 892, 386, 2170, 386, 890, 386, 2170, 386, 890, 386, 2170, 386, 892, 386, 2170, 386, 890, 386, 892, 386, 890, 386, 2170, 386}; // UNKNOWN E923CB07
Manual target temperature change 24->25
10:42:12.339 -> Protocol : UNKNOWN
10:42:12.339 -> Code : 0x2D0000E3 (92 Bits)
10:42:12.339 -> uint16_t rawData[183] = {6418, 3168, 442, 834, 442, 834, 442, 2112, 444, 2112, 444, 832, 444, 2112, 444, 834, 442, 2112, 444, 2112, 442, 834, 444, 2112, 444, 834, 442, 2112, 442, 2112, 442, 2112, 444, 2112, 444, 834, 444, 834, 442, 834, 442, 834, 442, 2112, 444, 834, 444, 2112, 444, 834, 442, 2112, 442, 834, 442, 2112, 442, 836, 442, 834, 442, 2112, 444, 2112, 442, 2112, 442, 834, 442, 2112, 444, 2112, 442, 834, 442, 834, 442, 834, 444, 834, 442, 834, 442, 834, 442, 836, 442, 834, 442, 834, 442, 836, 442, 2112, 442, 2112, 444, 2112, 442, 836, 442, 834, 442, 834, 442, 834, 442, 836, 442, 836, 442, 834, 442, 836, 442, 2114, 442, 2112, 442, 2112, 442, 834, 442, 2112, 442, 2114, 442, 834, 442, 836, 442, 836, 442, 2112, 442, 2112, 442, 834, 442, 836, 442, 836, 442, 834, 442, 836, 442, 836, 442, 836, 442, 836, 442, 836, 442, 836, 442, 2114, 442, 836, 440, 2114, 442, 836, 442, 2114, 442, 2114, 442, 2114, 442, 836, 440, 2114, 442, 2114, 442, 836, 442, 836, 440, 2114, 442}; // UNKNOWN 2D0000E3
Silent temperature message 30C:
10:22:04.919 -> Protocol : UNKNOWN
10:22:04.919 -> Code : 0x936639B2 (34 Bits)
10:22:04.919 -> uint16_t rawData[67] = {6386, 3204, 414, 862, 416, 862, 414, 2140, 414, 2140, 414, 864, 414, 2140, 416, 862, 414, 2140, 416, 2140, 416, 862, 414, 2142, 414, 864, 414, 2142, 414, 2140, 414, 2142, 414, 2142, 414, 862, 414, 2142, 416, 862, 414, 864, 414, 2140, 414, 862, 414, 2142, 414, 2142, 414, 2142, 412, 2142, 414, 864, 412, 864, 414, 2142, 412, 2144, 412, 2142, 414, 864, 412}; // UNKNOWN 936639B2
Silent temperature message 29C:
10:23:09.423 -> Protocol : UNKNOWN
10:23:09.423 -> Code : 0x716DD4C0 (34 Bits)
10:23:09.423 -> uint16_t rawData[67] = {6420, 3168, 442, 834, 442, 834, 442, 2112, 444, 2112, 442, 834, 442, 2112, 444, 834, 442, 2112, 442, 2112, 442, 834, 444, 2112, 442, 834, 442, 2112, 442, 2114, 442, 2112, 442, 2112, 442, 836, 442, 2112, 444, 836, 442, 2112, 444, 834, 442, 836, 442, 2112, 442, 2114, 442, 2112, 442, 2112, 442, 834, 442, 2114, 442, 836, 442, 2112, 442, 2114, 442, 836, 442}; // UNKNOWN 716DD4C0
Silent temperature message 28C:
10:27:22.916 -> Protocol : UNKNOWN
10:27:22.916 -> Code : 0x6149090 (34 Bits)
10:27:22.916 -> uint16_t rawData[67] = {6418, 3168, 444, 834, 444, 834, 442, 2112, 444, 2112, 444, 834, 442, 2114, 442, 834, 442, 2112, 444, 2112, 444, 832, 442, 2114, 442, 834, 442, 2112, 442, 2114, 442, 2112, 444, 2112, 442, 834, 442, 2112, 444, 834, 442, 834, 442, 834, 442, 834, 442, 2114, 442, 2114, 442, 2112, 442, 2112, 442, 834, 444, 834, 442, 834, 442, 2112, 442, 2112, 442, 836, 442}; // UNKNOWN 6149090
Circuit diagram and hardware used (if applicable)
https://www.wemos.cc/en/latest/d1/d1_mini.html https://www.wemos.cc/en/latest/d1_mini_shield/ir.html
I have followed the steps in the Troubleshooting Guide & read the FAQ
Yes
Has this library/code previously worked as expected for you?
No
@zpin Can you please download and try branch Issue1859 https://github.com/crankyoldgit/IRremoteESP8266/tree/Issue1859 and let me know how it goes.
It should decode the (very) short messages now. It doesn't do everything yet.
I've also tried to use more common code for your sendSensorTemp()
too. So please re-test that too.
Also, can you determine the minimum and maximum for the sensor temp from the remote? e.g. Put it in the fridge/freezer to get the minimum temp. Maybe a hairdryer for the maximum.
Seems to work fine from what I can tell. It's hard to test exactly because there's no acknowledgement and the unit takes several minutes to react to a change. It also manages to decode the temperature messages but still doesn't recognize the normal messages.
Temperature range looks like [5...35] celsius. Capture starting at 29, heating up (40+ C I'd say), then letting cool down: tmphigh.txt Capture starting at <0 C, then letting warm up: tmplow.txt
Looking at that data, it seems 35C is the max sensor temp recorded, and the lowest is 5C.
I'll look at adding the appropriate limits to sendSensorTemp()
so we don't have anything go terribly wrong.
Thanks for confirming the sensor temps are being detected.
I've added bounds checking to that funtion, so we don't get any unexpected results. FWIW, mathematically the minimum sensor temp looks like it could be 4C. So I've allowed that. Branch updated etc.
Now, what is the deal with the rest of the messages.
What messages are correctly decoded & which ones are not?
Also, can you please provide all the brand/model numbers of the remote and the A/C unit?
The A/C support for this protocol was user submitted code. So it doesn't have the same level of unit test coverage/support and confidence. (i.e. I can't verify that it works fully)
It's a AxAir Ulisse 13 DCI ECO
and the remote says SAC WREM-2 V1
. It looks like it comes under different brands (Argo, AxAir, Krueger, AirBlue, ...), as Ulisse 13 DCI ECO
but there's others that look exactly the same, e.g. Technibel SCDF32 4000W
, Climia CMK 4000
.
It might have been an incomplete capture before, it does show ARGO now but the sensor temp is wrong, it should use the RoomTemp
from these messages instead. Also, these messages are not 32bit but somewhere around 90-96 (96 according to the size of the state struct but that didn't capture correctly before). I suspect the temperature messages might also be longer but maybe don't get recorded correctly because they are mostly empty.
Here's a few captures of normal remote functions:
ON:
13:48:02.392 -> Timestamp : 000090.093
13:48:02.392 -> Library : v2.8.2
13:48:02.392 ->
13:48:02.392 -> Protocol : ARGO
13:48:02.392 -> Code : 0xACF5D0E4 (32 Bits)
13:48:02.392 -> Mesg Desc.: Sensor Temp: 30C
13:48:02.392 -> uint16_t rawData[183] = {6418, 3168, 442, 836, 440, 836, 440, 2114, 440, 2114, 442, 836, 440, 2114, 440, 836, 442, 2114, 442, 2114, 440, 836, 440, 2114, 442, 836, 440, 2114, 442, 2114, 442, 2114, 442, 2114, 442, 836, 440, 836, 442, 836, 440, 836, 440, 2114, 440, 838, 440, 2114, 442, 2114, 440, 836, 440, 836, 442, 2114, 440, 836, 440, 836, 442, 2114, 440, 2116, 440, 2114, 440, 836, 440, 2114, 442, 2114, 440, 836, 440, 838, 440, 838, 440, 836, 440, 836, 440, 836, 440, 836, 442, 836, 438, 838, 440, 836, 440, 2114, 440, 2114, 440, 2114, 440, 838, 440, 838, 440, 836, 440, 838, 440, 838, 440, 838, 440, 836, 440, 838, 440, 2116, 440, 2114, 440, 2116, 440, 838, 440, 838, 438, 838, 440, 836, 440, 838, 440, 838, 438, 838, 438, 2116, 440, 2114, 440, 838, 440, 838, 438, 838, 440, 838, 440, 838, 438, 840, 438, 838, 440, 838, 440, 838, 440, 2116, 440, 838, 438, 2116, 440, 838, 440, 2116, 440, 838, 440, 838, 438, 838, 438, 838, 438, 2116, 440, 2116, 438, 2116, 440, 2116, 438}; // ARGO
13:48:02.491 -> uint8_t state[4] = {0xAC, 0xF5, 0xD0, 0xE4};
13:48:02.491 ->
13:48:02.491 ->
OFF:
13:48:04.312 -> Timestamp : 000092.033
13:48:04.312 -> Library : v2.8.2
13:48:04.312 ->
13:48:04.312 -> Protocol : ARGO
13:48:04.312 -> Code : 0xACF5D0E4 (32 Bits)
13:48:04.312 -> Mesg Desc.: Sensor Temp: 30C
13:48:04.345 -> uint16_t rawData[183] = {6418, 3170, 440, 838, 438, 838, 438, 2114, 440, 2114, 440, 866, 412, 2114, 440, 840, 438, 2114, 440, 2114, 440, 864, 412, 2114, 442, 864, 412, 2114, 442, 2114, 440, 2116, 440, 2114, 440, 866, 412, 866, 412, 866, 412, 866, 412, 2116, 440, 864, 412, 2116, 440, 2114, 440, 866, 412, 866, 412, 2116, 440, 866, 412, 866, 412, 2116, 440, 2114, 440, 2116, 440, 866, 412, 2114, 440, 2116, 440, 866, 412, 864, 412, 866, 412, 864, 412, 864, 412, 866, 410, 866, 410, 866, 412, 866, 410, 864, 412, 2116, 440, 2116, 440, 2116, 440, 866, 410, 866, 412, 866, 412, 866, 412, 866, 412, 866, 410, 866, 412, 866, 412, 2116, 440, 2116, 440, 2114, 440, 866, 412, 866, 412, 866, 410, 866, 412, 866, 410, 866, 412, 866, 412, 2116, 440, 2116, 438, 866, 412, 866, 412, 866, 412, 866, 412, 866, 412, 866, 412, 866, 412, 866, 412, 866, 410, 866, 412, 866, 412, 2116, 438, 866, 410, 2116, 440, 866, 410, 866, 410, 866, 412, 866, 410, 2116, 438, 868, 410, 2116, 438, 2116, 438}; // ARGO
13:48:04.412 -> uint8_t state[4] = {0xAC, 0xF5, 0xD0, 0xE4};
13:48:04.412 ->
13:48:04.412 ->
ON:
13:48:06.233 -> Timestamp : 000093.964
13:48:06.233 -> Library : v2.8.2
13:48:06.266 ->
13:48:06.266 -> Protocol : ARGO
13:48:06.266 -> Code : 0xACF5D0E4 (32 Bits)
13:48:06.266 -> Mesg Desc.: Sensor Temp: 30C
13:48:06.266 -> uint16_t rawData[183] = {6418, 3168, 440, 836, 440, 836, 442, 2114, 440, 2114, 442, 836, 440, 2114, 440, 836, 440, 2114, 442, 2114, 440, 836, 440, 2114, 440, 838, 440, 2114, 442, 2114, 442, 2114, 440, 2114, 440, 838, 440, 838, 440, 836, 440, 836, 440, 2114, 440, 836, 440, 2114, 440, 2116, 440, 838, 440, 838, 440, 2114, 440, 838, 440, 836, 440, 2116, 440, 2114, 440, 2116, 440, 838, 440, 2116, 440, 2114, 440, 838, 438, 838, 438, 838, 440, 838, 440, 838, 438, 838, 440, 838, 440, 838, 438, 840, 438, 838, 438, 2116, 440, 2116, 440, 2116, 440, 838, 438, 838, 438, 838, 438, 866, 412, 840, 438, 840, 438, 864, 412, 840, 438, 2116, 440, 2116, 440, 2116, 440, 840, 438, 840, 438, 866, 412, 838, 440, 864, 412, 866, 410, 866, 412, 2116, 440, 2116, 438, 866, 412, 866, 410, 866, 412, 866, 412, 866, 410, 866, 410, 866, 410, 866, 410, 866, 412, 2116, 438, 866, 412, 2116, 440, 866, 410, 2116, 440, 866, 412, 866, 412, 866, 412, 866, 410, 2116, 440, 2116, 440, 2116, 438, 2116, 438}; // ARGO
13:48:06.365 -> uint8_t state[4] = {0xAC, 0xF5, 0xD0, 0xE4};
13:48:06.365 ->
13:48:06.365 ->
Change target temperature from 23 to 24:
13:48:10.107 -> Timestamp : 000097.822
13:48:10.107 -> Library : v2.8.2
13:48:10.107 ->
13:48:10.107 -> Protocol : ARGO
13:48:10.107 -> Code : 0xACF510E5 (32 Bits)
13:48:10.107 -> Mesg Desc.: Sensor Temp: 6C
13:48:10.107 -> uint16_t rawData[183] = {6420, 3168, 442, 836, 440, 838, 440, 2114, 442, 2114, 442, 836, 440, 2114, 442, 836, 440, 2114, 440, 2114, 440, 836, 440, 2114, 440, 836, 442, 2114, 440, 2116, 440, 2114, 440, 2114, 440, 838, 440, 836, 440, 838, 440, 838, 440, 2116, 440, 838, 440, 836, 440, 838, 440, 2116, 440, 838, 440, 2114, 440, 838, 440, 838, 440, 2114, 440, 2114, 442, 2114, 440, 838, 440, 2114, 440, 2114, 442, 836, 440, 838, 438, 838, 438, 838, 438, 838, 438, 838, 440, 838, 438, 838, 440, 838, 438, 838, 440, 2116, 440, 2114, 440, 2114, 440, 838, 438, 840, 438, 838, 438, 840, 438, 838, 438, 838, 438, 838, 438, 840, 438, 2116, 440, 2114, 440, 2116, 440, 840, 438, 840, 438, 838, 438, 840, 438, 864, 412, 840, 438, 840, 438, 2116, 440, 2116, 440, 866, 412, 866, 412, 866, 410, 866, 412, 866, 412, 864, 412, 866, 412, 866, 410, 866, 410, 2116, 440, 866, 412, 2116, 440, 866, 412, 2116, 438, 2116, 440, 866, 410, 866, 412, 866, 410, 2116, 438, 2116, 440, 866, 412, 866, 412}; // ARGO
13:48:10.207 -> uint8_t state[4] = {0xAC, 0xF5, 0x10, 0xE5};
13:48:10.207 ->
13:48:10.207 ->
Hi,
I'm currently in process of adding support for what seems to be next generation of this remote (WREM-3
- it's capacitive btn./touch-based, see: https://argoclima.com/en/prodotti/argo-ulisse-eco/ ).
While at it, I figured I could extract/reuse common code, but unfortunately as I don't own a WREM-2
remote, so probably won't be able to refactor the code too much.
From what I gathered, the new remote seems to have a slightly different AC protocol (message lengths, checksums calculated differently...), but seems to have quite a few similarities as well.
For example, the new remote has 4 types of commands:
-
[0b00]
Regular/operation - 6-byte IR command (AC operation, like on/off, temp set...) -
[0b01]
iFeel Temperature report - 2-byte IR command (temp+3-bit checksum) -
[0b10]
Timer command - 9-byte -
[0b11]
Config command - 4-byte
Am I reading it correctly that for WREM-2, "regular" + "timer" is actually one jumbo command, and "config" does not exist at all?
If someone who owns this remote could confirm it would help me decide how much is there to reuse. Thx in advance!
On another note... the IRArgoAC::sendSensorTemp()
method which sends the (shorter) iFeel report is only exposed from IRArgoAC
itself. I would really like for this to be exposed through https://github.com/crankyoldgit/IRremoteESP8266/blob/9228143207ab7e2968a42d9a92e246237af7bb83/src/IRac.h#L74 ... which would allow for a generic interface, and straightforward use in downstream projects, like Tasmota IR, for example (e.g. somewhere here).
Extending stdAc::state_t
to sth like
struct state_t {
// (...) existing fields
float sensorTemp = -1.0; // -1 for not present
// consider: std:optional<>, when project moves to c++17
};
seems straightforward enough (esp. since I see that lot of AC protocols have iFeel
and getSensorTemp()
/ setSensorTemp(...)
.
What I struggle with, is - given Argo sends separate commands (e.g. 4B for iFeel report as per my post above) - how should the generic i-face allow the user to choose what they want? (it's an either-or choice for this protocol).
Naive implementation: (if sensorTemp
is set -> send it and disregard any other state param) would work, but is not exactly scalable nor explicit. On the other hand, translating one sendAc(...)
invocation into, potentially, a series of 1..4 commands does not seem to be too intuitive either :(
@crankyoldgit do you have a preference or pointers here? Is something like this being done anywhere in the library already?
Sorry for the churn...
@crankyoldgit - are you by any chance planning to merge Issue1859
branch anytime soon?
I'm adding the WREM3 remote support (new Argo remote type) and, while the code would be mostly addon on top of what is there, there is a common part I'm touching as well. For now I've branched off of Issue1859
to minimize merge conflicts, but can also base off of master
if the former is not going to be merged soon.
I hope to have my PR ready this or next weekend, likely. Please advise
Apologies. I had forgotten about that branch. No sure were I was/am with that. Created PR #1906 to merge it in.
@mbronk it's now merged