Skip to content

Radish

Radish logo

Radish is a project that interfaces with Daikin / ClimateTalk-style HVAC networks over CT-485 (RS-485). An ESPHome device sniffs (and optionally joins) the network and publishes frames to MQTT. Additionally Python tooling on a host is able to decode that traffic for analysis.

Getting started

Work through these in order. You can stop after sniffing + decoding if you only need visibility into the network.

  1. Hardware setup — assemble the ESP32 + RS-485 kit (leave the HVAC bus disconnected for now).
  2. Software setup — create secrets, flash radish.yaml, confirm Wi‑Fi/MQTT/OTA before connecting to the bus.
  3. Wire and verify — connect A/B to Data 1 / Data 2 only, then confirm raw hex on radish/rs485/raw.
  4. Python decoder — run mqtt_listener.py to pretty-print live frames and filter by message type.
  5. Optional: ESPHome component / AutoNet — move to radish2.yaml when you want on-device protocol handling and experimental network join. Keep AutoNet off until sniffing is solid.

What this project includes

  • ESPHome sniffing profile (radish.yaml) — passive UART capture to MQTT
  • ESPHome external component (radish2.yaml + components/radish) — on-device frame handling, dataflow replies, optional AutoNet subordinate join, and originated read-only app queries (configuration / status / sensor / identification)
  • Python decoder (mqtt_listener.py + radish package) — live decode/inspect of MQTT hex frames
  • Host query helper (request_ct_query.py) — trigger an app query via Home Assistant and print the decoded MQTT response
  • Spec archive — ClimateTalk PDFs used as the protocol reference

What works today

  • UART/RS-485 capture and publish to MQTT (default topic radish/rs485/raw)
  • Frame parse/encode and checksum handling in firmware
  • Controller queue / dataflow behavior (R2R + Token Offer)
  • AutoNet client state machine (discovery, set-address, keepalive/relinquish)
  • Subordinate handlers for network node list and shared-data sector read/write (with persistence)
  • Optional Get Configuration (0x01), Get Status (0x02), Get Sensor Data (0x07), and Get Identification Data (0x0E) after join, triggered from Home Assistant

Network join and subordinate responses are still experimental. Other interrogation (menus, control) is not implemented. See the ESPHome component guide and component internals.

Documentation

Setup (operators)

Page Contents
Hardware setup Parts, alternatives, off-bus assembly, photo of the kit
Software setup Secrets, flash, verify, OTA
Wire and verify Bus tap, safety, raw MQTT link check
Python decoder Listener install, .env filters, example decoded output
ESPHome component radish2.yaml, AutoNet join, YAML options

Reference (contributors)

Page Contents
Glossary CT-485 / hardware / Radish terms
Component internals Firmware layout, state machines, behavior rules
Message coverage matrix Which message IDs the Python parser handles
Protocol specification archive ClimateTalk PDF index and license notes

Repository

Source, ESPHome profiles, and issue tracking live on GitHub: vesuvisian/radish.

References