AC IR code decrypting
- 
					
					
					
					
 HI All, I am trying to decode my AC ir codes, so far i have pretty good understanding of what every command is in the code, at list the ones who's interesting to me: mode, fan, temp and on/off. The problem is is that i could not figure the checksum function. 
 Below is some examples of code i got. The last 4 digits seems to me like a checksum, the first 4 digits are the mode and one bit for power on or off, the second 4 bits are for fan speed the 3rd 4 bits are for temp which in the example below is the only thing that is changed:
 cold auto fan, temp:
 16
 1001 0000 0000 000000000110000010100100000000000000100000000000000 1010
 17
 1001 0000 1000 000000000110000010100100000000000000100000000000000 0110
 18
 1001 0000 0100 000000000110000010100100000000000000100000000000000 1110
 19
 1001 0000 1100 000000000110000010100100000000000000100000000000000 0001
 20
 1001 0000 0010 000000000110000010100100000000000000100000000000000 1001
 21
 1001 0000 1010 000000000110000010100100000000000000100000000000000 0101
 22
 1001 0000 0110 000000000110000010100100000000000000100000000000000 1101
 23
 1001 0000 1110 000000000110000010100100000000000000100000000000000 0011
 24
 1001 0000 0001 000000000110000010100100000000000000100000000000000 1011
 25
 1001 0000 1001 000000000110000010100100000000000000100000000000000 0111
 26
 1001 0000 0101 000000000110000010100100000000000000100000000000000 1111
 27
 1001 0000 1101 000000000110000010100100000000000000100000000000000 0000
 28
 1001 0000 0011 000000000110000010100100000000000000100000000000000 1000
 29
 1001 0000 1011 000000000110000010100100000000000000100000000000000 0100
 30
 1001 0000 0111 000000000110000010100100000000000000100000000000000 1100Can some one please help? my eyes are red from looking at this for few days now  Thanks. 
 
- 
					
					
					
					
 Hello, what are the brand and model of your AC and and how do you get this data (processor/board, IR library used, ...) ? It seems you have something wrong as you don't have full bytes. When I try to split in bytes I have 3 bits alone at the end so you are missing data somewhere. Usually the checksum is just a xor. It doesn't seem to be the case for yours, but maybe it's because you are missing some data. 
 
- 
					
					
					
					
 @dpressle you probably just want to control your airco from mysensors, right? 
 Just an idea, but you could also just replay the captured IR sequence, without worrying about the content.
 
- 
					
					
					
					
 Maybe this will work 
 
 
