Homewizard climate local MQTT control! and now with esphome firmware!

Also still stuck…

Hi!

I can’t pair my princess calefactor to Homewizard app (android), on step when I have to connect my phone to HeaterSetup wifi… that wifi doesn’t appear on my phone… Any idea?

My password is from here.

How could you pair it with the Homeclimate app? I can’t because the wifi name doesn’t appear on my phone

This integration has nothing to do with the app. This is for control within home assistant.

But the integration ask me for username and password. I don’t understand :thinking:

Did you register here initially? If you’re having problems with the Homewizard app, that’s a Homewizard issue, not HA.

Yes, I have account there, but can’t see my climate device there :thinking:

Hi, I have one of these heaters and going through the steps to try to get local control.

My HA runs in proxmox and my Mosquitto broker is version 2.x so I decided the easiest way to get a 1.6.x version is to have a standalone LXC container instance. However I’m struggling to get Mosquitto 1.6.x installed on a Debian LXC. The built in package repository only has 2.x versions, so I downloaded a .deb package which then told me it has a number of dependencies that I can’t resolve as those are not available in the repositories.

How are people managing to install 1.6.x versions of Mosquitto?

Did you have any luck?

I have 2 Princess heaters that was already installed on a second home that we bought last spring. As I first step I have tried to connect them to Wifi using the app called Homewizard/Climate on my iPhone. But I have failed, the last try I did was yesterday.

Today being back home - I asked a question in another forum about this, and based on the replies I have made the reflection that maybe I have used the wrong app. There seem to be another app called “Princess Home”. Maybe this “Princess Home” is their old app (supporting) some old heaters, while Homewizard is their new app…

Anyway - on the next visit to our other home, I will try using the “Princess Home” app instead of Homewizard…

Yeah, using Tuya app works great :wink:

I couldn’t get mine to connect to the homewizard app to do the initial setup, so I tried the Princess app which worked and got me connected. I then managed to do DNS redirects, block internet access etc and started getting MQTT messages to my docker mosquitto-1.6.12 broker.

Everything was looking good, until I tried to use the heater today and I’m not seeing any messages over MQTT, so used Wireshark to sniff packets which shows me that it’s trying to connect to m2.tuyaeu.com and a3.tuyaeu.com. It’s unable to reach these due to the device being blocked from the internet, but having redirected their DNS queries to my MQTT broker nothing is coming through.

I’m confused as to how the device suddenly changed the addresses through which it’s trying to connect. I can only assume it managed to download a firmware update in the short time I had it accessible to the internet for initial setup, and that update was then applied next time I restarted the heater.

I created new SSL certificates with *.tuyaeu.com as the FQDN in the hope that this would allow it to start communicating with the broker but no change. I’m starting to think I might have to give up on MQTT control on this device and investigate the Tuya integration instead.

Urgh that is unfortunate, mine is still working with local MQTT control! Never had it connected to the internet.

After a significant battle to extract the local key required to get it working with Tuya local integration, I now have local control. However I’m far less confident of its reliability given the potential for the key to change (which requires a further extraction via the Tuya IoT cloud). Those of you with MQTT access, keep your devices off the internet!

@pmorg4

I now have two Princess panel heaters connected to the (“old”?) Princess Home app. Can you share info on how you got them into HA using the Tuya local integration?

I did not manage to Link the App Account in Tuya Dev Platform - nothing happened when I scanned the QR code provided, using the Princess Home app, the QR codes just times out. I have tried using the Central & Western European Data centers…

I paired the heater to the Tuya Smart app, which allowed me to control the heater just like the Princess app. I think you need thr Tuya app rather than the princess app for the process to work. I then followed the standard instructions posted elsewhere to extract the local key via Tuya API. I will forewarn that it’s a very tedious process!

So. A year later. I would like to add that I opened up a Princess Smart Panel heater, (the one mentioned initially) And found out that it has an ESP32-WROOM-32D chip for the wifi functionality and wouldn’t you have it; it’s flashable. The control board even comes with an interface to just plug in some jumper cables. So I used my old arduino Uno as an uart controller and (after backing up the original firmware) flashed esphome on it. Then added the tuya MCU component to it.
So, no problems with encypted messaging to some cloud provider. On screen controls still work as they are not initially controlled by the esp.
I pasted my config below, it’s not perfect yet and doesn’t have all of the controls in the climate entity yet, but it works perfectly fine and locally now :slight_smile:

