Wiring our Navien water heater into Home Assistant
Scheduled recirculation for our Navien tankless heater, with an ESP32 on its NaviLink port and about $30-40 in parts.
We moved into a house in Westchester NY after relocating the family here in 2024 for my job in NYC. The previous owners put in a Navien tankless unit before they moved out to replace the old boiler system. It has worked great, endless hot water, great temperature control, but we noticed the wait at certain fixtures in the house was becoming annoying.
Reason for the project was to enable recirculation on a schedule so we have better control of how and when our recirc happens, since we already ran Home Assistant. Navien has a cloud option but ours was never on it, and I always prefer local for anything IoT and home automation. Like $30-40 in parts and some time.
Why recirc matters for us
For washing laundry and washing dishes, it’s a big win for enzyme performance and cleaning power to have hot and warm water instantly at the LG washing machine, steam dryer, and dishwasher in the kitchen. That’s a huge huge thing for us with lots of messy clothes with two little boys.
I installed a Navien NaviCirc recirculation valve at the furthest fixture past the 1st floor washer/dryer (kitchen sink) which is a temperature valve that uses the existing hot and cold lines (no dedicated return line). I plan to put another one of these in at the 2nd floor guest bathroom.
The hardware
The heater is a Navien NPE-240A2 and it has a 5-pin NaviLink connector on the front board which has 12V, B, A, and GND. This connector talks RS485 and is how Navien’s proprietary Wi-Fi module talks to the unit.
The controller is an M5Stack AtomS3 Lite on top of the Atomic RS485 base which handles the RS485 level conversion, and the whole thing is powered from the heater’s 12V pin (no separate power supply needed).
Firmware
I used htumanyan’s navien ESPHome component with one local edit: the default UART pins are set up for a Tail485 board, but the Atomic RS485 base uses tx on GPIO6 and rx on GPIO5. Swap those in the YAML and it works. I did the wiring and flashing myself, with Claude Code helping on a few bits.
The community did a lot of the hard work already. The HA community thread (385 posts and counting) and jhenkens’ hardware guide are the main references. There’s also a Reddit thread that walks through the hardware side in plain English if you’re just getting started.
Lessons
A few things worth knowing going in:
-
The NaviLink setting has to be enabled in the heater’s installer menu, or else the bus will be completely silent. If you’re not getting anything, check that before you start re-wiring things.
-
The working A/B polarity reads about -2V idle. That feels counterintuitive but trust it.
-
Don’t add the UART debug byte-dump logger. This crash-loops the ESP before Wi-Fi comes up. It requires a USB reflash at the heater to fix.
-
No termination resistor needed on this unit, it works fine without one.
What’s next
The hardware side is the easy part.. the automations are where it really pays off. Part 2 covers the Home Assistant side - scheduled recirc, the override button, and what we can actually do now that the heater talks to HA.