- 
					
					
					
					
 @Nca78 Thanks for the answer. 
 The brand of the AC is a local brand called "Tadiran" (not sure if its world distributed).
 I am capturing the IR code with following arduino code, please note you need this code because AC have very long IR code since every button push the whole state is sent i.e. fan speed temp mode etc.
 Now i know that the code i am capturing is good because i can successfully transmit it back using any IR library.I agree on the uneven bytes and could not figure this out as well, i also tried the XOR checksum and couldn't get it to match. 
 The output i am getting from the code is of time delays which i later convert to binary i use the follow mapping to convert to bin:
 HDR_MARK 9000
 HDR_SPACE 4000
 BIT_MARK 620
 ONE_SPACE 1600
 ZERO_SPACE 540
 MSG_SPACE 19000Please note that there is a message space of around 19 ms that separates the message in to 2 parts, the second part does not change beside the last 4 digits which i think is the checksum. the long pause is right after the 3 digits, so for an example look at the code i got below for a certain operation, they all got the same checksum: 
 cold, 26 C
 Fan:
 Auto
 100100000101000000000110000 0101001000000000000001000000000000001111
 Fan1
 100110000101000000000110000 0101001000000000000001000000000000001111
 Fan2
 100101000101000000000110000 0101001000000000000001000000000000001111
 Fan3
 100111000101000000000110000 0101001000000000000001000000000000001111I appreciate the help and hope we can resolve this as i am about to give up... #define IRpin_PIN PIND #define IRpin 2 // for MEGA use these! //#define IRpin_PIN PINE //#define IRpin 4 // the maximum pulse we'll listen for - 65 milliseconds is a long time #define MAXPULSE 65000 // what our timing resolution should be, larger is better // as its more 'precise' - but too large and you wont get // accurate timing #define RESOLUTION 20 // we will store up to 300 pulse pairs (this is -a lot-) uint16_t pulses[300][2]; // pair is high and low pulse uint8_t currentpulse = 0; // index for pulses we're storing void setup(void) { Serial.begin(9600); Serial.println("Ready to decode IR!"); } void loop(void) { uint16_t highpulse, lowpulse; // temporary storage timing highpulse = lowpulse = 0; // start out with no pulse length // while (digitalRead(IRpin)) { // this is too slow! while (IRpin_PIN & (1 << IRpin)) { // pin is still HIGH // count off another few microseconds highpulse++; delayMicroseconds(RESOLUTION); // If the pulse is too long, we 'timed out' - either nothing // was received or the code is finished, so print what // we've grabbed so far, and then reset if ((highpulse >= MAXPULSE) && (currentpulse != 0)) { printpulses(); currentpulse=0; return; } } // we didn't time out so lets stash the reading pulses[currentpulse][0] = highpulse; // same as above while (! (IRpin_PIN & _BV(IRpin))) { // pin is still LOW lowpulse++; delayMicroseconds(RESOLUTION); if ((lowpulse >= MAXPULSE) && (currentpulse != 0)) { printpulses(); currentpulse=0; return; } } pulses[currentpulse][1] = lowpulse; // we read one high-low pulse successfully, continue! currentpulse++; } void printpulses(void) { // IR Remote Results Serial.println("For IR Remote Arduino sketch: "); Serial.print("unsigned int raw["); Serial.print(currentpulse*2, DEC); Serial.print("] = {"); for (uint8_t i = 0; i < currentpulse; i++) { if(i!=0){ Serial.print(pulses[i][0] * RESOLUTION, DEC); Serial.print(", "); } Serial.print(pulses[i][1] * RESOLUTION, DEC); Serial.print(", "); } Serial.print("};"); Serial.println(""); Serial.print("irsend.sendRaw(raw,"); Serial.print(currentpulse*2, DEC); Serial.print(",38);"); Serial.println(""); Serial.println(""); }```
 
- 
					
					
					
					
 @Yveaux Yes, but i want to be able to control each of the parameters separately and not have to record many operations 
 
- 
					
					
					
					
 Most likely its manufactured by GREE just like most of local branded stuff  
 
- 
					
					
					
					
 @siklosi Thanks but this is for a different AC with different protocol. 
 The biggest problem with these AC companies is that each one creates its own protocol and makes our lives hard...
 
- 
					
					
					
					
 @pjr Dont know this one, not sure your local is my local  
 
- 
					
					
					
					
 Can you please indicate in one of the messages where the 19ms "space" exactly is ? 
 Maybe the 3 extra bits are related to this space and they should be discarded before/after the space ?Never heard about this brand, where do you live ? 
 
- 
					
					
					
					
 @Nca78 The space is where the space is in the binary i wrote (its actually hard to see): 
 100100000101000000000110000 19 ms space 0101001000000000000001000000000000001111I am from Israel. Thanks. 
 
- 
					
					
					
					
 Would these help: https://github.com/ToniA/arduino-heatpumpir 
 https://github.com/ToniA/Raw-IR-decoder-for-Arduino
 
- 
					
					
					
					
 I can send the timings i get from the code before i convert to bin, since i am converting it with notepad++ i might be wrong. 
 
- 
					
					
					
					
 @ToniA I love your library but non of your pre-defined AC's worked for mine. 
 I will defiantly use it once i crack the code of this AC and will pull it to your repository.Thanks. 
 
- 
					
					
					
					
 How about writing a new decode module into Raw-IR-decoder-for-Arduino? I find it very useful in trying to figure out how a certain A/C protocol works. 
 
- 
					
					
					
					
 Gree is the most largest manufacturer of AC devices and Tadiran outdoor unit looks quite a lot like Gree.. at least I'd try that first. e: Oh. Looks like Carrier also has some relation with Tadiran. 
 
- 
					
					
					
					
 @ToniA can you elaborate? 
 
- 
					
					
					
					
 @dpressle said: @ToniA can you elaborate? From wikipedia : 
 "Tadiran Appliances (also known as Tadiran Air Conditioners), was acquired by the Carrier Corporation, the worldโs largest manufacturer and distributor of heating, ventilating and air conditioning (HVAC) systems, itself a subsidiary of United Technologies Corporation (UTC) of the USA and a constitute of Dow Jones Industrial Average. Carrier initially acquired 26%of the company in 1997 and took full ownership of it in 2004.[2]"So looking for Carrier AC infrared should probably help. 
 Is the reference of your remote control (on the sticker at the back) YB1FA ? As it seems to be shared by gree/carrier/tadiran/ferroli/condor
 
