IRremoteESP8266
ir_Kelvinator.h
Go to the documentation of this file.
1 // Copyright 2016 David Conran
4 
5 // Supports:
6 // Brand: Kelvinator, Model: YALIF Remote
7 // Brand: Kelvinator, Model: KSV26CRC A/C
8 // Brand: Kelvinator, Model: KSV26HRC A/C
9 // Brand: Kelvinator, Model: KSV35CRC A/C
10 // Brand: Kelvinator, Model: KSV35HRC A/C
11 // Brand: Kelvinator, Model: KSV53HRC A/C
12 // Brand: Kelvinator, Model: KSV62HRC A/C
13 // Brand: Kelvinator, Model: KSV70CRC A/C
14 // Brand: Kelvinator, Model: KSV70HRC A/C
15 // Brand: Kelvinator, Model: KSV80HRC A/C
16 // Brand: Green, Model: YAPOF3 remote
17 
18 #ifndef IR_KELVINATOR_H_
19 #define IR_KELVINATOR_H_
20 
21 #define __STDC_LIMIT_MACROS
22 #include <stdint.h>
23 #ifndef UNIT_TEST
24 #include <Arduino.h>
25 #endif
26 #include "IRremoteESP8266.h"
27 #include "IRsend.h"
28 #ifdef UNIT_TEST
29 #include "IRsend_test.h"
30 #endif
31 
32 // Constants
33 const uint8_t kKelvinatorAuto = 0;
34 const uint8_t kKelvinatorCool = 1;
35 const uint8_t kKelvinatorDry = 2;
36 const uint8_t kKelvinatorFan = 3;
37 const uint8_t kKelvinatorHeat = 4;
38 const uint8_t kKelvinatorBasicFanMax = 3;
39 const uint8_t kKelvinatorFanAuto = 0;
40 const uint8_t kKelvinatorFanMin = 1;
41 const uint8_t kKelvinatorFanMax = 5;
42 const uint8_t kKelvinatorMinTemp = 16; // 16C
43 const uint8_t kKelvinatorMaxTemp = 30; // 30C
44 const uint8_t kKelvinatorAutoTemp = 25; // 25C
45 
46 // Legacy defines (Deprecated)
47 #define KELVINATOR_MIN_TEMP kKelvinatorMinTemp
48 #define KELVINATOR_MAX_TEMP kKelvinatorMaxTemp
49 #define KELVINATOR_HEAT kKelvinatorHeat
50 #define KELVINATOR_FAN_MAX kKelvinatorFanMax
51 #define KELVINATOR_FAN_AUTO kKelvinatorFanAuto
52 #define KELVINATOR_FAN kKelvinatorFan
53 #define KELVINATOR_DRY kKelvinatorDry
54 #define KELVINATOR_COOL kKelvinatorCool
55 #define KELVINATOR_BASIC_FAN_MAX kKelvinatorBasicFanMax
56 #define KELVINATOR_AUTO_TEMP kKelvinatorAutoTemp
57 #define KELVINATOR_AUTO kKelvinatorAuto
58 
59 /*
60  Kelvinator AC map
61 
62  (header mark and space)
63  byte 0 = Basic Modes
64  b2-0 = Modes
65  Modes:
66  000 = Auto (temp = 25C)
67  001 = Cool
68  010 = Dry (temp = 25C, but not shown)
69  011 = Fan
70  100 = Heat
71  b3 = Power Status (1 = On, 0 = Off)
72  b5-4 = Fan (Basic modes)
73  Fan:
74  00 = Auto
75  01 = Fan 1
76  10 = Fan 2
77  11 = Fan 3 or higher (See byte 14)
78  b6 = Vent swing (1 = On, 0 = Off) (See byte 4)
79  b7 = Sleep Modes 1 & 3 (1 = On, 0 = Off)
80  byte 1 = Temperature
81  b3-0: Degrees C.
82  0000 (0) = 16C
83  0001 (1) = 17C
84  0010 (2) = 18C
85  ...
86  1101 (13) = 29C
87  1110 (14) = 30C
88  byte 2 = Extras
89  b3-0 = UNKNOWN, typically 0.
90  b4 = Turbo Fan (1 = On, 0 = Off)
91  b5 = Light (Display) (1 = On, 0 = Off)
92  b6 = Ion Filter (1 = On, 0 = Off)
93  b7 = X-Fan (Fan runs for a while after power off) (1 = On, 0 = Off)
94  byte 3 = Section Indicator
95  b3-0 = Unused (Typically 0)
96  b5-4 = Unknown (possibly timer related) (Typically 0b01)
97  b7-6 = End of command block (B01)
98  (B010 marker and a gap of 20ms)
99  byte 4 = Extended options
100  b0 = Swing Vent Vertical (1 = On, 0 = Off)
101  b4 = Swing Vent Horizontal (1 = On, 0 = Off)
102  byte 5-6 = Timer related. Typically 0 except when timer in use.
103  byte 7 = checksum
104  b3-0 = Unknown (Used in Timer mode)
105  b7-4 = checksum of the previous bytes (0-6)
106  (gap of 40ms)
107  (header mark and space)
108  byte 8 = Repeat of byte 0
109  byte 9 = Repeat of byte 1
110  byte 10 = Repeat of byte 2
111  byte 11 = Section Indicator
112  b3-0 = Unused (Typically 0)
113  b5-4 = Unknown (possibly timer related) (Typically 0b11)
114  b7-6 = End of command block (B01)
115  (B010 marker and a gap of 20ms)
116  byte 12 = Extended options
117  b0 = Sleep mode 2 (1 = On, 0=Off)
118  b6-1 = Unknown (Used in Sleep Mode 3, Typically 0b000000)
119  b7 = Quiet Mode (1 = On, 0=Off)
120  byte 13 = Unknown (Sleep Mode 3 related, Typically 0x00)
121  byte 14 = Fan control
122  b3-0 = Unknown (Sleep Mode 3 related, Typically 0b0000)
123  b6-4 = Fan speed
124  0b000 (0) = Automatic
125  0b001 (1) = Fan 1
126  0b010 (2) = Fan 2
127  0b011 (3) = Fan 3
128  0b100 (4) = Fan 4
129  0b101 (5) = Fan 5
130  byte 15 = checksum
131  b3-0 = Unknown (Typically 0b0000)
132  b7-4 = checksum of the previous bytes (8-14)
133 */
134 
135 // Classes
138  public:
139  explicit IRKelvinatorAC(const uint16_t pin, const bool inverted = false,
140  const bool use_modulation = true);
141  void stateReset(void);
142 #if SEND_KELVINATOR
143  void send(const uint16_t repeat = kKelvinatorDefaultRepeat);
148  int8_t calibrate(void) { return _irsend.calibrate(); }
149 #endif // SEND_KELVINATOR
150  void begin(void);
151  void on(void);
152  void off(void);
153  void setPower(const bool on);
154  bool getPower(void);
155  void setTemp(const uint8_t degrees);
156  uint8_t getTemp(void);
157  void setFan(const uint8_t speed);
158  uint8_t getFan(void);
159  void setMode(const uint8_t mode);
160  uint8_t getMode(void);
161  void setSwingVertical(const bool on);
162  bool getSwingVertical(void);
163  void setSwingHorizontal(const bool on);
164  bool getSwingHorizontal(void);
165  void setQuiet(const bool on);
166  bool getQuiet(void);
167  void setIonFilter(const bool on);
168  bool getIonFilter(void);
169  void setLight(const bool on);
170  bool getLight(void);
171  void setXFan(const bool on);
172  bool getXFan(void);
173  void setTurbo(const bool on);
174  bool getTurbo(void);
175  uint8_t* getRaw(void);
176  void setRaw(const uint8_t new_code[]);
177  static uint8_t calcBlockChecksum(
178  const uint8_t* block, const uint16_t length = kKelvinatorStateLength / 2);
179  static bool validChecksum(const uint8_t state[],
180  const uint16_t length = kKelvinatorStateLength);
181  uint8_t convertMode(const stdAc::opmode_t mode);
182  static stdAc::opmode_t toCommonMode(const uint8_t mode);
183  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
184  stdAc::state_t toCommon(void);
185  String toString(void);
186 #ifndef UNIT_TEST
187 
188  private:
190 #else // UNIT_TEST
191  IRsendTest _irsend;
193 #endif // UNIT_TEST
196  void checksum(const uint16_t length = kKelvinatorStateLength);
197  void fixup(void);
198 };
199 
200 #endif // IR_KELVINATOR_H_
IRKelvinatorAC::setSwingHorizontal
void setSwingHorizontal(const bool on)
Control the current horizontal swing setting.
Definition: ir_Kelvinator.cpp:314
IRKelvinatorAC::stateReset
void stateReset(void)
Reset the internals of the object to a known good state.
Definition: ir_Kelvinator.cpp:129
IRKelvinatorAC::checksum
void checksum(const uint16_t length=kKelvinatorStateLength)
Calculate the checksum for the internal state.
Definition: ir_Kelvinator.cpp:188
IRKelvinatorAC::getTurbo
bool getTurbo(void)
Is the Turbo setting on?
Definition: ir_Kelvinator.cpp:392
IRKelvinatorAC::setTurbo
void setTurbo(const bool on)
Control the current Turbo setting.
Definition: ir_Kelvinator.cpp:385
IRKelvinatorAC::getSwingVertical
bool getSwingVertical(void)
Is the vertical swing setting on?
Definition: ir_Kelvinator.cpp:308
kKelvinatorFanAuto
const uint8_t kKelvinatorFanAuto
Definition: ir_Kelvinator.h:39
IRKelvinatorAC::on
void on(void)
Set the internal state to have the power on.
Definition: ir_Kelvinator.cpp:212
kKelvinatorFanMax
const uint8_t kKelvinatorFanMax
Definition: ir_Kelvinator.h:41
kKelvinatorCool
const uint8_t kKelvinatorCool
Definition: ir_Kelvinator.h:34
stdAc::fanspeed_t
fanspeed_t
Common A/C settings for Fan Speeds.
Definition: IRsend.h:58
IRKelvinatorAC::setLight
void setLight(const bool on)
Control the current Light setting. i.e. The LED display on the A/C unit that shows the basic settings...
Definition: ir_Kelvinator.cpp:355
IRKelvinatorAC::toCommonFanSpeed
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed to it's stdAc::fanspeed_t equivalent.
Definition: ir_Kelvinator.cpp:425
kKelvinatorAutoTemp
const uint8_t kKelvinatorAutoTemp
Definition: ir_Kelvinator.h:44
IRKelvinatorAC::getRaw
uint8_t * getRaw(void)
Get the raw state of the object, suitable to be sent with the appropriate IRsend object method.
Definition: ir_Kelvinator.cpp:158
IRsend.h
IRKelvinatorAC::setIonFilter
void setIonFilter(const bool on)
Control the current Ion Filter setting.
Definition: ir_Kelvinator.cpp:341
IRKelvinatorAC::setFan
void setFan(const uint8_t speed)
Set the speed of the fan.
Definition: ir_Kelvinator.cpp:248
IRsend
Class for sending all basic IR protocols.
Definition: IRsend.h:176
kKelvinatorMinTemp
const uint8_t kKelvinatorMinTemp
Definition: ir_Kelvinator.h:42
IRKelvinatorAC::calibrate
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition: ir_Kelvinator.h:148
IRsend::calibrate
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition: IRsend.cpp:207
String
std::string String
Definition: IRremoteESP8266.h:1128
IRKelvinatorAC::setPower
void setPower(const bool on)
Set the internal state to have the desired power.
Definition: ir_Kelvinator.cpp:219
IRKelvinatorAC::getFan
uint8_t getFan(void)
Get the current fan speed setting.
Definition: ir_Kelvinator.cpp:266
IRKelvinatorAC::setMode
void setMode(const uint8_t mode)
Set the desired operation mode.
Definition: ir_Kelvinator.cpp:278
IRKelvinatorAC::send
void send(const uint16_t repeat=kKelvinatorDefaultRepeat)
Send the current internal state as an IR message.
Definition: ir_Kelvinator.cpp:149
IRKelvinatorAC::setRaw
void setRaw(const uint8_t new_code[])
Set the raw state of the object.
Definition: ir_Kelvinator.cpp:165
IRKelvinatorAC::begin
void begin(void)
Set up hardware to be able to send a message.
Definition: ir_Kelvinator.cpp:136
IRKelvinatorAC::getMode
uint8_t getMode(void)
Get the current operation mode setting.
Definition: ir_Kelvinator.cpp:272
IRKelvinatorAC::calcBlockChecksum
static uint8_t calcBlockChecksum(const uint8_t *block, const uint16_t length=kKelvinatorStateLength/2)
Calculate the checksum for a given block of state.
Definition: ir_Kelvinator.cpp:174
IRremoteESP8266.h
IRKelvinatorAC::_irsend
IRsend _irsend
Instance of the IR send class.
Definition: ir_Kelvinator.h:189
IRKelvinatorAC::getPower
bool getPower(void)
Get the power setting from the internal state.
Definition: ir_Kelvinator.cpp:226
IRKelvinatorAC::validChecksum
static bool validChecksum(const uint8_t state[], const uint16_t length=kKelvinatorStateLength)
Verify the checksum is valid for a given state.
Definition: ir_Kelvinator.cpp:200
IRKelvinatorAC
Class for handling detailed Kelvinator A/C messages.
Definition: ir_Kelvinator.h:137
kKelvinatorMaxTemp
const uint8_t kKelvinatorMaxTemp
Definition: ir_Kelvinator.h:43
IRKelvinatorAC::fixup
void fixup(void)
Fix up any odd conditions for the current state.
Definition: ir_Kelvinator.cpp:139
IRKelvinatorAC::getTemp
uint8_t getTemp(void)
Get the current temperature setting.
Definition: ir_Kelvinator.cpp:241
kKelvinatorStateLength
const uint16_t kKelvinatorStateLength
Definition: IRremoteESP8266.h:935
IRKelvinatorAC::toCommon
stdAc::state_t toCommon(void)
Convert the internal A/C object state to it's stdAc::state_t equivalent.
Definition: ir_Kelvinator.cpp:431
IRKelvinatorAC::setQuiet
void setQuiet(const bool on)
Control the current Quiet setting.
Definition: ir_Kelvinator.cpp:329
IRKelvinatorAC::setXFan
void setXFan(const bool on)
Control the current XFan setting. This setting will cause the unit blow air after power off to dry ou...
Definition: ir_Kelvinator.cpp:371
kKelvinatorFan
const uint8_t kKelvinatorFan
Definition: ir_Kelvinator.h:36
IRKelvinatorAC::setTemp
void setTemp(const uint8_t degrees)
Set the temperature setting.
Definition: ir_Kelvinator.cpp:232
kKelvinatorBasicFanMax
const uint8_t kKelvinatorBasicFanMax
Definition: ir_Kelvinator.h:38
kKelvinatorFanMin
const uint8_t kKelvinatorFanMin
Definition: ir_Kelvinator.h:40
IRKelvinatorAC::getLight
bool getLight(void)
Is the Light (Display) setting on?
Definition: ir_Kelvinator.cpp:362
kKelvinatorHeat
const uint8_t kKelvinatorHeat
Definition: ir_Kelvinator.h:37
IRKelvinatorAC::IRKelvinatorAC
IRKelvinatorAC(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: ir_Kelvinator.cpp:124
IRKelvinatorAC::off
void off(void)
Set the internal state to have the power off.
Definition: ir_Kelvinator.cpp:215
kKelvinatorDefaultRepeat
const uint16_t kKelvinatorDefaultRepeat
Definition: IRremoteESP8266.h:937
IRKelvinatorAC::remote_state
uint8_t remote_state[kKelvinatorStateLength]
The state in IR code form.
Definition: ir_Kelvinator.h:195
IRKelvinatorAC::setSwingVertical
void setSwingVertical(const bool on)
Control the current vertical swing setting.
Definition: ir_Kelvinator.cpp:299
kKelvinatorDry
const uint8_t kKelvinatorDry
Definition: ir_Kelvinator.h:35
IRKelvinatorAC::getIonFilter
bool getIonFilter(void)
Is the Ion Filter setting on?
Definition: ir_Kelvinator.cpp:348
IRKelvinatorAC::toString
String toString(void)
Convert the internal settings into a human readable string.
Definition: ir_Kelvinator.cpp:459
IRKelvinatorAC::getXFan
bool getXFan(void)
Is the XFan setting on?
Definition: ir_Kelvinator.cpp:378
IRKelvinatorAC::toCommonMode
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode to it's stdAc::opmode_t equivalent.
Definition: ir_Kelvinator.cpp:412
IRKelvinatorAC::getQuiet
bool getQuiet(void)
Is the Quiet setting on?
Definition: ir_Kelvinator.cpp:335
stdAc::state_t
Structure to hold a common A/C state.
Definition: IRsend.h:97
IRKelvinatorAC::getSwingHorizontal
bool getSwingHorizontal(void)
Is the horizontal swing setting on?
Definition: ir_Kelvinator.cpp:323
kKelvinatorAuto
const uint8_t kKelvinatorAuto
Definition: ir_Kelvinator.h:33
IRKelvinatorAC::convertMode
uint8_t convertMode(const stdAc::opmode_t mode)
Convert a standard A/C mode (stdAc::opmode_t) into it a native mode.
Definition: ir_Kelvinator.cpp:399
stdAc::opmode_t
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46