From a2228ed9dcc1e9ef9aaee5f5bb89f03b72a26758 Mon Sep 17 00:00:00 2001 From: David Conran Date: Wed, 30 Aug 2023 15:18:42 +1000 Subject: [PATCH 1/5] Panasonic AC: Document support for PV1122V remote (#2029) For #2026 --- src/ir_Panasonic.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ir_Panasonic.h b/src/ir_Panasonic.h index b2d151ed5..50b0783ac 100644 --- a/src/ir_Panasonic.h +++ b/src/ir_Panasonic.h @@ -24,6 +24,7 @@ // Brand: Panasonic, Model: A75C2311 remote (PANASONIC_AC CKP/5) // Brand: Panasonic, Model: A75C2616-1 remote (PANASONIC_AC DKE/3) // Brand: Panasonic, Model: A75C3704 remote (PANASONIC_AC DKE/3) +// Brand: Panasonic, Model: PN1122V remote (PANASONIC_AC DKE/3) // Brand: Panasonic, Model: A75C3747 remote (PANASONIC_AC JKE/4) // Brand: Panasonic, Model: CS-E9CKP series A/C (PANASONIC_AC32) // Brand: Panasonic, Model: A75C2295 remote (PANASONIC_AC32) From a295f87e067bc8ccb22523ef035a05ea11d65e49 Mon Sep 17 00:00:00 2001 From: David Conran Date: Fri, 1 Sep 2023 16:25:51 +1000 Subject: [PATCH 2/5] Remove unused constant `kRcmmExcess` (#2033) Per https://github.com/crankyoldgit/IRremoteESP8266/issues/2031#issuecomment-1702159536 --- src/ir_RCMM.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ir_RCMM.cpp b/src/ir_RCMM.cpp index 97a3c79b5..00cc58f02 100644 --- a/src/ir_RCMM.cpp +++ b/src/ir_RCMM.cpp @@ -35,7 +35,6 @@ const uint16_t kRcmmMinGapTicks = 120; const uint32_t kRcmmMinGap = 3360; // Use a tolerance of +/-10% when matching some data spaces. const uint8_t kRcmmTolerance = 10; -const uint16_t kRcmmExcess = 50; #if SEND_RCMM /// Send a Philips RC-MM packet. From 089ca898d0a37bd4a5e3948119754390ced3ffd4 Mon Sep 17 00:00:00 2001 From: noone2k <869869+noone2k@users.noreply.github.com> Date: Sat, 9 Dec 2023 23:58:59 +0100 Subject: [PATCH 3/5] Quiet/Silent Mode for Electra_AC (#1990) * Add Delonghi PAC EM90 to Electra compat. list * Add Electra_AC Quiet Mode ( testet with Delonghi PAC EM90 ) --------- Co-authored-by: noone2k --- src/IRac.cpp | 10 ++++++---- src/IRac.h | 4 ++-- src/ir_Electra.cpp | 15 ++++++++++++++- src/ir_Electra.h | 5 ++++- test/IRac_test.cpp | 3 ++- test/ir_Electra_test.cpp | 20 ++++++++++---------- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/IRac.cpp b/src/IRac.cpp index 67c218c1e..571e31c8e 100644 --- a/src/IRac.cpp +++ b/src/IRac.cpp @@ -1167,6 +1167,7 @@ void IRac::ecoclim(IREcoclimAc *ac, /// @param[in] swingv The vertical swing setting. /// @param[in] swingh The horizontal swing setting. /// @param[in] iFeel Whether to enable iFeel (remote temp) mode on the A/C unit. +/// @param[in] quiet Run the device in quiet/silent mode. /// @param[in] turbo Run the device in turbo/powerful mode. /// @param[in] lighttoggle Should we toggle the LED/Display? /// @param[in] clean Turn on the self-cleaning mode. e.g. Mould, dry filters etc @@ -1175,7 +1176,8 @@ void IRac::electra(IRElectraAc *ac, const float degrees, const float sensorTemp, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool iFeel, - const bool turbo, const bool lighttoggle, const bool clean) { + const bool quiet, const bool turbo, const bool lighttoggle, + const bool clean) { ac->begin(); ac->setPower(on); ac->setMode(ac->convertMode(mode)); @@ -1186,7 +1188,7 @@ void IRac::electra(IRElectraAc *ac, ac->setFan(ac->convertFan(fan)); ac->setSwingV(swingv != stdAc::swingv_t::kOff); ac->setSwingH(swingh != stdAc::swingh_t::kOff); - // No Quiet setting available. + ac->setQuiet(quiet); ac->setTurbo(turbo); ac->setLightToggle(lighttoggle); // No Econo setting available. @@ -3223,8 +3225,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { { IRElectraAc ac(_pin, _inverted, _modulation); electra(&ac, send.power, send.mode, degC, sensorTempC, send.fanspeed, - send.swingv, send.swingh, send.iFeel, send.turbo, send.light, - send.clean); + send.swingv, send.swingh, send.iFeel, send.quiet, send.turbo, + send.light, send.clean); break; } #endif // SEND_ELECTRA_AC diff --git a/src/IRac.h b/src/IRac.h index 7f4a3cf01..e3c261d0d 100644 --- a/src/IRac.h +++ b/src/IRac.h @@ -264,8 +264,8 @@ void electra(IRElectraAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const float sensorTemp, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, - const stdAc::swingh_t swingh, const bool iFeel, const bool turbo, - const bool lighttoggle, const bool clean); + const stdAc::swingh_t swingh, const bool iFeel, const bool quiet, + const bool turbo, const bool lighttoggle, const bool clean); #endif // SEND_ELECTRA_AC #if SEND_FUJITSU_AC void fujitsu(IRFujitsuAC *ac, const fujitsu_ac_remote_model_t model, diff --git a/src/ir_Electra.cpp b/src/ir_Electra.cpp index f8edf9729..40e208a52 100644 --- a/src/ir_Electra.cpp +++ b/src/ir_Electra.cpp @@ -310,6 +310,18 @@ bool IRElectraAc::getTurbo(void) const { return _.Turbo; } +/// Set the Quiet/Silent'mode of the A/C. +/// @param[in] on true, the setting is on. false, the setting is off. +void IRElectraAc::setQuiet(const bool on) { + _.Quiet = on; +} + +/// Get the Quiet/Silent mode of the A/C. +/// @return true, the setting is on. false, the setting is off. +bool IRElectraAc::getQuiet(void) const { + return _.Quiet; +} + /// Get the IFeel mode of the A/C. /// @return true, the setting is on. false, the setting is off. bool IRElectraAc::getIFeel(void) const { return _.IFeel; } @@ -373,11 +385,11 @@ stdAc::state_t IRElectraAc::toCommon(void) const { : stdAc::swingh_t::kOff; result.light = getLightToggle(); result.turbo = _.Turbo; + result.quiet = _.Quiet; result.clean = _.Clean; result.iFeel = getIFeel(); // Not supported. result.model = -1; // No models used. - result.quiet = false; result.econo = false; result.filter = false; result.beep = false; @@ -404,6 +416,7 @@ String IRElectraAc::toString(void) const { result += addToggleToString(getLightToggle(), kLightStr); result += addBoolToString(_.Clean, kCleanStr); result += addBoolToString(_.Turbo, kTurboStr); + result += addBoolToString(_.Quiet, kQuietStr); result += addBoolToString(_.IFeel, kIFeelStr); } if (_.IFeel || _.SensorUpdate) { diff --git a/src/ir_Electra.h b/src/ir_Electra.h index 602406d8d..ebc330068 100644 --- a/src/ir_Electra.h +++ b/src/ir_Electra.h @@ -15,6 +15,7 @@ // Brand: Centek, Model: YKR-P/002E remote // Brand: AEG, Model: Chillflex Pro AXP26U338CW A/C // Brand: Electrolux, Model: YKR-H/531E A/C +// Brand: Delonghi, Modell: PAC EM90 #ifndef IR_ELECTRA_H_ #define IR_ELECTRA_H_ @@ -52,7 +53,7 @@ union ElectraProtocol { // Byte 5 uint8_t :6; uint8_t Turbo :1; - uint8_t :1; + uint8_t Quiet :1; // Byte 6 uint8_t :3; uint8_t IFeel :1; @@ -145,6 +146,8 @@ class IRElectraAc { bool getLightToggle(void) const; void setTurbo(const bool on); bool getTurbo(void) const; + void setQuiet(const bool on); + bool getQuiet(void) const; void setIFeel(const bool on); bool getIFeel(void) const; void setSensorUpdate(const bool on); diff --git a/test/IRac_test.cpp b/test/IRac_test.cpp index 8d6274c65..5d9084ecb 100644 --- a/test/IRac_test.cpp +++ b/test/IRac_test.cpp @@ -613,7 +613,7 @@ TEST(TestIRac, Electra) { char expected[] = "Power: On, Mode: 6 (Fan), Temp: 26C, Fan: 1 (High), " "Swing(V): On, Swing(H): On, Light: Toggle, Clean: On, Turbo: On, " - "IFeel: Off"; + "Quiet: On, IFeel: Off"; ac.begin(); irac.electra(&ac, @@ -625,6 +625,7 @@ TEST(TestIRac, Electra) { stdAc::swingv_t::kAuto, // Vertical swing stdAc::swingh_t::kLeft, // Horizontal swing false, // iFeel + true, // Quiet true, // Turbo true, // Light (toggle) true); // Clean diff --git a/test/ir_Electra_test.cpp b/test/ir_Electra_test.cpp index 9c1dedd09..6eefc8b1d 100644 --- a/test/ir_Electra_test.cpp +++ b/test/ir_Electra_test.cpp @@ -102,7 +102,7 @@ TEST(TestDecodeElectraAC, RealExampleDecode) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), " "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off, " - "IFeel: Off", + "Quiet: Off, IFeel: Off", IRAcUtils::resultAcToString(&irsend.capture)); stdAc::state_t r, p; ASSERT_TRUE(IRAcUtils::decodeToState(&irsend.capture, &r, &p)); @@ -237,7 +237,7 @@ TEST(TestIRElectraAcClass, HumanReadable) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 32C, Fan: 5 (Auto), " "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off, " - "IFeel: Off", + "Quiet: Off, IFeel: Off", ac.toString()); uint8_t on_cool_16C_auto_voff[13] = { 0xC3, 0x47, 0xE0, 0x00, 0xA0, 0x00, 0x20, @@ -246,7 +246,7 @@ TEST(TestIRElectraAcClass, HumanReadable) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 5 (Auto), " "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off, " - "IFeel: Off", + "Quiet: Off, IFeel: Off", ac.toString()); uint8_t on_cool_16C_low_voff[13] = { 0xC3, 0x47, 0xE0, 0x00, 0x60, 0x00, 0x20, @@ -255,7 +255,7 @@ TEST(TestIRElectraAcClass, HumanReadable) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 16C, Fan: 3 (Low), " "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off, " - "IFeel: Off", + "Quiet: Off, IFeel: Off", ac.toString()); } @@ -280,7 +280,7 @@ TEST(TestIRElectraAcClass, Clean) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), " "Swing(V): Off, Swing(H): Off, Light: Toggle, Clean: On, Turbo: Off, " - "IFeel: Off", + "Quiet: Off, IFeel: Off", ac.toString()); } @@ -307,7 +307,7 @@ TEST(TestIRElectraAcClass, Turbo) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), " "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: On, " - "IFeel: Off", + "Quiet: Off, IFeel: Off", ac.toString()); } @@ -332,7 +332,7 @@ TEST(TestIRElectraAcClass, LightToggle) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), " "Swing(V): Off, Swing(H): Off, Light: Toggle, Clean: On, Turbo: Off, " - "IFeel: Off", + "Quiet: Off, IFeel: Off", ac.toString()); } @@ -360,7 +360,7 @@ TEST(TestIRElectraAcClass, ConstructKnownState) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 24C, Fan: 3 (Low), " "Swing(V): Off, Swing(H): Off, Light: Toggle, Clean: On, Turbo: Off, " - "IFeel: Off", + "Quiet: Off, IFeel: Off", ac.toString()); EXPECT_STATE_EQ(on_cool_24C_fan1_swing_off_turbo_off_clean_on, ac.getRaw(), kElectraAcBits); @@ -379,7 +379,7 @@ TEST(TestIRElectraAcClass, IFeelAndSensor) { EXPECT_EQ( "Power: On, Mode: 1 (Cool), Temp: 21C, Fan: 5 (Auto), " "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off, " - "IFeel: On, Sensor Temp: 26C", + "Quiet: Off, IFeel: On, Sensor Temp: 26C", ac.toString()); ac.stateReset(); @@ -429,6 +429,6 @@ TEST(TestIRElectraAcClass, IFeelAndSensor) { EXPECT_EQ( "Power: On, Mode: 4 (Heat), Temp: 27C, Fan: 5 (Auto), " "Swing(V): Off, Swing(H): Off, Light: -, Clean: Off, Turbo: Off, " - "IFeel: On, Sensor Temp: 28C", + "Quiet: Off, IFeel: On, Sensor Temp: 28C", ac.toString()); } From f67948f6c8b156ff178b943af52bd4d3e0a94a6a Mon Sep 17 00:00:00 2001 From: "K.Takata" Date: Mon, 11 Dec 2023 15:45:41 +0900 Subject: [PATCH 4/5] Daikin: Support setting temperature in 0.5 C unit (#2036) However, IRDaikinESP didn't support it. This PR allows to set and get the temperature in 0.5 C unit. It looks like some other Daikin protocols also support setting the temperature in 0.5 C unit: * Daikin2 * Daikin216 * Daikin160 * Daikin176 * Daikin152 However, they are not implemented in this PR, because I cannot test them. --- src/ir_Daikin.cpp | 15 ++++++++------- src/ir_Daikin.h | 7 +++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/ir_Daikin.cpp b/src/ir_Daikin.cpp index f44cd8f13..114d38989 100644 --- a/src/ir_Daikin.cpp +++ b/src/ir_Daikin.cpp @@ -46,6 +46,7 @@ using irutils::addModeToString; using irutils::addSwingHToString; using irutils::addSwingVToString; using irutils::addTempToString; +using irutils::addTempFloatToString; using irutils::addFanToString; using irutils::bcdToUint8; using irutils::minsToString; @@ -221,15 +222,15 @@ bool IRDaikinESP::getPower(void) const { /// Set the temperature. /// @param[in] temp The temperature in degrees celsius. -void IRDaikinESP::setTemp(const uint8_t temp) { - uint8_t degrees = std::max(temp, kDaikinMinTemp); - degrees = std::min(degrees, kDaikinMaxTemp); - _.Temp = degrees; +void IRDaikinESP::setTemp(const float temp) { + float degrees = std::max(temp, static_cast(kDaikinMinTemp)); + degrees = std::min(degrees, static_cast(kDaikinMaxTemp)); + _.Temp = degrees * 2.0f; } /// Get the current temperature setting. /// @return The current setting for temp. in degrees celsius. -uint8_t IRDaikinESP::getTemp(void) const { return _.Temp; } +float IRDaikinESP::getTemp(void) const { return _.Temp / 2.0f; } /// Set the speed of the fan. /// @param[in] fan The desired setting. @@ -536,7 +537,7 @@ stdAc::state_t IRDaikinESP::toCommon(void) const { result.power = _.Power; result.mode = toCommonMode(_.Mode); result.celsius = true; - result.degrees = _.Temp; + result.degrees = getTemp(); result.fanspeed = toCommonFanSpeed(getFan()); result.swingv = _.SwingV ? stdAc::swingv_t::kAuto : stdAc::swingv_t::kOff; @@ -563,7 +564,7 @@ String IRDaikinESP::toString(void) const { result += addBoolToString(_.Power, kPowerStr, false); result += addModeToString(_.Mode, kDaikinAuto, kDaikinCool, kDaikinHeat, kDaikinDry, kDaikinFan); - result += addTempToString(_.Temp); + result += addTempFloatToString(getTemp()); result += addFanToString(getFan(), kDaikinFanMax, kDaikinFanMin, kDaikinFanAuto, kDaikinFanQuiet, kDaikinFanMed); result += addBoolToString(_.Powerful, kPowerfulStr); diff --git a/src/ir_Daikin.h b/src/ir_Daikin.h index 3a98f07e7..dda966aa6 100644 --- a/src/ir_Daikin.h +++ b/src/ir_Daikin.h @@ -99,8 +99,7 @@ union DaikinESPProtocol{ uint64_t Mode :3; uint64_t :1; // Byte 22 - uint64_t :1; - uint64_t Temp :7; // Temp should be between 10 - 32 + uint64_t Temp :8; // Temp should be between 20 - 64 (10 C - 32 C) // Byte 23 uint64_t :8; @@ -738,8 +737,8 @@ class IRDaikinESP { void off(void); void setPower(const bool on); bool getPower(void) const; - void setTemp(const uint8_t temp); - uint8_t getTemp(void) const; + void setTemp(const float temp); + float getTemp(void) const; void setFan(const uint8_t fan); uint8_t getFan(void) const; void setMode(const uint8_t mode); From d8aee22117b826945724dfb4f1b94d82d68f31f0 Mon Sep 17 00:00:00 2001 From: David Conran Date: Thu, 22 Feb 2024 19:16:54 +1000 Subject: [PATCH 5/5] Add AR-JW19 to supported devices (#2069) Per https://github.com/crankyoldgit/IRremoteESP8266/pull/1813#issuecomment-1958066970 --- src/ir_Fujitsu.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ir_Fujitsu.h b/src/ir_Fujitsu.h index 6e2583a0c..ed4979dac 100644 --- a/src/ir_Fujitsu.h +++ b/src/ir_Fujitsu.h @@ -41,6 +41,7 @@ // Brand: Fujitsu, Model: AR-REG1U remote (ARRAH2E) // Brand: OGeneral, Model: AR-RCL1E remote (ARRAH2E) // Brand: Fujitsu General, Model: AR-JW17 remote (ARDB1) +// Brand: Fujitsu General, Model: AR-JW19 remote (ARDB1) #ifndef IR_FUJITSU_H_ #define IR_FUJITSU_H_