Skip to content

Commit 045b3b4

Browse files
[HAIER_AC176/HAIER_AC_YRW02] Add support Lock function (#1652)
`Lock` used to lock buttons on IR remote to prevent unintended operations. * Add `getLock()` and `setLock()` methods * Increase from 4 to 5 bits button's code in `HaierAc176Protocol` * Add `Timer` and `Lock` button's codes * Update tests
1 parent 86dee2d commit 045b3b4

File tree

8 files changed

+87
-38
lines changed

8 files changed

+87
-38
lines changed

src/IRtext.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ IRTEXT_CONST_STRING(kTypeStr, D_STR_TYPE); ///< "Type"
123123
IRTEXT_CONST_STRING(kSpecialStr, D_STR_SPECIAL); ///< "Special"
124124
IRTEXT_CONST_STRING(kIdStr, D_STR_ID); ///< "Id" / Device Identifier
125125
IRTEXT_CONST_STRING(kVaneStr, D_STR_VANE); ///< "Vane"
126+
IRTEXT_CONST_STRING(kLockStr, D_STR_LOCK); ///< "Lock"
126127

127128
IRTEXT_CONST_STRING(kAutoStr, D_STR_AUTO); ///< "Auto"
128129
IRTEXT_CONST_STRING(kAutomaticStr, D_STR_AUTOMATIC); ///< "Automatic"

src/IRtext.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ extern IRTEXT_CONST_PTR(kLightStr);
119119
extern IRTEXT_CONST_PTR(kLightToggleStr);
120120
extern IRTEXT_CONST_PTR(kLkeStr);
121121
extern IRTEXT_CONST_PTR(kLoStr);
122+
extern IRTEXT_CONST_PTR(kLockStr);
122123
extern IRTEXT_CONST_PTR(kLoudStr);
123124
extern IRTEXT_CONST_PTR(kLowerStr);
124125
extern IRTEXT_CONST_PTR(kLowestStr);

src/ir_Haier.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,7 @@ void IRHaierAC176::setButton(uint8_t button) {
618618
case kHaierAcYrw02ButtonHealth:
619619
case kHaierAcYrw02ButtonTurbo:
620620
case kHaierAcYrw02ButtonSleep:
621+
case kHaierAcYrw02ButtonLock:
621622
_.Button = button;
622623
}
623624
}
@@ -907,6 +908,17 @@ uint16_t IRHaierAC176::getOffTimer(void) const {
907908
return _.OffTimerHrs * 60 + _.OffTimerMins;
908909
}
909910

