Water softener (CLACK WS1) consumed m3/liter monitoring

Also interested in purchasing a kit. If they become available through here or somewhere else online please share a link!

I’m also interested in this board. Meanwhile I will set up with ESP32 board. Thanks for the insights.

Hi all,
First off, thanks to the author for the work put into this project, it’s a great idea and clearly useful for people with Clack softeners.

That said, I wanted to raise a point that’s been bothering me a bit. The project is presented as an open-source ESPHome/DIY solution, but when I went looking for a schematic, BOM, or Gerber files to build my own board, I couldn’t find any of that in the repository. The only option mentioned is contacting the author by email to buy a pre-built, pre-flashed PCB.

I understand supporting a project financially by buying the ready-made hardware, and I have no issue with that as a business model. But it does feel a bit at odds with calling it “open source DIY,” since without the hardware files there’s no real way to replicate or adapt the build independently, you’re effectively locked into a single supplier.

Could someone clarify whether there’s a plan to release the schematic/PCB files at some point, or whether that’s intentionally being kept private? Even a rough parts list for those willing to reverse-engineer the wiring would help. I think being transparent about this, even if the answer is “the hardware design stays closed for now”, would help set expectations for people discovering the project through GitHub.

Thanks in advance for any clarification!

Here is my ESPHome config for the Clack WS1 CE valve water meter. In my case it’s an Ecosoft FK1054CEMIXA

A few notes from my testing:

  • The Clack turbine outputs ~62 pulses per gallon, which is ~16.38 pulses per liter - hence the x / 16.38 filter.
  • I use pulse_meter instead of pulse_counter: it measures time between pulses, so flow reacts instantly and low-flow resolution is much better
  • internal_filter: 13ms with PULSE mode debounces the reed switch
  • Measured on my unit: the slowest flow the turbine reliably detects gives a pulse every ~5.5 s (~0.66 L/min), anything below that is physically invisible to the turbine. So timeout: 8s covers everything the sensor can actually see - flow drops to zero within 8s after closing the tap
  • device_class: volume_flow_rate on the flow sensor and device_class: water + state_class: total_increasing on the total make it plug straight into the HA Energy Dashboard
  • Daily/Monthly/Yearly totals are Utility Meter helpers in HA on top of the total sensor
sensor:
  - platform: pulse_meter
    pin:
      number: GPIO5
      allow_other_uses: true
      mode:
        input: true
        pullup: true
    id: water_flow
    internal_filter: 13ms
    internal_filter_mode: PULSE
    timeout: 8s
    unit_of_measurement: 'L/min'
    device_class: volume_flow_rate
    state_class: measurement
    accuracy_decimals: 1
    name: 'Water Flow'
    icon: 'mdi:water-pump'
    filters:
      - lambda: return (x / 16.38);
    total:
      unit_of_measurement: 'L'
      name: 'Water Total'
      state_class: total_increasing
      device_class: water
      accuracy_decimals: 1
      icon: 'mdi:water'
      filters:
        - lambda: return (x / 16.38);

  - platform: wifi_signal
    name: 'WiFi Signal'
    update_interval: 60s
    entity_category: diagnostic
    icon: "mdi:wifi"

  - platform: uptime
    name: 'Uptime'
    entity_category: diagnostic

binary_sensor:
  - platform: template
    name: 'Water Running'
    device_class: running
    lambda: |-
      return id(water_flow).state > 0.2;

  - platform: status
    name: 'Status'

  - platform: gpio
    pin:
      number: GPIO5
      allow_other_uses: true
      mode:
        input: true
        pullup: true
    name: 'Pulse Raw'
    internal: true
    filters:
      - delayed_on: 5ms
    on_press:
      then:
        - lambda: |-
            static uint32_t last = 0;
            uint32_t now = millis();
            ESP_LOGI("pulse", "PULSE! interval = %u ms", now - last);
            last = now;

As i understand you just use ordinary ESP32 board with direct connection of GPIO5 to Clack WS1 turbine?
Do you use any other electronic components in your schema?

How do you monitor the regen process? (when it starts / finishes)?

Hey,

I used ideas from this thread, and with an ESP32 and a UART salt sensor, I built my own version to measure water usage and salt level.

That is great. Could you please share some more details on how you connected to the water softener and your ESPhome code? Many thanks!

Sure,

This is the code: esphome-configurations/water-softener.yaml at c171db52f0af97f37b15ee447831bd246b0f988d · fassko/esphome-configurations · GitHub

I used an ESP32 DevKit S3 device (I can use a smaller one, but I had this one).
I used this sensor for salt because it is waterproof: https://a.aliexpress.com/_ExItSE2

