Skip to content

Non Standard AC protocol #192

@lcfm1

Description

@lcfm1

Hi, I have an air conditioner that stores parameters and check sum in nibbles instead of bytes. Is it possible to realize its control using your library?
I have written a code that checks its work in your project, but how to make it control - I don't have enough knowledge.
Can you advise?
Thanks.

Nibbles:
0x182773800000008000804026

Bits:
0b000110000010011101110011100000000000000000000000000000001000000000000000100000000100000000100110
Header [1-16] = 0001100000100111 - constant
Temp [21, 17-20] = 00111 - The first four bytes are normal, but the high bit is in position 21 for some reason. Starts from 0(16).
Range 16-32 For Cool, 18-28 For Dry, 23 For Fan in Celsius
Mode [22-24] = 001 For Cool, 010 for Dry, 011 for Fan
Power [25] = 0/1
Swing [26] = 0/1
Empty [27-33] = 000000 - constant
CF [34-41] = 00000000 for Celsius, 10011010 for Fahrenheit
Sleep (Night Mode) [42] =0 for off, 1 for on
Empty [43-56] = Constant, always zero
Timer off[57-64] = Timer in Hours, starts from 128 to 164 - Equal 1-24hrs
Timer State [65] = 1 for on, 0 for off
Empty [74-80] = Always 0
Speed [81-84] = 1000 for Auto, 0001 For 1 Speed, 0010 For 2 Speed, 0100 For 3 Speed, (1 Speed For Dry mode const)
Empty [85-90] = Always 0
CheckSum [91-96] = Sum in Hex from 5 to 22 bytes (7+3+8+8+8+4) = 0x26

`#include <Arduino.h> // NEO ACM-14 remote

bool decodeNeoAcm14Remote(char* symbols, int bitCount, byte *bytes, int byteCount)
{
if (symbols[1] != 'H' || symbols[2] != 'h') { return false; }
if (byteCount != 24) { return false; }
if (bytes[0] == 0x18 && bytes[1] == 0xE4) {
Serial.println(F("Looks like a Neo ACM 14 protocol"));

 // Power 
  if (symbols[27] == '0') {Serial.println(F("POWER OFF"));}
  else if (symbols[27] == '1') {Serial.println(F("POWER ON"));}

 // Operating mode
  int acMode;
       if (symbols[25] == '0' && symbols[26] == '1') { acMode = 1; }
  else if (symbols[25] == '1' && symbols[26] == '0') { acMode = 2; }
  else if (symbols[25] == '1' && symbols[26] == '1') { acMode = 3; }
  else {
    Serial.println(F("Mode: UNKNOWN"));
    return false;
  }

  Serial.print(F("Mode: "));
  Serial.println(acMode);
  
  int acTemp;
  if      (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 16; }
  else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '1') { acTemp = 17; }
  else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '1' && symbols[22] == '0') { acTemp = 18; }
  else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '1' && symbols[22] == '1') { acTemp = 19; }
  else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '1' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 20; }
  else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '1' && symbols[21] == '0' && symbols[22] == '1') { acTemp = 21; }
  else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '1' && symbols[21] == '1' && symbols[22] == '0') { acTemp = 22; }
  else if (symbols[23] == '0' && symbols[19] == '0' && symbols[20] == '1' && symbols[21] == '1' && symbols[22] == '1') { acTemp = 23; }
  else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 24; }
  else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '1') { acTemp = 25; }
  else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '0' && symbols[21] == '1' && symbols[22] == '0') { acTemp = 26; }
  else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '0' && symbols[21] == '1' && symbols[22] == '1') { acTemp = 27; }
  else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '1' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 28; }
  else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '1' && symbols[21] == '0' && symbols[22] == '1') { acTemp = 29; }
  else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '1' && symbols[21] == '1' && symbols[22] == '0') { acTemp = 30; }
  else if (symbols[23] == '0' && symbols[19] == '1' && symbols[20] == '1' && symbols[21] == '1' && symbols[22] == '1') { acTemp = 31; }
  else if (symbols[23] == '1' && symbols[19] == '0' && symbols[20] == '0' && symbols[21] == '0' && symbols[22] == '0') { acTemp = 32; }
   else {
    Serial.println(F("Temp: UNKNOWN"));
    return false;
  }
  
  Serial.print(F("Temp: "));
  Serial.println(acTemp);      

  int acSpeed;
  if      (symbols[83] == '1' && symbols[84] == '0' && symbols[85] == '0' && symbols[86] == '0') { acSpeed = 0; }
  else if (symbols[83] == '0' && symbols[84] == '0' && symbols[85] == '0' && symbols[86] == '1') { acSpeed = 1; }
  else if (symbols[83] == '0' && symbols[84] == '0' && symbols[85] == '1' && symbols[86] == '0') { acSpeed = 2; }
  else if (symbols[83] == '0' && symbols[84] == '1' && symbols[85] == '0' && symbols[86] == '0') { acSpeed = 3; }
   else {
    Serial.println(F("Speed: UNKNOWN"));
    return false;
  }

  Serial.print(F("Speed: "));
  Serial.println(acSpeed);    


  if (symbols[28] == '0') {Serial.println(F("SWING OFF"));}
  else if (symbols[28] == '1') {Serial.println(F("SWING ON"));}

  char ACTimer[7];
  ACTimer [0] = symbols[59];
  ACTimer [1] = symbols[60];
  ACTimer [2] = symbols[61];
  ACTimer [3] = symbols[62];
  ACTimer [4] = symbols[63];
  ACTimer [5] = symbols[64];
  ACTimer [6] = symbols[65];
  ACTimer [7] = symbols[66];
  
  Serial.print(int(ACTimer));

  if (symbols[68] == '0') {Serial.println(F("TIMER OFF"));}
  else if (symbols[68] == '1') {Serial.println(F("TIMER ON"));}
  
  return true;

}
return false;
}
`

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions