Skip to content

Wiring Guide

You’re connecting three wires — A, B and ground — between your Tigo equipment and the ESP32 board, so the board can quietly listen in on the conversation your panels are already having. Written for solar owners doing it themselves.

The wiring itself is genuinely simple. The care is all in step zero: making the high-voltage side safe before you open anything.

⚠️ Warning — this bus lives inside a high-voltage PV system. The RS485 signal is low voltage, but you tap it inside or next to a Tigo CCA/TAP and inverter that are part of a high-voltage PV DC system. That DC can be lethal, and it is not switched off just because you turn the inverter off — sunlit panels keep producing voltage.

Before opening any enclosure:

  • De-energize and isolate the PV array and inverter using the DC disconnect / isolator, per your inverter’s shutdown procedure. Turning off the inverter alone does not make the array safe.
  • Treat the inverter side as live high-voltage DC until you have verified it is isolated.
  • If you are not comfortable or qualified, stop and involve a licensed solar installer or electrician. There is no shame in it and it may be a legal requirement where you live.

Your optimizers talk to your Tigo CCA (the green wall box) or TAP (the small radio box) over a four-wire cable — + and carrying power, A and B carrying the data. That data pair is RS485, and it’s the only part we’re interested in. You’re tapping the ESP32 onto the existing run — at the CCA’s GATEWAY port — so it hears both sides of the conversation without joining in. Nothing gets cut or unplugged.

Think of it as a wiretap, not a phone extension.

┌─────────────────────────────────────┐ ┌────────────────────────────┐
│ CCA │ │ TAP │
│ │ │ │
│ AUX RS485-1 GATEWAY RS485-2 POWER│ │ ┌~┐ │
│┌─┬─┐ ┌─┬─┬─┐ ┌─┬─┬─┬─┐ ┌─┬─┬─┐ ┌─┬─┐│ │ ┌─┬─┬─┬─┐ ┌─┬─┬│┬│┐ │
││/│_│ │-│B│A│ │-│+│B│A│ │-│B│A│ │-│+││ │ │-│+│B│A│ │-│+│B│A│ │
│└─┴─┘ └─┴─┴─┘ └│┴│┴│┴│┘ └─┴─┴─┘ └─┴─┘│ │ └│┴│┴│┴│┘ └─┴─┴─┴─┘ │
└───────────────│─│─│─│───────────────┘ └────│─│─│─│─────────────────┘
│ │ │ │ │ │ │ │
│ │ │ ┃───────────────────────────│─│─│─┘
│ │ ┃─┃───────────────────────────│─│─┘
│ └─┃─┃───────────────────────────│─┘
┃───┃─┃───────────────────────────┘
┗━┓ ┃ ┃
┌───┃─┃─┃───┐
│ ┌┃┬┃┬┃┐ │
│ │-│B│A│ │
│ └─┴─┴─┘ │
│ Monitor │
└───────────┘

Diagram credit: willglynn/taptap

The CCA has several ports — you want GATEWAY, the four-terminal one in the middle. Reading its terminals left to right:

Terminal What it is What you do with it
Power negative, and the common ground Connect it — this is your GND
+ Power positive, feeding the TAPs and optimizers Leave it alone entirely
B Data Connect it
A Data Connect it

The Monitor box at the bottom of the diagram is your ESP32 — note it hangs off those wires rather than interrupting them.

The ESP32 acts as a passive listener – it only receives, and it is wired so that it physically cannot transmit onto the bus. See Passive-listener wiring below for the electrical reason why.


Component Recommended Notes
ESP32 Board M5Stack AtomS3R 8MB PSRAM — required, don’t substitute a board without it
RS485 Adapter M5Stack Atomic RS485 Base Built-in level shifter
Wiring 22-24 AWG twisted pair For RS485 A/B connections

Alternative RS485 adapters:

  • MAX485 module
  • SP3485 module
  • Any TTL-to-RS485 converter

The Atomic RS485 Base plugs directly onto the AtomS3R, so all that’s left is the three spur wires. RS485 is a shared bus — the ESP32 hangs off the existing cable rather than sitting in the middle of it, so nothing gets cut:

