Climate component in ESPHome flashed BHT-002 Beca Thermostat always says "heating" or "cooling"

So i managed to flash a BHT-002 two-pipe fan-coil thermostat with ESPHome and this template:

Please see my config here:

esphome:
  name: thermostat
  friendly_name: Thermostat

bk72xx:
  board: generic-bk7231n-qfn32-tuya

# Enable logging
logger:
  level: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: "..."

ota:
  - platform: esphome
    password: "..."

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Thermostat Fallback Hotspot"
    password: "..."

captive_portal:

uart:
  rx_pin: RX1
  tx_pin: TX1
  baud_rate: 9600

time:
  - platform: homeassistant
    id: ha_time

tuya:
  # The MCU uses this for displaying the time in the display as well as for
  # scheduled programmes one may have configured in their thermostat.
  time_id: ha_time

  # (Optional)
  # Schedules are not modeled in neither ESPHome nor Home Assistant.
  #
  # This parses the data point and emitting it as a string in the logs, and
  # serves as an example for users desiring more advanced configurations.
  on_datapoint_update:
    - sensor_datapoint: 101
      datapoint_type: raw
      then:
        - lambda: |-
            // Apparently these vary per model; these are valid for the BHT-002
            const int POS_HOUR = 1;
            const int POS_MINUTE = 0;
            const float TEMPERATURE_MULTIPLIER = 0.5f;
            const std::map<int, std::string> DAY_OFFSET = {
                {0, "days 1-5"},
                {6, "day 6"},
                {12, "day 7"},
            };

            for (auto& day : DAY_OFFSET) {
                for (int period = 0; period < 6; period++) {
                    int offset = (day.first + period) * 3;
                    int hour = x[offset + POS_HOUR];
                    int minute = x[offset + POS_MINUTE];
                    float temp = x[offset + 2] * TEMPERATURE_MULTIPLIER;
                    ESP_LOGD("custom", "Scheduled program for %s %02d:%02d set at %.1f C", day.second.c_str(), hour, minute, temp);
              }
            }

climate:
  - platform: tuya
    name: "Thermostat"
    switch_datapoint: 1
    target_temperature_datapoint: 2
    current_temperature_datapoint: 3
    # eco_datapoint: 5
    # eco_temperature: 20 °C
    preset:
      eco:
        datapoint: 5
        temperature: 20 °C
    temperature_multiplier: 0.5
    visual:
      min_temperature: 5 °C
      max_temperature: 35 °C
      temperature_step: 0.5 °C
    supports_heat: true
    supports_cool: true
    active_state:
      datapoint: 102
      cooling_value: 0
      heating_value: 1
      fanonly_value: 2
    fan_mode:
      datapoint: 103
      auto_value: 0
      high_value: 1
      medium_value: 2
      low_value: 3

sensor:
  - platform: "tuya"
    name: "Temperature"
    sensor_datapoint: 3
    unit_of_measurement: "°C"
    device_class: "temperature"
    accuracy_decimals: 1
    filters:
      - multiply: 0.5
    # The climate component already includes temperature, but having the
    # temperature as a separate sensor can be useful
    disabled_by_default: true

  # The external temperature sensor, if wired
  - platform: "tuya"
    name: "Temperature (external)"
    sensor_datapoint: 102
    unit_of_measurement: "°C"
    device_class: "temperature"
    accuracy_decimals: 1
    filters:
      - multiply: 0.5
    disabled_by_default: true

switch:
  - platform: "tuya"
    name: "Lock"
    icon: "mdi:lock"
    switch_datapoint: 6

select:
  - platform: "tuya"
    name: "Scheduled programming"
    icon: "mdi:calendar"
    enum_datapoint: 4
    options:
      0: Use scheduled programs
      1: Manual control 

What seems to happen is that the device just has an HVAC mode, “heating” / “cooling” which is the mode the device is in. Shown with a sun and an ice-crystal on the display itself.

It seems the climate component mistakes the HVAC mode for the “heating” or “cooling” action, meaning that even though the temperature is set to 15C while the read temp is 20.5 it’s still in “heating” mode.

This doesn’t allow me to make further automation based on when the device goes from “idle” to “heating”.

Any idea what is wrong with this?

Hi,
Did you manage to fix it?
And onother question: after flashing does the screen control and display works?
I’m asking becouse I would like to flash BHT-6000.
Kind Regards,
Maciek

Yeah it does work and the control and display too. The only thing that doesn’t work is figuring if the device “asks for heat/cold”, i debugged this up to the TuyaMCU but there is no pin for this. In the end i just fixed it using a temperature comparison: if ambient < set_temp → heating = true. You could also fix it with a simple smart relay attached to the valve output on the unit but I didnt find this necessary yet.

Thanks for quick answer;
Do I understand it right?
“asks for heat/cold” - means the BHT will not turn heating (in my case) when temperature fall below set?

I read whole post one more and I undrestand. Thanks

1 Like