Skip to content

UART serial comms issues on ESP32-C3 - TX working on RX pin? #15441

Description

@IanLowe

The problem

I'm changing my TCL Aircon units across from the manufacturer supplied app to ESPHome.
The original Wifi module is an ESP2866 based device which talks to the A/C mainboard using simple serial comms.

I have completed 3 of these units, but on the last one, I am not getting any status info from the AC, or a response to commands.

When I send a command to the device through the HASS integration, it is sent. the ESPhome device recieves the command, and sends it on to the AC's mobo, and it is carried out (so, turns on, switches mode, sets temp etc) - just no response.

What is super confusing to me is this - I swapped the TX and RX pins in my YAML, and get exactly the same result... so either GPIO1 or GPIO3 seems to be able to act as a TX - without swapping the wires over! neither can receive though.

I'm trying to bottom out any software issues I can before replacing/rewiring the ESP32 as these AC units requie quite a teardown to get the Wifi module disconnected.

Any help welcome!

Which version of ESPHome has the issue?

2026.3.0

What type of installation are you using?

Docker

What platform are you using?

ESP32

Component causing the issue

uart

YAML Config

esphome:
  name: tcl-ac-activityroom
  friendly_name: tcl-ac-activityroom

esp32:
  board: esp32-c3-devkitm-1
  framework:
    type: esp-idf

external_components:
  - source:
      type: git
      url: https://github.com/lNikazzzl/tcl_ac_esphome
    components: [tcl_climate]

# Enable Home Assistant API
api:
  encryption:
    key: "<encryption key removed>"

ota:
  - platform: esphome
    password: "<password removed>"

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Tcl-Ac-Activityroom"
    password: "52Vou5GnM677"

captive_portal:

uart:
  id: uart_bus
  tx_pin: 3
  rx_pin: 1
  baud_rate: 9600
  parity: EVEN

logger:
  level: VERBOSE
  baud_rate: 0

climate:
  - platform: tcl_climate
    id: tcl_custom_climate
    uart_id: uart_bus
    name: "HAVC TCL"

select:
  - platform: template
    name: Vertical swing
    id: vswing
    entity_category: config
    options:
      - "Last position"
      - "Fix top"
      - "Fix upper"
      - "Fix mid"
      - "Fix lower"
      - "Fix bottom"
      - "Move full"
      - "Move upper"
      - "Move lower"
    set_action:
      then:
        lambda: |-
          id(tcl_custom_climate).control_vertical_swing(x);

  - platform: template
    name: Horizontal swing
    id: hswing
    entity_category: config
    options:
      - "Last position"
      - "Fix left"
      - "Fix mid left"
      - "Fix mid"
      - "Fix mid right"
      - "Fix right"
      - "Move full"
      - "Move left"
      - "Move mid"
      - "Move right"
    set_action:
      then:
        lambda: |-
          id(tcl_custom_climate).control_horizontal_swing(x);

Anything in the logs that might be useful for us?