- 
					
					
					
					
 From the temperature codes, the checksum is obviously a sum, you have to reverse the bits before you sum, the MSB is on the right in both data bits and checksum. 16ยฐ 0000 checksum 0101 
 17ยฐ 0001 checksum 0110 = 0101 + 0001
 18ยฐ 0010 checksum 0111 = 0101 + 0010
 19ยฐ 0011 checksum 1000 = 0101 + 0011
 20ยฐ 0100 checksum 1001 = 0101 + 0100
 ...
 27ยฐ 1101 checksum 0000 because 0101 + 1101 = 10000 and you keep only the last 4 bitsNow we just need to understand what bits are included or not in the sum, it seems the fan speed is not, but we need more messages in different modes and with different settings to be able to know which bits are used or not in the calculation. I take your example code : 
 100100000101000000000110000 19 ms space 0101001000000000000001000000000000001111
 Split in 4 bits words :
 1001
 0000
 0101
 0000
 0000
 0110
 000 19 ms space => I ignore this part as it's not matching the 4 bits words, and only 0s anyway
 0101
 0010
 0000
 0000
 0000
 0100
 0000
 0000
 0000
 1111Invert bit order and try to guess what words are included or not. 
 If you make the sum of included words with binary calculator, it matches the checksum but we must validate with more parameters changed, try with horizontal/vertical swing if you have these on the remote control, then any other specific function.1001 => on + mode, included as it's the only one with LSB = 1 and we have LSB = 1 in checksum 
 0000 => fan speed, not included as shown in your examples on fan speed
 1010 => temp 16ยฐC + value, included as shown in your examples of temperature
 0000 => ??? cannot know because 0
 0000 => ??? cannot know because 0
 0110 => I think included else I don't have the right checksum
 000 19 ms space => I ignore this part as it's not matching the 4 bits words, and only 0s anyway
 1010 => I think not included else I don't have the right checksum
 0100 => I think included else I don't have the right checksum
 0000 => ??? cannot know because 0
 0000 => ??? cannot know because 0
 0000 => ??? cannot know because 0
 0100 => I think included else I don't have the right checksum
 0000 => ??? cannot know because 0
 0000 => ??? cannot know because 0
 0000 => ??? cannot know because 0
 1111 => binary sum of all included words, only the 4 LSB bits are kept
 
- 
					
					
					
					
 @Nca78 I think you are on to something, thanks a lot. I will investigate it further, but in the mean time here is some more data that i took: 
 mode fan temp
 cold auto 26
 1001 0000 0101 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 1111
 cold auto 25
 1001 0000 1001 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 0111
 cold auto 24
 1001 0000 0001 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 1011
 cold fan1 24
 1001 1000 0001 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 1011
 cold fan2 24
 1001 0100 0001 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 1011
 cold fan3 24
 1001 1100 0001 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 1011
 dry fan1 24
 0101 1000 0001 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 0111
 air fan1 24
 1101 1000 0001 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 1111
 heat fan1 24
 0011 1000 0001 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 0000
 OFF cold auto 26
 1000 0000 0101 0000 0000 0110 0000 1010 010 - 0000 0000 0000 0100 0000 0000 0000 1110
 
- 
					
					
					
					
 @Nca78 can you please explain why do you add 0101 to the checksum in the temperature example? 
 
- 
					
					
					
					
 @dpressle 
 I add it because it is the initial value of the checksum when temperature is 16ยฐC = 0000
 I just wanted to show than an increase of 1 in temperature was producing an increase of 1 in checksum.I think your minus sign (= 19ms pause ?) is in wrong position as it is supposed to be after the 6 (and not 8 ) first words ? Please take some values by changing the horizontal and vertical swing so we can try to change the second part of the message. After that try some other functions if you have (anything like "eco"/"quiet"/"turbo" options for example) and also if you have it the timer. 
 
- 
					
					
					
					
 @Nca78 OK, i will generate more commands and see if it makes more sense, Thanks for your help. 
 