This is my setup (generated image by AI)

You need to calibrate the water pulse, but I had the same issue we discussed earlier in this thread.

If you talk about wiring, I pretty much extended the water softener and split into three ways. Nothing fancy but works.

Thanks for the info. Lastly, it would be very helpful for me to see a photo or some other way to see where on the Clack circuit board I attach the white (pulse) and black (gnd) wires. I have the Esp32 board ready to go. Thanks again.

I attached this way. extended the meter cables, then split black and white in 3 ways. Nothing fancy, but works.

Many thanks!

Hi Everyone,
I am just in the process of building a replacement PCB for my Fleck 5600/Pentair SXT, although it should be possible to recreate for the Clack WS1.

It is basically all finished ready for me to send to PCBWAY, but I thought at the last minute to get some input from everyone here on the missing features

So far I have:

  • ESPHome based firmware on a ESP32-S3 (This is the WROOM model for external antenna)

  • OLED display

  • Sensors/Control:
    – Control over the existing Fleck motors
    – Water flow rate with the existing Fleck meter (GPIO21 for hardware pulse counting)
    – Incoming water Pressure and Temp via I2C (Optional with XIDIBEI XDB401 Pressure Sensor - ESPHome - Smart Home Made Simple)
    – Outgoing water Pressure and Temp via I2C (Optional with XIDIBEI XDB401 Pressure Sensor - ESPHome - Smart Home Made Simple)
    – 3 Buttons (so this aligns with the existing 3 on the Fleck/Pentair chassis)
    – I2C Brine sensor Optional (Supported by LTC4311 so the I2C will run over a longer distance)
    – Onboard Temp/Humidity below the middle button
    — This is not soldered, I have put a small horizontal header. So by default I will just push the pins into the header, but I can also put it remotely sticking through the chassis if I want the room ambient reading.
    – Boot button
    – LEDs for 24v, 5v, 3.3v, Network, and Motor (when it is trying to move the valve position)
    – Remaining IO is broken out ready for use (including one of the I2C lanes)
    — The image is from an older version, the header is now 2x8 rather than the 2x5 from the image

Atleast for the Fleck/Pentair it will be a drop-in replacement; as I have tried to fit everything inside the existing board size/depth, also screen size and button placement/height are the same.
It is powered by the existing brick, but you can also power the ESP32 on your desk if needed. It has protections if both are plugged in at the same time.


I did some changes to the code, took couple of ideas from @Fonske repository

  • Rework the water softener around a persistent pulse total.
  • Restore saved_total_pulses directly into the pulse meter on boot so
    its total is the lifetime total, and checkpoint to flash on shutdown
    as well as every 5 minutes. Derived sensors become copy platforms
    with filters instead of polling lambdas.
  • Move calibration into config number entities (pulses/litre, container
    height, salt threshold, regeneration capacity) so it is tunable from
    HA without reflashing; substitutions are first-boot defaults only.
  • Add regeneration tracking (water since/until, capacity used, days
    since, last regeneration, “Regeneration Due”), reset by a button or
    the mark_regeneration action, plus set_total_water to sync with the
    valve’s totaliser. Add a “Salt Low” problem sensor.
  • Harden inputs: pulse_meter timeout and debounce, NaN + median filter
    on the A02YYUW. Move diagnostics to the shared package.

V3030 is the bus master → V3030 generates CLK → The valve responds only when it is spoken to/clocked.

If the V3030 is missing, CLK and DATA simply remain in the idle state. Since the lines are officially named CLK, DATA, and GND, I likely a master-slave model.

Also: your error code 106 was not related to this.

I would be very interested in one of these. I have a “Clack impression plus” with a WS1 (if I’ve identified it correctly). Would it be compatible?


That looks like a different model to my “Fleck 5600/Pentair SXT”

It should be possible for me to remix the layout to fit your device as well; but I would really really good measurements of the board size, height of the buttons/screen.

Its probably not going to be cheap for a single device, as PCBWAY needs a minimum of 5 PCBs printed.

I am just waiting on PCBWAY to print and assemble mine at the moment, I have virtually tested everything in deep detail… but the proof will be when I plug it in.

Hi! Thanks for sharing your project, it’s really interesting!

I’m planning to buy a Clack water softener and integrate it with Home Assistant using your ESPHome configuration.

Could you please share the exact model of your water softener? For example, is it a Clack WS1, WS1CI, or another version?

I’d also be interested to know whether you had to make any hardware modifications to the valve or its wiring to get everything working.

Thanks in advance for your help!