@@ -584,7 +584,7 @@ void IRHaierAC176::stateReset(void) {
584
584
std::memset (_.raw , 0 , sizeof _.raw );
585
585
_.Prefix = kHaierAcYrw02Prefix ;
586
586
_.Prefix2 = kHaierAc176Prefix ;
587
- _.Temp = kHaierAcDefTemp - kHaierAcMinTemp ;
587
+ _.Temp = kHaierAcYrw02DefTempC - kHaierAcYrw02MinTempC ;
588
588
_.Health = true ;
589
589
setFan (kHaierAcYrw02FanAuto );
590
590
_.Power = true ;
@@ -619,6 +619,7 @@ void IRHaierAC176::setButton(uint8_t button) {
619
619
case kHaierAcYrw02ButtonTurbo :
620
620
case kHaierAcYrw02ButtonSleep :
621
621
case kHaierAcYrw02ButtonLock :
622
+ case kHaierAcYrw02ButtonCF :
622
623
_.Button = button;
623
624
}
624
625
}
@@ -654,27 +655,96 @@ void IRHaierAC176::setMode(uint8_t mode) {
654
655
// / @return The current operating mode setting.
655
656
uint8_t IRHaierAC176::getMode (void ) const { return _.Mode ; }
656
657
657
- // / Set the temperature.
658
- // / @param[in] celsius The temperature in degrees celsius .
659
- void IRHaierAC176::setTemp ( const uint8_t celsius) {
660
- uint8_t temp = celsius;
661
- if (temp < kHaierAcMinTemp )
662
- temp = kHaierAcMinTemp ;
663
- else if (temp > kHaierAcMaxTemp )
664
- temp = kHaierAcMaxTemp ;
658
+ // / Set the default temperature units to use .
659
+ // / @param[in] on Use Fahrenheit as the units .
660
+ // / true is Fahrenheit, false is Celsius.
661
+ void IRHaierAC176::setUseFahrenheit ( const bool on) { _. UseFahrenheit = on; }
662
+
663
+ // / Get the default temperature units in use.
664
+ // / @return true is Fahrenheit, false is Celsius.
665
+ bool IRHaierAC176::getUseFahrenheit ( void ) const { return _. UseFahrenheit ; }
665
666
667
+ // / Set the temperature.
668
+ // / @param[in] degree The temperature in degrees.
669
+ // / @param[in] fahrenheit Use units of Fahrenheit and set that as units used.
670
+ void IRHaierAC176::setTemp (const uint8_t degree, const bool fahrenheit) {
666
671
uint8_t old_temp = getTemp ();
667
- if (old_temp == temp) return ;
668
- if (old_temp > temp)
669
- _.Button = kHaierAcYrw02ButtonTempDown ;
670
- else
671
- _.Button = kHaierAcYrw02ButtonTempUp ;
672
- _.Temp = temp - kHaierAcMinTemp ;
672
+ if (old_temp == degree) return ;
673
+
674
+ if (_.UseFahrenheit == fahrenheit) {
675
+ if (old_temp > degree)
676
+ _.Button = kHaierAcYrw02ButtonTempDown ;
677
+ else
678
+ _.Button = kHaierAcYrw02ButtonTempUp ;
679
+ } else {
680
+ _.Button = kHaierAcYrw02ButtonCF ;
681
+ }
682
+ _.UseFahrenheit = fahrenheit;
683
+
684
+ uint8_t temp = degree;
685
+ if (fahrenheit) {
686
+ if (temp < kHaierAcYrw02MinTempF )
687
+ temp = kHaierAcYrw02MinTempF ;
688
+ else if (temp > kHaierAcYrw02MaxTempF )
689
+ temp = kHaierAcYrw02MaxTempF ;
690
+ if (degree >= 77 ) { temp++; }
691
+ if (degree >= 79 ) { temp++; }
692
+ // See at IRHaierAC176::getTemp() comments for clarification
693
+ _.ExtraDegreeF = temp % 2 ;
694
+ _.Temp = (temp - kHaierAcYrw02MinTempF -_.ExtraDegreeF ) >> 1 ;
695
+ } else {
696
+ if (temp < kHaierAcYrw02MinTempC )
697
+ temp = kHaierAcYrw02MinTempC ;
698
+ else if (temp > kHaierAcYrw02MaxTempC )
699
+ temp = kHaierAcYrw02MaxTempC ;
700
+ _.Temp = temp - kHaierAcYrw02MinTempC ;
701
+ }
673
702
}
674
703
675
704
// / Get the current temperature setting.
676
705
// / @return The current setting for temp. in degrees celsius.
677
- uint8_t IRHaierAC176::getTemp (void ) const { return _.Temp + kHaierAcMinTemp ; }
706
+ uint8_t IRHaierAC176::getTemp (void ) const {
707
+ if (!_.UseFahrenheit ) { return _.Temp + kHaierAcYrw02MinTempC ; }
708
+ uint8_t degree = _.Temp *2 + kHaierAcYrw02MinTempF + _.ExtraDegreeF ;
709
+ // The way of coding the temperature in degree Fahrenheit is
710
+ // kHaierAcYrw02MinTempF + Temp*2 + ExtraDegreeF, for example
711
+ // Temp = 0b0011, ExtraDegreeF = 0b1, temperature is 60 + 3*2 + 1 = 67F
712
+ // But around 78F there is unconsistency, see table below
713
+ //
714
+ // | Fahrenheit | Temp | ExtraDegreeF |
715
+ // | 60F | 0b0000 | 0b0 |
716
+ // | 61F | 0b0000 | 0b1 |
717
+ // | 62F | 0b0001 | 0b0 |
718
+ // | 63F | 0b0001 | 0b1 |
719
+ // | 64F | 0b0010 | 0b0 |
720
+ // | 65F | 0b0010 | 0b1 |
721
+ // | 66F | 0b0011 | 0b0 |
722
+ // | 67F | 0b0011 | 0b1 |
723
+ // | 68F | 0b0100 | 0b0 |
724
+ // | 69F | 0b0100 | 0b1 |
725
+ // | 70F | 0b0101 | 0b0 |
726
+ // | 71F | 0b0101 | 0b1 |
727
+ // | 72F | 0b0110 | 0b0 |
728
+ // | 73F | 0b0110 | 0b1 |
729
+ // | 74F | 0b0111 | 0b0 |
730
+ // | 75F | 0b0111 | 0b1 |
731
+ // | 76F | 0b1000 | 0b0 |
732
+ // | Not Used | 0b1000 | 0b1 |
733
+ // | 77F | 0b1001 | 0b0 |
734
+ // | Not Used | 0b1001 | 0b1 |
735
+ // | 78F | 0b1010 | 0b0 |
736
+ // | 79F | 0b1010 | 0b1 |
737
+ // | 80F | 0b1011 | 0b0 |
738
+ // | 81F | 0b1011 | 0b1 |
739
+ // | 82F | 0b1100 | 0b0 |
740
+ // | 83F | 0b1100 | 0b1 |
741
+ // | 84F | 0b1101 | 0b0 |
742
+ // | 86F | 0b1110 | 0b0 |
743
+ // | 85F | 0b1101 | 0b1 |
744
+ if (degree >= 77 ) { degree--; }
745
+ if (degree >= 79 ) { degree--; }
746
+ return degree;
747
+ }
678
748
679
749
// / Set the Health (filter) setting of the A/C.
680
750
// / @param[in] on true, the setting is on. false, the setting is off.
@@ -1038,7 +1108,7 @@ stdAc::state_t IRHaierAC176::toCommon(void) const {
1038
1108
result.model = -1 ; // No models used.
1039
1109
result.power = _.Power ;
1040
1110
result.mode = toCommonMode (_.Mode );
1041
- result.celsius = true ;
1111
+ result.celsius = !_. UseFahrenheit ;
1042
1112
result.degrees = getTemp ();
1043
1113
result.fanspeed = toCommonFanSpeed (_.Fan );
1044
1114
result.swingv = toCommonSwingV (_.SwingV );
@@ -1102,14 +1172,17 @@ String IRHaierAC176::toString(void) const {
1102
1172
case kHaierAcYrw02ButtonLock :
1103
1173
result += kLockStr ;
1104
1174
break ;
1175
+ case kHaierAcYrw02ButtonCF :
1176
+ result += kCelsiusFahrenheitStr ;
1177
+ break ;
1105
1178
default :
1106
1179
result += kUnknownStr ;
1107
1180
}
1108
1181
result += ' )' ;
1109
1182
result += addModeToString (_.Mode , kHaierAcYrw02Auto , kHaierAcYrw02Cool ,
1110
1183
kHaierAcYrw02Heat , kHaierAcYrw02Dry ,
1111
1184
kHaierAcYrw02Fan );
1112
- result += addTempToString (getTemp ());
1185
+ result += addTempToString (getTemp (), !_. UseFahrenheit );
1113
1186
result += addFanToString (_.Fan , kHaierAcYrw02FanHigh , kHaierAcYrw02FanLow ,
1114
1187
kHaierAcYrw02FanAuto , kHaierAcYrw02FanAuto ,
1115
1188
kHaierAcYrw02FanMed );
0 commit comments