ir_Coolix.h 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // Coolix A/C
  2. //
  3. // Copyright 2018 David Conran
  4. #ifndef IR_COOLIX_H_
  5. #define IR_COOLIX_H_
  6. #define __STDC_LIMIT_MACROS
  7. #include <stdint.h>
  8. #ifndef UNIT_TEST
  9. #include <Arduino.h>
  10. #else
  11. #include <string>
  12. #endif
  13. #include "IRremoteESP8266.h"
  14. #include "IRsend.h"
  15. // CCCCC OOOOO OOOOO LL IIIII XX XX
  16. // CC C OO OO OO OO LL III XX XX
  17. // CC OO OO OO OO LL III XXXX
  18. // CC C OO OO OO OO LL III XX XX
  19. // CCCCC OOOO0 OOOO0 LLLLLLL IIIII XX XX
  20. // Supports:
  21. // RG57K7(B)/BGEF remote control for Beko BINR 070/071 split-type aircon.
  22. // Ref:
  23. // https://github.com/markszabo/IRremoteESP8266/issues/484
  24. // Kudos:
  25. // Hamper: For the breakdown and mapping of the bit values.
  26. // Constants
  27. // Modes
  28. const uint8_t kCoolixCool = 0b00;
  29. const uint8_t kCoolixDry = 0b01;
  30. const uint8_t kCoolixAuto = 0b10;
  31. const uint8_t kCoolixHeat = 0b11;
  32. const uint8_t kCoolixFan = 4; // Synthetic.
  33. const uint32_t kCoolixModeMask = 0b000000000000000000001100; // 0xC
  34. const uint32_t kCoolixZoneFollowMask = 0b000010000000000000000000; // 0x80000
  35. // Fan Control
  36. const uint8_t kCoolixFanMin = 0b100;
  37. const uint8_t kCoolixFanMed = 0b010;
  38. const uint8_t kCoolixFanMax = 0b001;
  39. const uint8_t kCoolixFanAuto = 0b101;
  40. const uint8_t kCoolixFanZoneFollow = 0b110;
  41. const uint8_t kCoolixFanFixed = 0b111;
  42. const uint32_t kCoolixFanMask = 0b000000001110000000000000; // 0x00E000
  43. // Temperature
  44. const uint8_t kCoolixTempMin = 17; // Celsius
  45. const uint8_t kCoolixTempMax = 30; // Celsius
  46. const uint8_t kCoolixTempRange = kCoolixTempMax - kCoolixTempMin + 1;
  47. const uint8_t kCoolixFanTempCode = 0b1110; // Part of Fan Mode.
  48. const uint32_t kCoolixTempMask = 0b11110000;
  49. const uint8_t kCoolixTempMap[kCoolixTempRange] = {
  50. 0b0000, // 17C
  51. 0b0001, // 18c
  52. 0b0011, // 19C
  53. 0b0010, // 20C
  54. 0b0110, // 21C
  55. 0b0111, // 22C
  56. 0b0101, // 23C
  57. 0b0100, // 24C
  58. 0b1100, // 25C
  59. 0b1101, // 26C
  60. 0b1001, // 27C
  61. 0b1000, // 28C
  62. 0b1010, // 29C
  63. 0b1011 // 30C
  64. };
  65. const uint8_t kCoolixSensorTempMin = 16; // Celsius
  66. const uint8_t kCoolixSensorTempMax = 30; // Celsius
  67. const uint8_t kCoolixSensorTempIgnoreCode = 0b1111;
  68. const uint32_t kCoolixSensorTempMask = 0b000000000000111100000000; // 0xF00
  69. // Fixed states/messages.
  70. const uint8_t kCoolixPrefix = 0b1011; // 0xB
  71. const uint8_t kCoolixUnknown = 0xFF;
  72. const uint32_t kCoolixOff = 0b101100100111101111100000; // 0xB27BE0
  73. const uint32_t kCoolixSwing = 0b101100100110101111100000; // 0xB26BE0
  74. const uint32_t kCoolixSleep = 0b101100101110000000000011; // 0xB2E003
  75. const uint32_t kCoolixTurbo = 0b101101011111010110100010; // 0xB5F5A2
  76. const uint32_t kCoolixLed = 0b101101011111010110100101; // 0xB5F5A5
  77. const uint32_t kCoolixClean = 0b101101011111010110101010; // 0xB5F5AA
  78. // On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore.
  79. const uint32_t kCoolixDefaultState = 0b101100101011111111001000; // 0xB2BFC8
  80. // Classes
  81. class IRCoolixAC {
  82. public:
  83. explicit IRCoolixAC(uint16_t pin);
  84. void stateReset();
  85. #if SEND_COOLIX
  86. void send();
  87. #endif // SEND_COOLIX
  88. void begin();
  89. void on();
  90. void off();
  91. void setPower(const bool state);
  92. bool getPower();
  93. void setTemp(const uint8_t temp);
  94. uint8_t getTemp();
  95. void setSensorTemp(const uint8_t desired);
  96. uint8_t getSensorTemp();
  97. void clearSensorTemp();
  98. void setFan(const uint8_t fan);
  99. uint8_t getFan();
  100. void setMode(const uint8_t mode);
  101. uint8_t getMode();
  102. void setSwing();
  103. bool getSwing();
  104. void setSleep();
  105. bool getSleep();
  106. void setTurbo();
  107. bool getTurbo();
  108. void setLed();
  109. bool getLed();
  110. void setClean();
  111. bool getClean();
  112. bool getZoneFollow();
  113. uint32_t getRaw();
  114. void setRaw(const uint32_t new_code);
  115. #ifdef ARDUINO
  116. String toString();
  117. #else
  118. std::string toString();
  119. #endif
  120. private:
  121. // The state of the IR remote in IR code form.
  122. uint32_t remote_state;
  123. IRsend _irsend;
  124. void setTempRaw(const uint8_t code);
  125. uint8_t getTempRaw();
  126. void setSensorTempRaw(const uint8_t code);
  127. void setZoneFollow(const bool state);
  128. };
  129. #endif // IR_COOLIX_H_