mirror of
https://github.com/esphome/esphome.git
synced 2025-02-24 05:48:14 +00:00
122 lines
5.1 KiB
C++
122 lines
5.1 KiB
C++
#pragma once
|
|
|
|
#include "esphome/core/log.h"
|
|
#include "esphome/components/climate_ir/climate_ir.h"
|
|
|
|
namespace esphome {
|
|
namespace hitachi_ac344 {
|
|
|
|
const uint16_t HITACHI_AC344_HDR_MARK = 3300; // ac
|
|
const uint16_t HITACHI_AC344_HDR_SPACE = 1700; // ac
|
|
const uint16_t HITACHI_AC344_BIT_MARK = 400;
|
|
const uint16_t HITACHI_AC344_ONE_SPACE = 1250;
|
|
const uint16_t HITACHI_AC344_ZERO_SPACE = 500;
|
|
const uint32_t HITACHI_AC344_MIN_GAP = 100000; // just a guess.
|
|
const uint16_t HITACHI_AC344_FREQ = 38000; // Hz.
|
|
|
|
const uint8_t HITACHI_AC344_BUTTON_BYTE = 11;
|
|
const uint8_t HITACHI_AC344_BUTTON_POWER = 0x13;
|
|
const uint8_t HITACHI_AC344_BUTTON_SLEEP = 0x31;
|
|
const uint8_t HITACHI_AC344_BUTTON_MODE = 0x41;
|
|
const uint8_t HITACHI_AC344_BUTTON_FAN = 0x42;
|
|
const uint8_t HITACHI_AC344_BUTTON_TEMP_DOWN = 0x43;
|
|
const uint8_t HITACHI_AC344_BUTTON_TEMP_UP = 0x44;
|
|
const uint8_t HITACHI_AC344_BUTTON_SWINGV = 0x81;
|
|
const uint8_t HITACHI_AC344_BUTTON_SWINGH = 0x8C;
|
|
const uint8_t HITACHI_AC344_BUTTON_MILDEWPROOF = 0xE2;
|
|
|
|
const uint8_t HITACHI_AC344_TEMP_BYTE = 13;
|
|
const uint8_t HITACHI_AC344_TEMP_OFFSET = 2;
|
|
const uint8_t HITACHI_AC344_TEMP_SIZE = 6;
|
|
const uint8_t HITACHI_AC344_TEMP_MIN = 16; // 16C
|
|
const uint8_t HITACHI_AC344_TEMP_MAX = 32; // 32C
|
|
const uint8_t HITACHI_AC344_TEMP_FAN = 27; // 27C
|
|
|
|
const uint8_t HITACHI_AC344_TIMER_BYTE = 15;
|
|
|
|
const uint8_t HITACHI_AC344_MODE_BYTE = 25;
|
|
const uint8_t HITACHI_AC344_MODE_FAN = 1;
|
|
const uint8_t HITACHI_AC344_MODE_COOL = 3;
|
|
const uint8_t HITACHI_AC344_MODE_DRY = 5;
|
|
const uint8_t HITACHI_AC344_MODE_HEAT = 6;
|
|
const uint8_t HITACHI_AC344_MODE_AUTO = 7;
|
|
|
|
const uint8_t HITACHI_AC344_FAN_BYTE = HITACHI_AC344_MODE_BYTE;
|
|
const uint8_t HITACHI_AC344_FAN_MIN = 1;
|
|
const uint8_t HITACHI_AC344_FAN_LOW = 2;
|
|
const uint8_t HITACHI_AC344_FAN_MEDIUM = 3;
|
|
const uint8_t HITACHI_AC344_FAN_HIGH = 4;
|
|
const uint8_t HITACHI_AC344_FAN_AUTO = 5;
|
|
const uint8_t HITACHI_AC344_FAN_MAX = 6;
|
|
const uint8_t HITACHI_AC344_FAN_MAX_DRY = 2;
|
|
|
|
const uint8_t HITACHI_AC344_POWER_BYTE = 27;
|
|
const uint8_t HITACHI_AC344_POWER_ON = 0xF1;
|
|
const uint8_t HITACHI_AC344_POWER_OFF = 0xE1;
|
|
|
|
const uint8_t HITACHI_AC344_SWINGH_BYTE = 35;
|
|
const uint8_t HITACHI_AC344_SWINGH_OFFSET = 0; // Mask 0b00000xxx
|
|
const uint8_t HITACHI_AC344_SWINGH_SIZE = 3; // Mask 0b00000xxx
|
|
const uint8_t HITACHI_AC344_SWINGH_AUTO = 0; // 0b000
|
|
const uint8_t HITACHI_AC344_SWINGH_RIGHT_MAX = 1; // 0b001
|
|
const uint8_t HITACHI_AC344_SWINGH_RIGHT = 2; // 0b010
|
|
const uint8_t HITACHI_AC344_SWINGH_MIDDLE = 3; // 0b011
|
|
const uint8_t HITACHI_AC344_SWINGH_LEFT = 4; // 0b100
|
|
const uint8_t HITACHI_AC344_SWINGH_LEFT_MAX = 5; // 0b101
|
|
|
|
const uint8_t HITACHI_AC344_SWINGV_BYTE = 37;
|
|
const uint8_t HITACHI_AC344_SWINGV_OFFSET = 5; // Mask 0b00x00000
|
|
|
|
const uint8_t HITACHI_AC344_MILDEWPROOF_BYTE = HITACHI_AC344_SWINGV_BYTE;
|
|
const uint8_t HITACHI_AC344_MILDEWPROOF_OFFSET = 2; // Mask 0b00000x00
|
|
|
|
const uint16_t HITACHI_AC344_STATE_LENGTH = 43;
|
|
const uint16_t HITACHI_AC344_BITS = HITACHI_AC344_STATE_LENGTH * 8;
|
|
|
|
#define GETBIT8(a, b) ((a) & ((uint8_t) 1 << (b)))
|
|
#define GETBITS8(data, offset, size) (((data) & (((uint8_t) UINT8_MAX >> (8 - (size))) << (offset))) >> (offset))
|
|
|
|
class HitachiClimate : public climate_ir::ClimateIR {
|
|
public:
|
|
HitachiClimate()
|
|
: climate_ir::ClimateIR(HITACHI_AC344_TEMP_MIN, HITACHI_AC344_TEMP_MAX, 1.0F, 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_HORIZONTAL}) {}
|
|
|
|
protected:
|
|
uint8_t remote_state_[HITACHI_AC344_STATE_LENGTH]{0x01, 0x10, 0x00, 0x40, 0x00, 0xFF, 0x00, 0xCC, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,
|
|
0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
|
uint8_t previous_temp_{27};
|
|
// Transmit via IR the state of this climate controller.
|
|
void transmit_state() override;
|
|
bool get_power_();
|
|
void set_power_(bool on);
|
|
uint8_t get_mode_();
|
|
void set_mode_(uint8_t mode);
|
|
void set_temp_(uint8_t celsius, bool set_previous = false);
|
|
uint8_t get_fan_();
|
|
void set_fan_(uint8_t speed);
|
|
void set_swing_v_toggle_(bool on);
|
|
bool get_swing_v_toggle_();
|
|
void set_swing_v_(bool on);
|
|
bool get_swing_v_();
|
|
void set_swing_h_(uint8_t position);
|
|
uint8_t get_swing_h_();
|
|
uint8_t get_button_();
|
|
void set_button_(uint8_t button);
|
|
// Handle received IR Buffer
|
|
bool on_receive(remote_base::RemoteReceiveData data) override;
|
|
bool parse_mode_(const uint8_t remote_state[]);
|
|
bool parse_temperature_(const uint8_t remote_state[]);
|
|
bool parse_fan_(const uint8_t remote_state[]);
|
|
bool parse_swing_(const uint8_t remote_state[]);
|
|
bool parse_state_frame_(const uint8_t frame[]);
|
|
void dump_state_(const char action[], uint8_t remote_state[]);
|
|
};
|
|
|
|
} // namespace hitachi_ac344
|
|
} // namespace esphome
|