Radish¶
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.
- Hardware setup — assemble the ESP32 + RS-485 kit (leave the HVAC bus disconnected for now).
- Software setup — create secrets, flash
radish.yaml, confirm Wi‑Fi/MQTT/OTA before connecting to the bus. - Wire and verify — connect A/B to Data 1 / Data 2 only, then confirm raw hex on
radish/rs485/raw. - Python decoder — run
mqtt_listener.pyto pretty-print live frames and filter by message type. - Optional: ESPHome component / AutoNet — move to
radish2.yamlwhen 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+radishpackage) — 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¶
- Thanks to @rrmayer for preserving the ClimateTalk specs (climate-talk-web-api)
- ClimateTalk
- Net485
- esphome-comfortnet
- ComfortNet-HVAC-ESP32
- Home Assistant community discussion
- openHAB community discussion