Pool pump speed control - easy way?

Update to the comms issue: Turns out, this doesn’t work with the ESP8266 too well, as in not giving me Demand RPM feedback or the slider not reflecting current RPM I suspect something to do with only having 1 UART that this can really use.

Replaced it with an ESP32 and everything works as it should. Just trying to read Motor input power page 0, address 17, or Inverter input power, page 0, address 4.

Are you guys able to build code after updating ESPHome to version 2023.4.0 ?

It is failing for me with:

In file included from src/esphome/components/centuryvspump/sensor/CenturyVSPumpSensor.cpp:1:
src/esphome/components/centuryvspump/sensor/CenturyVSPumpSensor.h: In constructor 'esphome::century_vs_pump::CenturyVSPumpSensor::CenturyVSPumpSensor(esphome::century_vs_pump::CenturyVSPump*, uint8_t, uint8_t, uint16_t, const string&, const string&)':
src/esphome/components/centuryvspump/sensor/CenturyVSPumpSensor.h:22:30: error: no matching function for call to 'esphome::century_vs_pump::CenturyVSPumpSensor::set_name(const string&)'
In file included from src/esphome/components/sensor/sensor.h:5,
                 from src/esphome/components/centuryvspump/CenturyVSPump.h:7,
                 from src/esphome/components/centuryvspump/sensor/CenturyVSPumpSensor.h:3,
                 from src/esphome/components/centuryvspump/sensor/CenturyVSPumpSensor.cpp:1:
src/esphome/core/entity_base.h:20:8: note: candidate: 'void esphome::EntityBase::set_name(const char*)'
   void set_name(const char *name);
src/esphome/core/entity_base.h:20:8: note:   no known conversion for argument 1 from 'const string' {aka 'const std::__cxx11::basic_string<char>'} to 'const char*'
Compiling /data/test-esp-32/.pioenvs/test-esp-32/src/esphome/components/esp32/preferences.cpp.o
Compiling /data/test-esp-32/.pioenvs/test-esp-32/src/esphome/components/homeassistant/time/homeassistant_time.cpp.o
*** [/data/test-esp-32/.pioenvs/test-esp-32/src/esphome/components/centuryvspump/sensor/CenturyVSPumpSensor.cpp.o] Error 1

@ gazoodle thanks for fixing code!

I also found issue why RS485 was not working for me at all.
It was hardware UART failure in ESP32 which is weird.

I tried to read Current and Voltage this way.
Current is working fine. Voltage returning “Unknown”.

Did you get it working?

No I wasn’t able to. What is your code for it to read current?

I’d like to try to get power out of it to keep me from making a CT based power meter.

I think it’s the data format but not familiar enough with the code to make it work.

I am using code from this page:

  - platform: centuryvspump
    name: ${friendly_name} Filter Pump Current
    address: 1
    page: 0
    scale: 1000         ## 1000 per Gen 3 EPC modbus Comm Protocol
    type: custom
    unit_of_measurement: Amps

  - platform: centuryvspump
    name: ${friendly_name} Filter Pump Voltage
    address: 31         ## or 2 Mains Voltage RMS
    page: 1             ## or 3 for Mains Voltage RMS
    scale: 230          ## NA per manual
    type: custom
    unit_of_measurement: Volts

I did more tests last couple days - looks like current sensor does not show correct amperage.
I have CT clamps also to measure current which are calibrated and more or less matching Klein Tools Tester.
When I run motor on low 1200-1800 RPM - current sensor is very close to what CT clamps detecting. But on full power it stuck on 7A and never going higher. CT Clamp is showing 9.5-10A at the same time.
Voltage is always show Unknown.

Just did an experiment and got the same results as you. At low RPM, it reads 0 but at 1200-1800, reads 1.00000 and at 3450, reads 6.000 amps. Nowhere near what my clamp meter reads.

I also noticed one more issue - basically pump never goes to 3450 rpm. Even if I set it to 3450 it is only reaching 3226-3227 rpm. It was working fine before latest fix. I also replaced esp32 but that should not be an issue. Could it be some bug? Can you try to check on your side?

It’s working good here. Here’s some screenshots. The gauge is running off the response from the pump, as it was bigger and easier to see from a distance.

Hey guys,

I have 2x Pentair Intelliflo VS and 1x Pentair Intellichlor Salt Chlorine Generator Model IC20 in operation.

Attached some pictures of the inside wiring of the pump, and something of the manual for the rather expensive Intellisyn Manual (not using this product).

It appears that RS485 is definitely used.

Questions I have:

  1. Do you think/know if the CenturyVSPump code will work?

  2. I don’t see any option between Regal Modbus v4.17 protocol and OEM version. Does anyone know which protocol works and if not how the Modbus can be activated?

  3. Has anyone tried ESP stack with RS485 to Wifi or Ethernet? It would make things easier for me.

  4. Has anyone integrated with Chlorinator?