Tigo CCA / TAP TAP / optimizers
┌──────────────┐ ┌──────────────┐
│ │ │ │
│ A ──────────┼─────┬──────────────────────────────────────────┼────── A │
│ B ──────────┼─────┼──┬───────────────────────────────────────┼────── B │
│ - ──────────┼─────┼──┼──┬────────────────────────────────────┼────── - │
│ + (leave) │ │ │ │ │ + (leave) │
└──────────────┘ │ │ │ └──────────────┘
│ │ │ three short spur wires —
│ │ │ the run itself is never cut
▼ ▼ ▼
┌───────────────┐
│ A B GND │
│ ESP32 + RS485 │
└───────────────┘
│ internal
┌──────────────────┐
│ AtomS3R ESP32 │
│ RX: GPIO5 │
│ TX: GPIO6 inert │
│ 38400 baud 8N1 │
└──────────────────┘

marks where a spur joins a wire; is just one line crossing another.

In practice this usually means landing a second wire under the same screw terminal that already holds the run, or using a wago/terminal block alongside it. The CCA keeps talking to the TAP exactly as before, whether or not the ESP32 is powered.

TX is wired but inert — the transceiver’s driver is held disabled, so the ESP32 only listens. See Why this is read-only.

Three wires, each one a spur off a terminal that stays connected to whatever it was already connected to:

Wire From To Notes
RS485 A CCA/TAP A terminal RS485 Base A Data
RS485 B CCA/TAP B terminal RS485 Base B Data
Ground CCA/TAP terminal RS485 Base GND Not optional — see below
CCA/TAP + terminal nothing Power. Leave exactly as found

Note: the ESP32 is one more listener on a shared bus, not a link in a chain. It sees traffic in both directions, and unplugging it changes nothing for the rest of the system.

Ground reference: RS485 needs a common ground reference between the ESP32 and the Tigo bus for reliable signalling — connect GND. It is not optional. (Skip it only if the ESP32 and the Tigo equipment already share a ground through another path, and even then a dedicated GND wire is the safer default.)

Short version: the chip that would let the ESP32 speak on the cable has its “talk” switch wired permanently off. Not off in software, where a bug could flip it — off in the wiring, where nothing can. The ESP32 can shout all it likes and not a single volt reaches your solar equipment.

If you want the electrical detail:

The AtomS3R UART wires TX to GPIO6, and the MAX485 example below wires the driver input (DI) to that same TX pin — yet the ESP32 still cannot transmit onto the bus. Here’s why:

  • A MAX485-style transceiver only drives the A/B lines when its driver-enable (DE) pin is HIGH and its receiver-enable (RE) pin is LOW.
  • In every wiring here, DE and RE are tied LOW. That holds the driver permanently disabled — its A/B outputs are high-impedance no matter what TX/DI does.
  • So wiring TX/DI is harmless: with the driver disabled, whatever the ESP32 sends on TX simply goes nowhere. The receiver stays enabled and you listen only.

This is what guarantees passive, read-only operation — it’s the disabled driver, not an unwired TX pin.

⚠️ Warning — high-voltage PV DC.

  • De-energize and isolate the PV array and inverter before opening any enclosure or touching wiring. PV DC can be lethal and is not switched off by turning the inverter off — panels in daylight keep producing voltage.
  • Treat the inverter side as live high-voltage DC until you have confirmed isolation with the proper disconnect.
  • If you are not comfortable or qualified, involve a licensed solar installer or electrician.

Once the high-voltage side is safely isolated:

  • The RS485 signal is low voltage (typically 5V differential), but verify your system before assuming anything is safe to touch.
  • Connect a common GND between the ESP32 and the Tigo bus so RS485 has a shared reference.
  • The ESP32 is passive – with the transceiver’s driver disabled (DE/RE tied LOW) it physically cannot transmit, so it cannot interfere with Tigo operation.

Simplest setup – just plug together and connect RS485 terminals:

  1. Attach AtomS3R to Atomic RS485 Base
  2. Run a spur wire from the Tigo A terminal to the base’s A terminal
  3. Run a spur wire from the Tigo B terminal to the base’s B terminal
  4. Power via USB-C
  5. Flash ESPHome configuration

Cheaper transceiver, same board requirement — it still has to be an ESP32-S3 with PSRAM:

  1. Wire MAX485 VCC to ESP32 3.3V
  2. Wire MAX485 GND to ESP32 GND
  3. Wire MAX485 RO to ESP32 GPIO5 (RX)
  4. Wire MAX485 DI to ESP32 GPIO6 (TX)
  5. Tie MAX485 DE and RE to GND — this disables the driver and is what makes the ESP32 read-only (step 4 is then harmless; see Why this is read-only)
  6. Connect A/B to Tigo RS485 bus, and share a common GND with the bus

The UART runs at 38400 baud, 8N1 on TX=GPIO6 / RX=GPIO5.


See also: Troubleshooting · Configuration · ← Back to README