Reverse engineering tools for the Trane ComfortLink II protocol used in residential HVAC systems.
Enable custom thermostats (Home Assistant, etc.) to communicate with Trane ComfortLink II compatible equipment:
- Trane/American Standard communicating furnaces (SV92, etc.)
- Trane/American Standard communicating heat pumps (XV19, etc.)
- Via BAY24VRPAC52DC relay panel
ComfortLink II is based on Honeywell EnviraCOM 2.0 protocol.
The XL850/XL950/XL1050 thermostats are manufactured by Honeywell for Trane. This is significant because it means existing EnviraCOM documentation and tools may be applicable.
Your system may use one of two physical layers:
| Type | EnviraCOM (Native) | RS-485 |
|---|---|---|
| Wires | 3 (R, C, D) | 2-4 |
| Data signal | Modulated 24VAC | Differential ±5V |
| Baud rate | 120 bps | 9600-38400 bps |
| Interface | Custom circuit needed | $10 USB adapter |
First step: Determine which physical layer your system uses!
Phase 0: Physical Layer Identification - Start Here
# Create virtual environment
python -m venv venv
source venv/bin/activate
# Install dependencies
pip install -e .
# For development
pip install -e ".[dev]"
# For analysis tools (pandas, matplotlib)
pip install -e ".[analysis]"
# For hardware design tools (circuit schematics)
pip install -e ".[hardware]"Before capturing data, determine your bus type:
Option A: Visual Inspection
- Count wires between thermostat and relay panel
- 3 wires (R, C, D): Likely EnviraCOM
- 4+ wires with labeled A/B: Likely RS-485
Option B: Oscilloscope Measurement
- Probe the data line
- EnviraCOM: 24VAC signal with slow (8ms) transitions
- RS-485: Fast differential signal (microsecond transitions)
Option C: Use Signal Analyzer (if you have logic analyzer captures)
python -m tools.signal_analyze capture.csv# Get USB to RS-485 adapter (FTDI chipset recommended)
# Auto-detect baud rate
python -m tools.baudrate_detect -p /dev/ttyUSB0
# Start capturing
python -m tools.capture -p /dev/ttyUSB0 -b <detected_baud>You'll need custom hardware. Options:
- Find a W8735A Serial Adapter (discontinued 2013, check eBay)
- Build the DIY interface circuit - See
docs/hardware/enviracom_interface.md- Complete schematic with BOM (~$15 in parts)
- Uses H11AA1 + 4N35 optocouplers for isolation
- ESP32/Arduino compatible
- Generate circuit diagrams:
pip install -e ".[hardware]" python -m tools.hardware.enviracom_schematic --format png - Generate PCB manufacturing files (Gerber, BOM, etc.):
# Install cuflow dependencies pip install -e ".[pcb]" # Clone cuflow (not available on PyPI) git clone https://github.com/jamesbowman/cuflow.git /tmp/cuflow export PYTHONPATH="/tmp/cuflow:$PYTHONPATH" # Generate PCB files (MCU header version) python -m tools.hardware.enviracom_pcb # Generate USB version (direct computer connection) python -m tools.hardware.enviracom_pcb --variant usb
# Analyze a capture file
python -m tools.analyze captures/raw/capture_*.bin
# Export to readable format
python -m tools.analyze capture.bin --export packets.txt --format parsed
# View specific packet
python -m tools.analyze capture.bin --packet 42| Tool | Description |
|---|---|
tools/capture.py |
Capture RS-485 bus traffic |
tools/analyze.py |
Analyze captured packets |
tools/replay.py |
Replay packets (use with caution) |
tools/baudrate_detect.py |
Auto-detect RS-485 baud rate |
tools/signal_analyze.py |
Analyze oscilloscope/logic analyzer captures |
tools/packet.py |
Packet parser library |
tools/hardware/enviracom_schematic.py |
Generate EnviraCOM interface circuit diagrams |
tools/hardware/enviracom_interface.py |
EnviraCOM interface BOM and pinout |
tools/hardware/enviracom_pcb.py |
Generate PCB layout and Gerber files (via cuflow) |
trane_protocol/
├── captures/
│ ├── raw/ # Binary capture files
│ └── parsed/ # Analyzed/exported data
├── docs/
│ ├── hardware/ # Wiring and setup guides
│ └── protocol/ # Protocol documentation
│ ├── README.md # Protocol overview
│ └── enviracom_physical.md # Physical layer details
├── tools/
│ ├── capture.py # RS-485 bus capture
│ ├── analyze.py # Packet analysis
│ ├── replay.py # Packet replay
│ ├── packet.py # Packet parser
│ ├── baudrate_detect.py # Baud rate detection
│ └── signal_analyze.py # Waveform analysis
├── tests/
├── config.example.yaml
├── pyproject.toml
└── README.md
- EnviraCOM (GitHub) - Honeywell EnviraCOM interface
- Net485 - Multi-brand HVAC RS-485 protocol project
- Infinitive - Carrier Infinity integration
- gofinity - Go library for Carrier/Bryant
- Bloominglabs EnviraCOM Info - Physical layer details
- US Patent 6373376B1 - EnviraCOM hardware implementation
- CocoonTech Forums - Community discussion
- 24VAC is dangerous - Use proper isolation when building interfaces
- Only connect to communication bus lines, NEVER directly to 24VAC power
- Keep a working thermostat available as backup
- Don't experiment during extreme weather
- Start with passive monitoring before sending any packets
- Understand packets before replaying them
Contributions welcome! Especially:
- Confirmation of physical layer type for specific equipment
- Packet captures from different equipment configurations
- Protocol documentation updates
- Checksum algorithm identification
- EnviraCOM interface circuit designs
- Message type mappings
MIT License - See LICENSE file