Hello everyone,
I’m currently trying to find a way to communicate with a Rain Bird ESP-RZX controller using Home Assistant via ESPHome.
I’m sharing here the progress of my investigation on the ACCESSORY port (5 pins) of the Rain Bird ESP-RZX, which is used in particular by the WiFi LNK module.
Measured pinout (from left to right)
| Pin | Function | Measured Voltage |
|---|---|---|
| 1 | +12V | OK |
| 2 | GND | OK |
| 3 | +5V | OK |
| 4 | Logic signal | ~3.3V |
| 5 | Logic signal | ~3.3V |
Electrical measurements
- Pin 4 → GND: 180 kΩ
- Pin 5 → GND: 100 kΩ
- Pin 4 → +5V: ∞ (no continuity)
- Pin 5 → +5V: ∞
- Pin 4 ↔ Pin 5: 4.7 kΩ
The two logic lines (pins 4 and 5) are weakly pulled to ground and coupled together via an internal resistance of about 4.7 kΩ.
Behavior with no module connected
- Pins 4 and 5 are synchronous
- Square wave signal at approximately 50 Hz
- No communication frames observed
Module presence detection
By injecting a signal on pin 5 that is synchronized but inverted relative to pin 4 (using an ESP32), the controller:
- exits idle mode
- appears to start transmitting digital frames
The presence of a module seems to be detected through activity on the DATA line (pin 5).
Observed communication
Once activated:
- Pin 4: regular signal (clock)
- Pin 5: synchronized signal with variable content
The communication appears to be synchronous.
Protocol tests
- UART decoding: invalid
- Signal is not compatible with UART
Captured frames (SPI decoding)
Examples of captured data:
20 43 80 04 08 10 A1 00 02 02 ...
or
02 07 16 80 02 00 43 80 04 ...
The data is structured and repetitive, confirming a digital protocol.
Important behavior
- If activity on pin 5 stops:
→ immediate return to the 50 Hz signal
The controller requires continuous activity to keep the communication active.
Tests performed
Active injection (ESP32)
Code used:
int inPin = 22; // pin 4
int outPin = 23; // pin 5
void setup() {
pinMode(inPin, INPUT_PULLUP);
pinMode(outPin, OUTPUT);
}
void loop() {
int state = digitalRead(inPin);
digitalWrite(outPin, !state);
}
Result:
- bus activation
- frames appear
- but data is corrupted
Weak injection (short pulses)
- microsecond pulses synchronized with the clock
- clean frames observed
- but no functional response
Conclusion (established facts)
- The ACCESSORY port uses a synchronous communication
- Pin 4 acts as a clock
- Pin 5 carries the data
- The two lines are coupled via ~4.7 kΩ
- The controller remains in idle mode without activity on DATA
- Activity on the DATA line is required to activate communication
- Communication stops immediately if this activity ceases
- The protocol is not UART
Current status
- Bus activation:

- Frame capture:

- Partial understanding of physical layer:

- Full protocol decoding: in progress
If anyone has already worked on this port or the WiFi LNK module, I’d be happy to exchange ideas ![]()