911+
/// Get the Lock setting of the A/C.
912+
/// @return true, the setting is on. false, the setting is off.
913+
bool IRHaierAC176::getLock(void) const { return _.Lock; }
914+
915+
/// Set the Lock setting of the A/C.
916+
/// @param[in] on true, the setting is on. false, the setting is off.
917+
void IRHaierAC176::setLock(const bool on) {
918+
_.Button = kHaierAcYrw02ButtonLock;
919+
_.Lock = on;
920+
}
921+
910922
/// Convert a stdAc::opmode_t enum into its native mode.
911923
/// @param[in] mode The enum to be converted.
912924
/// @return The native equivalent of the enum.
@@ -1048,7 +1060,7 @@ stdAc::state_t IRHaierAC176::toCommon(void) const {
10481060
/// @return A human readable string.
10491061
String IRHaierAC176::toString(void) const {
10501062
String result = "";
1051-
result.reserve(250); // Reserve some heap for the string to reduce fragging.
1063+
result.reserve(260); // Reserve some heap for the string to reduce fragging.
10521064
result += addBoolToString(_.Power, kPowerStr, false);
10531065
uint8_t cmd = _.Button;
10541066
result += addIntToString(cmd, kButtonStr);
@@ -1084,6 +1096,12 @@ String IRHaierAC176::toString(void) const {
10841096
case kHaierAcYrw02ButtonTurbo:
10851097
result += kTurboStr;
10861098
break;
1099+
case kHaierAcYrw02ButtonTimer:
1100+
result += kTimerStr;
1101+
break;
1102+
case kHaierAcYrw02ButtonLock:
1103+
result += kLockStr;
1104+
break;
10871105
default:
10881106
result += kUnknownStr;
10891107
}
@@ -1169,6 +1187,7 @@ String IRHaierAC176::toString(void) const {
11691187
result += addLabeledString((tmode != kHaierAcYrw02NoTimers &&
11701188
tmode != kHaierAcYrw02OnTimer) ?
11711189
minsToString(getOffTimer()) : kOffStr, kOffTimerStr);
1190+
result += addBoolToString(_.Lock, kLockStr);
11721191
return result;
11731192
}
11741193
// End of IRHaierAC176 class.

src/ir_Haier.h

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,18 @@ const uint8_t kHaierAcYrw02Dry = 0b010; // 2
161161
const uint8_t kHaierAcYrw02Heat = 0b100; // 4
162162
const uint8_t kHaierAcYrw02Fan = 0b110; // 5
163163

164-
const uint8_t kHaierAcYrw02ButtonTempUp = 0x0;
165-
const uint8_t kHaierAcYrw02ButtonTempDown = 0x1;
166-
const uint8_t kHaierAcYrw02ButtonSwingV = 0x2;
167-
const uint8_t kHaierAcYrw02ButtonSwingH = 0x3;
168-
const uint8_t kHaierAcYrw02ButtonFan = 0x4;
169-
const uint8_t kHaierAcYrw02ButtonPower = 0x5;
170-
const uint8_t kHaierAcYrw02ButtonMode = 0x6;
171-
const uint8_t kHaierAcYrw02ButtonHealth = 0x7;
172-
const uint8_t kHaierAcYrw02ButtonTurbo = 0x8;
173-
const uint8_t kHaierAcYrw02ButtonSleep = 0xB;
164+
const uint8_t kHaierAcYrw02ButtonTempUp = 0b00000;
165+
const uint8_t kHaierAcYrw02ButtonTempDown = 0b00001;
166+
const uint8_t kHaierAcYrw02ButtonSwingV = 0b00010;
167+
const uint8_t kHaierAcYrw02ButtonSwingH = 0b00011;
168+
const uint8_t kHaierAcYrw02ButtonFan = 0b00100;
169+
const uint8_t kHaierAcYrw02ButtonPower = 0b00101;
170+
const uint8_t kHaierAcYrw02ButtonMode = 0b00110;
171+
const uint8_t kHaierAcYrw02ButtonHealth = 0b00111;
172+
const uint8_t kHaierAcYrw02ButtonTurbo = 0b01000;
173+
const uint8_t kHaierAcYrw02ButtonSleep = 0b01011;
174+
const uint8_t kHaierAcYrw02ButtonTimer = 0b10000;
175+
const uint8_t kHaierAcYrw02ButtonLock = 0b10100;
174176

175177
const uint8_t kHaierAcYrw02NoTimers = 0b000;
176178
const uint8_t kHaierAcYrw02OffTimer = 0b001;
@@ -220,8 +222,9 @@ union HaierAc176Protocol{
220222
// Byte 11
221223
uint8_t :8;
222224
// Byte 12
223-
uint8_t Button :4;
224-
uint8_t :4;
225+
uint8_t Button :5;
226+
uint8_t Lock :1;
227+
uint8_t :2;
225228
// Byte 13
226229
uint8_t Sum :8;
227230
// Byte 14
@@ -403,6 +406,9 @@ class IRHaierAC176 {
403406
void setOffTimer(const uint16_t mins);
404407
uint16_t getOffTimer(void) const;
405408

409+
bool getLock(void) const;
410+
void setLock(const bool on);
411+
406412
uint8_t* getRaw(void);
407413
virtual void setRaw(const uint8_t new_code[]);
408414
static bool validChecksum(const uint8_t state[],

src/locale/defaults.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,9 @@
291291
#ifndef D_STR_VANE
292292
#define D_STR_VANE "Vane"
293293
#endif // D_STR_VANE
294+
#ifndef D_STR_LOCK
295+
#define D_STR_LOCK "Lock"
296+
#endif // D_STR_LOCK
294297

295298
#ifndef D_STR_AUTO
296299
#define D_STR_AUTO "Auto"

src/locale/ru-RU.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
#define D_STR_SPECIAL "Специальный"
8585
#define D_STR_RECYCLE "Рециркуляция"
8686
#define D_STR_VANE "Жалюзи"
87+
#define D_STR_LOCK "Блокировка"
8788
#define D_STR_AUTO "Авто"
8889
#define D_STR_AUTOMATIC "Автоматический"
8990
#define D_STR_MANUAL "Ручной"

test/IRac_test.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ TEST(TestIRac, Haier176) {
793793
"Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 23C, "
794794
"Fan: 2 (Medium), Turbo: On, Quiet: Off, Swing(V): 1 (Highest), "
795795
"Swing(H): 0 (Middle), Sleep: On, Health: On, "
796-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off";
796+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off";
797797
ac.begin();
798798
irac.haier176(&ac,
799799
true, // Power
@@ -824,7 +824,7 @@ TEST(TestIRac, HaierYrwo2) {
824824
"Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 23C, "
825825
"Fan: 2 (Medium), Turbo: Off, Quiet: On, Swing(V): 1 (Highest), "
826826
"Swing(H): 7 (Auto), Sleep: On, Health: On, "
827-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off";
827+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off";
828828

829829
ac.begin();
830830
irac.haierYrwo2(&ac,

test/ir_Haier_test.cpp

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -723,14 +723,32 @@ TEST(TestHaierACYRW02Class, SwingH) {
723723
EXPECT_EQ(kHaierAcYrw02ButtonTempUp, ac.getButton());
724724
}
725725

726+
TEST(TestHaierACYRW02Class, Lock) {
727+
IRHaierACYRW02 ac(kGpioUnused);
728+
ac.begin();
729+
730+
ac.setLock(true);
731+
EXPECT_TRUE(ac.getLock());
732+
EXPECT_EQ(kHaierAcYrw02ButtonLock, ac.getButton());
733+
734+
ac.setButton(kHaierAcYrw02ButtonTempUp);
735+
ac.setLock(false);
736+
EXPECT_FALSE(ac.getLock());
737+
EXPECT_EQ(kHaierAcYrw02ButtonLock, ac.getButton());
738+
739+
ac.setLock(true);
740+
EXPECT_TRUE(ac.getLock());
741+
EXPECT_EQ(kHaierAcYrw02ButtonLock, ac.getButton());
742+
}
743+
726744
TEST(TestHaierACYRW02Class, MessageConstuction) {
727745
IRHaierACYRW02 ac(kGpioUnused);
728746

729747
EXPECT_EQ(
730748
"Power: On, Button: 5 (Power), Mode: 0 (Auto), Temp: 25C, "
731749
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 0 (Off), "
732750
"Swing(H): 0 (Middle), Sleep: Off, Health: On, "
733-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
751+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
734752
ac.toString());
735753
ac.setMode(kHaierAcYrw02Cool);
736754
ac.setTemp(21);
@@ -739,7 +757,7 @@ TEST(TestHaierACYRW02Class, MessageConstuction) {
739757
"Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 21C, "
740758
"Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 0 (Off), "
741759
"Swing(H): 0 (Middle), Sleep: Off, Health: On, "
742-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
760+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
743761
ac.toString());
744762

745763
ac.setSwingV(kHaierAcYrw02SwingVMiddle);
@@ -750,7 +768,7 @@ TEST(TestHaierACYRW02Class, MessageConstuction) {
750768
"Power: On, Button: 8 (Turbo), Mode: 1 (Cool), Temp: 21C, "
751769
"Fan: 1 (High), Turbo: On, Quiet: Off, Swing(V): 2 (Middle), "
752770
"Swing(H): 0 (Middle), Sleep: On, Health: Off, "
753-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
771+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
754772
ac.toString());
755773
}
756774

@@ -766,7 +784,7 @@ TEST(TestHaierACYRW02Class, RealStates) {
766784
"Power: On, Button: 7 (Health), Mode: 4 (Heat), Temp: 30C, "
767785
"Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 1 (Highest), "
768786
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
769-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
787+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
770788
ac.toString());
771789

772790
uint8_t expectedState2[kHaierACYRW02StateLength] = {
@@ -777,7 +795,7 @@ TEST(TestHaierACYRW02Class, RealStates) {
777795
"Power: Off, Button: 5 (Power), Mode: 4 (Heat), Temp: 30C, "
778796
"Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 0 (Off), "
779797
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
780-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
798+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
781799
ac.toString());
782800

783801
uint8_t expectedState3[kHaierACYRW02StateLength] = {
@@ -788,7 +806,7 @@ TEST(TestHaierACYRW02Class, RealStates) {
788806
"Power: On, Button: 1 (Temp Down), Mode: 1 (Cool), Temp: 16C, "
789807
"Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), "
790808
"Swing(H): 0 (Middle), Sleep: Off, Health: On, "
791-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
809+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
792810
ac.toString());
793811

794812
// cool 25, health, fan auto, vertical swing auto, sleep on
@@ -800,7 +818,7 @@ TEST(TestHaierACYRW02Class, RealStates) {
800818
"Power: On, Button: 11 (Sleep), Mode: 1 (Cool), Temp: 25C, "
801819
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 12 (Auto), "
802820
"Swing(H): 0 (Middle), Sleep: On, Health: On, "
803-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
821+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
804822
ac.toString());
805823

806824
// cool 25, health, fan 3, vertical swing auto, sleep on
@@ -812,7 +830,7 @@ TEST(TestHaierACYRW02Class, RealStates) {
812830
"Power: On, Button: 4 (Fan), Mode: 1 (Cool), Temp: 25C, "
813831
"Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 12 (Auto), "
814832
"Swing(H): 0 (Middle), Sleep: On, Health: On, "
815-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
833+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
816834
ac.toString());
817835
}
818836

@@ -1044,7 +1062,7 @@ TEST(TestDecodeHaierAC_YRW02, RealExample) {
10441062
"Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 17C, "
10451063
"Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), "
10461064
"Swing(H): 0 (Middle), Sleep: Off, Health: On, "
1047-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
1065+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
10481066
ac.toString());
10491067
}
10501068

@@ -1270,7 +1288,7 @@ TEST(TestDecodeHaierAC176, SyntheticDecode) {
12701288
"Power: On, Button: 5 (Power), Mode: 1 (Cool), Temp: 24C, "
12711289
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 6 (UNKNOWN), "
12721290
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
1273-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
1291+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
12741292
IRAcUtils::resultAcToString(&irsend.capture));
12751293
stdAc::state_t result, prev;
12761294
ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &result, &prev));
@@ -1312,7 +1330,7 @@ TEST(TestHaierAC176Class, BuildKnownState) {
13121330
"Power: On, Button: 4 (Fan), Mode: 4 (Heat), Temp: 24C, "
13131331
"Fan: 1 (High), Turbo: Off, Quiet: Off, Swing(V): 0 (Off), "
13141332
"Swing(H): 0 (Middle), Sleep: Off, Health: On, "
1315-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
1333+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
13161334
ac.toString());
13171335
/* Disabled pending:
13181336
https://github.com/crankyoldgit/IRremoteESP8266/issues/1480#issuecomment-885636790
@@ -1401,49 +1419,49 @@ TEST(TestHaierAC176Class, Timers) {
14011419
ac.setRaw(timer30m);
14021420
EXPECT_EQ(kHaierAcYrw02OnTimer, ac.getTimerMode());
14031421
EXPECT_EQ(
1404-
"Power: Off, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, "
1422+
"Power: Off, Button: 16 (Timer), Mode: 0 (Auto), Temp: 24C, "
14051423
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), "
14061424
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
1407-
"Timer Mode: 2 (On), On Timer: 00:30, Off Timer: Off",
1425+
"Timer Mode: 2 (On), On Timer: 00:30, Off Timer: Off, Lock: Off",
14081426
ac.toString());
14091427
ac.setRaw(timeroff);
14101428
EXPECT_EQ(kHaierAcYrw02NoTimers, ac.getTimerMode());
14111429
EXPECT_EQ(
1412-
"Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, "
1430+
"Power: On, Button: 16 (Timer), Mode: 0 (Auto), Temp: 24C, "
14131431
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), "
14141432
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
1415-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
1433+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
14161434
ac.toString());
14171435
ac.setRaw(timeroffthenon);
14181436
EXPECT_EQ(
1419-
"Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, "
1437+
"Power: On, Button: 16 (Timer), Mode: 0 (Auto), Temp: 24C, "
14201438
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), "
14211439
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
1422-
"Timer Mode: 5 (Off-On), On Timer: 08:00, Off Timer: 00:30",
1440+
"Timer Mode: 5 (Off-On), On Timer: 08:00, Off Timer: 00:30, Lock: Off",
14231441
ac.toString());
14241442
ac.setTimerMode(kHaierAcYrw02OnThenOffTimer);
14251443
EXPECT_EQ(
1426-
"Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, "
1444+
"Power: On, Button: 16 (Timer), Mode: 0 (Auto), Temp: 24C, "
14271445
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), "
14281446
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
1429-
"Timer Mode: 4 (On-Off), On Timer: 08:00, Off Timer: 00:30",
1447+
"Timer Mode: 4 (On-Off), On Timer: 08:00, Off Timer: 00:30, Lock: Off",
14301448
ac.toString());
14311449
ac.setTimerMode(kHaierAcYrw02OffTimer);
14321450
EXPECT_EQ(0, ac.getOnTimer());
14331451
EXPECT_EQ(30, ac.getOffTimer());
14341452
EXPECT_EQ(
1435-
"Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, "
1453+
"Power: On, Button: 16 (Timer), Mode: 0 (Auto), Temp: 24C, "
14361454
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), "
14371455
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
1438-
"Timer Mode: 1 (Off), On Timer: Off, Off Timer: 00:30",
1456+
"Timer Mode: 1 (Off), On Timer: Off, Off Timer: 00:30, Lock: Off",
14391457
ac.toString());
14401458
ac.setTimerMode(kHaierAcYrw02NoTimers);
14411459
EXPECT_EQ(0, ac.getOnTimer());
14421460
EXPECT_EQ(0, ac.getOffTimer());
14431461
EXPECT_EQ(
1444-
"Power: On, Button: 0 (Temp Up), Mode: 0 (Auto), Temp: 24C, "
1462+
"Power: On, Button: 16 (Timer), Mode: 0 (Auto), Temp: 24C, "
14451463
"Fan: 5 (Auto), Turbo: Off, Quiet: Off, Swing(V): 2 (Middle), "
14461464
"Swing(H): 0 (Middle), Sleep: Off, Health: Off, "
1447-
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off",
1465+
"Timer Mode: 0 (N/A), On Timer: Off, Off Timer: Off, Lock: Off",
14481466
ac.toString());
14491467
}

0 commit comments

Comments
 (0)