I am aware of the nodejs controller with HA integration but prefer to keep it simple/less devices/systems.

Thanks for your help.

Hello! I’m wondering if anybody has successfully integrated the V-Green 2.7 HP VS pump with Home Assistant using only an ESP?

I’ve seen @gazoodle 's repo, but it looks like the ESP he mentions is no longer made, and I’m also not sure if the 2.7 HP version of the pump is compatible?

I would LOVE to gain control of the speeds in Home Assistant, just not sure if it’s possible without a dedicated “pool controller” like the big brands make.

Also they sell this “automation adapter” … not sure if that’s required with the ESP solution: https://regalbeloitliterature.callmss.com/filedownload.php?S_card=MCIM18021E

I believe this is the RS485 connector:

Hi there,

I have only managed to get the Pentair VSD pump working. Took me ages, all hex commands.

I used this product: Yocto-RS485-V2 - USB to RS485 isolated adapter, driver-free

See screenshot below - I can access all the data from the pump and run the external programs.

Also attaching an XLS document with the hex commands.

Hope it helps


1 Like

I’m using with with a V-Green 2.7HP. Works great controlling the pump – however I was unable to get it to control the auxiliary relay that is on the this pump. I am using the original ESP. You do not need the automation interface, and I couldn’t stand the V.Link wifi adapter made by Century, so this replaced it perfectly.

The ATOM from M5Stack looks like was recently updated and is now only available as the ATOM S3 (S3Lite) and you can pop on a rs-485 Interface module.

I’m not sure if it would be backward compatible with the code from gazoodle.



I wish I could be more help. But this might get you pointed in the right direction.

1 Like

Wow, thanks so much!!!

EDIT: I just found these, it looks like together it would be the exact same thing.

They also have both at Mouser:

@gazoodle @BravaCentauri83 YOU GUYS ROCK!!! I received the ATOM today, IT WORKS!!! Full control over my V-Green 2.7 HP.

I have to finish installing it proper and making it pretty, but I just wanted to thank you guys, this is AMAZING!!!

1 Like

well done @Scope666 once you are done why don’t you post a few pictures/screenshots and code snippets? then it will be easy for anyone to replicate. Thanks!

1 Like

Here’s my config so far. I’m trying to read the amps as others have in this thread, but it’s not very accurate since it’s only reading the whole number. (1.0, 2.0, etc.)

Here’s how it looks in HA at the moment. (I’m always tweaking)

Web interface:


1 Like

Look good. I am working on the same setup. I have some of the basic commands tested and working. However, my VS pump doesn’t have contacts for external programs. I have read around a good bit and It s seems some older version drives have the external program dry contacts, but the newer the drivers seem to have the dry contacts removed and it is only RS485 comms.

Basically, the issue is when I run the “external program x” command and nothing happens. I assume that is because this pump doesn’t have the input. I think need to load some registers with RPM setpoints and then call them for each program, rather than run the “external program”.


I got the Atom S3 Lite with the ATOM RS-485 that was linked to in a github issue. The pump does not respond. I’m just getting this error over and over again:

[11:22:50][D][century_vs_pump:140]: Pump command 43 no response received - removed from send queue
[11:22:51][D][century_vs_pump:140]: Pump command 45 no response received - removed from send queue
[11:22:52][D][switch:012]: 'Pool Pump Controller Run' Turning ON.
[11:22:52][D][switch:055]: 'Pool Pump Controller Run': Sending state ON
[11:22:53][D][century_vs_pump:140]: Pump command 45 no response received - removed from send queue
[11:22:54][D][century_vs_pump:140]: Pump command 45 no response received - removed from send queue
[11:22:55][D][century_vs_pump:140]: Pump command 45 no response received - removed from send queue
[11:22:57][D][century_vs_pump:140]: Pump command 41 no response received - removed from send queue
[11:22:58][D][century_vs_pump:140]: Pump command 43 no response received - removed from send queue

I’ve configured it to run with GPIO05 and 06:

# You need a UART to talk to the RS485 bus
  baud_rate: 9600
  rx_pin: GPIO05
  tx_pin: GPIO06

I’ve tried swapping the A/B wires, swapping 05/06 as well as a few other GPIO combinations. Any advice? Will the ATOM S3 Lite just not work? If so I can order this instead. I hooked my Jandy VS Controller back up in the mean time.

My full config is here.

I figured out my problem. It was dip switch 5. I was reading through some of the links off of the github link and saw that for some pumps dip switch 5 toggles it between Jandy Mode an RS-485 mode. When I switched that it started working.

Now it’s automation time! Speed up when the heater is on, run high enough for the skimmers a few hours a day, turn on automatically when power is restored, set speed based on time of day, freeze protection… the possibilities are endless! Thank you!