- 
					
					
					
					
 @dpressle said: @ToniA can you elaborate? Yes, on my AC IR decoder sketch I have decoder modules for different heatpumps. Like this: https://github.com/ToniA/Raw-IR-decoder-for-Arduino/blob/master/MitsubishiElectric.cpp So, write a new one, and add a call to it into https://github.com/ToniA/Raw-IR-decoder-for-Arduino/blob/master/rawirdecode.ino#L315. First you need to write a condition to recognize the protocol (like, from the first bytes + length etc). Then just start adding functionality, like decoding the temperature, then operating mode etc. 
 
- 
					
					
					
					
 @ToniA i got you, but the problem is i still dont know the checksum value, working on it... 
 
- 
					
					
					
					
 @dpressle could you please also post a picture of the back of your remote control ? I would like to confirm it's the one I quoted above, would be very interesting as it seems this RC/protocol is shared with a loooot of brands and models. 
 It's a very interesting case for this reason but also because it's using a checksum based on 4 bits words and excluding some of the "data" bits (at least the fan speed), it's the first time I see this.
 
- 
					
					
					
					
 @Nca78 yes it is YB1FA 
 
- 
					
					
					
					
 In case you are still interested, here is the full description of this code: 
 
- 
					
					
					
					
 @joker_mkd That's a fraction of a VERY interesting document you have posted here 
 I suppose the other 180 pages are not freely available ? 
 
- 
					
					
					
					
 @joker_mkd said: In case you are still interested, here is the full description of this code: Thanks, this is great looks like exactly what i need, all the relevant information is there. 
 I will now write some code to implement this.Thanks. 
 
- 
					
					
					
					
 @Nca78 Unfortunately not. This is a part of the document which we use to define IR codes for our product called PebbleAIR . These codes are implemented in the Android and iOS app. It took me a lot of time, money and effort to decode all the different brands and remotes. I often browse the forums and if I see that someone is stuck or in a need, I share remote data from time to time. If you desperately need data for a certain brand od model feel free to PM me, and I might help you. 
 
- 
					
					
					
					
 @joker_mkd I understand, it's very nice from you to share these pages already ! 
 You have a nice product, I love the flashing function I will have to try that just for the fun of it 
 
- 
					
					
					
					
 @joker_mkd product looks great, did you ever thought of making these units smaller (so can be attached on an AC for example) and have some kind of API exposed so any Home Automation can use them? MySensors ZWave Wifi http etc... 
 
- 
					
					
					
					
 @dpressle We are in the process of making an API, because several companies have asked us for this. I was not involved in the process of hardware design, and I agree that the unit could have been made smaller, probably in the next revision. 
 
- 
					
					
					
					
 @joker_mkd Sounds wonderful, good luck, i will be watching you  
 
- 
					
					
					
					
 This is what I have done as a hobby so far: https://www.openhardware.io/view/41/Heatpump-airconditioner-controller There's no Gree support in the HeatpumpIR library, though. 
 
- 
					
					
					
					
 @ToniA i know, i will try to add it to your library (if no one will beat me to it) 
 
- 
					
					
					
					
 @dpressle said: @ToniA i know, i will try to add it to your library (if no one will beat me to it) Not me  
 I'll implement it in my own library if I manage to make something valuable.
 
- 
					
					
					
					
 @Nca78 said: @dpressle said: @ToniA i know, i will try to add it to your library (if no one will beat me to it) Not me  
 I'll implement it in my own library if I manage to make something valuable.Let me know if you get it done please! 
 
- 
					
					
					
					
 Hi all, 
 This post is great. I started writing a similar library myself for Electra AC, I might just add it on top of @ToniA's library.Quick question: can anyone recommend MySensors compatible controller that supports temperature/fan commands ? 
 The only thing I came across so far is this modification for Vera UI7 thermostat: https://forum.mysensors.org/topic/3606/redesigned-vera-ui7-thermostat-with-heat-cool-setpoint-hvac-state-fan-status-energy-modeThanks! 
 
- 
					
					
					
					
 So i ended up implementing it in my own library, still under tests, i will publish it here once i push it to github. 
 
- 
					
					
					
					
 Hi All, Library can be found here: 
 GitHubIt contains a test ino to test the library and a ino to work with mysensors. 
 If you have any comments and or questions please dont hesitate to ask/comment.Thanks to all of you who helped in this topic and especially to @joker_mkd who donated his gree code document. 
 
 
			
		 
			
		 
					
				