I’m going to try this with my princess mobile airconditioner next.
Hopefully someone also gets some use out of this.


# ============================================
# Tuya MCU Serial Communication
# ============================================
tuya:
  id: tuya_mcu
  # Optional: ignore problematic datapoints during debugging
  # ignore_mcu_update_on_datapoints: [27]

uart:
  - id: my_uart
    tx_pin: GPIO17
    rx_pin: GPIO16
    baud_rate: 9600

# ============================================
# Climate Control
# ============================================

# Climate Control
climate:
  - platform: tuya
    name: "Princess Heater"
    switch_datapoint: 1          # DP1 = ON/OFF ✅
    target_temperature_datapoint: 3   # DP3 = Target Temp (was showing 23, 24)
    current_temperature_datapoint: 4  # DP4 = Current Temp (16, 17°C) ✅
    supports_heat: true
    visual:
      max_temperature: 25°C
      min_temperature: 5°C
      temperature_step: 1°C
    active_state:
      datapoint: 1
      heating_value: 1
    icon: "mdi:heat-wave"
    # Add fan mode for high/low heat level (DP7)
    fan_mode:
      datapoint: 7
      low_value: 1        # Low heat
      high_value: 0        # High heat
      
# Debug sensors
sensor:
  - platform: tuya
    name: "Current Temperature"
    sensor_datapoint: 3
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 0
  - platform: tuya
    name: "Target Temperature"
    sensor_datapoint: 4
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 0
  - platform: tuya
    name: "High Mode Status"
    sensor_datapoint: 7
    accuracy_decimals: 0
    disabled_by_default: false
    entity_category: diagnostic

# Switches for control
switch:
  - platform: tuya
    name: "Main Switch"
    switch_datapoint: 1
  - platform: tuya
    name: "ECO Mode"
    switch_datapoint: 7
    internal: true
    restore_mode: ALWAYS_OFF
    inverted: false

Great news! I’ve been putting this off for months! But that gives me the courage to do it too.
So the internals are controlled over ESP → UART.

Awesome! a1ad, I just updated the yaml ^ to include fanmode to set the high/low setting on the heater as well. I still need to get the timer working, but I don’t really use that.
And the network connectivity light is off at the moment which also seems like a fun addition to have

Nice! got it running!

This is the working config for my heater:

esphome:
  name: name
  comment: "Comments"
    # The original HomeWizard firmware starts with a heartbeat, WIFI_STATE=0x02,
  # command 0x51, and a DATAPOINT_QUERY. The MCU does not answer PRODUCT_QUERY.
  on_boot:
    - uart.write:
        id: my_uart
        data: [0x55, 0xAA, 0x00, 0x00, 0x00, 0x00, 0xFF]
    - delay: 50ms
    - uart.write:
        id: my_uart
        data: [0x55, 0xAA, 0x00, 0x03, 0x00, 0x01, 0x02, 0x05]
    - delay: 150ms
    - uart.write:
        id: my_uart
        data: [0x55, 0xAA, 0x00, 0x51, 0x00, 0x00, 0x50]
    - delay: 10ms
    - uart.write:
        id: my_uart
        data: [0x55, 0xAA, 0x00, 0x08, 0x00, 0x00, 0x07]
    - delay: 5s
    - repeat:
        count: 5
        then:
          - uart.write:
              id: my_uart
              data: [0x55, 0xAA, 0x00, 0x08, 0x00, 0x00, 0x07]
          - delay: 3s

esp32:
  board: esp32dev
  framework:
    type: esp-idf   # or arduino, both work
  flash_size: 16MB

wifi:
  ssid: "IoT"
  password: "******"

  ap:
    ssid: "Fallback Hotspot"
    password: "********"

  power_save_mode: none
  reboot_timeout: 0s

  # The original firmware reports 0x03 after the station receives an IP address.
  on_connect:
    - uart.write:
        id: my_uart
        data: [0x55, 0xAA, 0x00, 0x03, 0x00, 0x01, 0x03, 0x06]
  on_disconnect:
    - uart.write:
        id: my_uart
        data: [0x55, 0xAA, 0x00, 0x03, 0x00, 0x01, 0x02, 0x05]