INFO ESPHome 2026.3.0
INFO Reading configuration /config/tcl-ac-activityroom.yaml...
INFO Starting log output from tcl-ac-activityroom.local using esphome API
INFO Successfully resolved tcl-ac-activityroom.local in 0.004s
INFO Successfully connected to tcl-ac-activityroom @ 192.168.200.110 in 0.212s
INFO Successful handshake with tcl-ac-activityroom @ 192.168.200.110 in 0.068s
[16:43:26.405][I][app:231]: ESPHome version 2026.3.0 compiled on 2026-04-04 16:20:02 +0000
[16:43:26.409][I][app:238]: ESP32 Chip: ESP32-C3 rev0.4, 1 core(s)
[16:43:26.409][C][logger:233]: Logger:
[16:43:26.409][C][logger:233]:   Max Level: VERBOSE
[16:43:26.409][C][logger:233]:   Initial Level: VERBOSE
[16:43:26.409][C][logger:240]:   Log Baud Rate: 0
[16:43:26.409][C][logger:240]:   Hardware UART: USB_SERIAL_JTAG
[16:43:26.416][C][logger:250]:   Task Log Buffer Size: 768 bytes
[16:43:26.430][C][uart.idf:222]: UART Bus 0:
[16:43:26.430][C][uart.idf:152]:   TX Pin: GPIO3
[16:43:26.431][C][uart.idf:152]:   RX Pin: GPIO1
[16:43:26.436][C][uart.idf:227]:   RX Buffer Size: 256
[16:43:26.436][C][uart.idf:227]:   RX Full Threshold: 7
[16:43:26.436][C][uart.idf:227]:   RX Timeout: 2
[16:43:26.436][C][uart.idf:236]:   Baud Rate: 9600 baud
[16:43:26.436][C][uart.idf:236]:   Data Bits: 8
[16:43:26.436][C][uart.idf:236]:   Parity: EVEN
[16:43:26.436][C][uart.idf:236]:   Stop bits: 1
[16:43:26.436][C][uart.idf:236]:   Wake on data RX: ENABLED
[16:43:26.437][C][template.select:010]: Template Select 'Vertical swing'
[16:43:26.437][C][template.select:014]:   Optimistic: NO
[16:43:26.437][C][template.select:014]:   Initial Option: Last position
[16:43:26.437][C][template.select:014]:   Restore Value: NO
[16:43:26.451][C][template.select:010]: Template Select 'Horizontal swing'
[16:43:26.475][C][template.select:014]:   Optimistic: NO
[16:43:26.475][C][template.select:014]:   Initial Option: Last position
[16:43:26.475][C][template.select:014]:   Restore Value: NO
[16:43:26.475][C][captive_portal:134]: Captive Portal:
[16:43:26.475][C][wifi:1510]: WiFi:
[16:43:26.475][C][wifi:1510]:   Local MAC: REDACTED
[16:43:26.475][C][wifi:1510]:   Connected: YES
[16:43:26.484][C][wifi:1221]:   IP Address: 192.168.200.110
[16:43:26.484][C][wifi:1232]:   SSID: [redacted]
[16:43:26.484][C][wifi:1232]:   BSSID: [redacted]
[16:43:26.484][C][wifi:1232]:   Hostname: 'tcl-ac-activityroom'
[16:43:26.484][C][wifi:1232]:   Signal strength: -60 dB ▂▄▆█
[16:43:26.484][C][wifi:1232]:   Channel: 6
[16:43:26.484][C][wifi:1232]:   Subnet: 255.255.254.0
[16:43:26.484][C][wifi:1232]:   Gateway: 192.168.200.1
[16:43:26.484][C][wifi:1232]:   DNS1: 192.168.200.1
[16:43:26.484][C][wifi:1232]:   DNS2: 192.168.10.1
[16:43:26.490][C][esphome.ota:071]: Over-The-Air updates:
[16:43:26.490][C][esphome.ota:071]:   Address: tcl-ac-activityroom.local:3232
[16:43:26.490][C][esphome.ota:071]:   Version: 2
[16:43:26.490][C][esphome.ota:078]:   Password configured
[16:43:26.516][C][safe_mode:026]: Safe Mode:
[16:43:26.516][C][safe_mode:026]:   Successful after: 60s
[16:43:26.516][C][safe_mode:026]:   Invoke after: 10 attempts
[16:43:26.516][C][safe_mode:026]:   Duration: 300s
[16:43:26.519][C][safe_mode:043]:   Bootloader rollback: supported
[16:43:26.519][C][web_server.ota:238]: Web Server OTA
[16:43:26.519][C][api:237]: Server:
[16:43:26.519][C][api:237]:   Address: tcl-ac-activityroom.local:6053
[16:43:26.519][C][api:237]:   Listen backlog: 4
[16:43:26.519][C][api:237]:   Max connections: 8
[16:43:26.526][C][api:244]:   Noise encryption: YES
[16:43:26.526][C][mdns:194]: mDNS:
[16:43:26.526][C][mdns:194]:   Hostname: tcl-ac-activityroom
[16:43:26.526][V][mdns:199]:   Services:
[16:43:26.526][V][mdns:201]:   - _esphomelib, _tcp, 6053
[16:43:26.531][V][mdns:204]:     TXT: friendly_name = tcl-ac-activityroom
[16:43:26.535][V][mdns:204]:     TXT: version = 2026.3.0
[16:43:26.535][V][mdns:204]:     TXT: mac = 206ef16d9b3c
[16:43:26.535][V][mdns:204]:     TXT: platform = ESP32
[16:43:26.540][V][mdns:204]:     TXT: board = esp32-c3-devkitm-1
[16:43:26.540][V][mdns:204]:     TXT: network = wifi
[16:43:26.586][V][mdns:204]:     TXT: api_encryption = Noise_NNpsk0_25519_ChaChaPoly_SHA256
[16:43:51.296][D][climate:049]: 'HAVC TCL' - Setting
[16:43:51.299][D][climate:053]:   Mode: COOL
[16:43:51.304][I][TCL:231]: Received mode control command: 2
[16:43:51.307][I][TCL:313]: Building and sending command to AC unit

Additional information

Jst in case it's useful, the ESP32-C3 dev board being used is a C3 SuperMini

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions