# Hardware Connection Diagram: ESP32-C6 ↔ Ballu AC This document describes the physical wiring between the ESP32-C6 controller and the Ballu air conditioner's MideaUART port, and the logical signal path through the firmware. > Pin numbers below match the firmware defaults in `src/app_controller.c` > (`apply_default_uart_config`): **TX = GPIO16**, **RX = GPIO17**, 9600 baud, 8N1. > These are configurable via `app_controller_config_t.uart_config`. ## 1. Signal Overview ``` +---------------------+ UART 9600 8N1 +---------------------+ | | (50 ms command spacing) | | | Home Assistant | | Ballu AC unit | | (Zigbee coord.) | | (Midea UART bus) | | | | | +----------+----------+ +----------+----------+ | | Zigbee 2.4 GHz (802.15.4) 3.3V TTL UART | | +----------v---------------------------------------------------v----------+ | ESP32-C6 controller | | | | [Zigbee radio] --> zigbee_zcl --> integration_layer --> midea_protocol | | | | | | v v | | status_monitor <--> uart_driver | | | | | GPIO16 (TX) --------+ | | GPIO17 (RX) --------+ | +-------------------------------------------------------------------------+ ``` ## 2. Physical Wiring (ESP32-C6 ↔ AC MideaUART header) The Ballu/Midea indoor unit exposes a 3-wire (or 4-wire) TTL UART header. The AC side already provides regulated power on some models; **verify the voltage on the AC connector before wiring** — the ESP32-C6 GPIO are strictly 3.3V tolerant. | ESP32-C6 pin | Direction | AC MideaUART pin | Notes | | :-- | :--: | :-- | :-- | | GPIO16 (TX) | ESP → AC | RX | Controller transmits commands to the AC | | GPIO17 (RX) | AC → ESP | TX | Controller receives status frames from the AC | | GND | common | GND | **Mandatory** common ground reference | | 3V3 | power | +5V/+12V | Do **not** connect AC +5V/+12V directly to 3V3; use a suitable regulator if powering the ESP32-C6 from the AC | ```mermaid graph LR subgraph AC [Ballu AC - Midea UART header] ARX[RX] ATX[TX] AGND[GND] APWR[+5V / +12V] end subgraph ESP [ESP32-C6 controller] ETX[GPIO16 TX] ERX[GPIO17 RX] EGND[GND] E3V3[3V3] end ETX -->|3.3V TTL| ARX ATX -->|3.3V TTL| ERX EGND --- AGND APWR -.->|via 3.3V regulator only| E3V3 ``` ## 3. Wiring Rules - **Cross TX/RX**: controller TX (GPIO16) → AC RX; AC TX → controller RX (GPIO17). - **Common ground is mandatory** — floating grounds cause framing errors. - **3.3V logic only.** If the AC UART header uses 5V logic, insert a logic-level shifter between the boards. - **Power isolation.** Never feed the AC's raw supply rail into the ESP32-C6 3V3 pin; step it down with a regulator (or power the ESP32-C6 over USB during development). - **Strapping pins.** GPIO16/GPIO17 are the ESP32-C6 default UART0 pins used for boot logging/flashing. When wiring the AC to these pins, disconnect the AC during flashing, or remap the AC UART to spare GPIO via `uart_config_t.tx_pin` / `rx_pin` to keep the boot console free. ## 4. Firmware Signal Path - **Command path (HA → AC):** `zigbee_zcl` receives a ZCL Thermostat command → `integration_layer` maps `system_mode`/temperature to a `midea_control_t` → `midea_protocol` encodes the frame → `uart_driver` transmits it on GPIO16 with ≥50 ms spacing. - **Feedback path (AC → HA):** `uart_driver` reads a frame on GPIO17 → `midea_protocol` decodes it to `midea_status_t` → `status_monitor` runs fault detection + watchdog and maps to `zcl_thermostat_attrs_t` → `zigbee_zcl` publishes `local_temperature` and `system_mode` for Home Assistant. See `docs/Hardware integration guide.md` for detailed ESP32-C6 pinout, strapping pin cautions, and PCB layout guidance.