logger:
  #level: VERBOSE
  #logs:
  #  component: VERBOSE
  #  tuya: VERBOSE
  #  tuya.climate: VERBOSE
  #  tuya.sensor: VERBOSE

api:
  encryption:
    key: "**********************************"

captive_portal:

# MCU quirk: the heating element only starts once DP7 (fan) is rewritten
# when real heat demand occurs (Action -> HEATING). This interval detects
# that transition (turning on with heat demand, or sliding the target up
# until target > current while already on) and rewrites DP7 once.
globals:
  - id: heater_kick_done
    type: bool
    restore_value: no
    initial_value: 'false'

interval:
  - interval: 1s
    then:
      - lambda: |-
          if (id(princess_heater).action == CLIMATE_ACTION_HEATING) {
            if (!id(heater_kick_done)) {
              auto fan = id(princess_heater).fan_mode;
              if (fan.has_value()) {
                // force_: bypasses ESPHome's "not sending unchanged value" skip.
                // The MCU only starts the element on an actual DP7 write.
                uint8_t dp7 = (*fan == ClimateFanMode::CLIMATE_FAN_HIGH) ? 0 : 1;
                id(tuya_mcu).force_set_enum_datapoint_value(7, dp7);
                id(heater_kick_done) = true;
              }
            }
          } else {
            id(heater_kick_done) = false;
          }

# ============================================
# Tuya MCU Serial Communication
# ============================================
tuya:
  id: tuya_mcu
  # Optional: ignore problematic datapoints during debugging
  # ignore_mcu_update_on_datapoints: [27]

uart:
  - id: my_uart
    tx_pin: GPIO17
    rx_pin: GPIO16
    baud_rate: 9600

# ============================================
# Climate Control
# ============================================

# Climate Control
climate:
  - platform: tuya
    id: princess_heater
    name: "Princess Heater"
    switch_datapoint: 1          # DP1 = ON/OFF
    target_temperature_datapoint: 3   # DP3 = Target Temp
    current_temperature_datapoint: 4  # DP4 = Current Temp
    supports_heat: true
    visual:
      max_temperature: 28°C
      min_temperature: 5°C
      temperature_step: 1°C
    icon: "mdi:heat-wave"
    # Fan mode for high/low heat level (DP7)
    fan_mode:
      datapoint: 7
      low_value: 1        # Low heat
      high_value: 0        # High heat
      
# Debug sensors
sensor:
  - platform: tuya
    name: "Target Temperature"
    sensor_datapoint: 3
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 0
  - platform: tuya
    name: "Current Temperature"
    sensor_datapoint: 4
    unit_of_measurement: "°C"
    device_class: temperature
    state_class: measurement
    accuracy_decimals: 0

switch:
  - platform: template
    name: "Heater Power"
    id: heater_power_switch
    icon: "mdi:radiator"
    lambda: |-
      return id(princess_heater).mode == ClimateMode::CLIMATE_MODE_HEAT;
    turn_on_action:
      - lambda: |-
          id(princess_heater).make_call()
            .set_mode(ClimateMode::CLIMATE_MODE_HEAT)
            .perform();
    turn_off_action:
      - lambda: |-
          id(princess_heater).make_call()
            .set_mode(ClimateMode::CLIMATE_MODE_OFF)
            .perform();
  - platform: template
    name: "Heater Power Level"
    id: heater_power_level_switch
    icon: "mdi:fire"
    lambda: |-
      return id(princess_heater).fan_mode == ClimateFanMode::CLIMATE_FAN_HIGH;
    turn_on_action:
      - lambda: |-
          id(princess_heater).make_call()
            .set_fan_mode(ClimateFanMode::CLIMATE_FAN_HIGH)
            .perform();
    turn_off_action:
      - lambda: |-
          id(princess_heater).make_call()
            .set_fan_mode(ClimateFanMode::CLIMATE_FAN_LOW)
            .perform();
  - platform: tuya
    name: "Child Lock"
    switch_datapoint: 2
    icon: "mdi:lock"
    entity_category: config

ota:
  - platform: esphome
    id: ota_vuurtje_badkamer
    password: *******

Me == happy

edit: after analyzing the firmware dump now with working network connectivity light and startup flow. (thanks to Ai)

@holmly relevant network connectivity: