mirror of
https://github.com/Threnklyn/esphome-dev.git
synced 2026-06-13 16:13:32 +02:00
Add ZH/LT-01 climate component with IR receiver option (#4333)
Co-authored-by: Chris Feenstra <chris@cfeenstra.nl> Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,167 @@
|
||||
#pragma once
|
||||
|
||||
#include "esphome/components/climate_ir/climate_ir.h"
|
||||
|
||||
/***********************************************************************************
|
||||
* SOURCE
|
||||
***********************************************************************************
|
||||
* The IR codes and the functional description below were taken from
|
||||
* 'arduino-heatpumpir/ZHLT01HeatpumpIR.h' as can be found on GitHub
|
||||
* https://github.com/ToniA/arduino-heatpumpir/blob/master/ZHLT01HeatpumpIR.h
|
||||
*
|
||||
************************************************************************************
|
||||
* Airconditional remote control encoder for:
|
||||
*
|
||||
* ZH/LT-01 Remote control https://www.google.com/search?q=zh/lt-01
|
||||
*
|
||||
* The ZH/LT-01 remote control is used for many locally branded Split
|
||||
* airconditioners, so it is better to name this protocol by the name of the
|
||||
* REMOTE rather then the name of the Airconditioner. For this project I used
|
||||
* a 2014 model Eurom-airconditioner, which is Dutch-branded and sold in
|
||||
* the Netherlands at Hornbach.
|
||||
*
|
||||
* For airco-brands:
|
||||
* Eurom
|
||||
* Chigo
|
||||
* Tristar
|
||||
* Tecnomaster
|
||||
* Elgin
|
||||
* Geant
|
||||
* Tekno
|
||||
* Topair
|
||||
* Proma
|
||||
* Sumikura
|
||||
* JBS
|
||||
* Turbo Air
|
||||
* Nakatomy
|
||||
* Celestial Air
|
||||
* Ager
|
||||
* Blueway
|
||||
* Airlux
|
||||
* Etc.
|
||||
*
|
||||
***********************************************************************************
|
||||
* SUMMARY FUNCTIONAL DESCRIPTION
|
||||
***********************************************************************************
|
||||
* The remote sends a 12 Byte message which contains all possible settings every
|
||||
* time.
|
||||
*
|
||||
* Byte 11 (and 10) contain the remote control identifier and are always 0xD5 and
|
||||
* 0x2A respectively for the ZH/LT-01 remote control.
|
||||
* Every UNeven Byte (01,03,05,07 and 09) holds command data
|
||||
* Every EVEN Byte (00,02,04,06,08 and 10) holds a checksum of the corresponding
|
||||
* command-, or identifier-byte by _inverting_ the bits, for example:
|
||||
*
|
||||
* The identifier byte[11] = 0xD5 = B1101 0101
|
||||
* The checksum byte[10] = 0x2A = B0010 1010
|
||||
*
|
||||
* So, you can check the message by:
|
||||
* - inverting the bits of the checksum byte with the corresponding command-, or
|
||||
* identifier byte, they should be the same, or
|
||||
* - Summing up the checksum byte and the corresponding command-, or identifier byte,
|
||||
* they should always add up to 0xFF = B11111111 = 255
|
||||
*
|
||||
* Control bytes:
|
||||
* [01] - Timer (1-24 hours, Off)
|
||||
* Time is hardcoded to OFF
|
||||
*
|
||||
* [03] - LAMP ON/OFF, TURBO ON/OFF, HOLD ON/OFF
|
||||
* Lamp and Hold are hardcoded to OFF
|
||||
* Turbo is used for the BOOST preset
|
||||
*
|
||||
* [05] - Indicates which button the user _pressed_ on the remote control
|
||||
* Hardcoded to POWER-button
|
||||
*
|
||||
* [07] - POWER ON/OFF, FAN AUTO/3/2/1, SLEEP ON/OFF, AIRFLOW ON/OFF,
|
||||
* VERTICAL SWING/WIND/FIXED
|
||||
* SLEEP is used for preset SLEEP
|
||||
* Vertical Swing supports Fixed, Swing and "Wind". The Wind option
|
||||
* is ignored in this implementation
|
||||
*
|
||||
* [09] - MODE AUTO/COOL/VENT/DRY/HEAT, TEMPERATURE (16 - 32°C)
|
||||
*
|
||||
***********************************************************************************/
|
||||
|
||||
namespace esphome {
|
||||
namespace zhlt01 {
|
||||
|
||||
/********************************************************************************
|
||||
* TIMINGS
|
||||
* Space: Not used
|
||||
* Header Mark: 6100 us
|
||||
* Header Space: 7400 us
|
||||
* Bit Mark: 500 us
|
||||
* Zero Space: 600 us
|
||||
* One Space: 1800 us
|
||||
*
|
||||
* Note : These timings are slightly different than those of ZHLT01HeatpumpIR
|
||||
* The values below were measured by taking the average of 2 different
|
||||
* remote controls each sending 10 commands
|
||||
*******************************************************************************/
|
||||
static const uint32_t AC1_HDR_MARK = 6100;
|
||||
static const uint32_t AC1_HDR_SPACE = 7400;
|
||||
static const uint32_t AC1_BIT_MARK = 500;
|
||||
static const uint32_t AC1_ZERO_SPACE = 600;
|
||||
static const uint32_t AC1_ONE_SPACE = 1800;
|
||||
|
||||
/********************************************************************************
|
||||
*
|
||||
* ZHLT01 codes
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
// Power
|
||||
static const uint8_t AC1_POWER_OFF = 0x00;
|
||||
static const uint8_t AC1_POWER_ON = 0x02;
|
||||
|
||||
// Operating Modes
|
||||
static const uint8_t AC1_MODE_AUTO = 0x00;
|
||||
static const uint8_t AC1_MODE_COOL = 0x20;
|
||||
static const uint8_t AC1_MODE_DRY = 0x40;
|
||||
static const uint8_t AC1_MODE_FAN = 0x60;
|
||||
static const uint8_t AC1_MODE_HEAT = 0x80;
|
||||
|
||||
// Fan control
|
||||
static const uint8_t AC1_FAN_AUTO = 0x00;
|
||||
static const uint8_t AC1_FAN_SILENT = 0x01;
|
||||
static const uint8_t AC1_FAN1 = 0x60;
|
||||
static const uint8_t AC1_FAN2 = 0x40;
|
||||
static const uint8_t AC1_FAN3 = 0x20;
|
||||
static const uint8_t AC1_FAN_TURBO = 0x08;
|
||||
|
||||
// Vertical Swing
|
||||
static const uint8_t AC1_VDIR_WIND = 0x00; // "Natural Wind", ignore
|
||||
static const uint8_t AC1_VDIR_SWING = 0x04; // Swing
|
||||
static const uint8_t AC1_VDIR_FIXED = 0x08; // Fixed
|
||||
|
||||
// Horizontal Swing
|
||||
static const uint8_t AC1_HDIR_SWING = 0x00; // Swing
|
||||
static const uint8_t AC1_HDIR_FIXED = 0x10; // Fixed
|
||||
|
||||
// Temperature range
|
||||
static const float AC1_TEMP_MIN = 16.0f;
|
||||
static const float AC1_TEMP_MAX = 32.0f;
|
||||
static const float AC1_TEMP_INC = 1.0f;
|
||||
|
||||
class ZHLT01Climate : public climate_ir::ClimateIR {
|
||||
public:
|
||||
ZHLT01Climate()
|
||||
: climate_ir::ClimateIR(
|
||||
AC1_TEMP_MIN, AC1_TEMP_MAX, AC1_TEMP_INC, true, true,
|
||||
{climate::CLIMATE_FAN_AUTO, climate::CLIMATE_FAN_LOW, climate::CLIMATE_FAN_MEDIUM,
|
||||
climate::CLIMATE_FAN_HIGH},
|
||||
{climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL, climate::CLIMATE_SWING_HORIZONTAL,
|
||||
climate::CLIMATE_SWING_BOTH},
|
||||
{climate::CLIMATE_PRESET_NONE, climate::CLIMATE_PRESET_SLEEP, climate::CLIMATE_PRESET_BOOST}) {}
|
||||
|
||||
void setup() override { climate_ir::ClimateIR::setup(); }
|
||||
|
||||
protected:
|
||||
/// Transmit via IR the state of this climate controller.
|
||||
void transmit_state() override;
|
||||
/// Handle received IR Buffer
|
||||
bool on_receive(remote_base::RemoteReceiveData data) override;
|
||||
};
|
||||
|
||||
} // namespace zhlt01
|
||||
} // namespace esphome
|
||||
Reference in New Issue
Block a user