I ran nodejs-poolController on my pool. Here’s what actually worked.

I’m Kayla. I have a Pentair EasyTouch 8, an IntelliFlo VSF pump, and an IntelliChlor IC40. I used to shuffle out to the pad, press tiny buttons, and guess what speed the pump needed. Fun? Not really. So I set up nodejs-poolController on a Raspberry Pi 4 and lived with it for a few months.

If you want the play-by-play of that first weekend—including every wiring photo and log snippet—I laid it all out here: the full “I ran nodejs-poolController on my pool” diary on ImprovingCode.

You know what? It felt like getting my time back.

My gear and why I tried it

  • Raspberry Pi 4 (2 GB), running Raspberry Pi OS Lite
  • FTDI-based USB-to-RS485 adapter (the Waveshare one)
  • Two wires from the Pi to the EasyTouch COM port (A/B) — yes, the little green block inside the panel

My goals were simple: control the pump, spa, lights, and heater from my phone or Home Assistant. And stop walking outside in slippers at night. That was the dream.

Setup: pretty smooth, but the wires matter

I won’t sugarcoat the wiring. The RS-485 A/B lines can be flipped. If you get no data, swap A and B. I had to. Once I got a heartbeat, I smiled like a kid. A quick refresher on differential signaling that I skimmed over at ImprovingCode saved me from spending an evening swapping conductors at random.

For anyone wanting the official wiring diagrams and programming details straight from the manufacturer, the Pentair EasyTouch Control System User’s Guide is an invaluable companion.

On the Pi, I installed Node.js and ran the app. I used the project’s quick-start steps and let it scan the bus. It found my EasyTouch, the pump, and the chlorinator. First try? Nope. Second try? Yes.

If you’re still piecing things together after the scan, the project’s own GitHub Wiki for nodejs-poolController walks through installation, MQTT setup, and more advanced tweaks.

Here’s the tiny config bit that mattered most on my box:

{
  "serial": {
    "port": "/dev/ttyUSB0",
    "baud": 9600
  },
  "web": {
    "port": 4200
  },
  "logLevel": "info"
}

I set the serial port to the RS-485 adapter and left the speed alone. The web service came up on 4200. The dash panel ran on another port (mine was 5150). I pinned both on my phone.

First run: real control, right away

I tested three things right off:

  1. Turn the spa on
    I tapped Spa in the dash panel. The relay clicked. The heater icon woke up. Warm water, fast. No more “Did I leave it on?” panic.
    If you’re lounging poolside with your phone while the spa heats, and you’re in the mood for some flirty conversation, you can drop into free sexting chat rooms where anonymous users swap playful messages and keep boredom at bay until the jets are ready.
    For readers in South Orange County who’d rather line up an in-person encounter once the bubbles stop, the curated AdultLook San Juan Capistrano listings deliver vetted profiles, photos, and clear availability details so you can arrange a discreet meetup without wading through endless generic ads.

  2. Change the pump speed when the cleaner runs
    I set a rule so the cleaner circuit bumps the pump to 2800 RPM. When the cleaner shuts off, it drops to 1600 RPM. Quiet again. My dog appreciates that part.

  3. Light shows
    I have Pentair IntelliBrite lights. The app let me pick a color show. I used “Sunset” for a birthday dinner. It was cheesy and sweet. We loved it.

For kicks, I also hit the API from my laptop:

curl localhost:4200/state

And to toggle a circuit by id (my Cleaner was 5):

curl -X POST localhost:4200/circuit/5/toggle

Simple. It felt like the gear finally listened.

Daily life with it: fewer trips outside

Most days I use these buttons:

  • Pool heat mode: Heater vs. Solar
  • Spa set point: 101 on cold days, 99 on others
  • Pump: 1600 RPM for filter, 2200 when someone’s swimming, 2800 for the cleaner
  • Lights: white at night, colors on weekends

There’s a freeze protect mode too. I live in Texas, so that matters some winters. When temps drop, it spins the pump and saves me from a burst pipe mess. It’s not fancy. It’s just there.

Home Assistant: worked well after MQTT

I do run Home Assistant. In nodejs-poolController, I turned on MQTT and pointed it at my broker. After a restart, new entities popped up: pump speed, heater state, spa, lights, salt level, and more. I made two tiny automations:

  • When we turn the spa on, set pump to 3000 RPM, and lock it there till the spa turns off.
  • If it’s freezing and the pump isn’t running, start it at 2000 RPM. Belt and suspenders.

I like the MQTT part. It feels steady. Commands land. States update fast.

Stuff I liked (and a few things I didn’t)

Pros:

  • Real control over my Pentair gear without the pricey add-ons
  • Dash panel is clear and fast on a phone
  • Schedules, circuits, light shows, pump speeds — all in one place
  • API and MQTT make nerd things easy
  • It found my equipment on its own after I fixed wiring

Cons:

  • Docs live across a few places; not all bits are in one spot
  • First wire-up is a “is A actually A?” puzzle
  • I hit a weird conflict with a pump schedule I made in the panel vs. one I made in the app — I deleted the panel’s version and let the app own it
  • One chlorinator reading was off after a power blip; a restart cleared it

If you’re on the fence about whether keeping Node.js running long-term on a Pi is even safe, my candid take—complete with crash graphs and uptime screenshots—is here: “Is Node.js Safe?” after shipping real stuff with it.

Little wins and gotchas

  • Use an FTDI-based RS-485 adapter. Cheap ones can be noisy.
  • Label your circuits in the app. Names beat numbers when you’re half awake.
  • Back up your config file. I keep a copy on the Pi and my laptop. For the exact Node.js snippet I use to prune old backups (a quick fs.unlink helper), see my honest take on deleting files with Node.js—with real code.
  • If lights don’t respond, make sure the app knows the right light type. Mine needed “IntelliBrite,” not generic.
  • Keep only one place for schedules. The panel or the app. Not both.

Here’s one schedule I used that felt right for summer:

  • Filter: 7 am–11 am at 1600 RPM (quiet coffee time)
  • Cleaner: 11 am–1 pm at 2800 RPM
  • Filter again: 7 pm–10 pm at 1600 RPM
  • Lights: sunset to 11 pm, soft white

Simple, cheap to run, and the water stayed clear.

Reliability and updates

I’ve had it running for three months. The Pi reboots after power loss and the app comes back on its own. Logs make sense. Memory use stayed low. I updated once to pick up a bug fix. It took five minutes.

There was a stretch where I considered wiping Node.js and starting clean—version mismatch headaches were real. I documented every trial, error, and rollback in the saga of uninstalling Node.js three separate times. Spoiler: nuke-and-pave isn’t always the answer, but sometimes it helps.

I did have one day where the RS-485 bus got chatty and dropped a few reads. Turned out a loose ground at the panel. Tightened it. Rock solid again.

If you ever decide you’re done with Node.js on a machine entirely, I also chronicled the clean-remove approach that finally stuck: how I deleted Node.js on all my boxes without leaving crumbs.

Who should try it?

  • You have Pentair gear (EasyTouch, IntelliTouch, IntelliCenter, IntelliBrite, IntelliChlor).
  • You