Best Swimming Pool monitoring solution: ORP, Ph, temp

Hi Yuanca, could you share me some links for the adapters and probes? I’ve added some extra piping myself with crossings where I can fit a 1" or 3/4" thread in to put the sensors in. If needed it can also be replaced or a lid can be put on as now.

I’m just struggling with finding the right wording to find the correct insert for the sensors.

In my case, I didn’t have enough space on the main pump pipe to install four standard saddle clamps. My solution was to extend the line by adding a curve using PVC elbows with specific threaded outlets for the probes:


• Elbow with ¾” outlet (for the pH probe):
Product link
• Elbow with ½” outlet (for a temperature probe used with Loxone):

I also installed three collars:
• One ½” clamp for a temperature probe (using this insertion sleeve).
• Two ¾” clamps for the ORP and salinity probes.

Problems with 3D Printed Parts

At first, I followed Reunion974’s advice and printed my own probe adapters using a 3D printer. They worked at the beginning, but each time I removed and reinserted a probe, the 3D parts lost their tight fit or broke. It just wasn’t a long-term solution.

Replacing with Commercial Adapters
I switched to ¾” threaded adapters with caps, which are much sturdier and easier to reuse:
Adapter
Cap

Issues with the Original Probes
One weak point of the PH-W218 are the included pH and ORP probes. After just a few weeks, the pH readings went above 10 and ORP readings dropped too low. The values were clearly incorrect, and upon inspection, I saw that water had seeped into the BNC connector through the cable, damaging the probe.

So I decided to try new probes with better quality:
• Alternative pH/ORP probes:
AliExpress link
• Electrode holders for these probes (½” thread):
Holder from H2O Confort
• 2 Adapter from ¾” to ½”. If I were starting from scratch now, I would go with three ½” threads (for the pH, ORP, and temperature probes) and one ¾” thread (for the salinity probe). This would simplify the plumbing and allow for easier integration of standard electrode holders.

This setup has been working flawlessly for several weeks now, with stable and accurate readings.

Thank you! makes very much sense. The only question: the cap. Have you just drilled a hole in it, pulled the cable through and then glued? it tight? Or is this a special ring or something? How does it get water tight.

Thanks! Great question — I considered using glue or silicone at first, but I wanted a solution that would be easy to disassemble and maintain.

Here’s how I made the installation watertight:

  • I used a ¾" threaded cap and drilled a hole just large enough to pass the probe cable through.
  • I inserted the probe through the cap, with the BNC connector staying outside and the electrode inside the water line.
  • To ensure a watertight seal, I didn’t use glue or silicone. Instead, I used:
    • Teflon tape on the threads,
    • Rubber O-rings, but these were placed at the base of the threaded collars. This creates a tight seal between the adapter and the pipe system.

This combination has worked perfectly — it’s leak-free, reusable, and easy to take apart if needed.

Hey @yuanca, pool dashboard looks really amazing! Much better than what I’ve attempted doing to display my pool’s most critical vitals on my NSPanel :smiley: If you’re keen on sharing the YAML, more than happy to get it and replace my basic stuff.

Hey everyone,
As promised, I’ve published my complete pool monitoring dashboard using the PH-W218 device and Home Assistant.
It includes value fallback (when the pump is off), dynamic alerts, and mini-graphs for all parameters.

:point_right: GitHub repo: home-assistant-pool-dashboard-phw218

Hope it helps others! Feedback welcome

1 Like

I just read through this whole thread, great work.
are people getting reliable readings long term? how often do people need to calibrate?

In my case, I replaced the original pH and ORP probes with a low-cost alternative I bought on AliExpress two months ago. I calibrated them when I installed them, and they’ve been giving accurate readings ever since — no need for recalibration so far.

Salut @Reunion974,

Do you have an email to contact them or have you used the aliexpress chat system?

In fact, I managed to get everything working (using TuyaLocal… thank you) but the temperature remains at 25 since first installation… Looks like a damaged device/probe.

[EDIT] My fault. Probe was badly inserted. [/EDIT]

(Au passage je serai sur l’île en fin d’année, ca pourrait être une opportunité d’échanger sur le sujet si j’arrive à progresser d’ici là…)

Hi @sesardelaisla,

Could you share your template formulas? :sweat_smile:

Thanks in advance,
Tom

Here you go!

  - platform: template
    sensors:
      sonda_piscina_cl:
        friendly_name: 'Sonda Piscina Cloro (con valores negativos)'
        unit_of_measurement: 'ppm'
        device_class: water
        value_template: >
          {% set e_number = 2.71828 %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) < 6.5 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -740.04)/141.14)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 6.5 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -740.04)/141.14)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 6.6 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -734.99)/139.02)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 6.7 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -729.97)/136.8)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 6.8 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -725.01)/134.64)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 6.9 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -720.04)/132.43)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.0 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -714.99)/130.28)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.1 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -710.02)/128.09)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.2 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -704.95)/125.88)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.3 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -700.03)/123.72)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.4 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -695.18)/121.41)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.5 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -689.94)/119.47)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.6 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -685)/117.25)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.7 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -680)/115.1)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.8 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -675.03)/112.91)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 7.9 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -670.03)/110.75)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) == 8.0 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -665.01)/108.61)) | round(2) }}
          {%- endif %}

          {% if states('sensor.sonda_piscina_ph') | float | round(1) > 8.0 -%}
          {{ (e_number**((states('sensor.sonda_piscina_orp') | float -665.01)/108.61)) | round(2) }}
          {%- endif %}

      sonda_piscina_cl_ok:
        friendly_name: 'Sonda Piscina Cloro'
        device_class: water
        unit_of_measurement: 'ppm'
        value_template: >
          {{ 0 if states('sensor.sonda_piscina_cl') | float < 0 else states('sensor.sonda_piscina_cl') }}

The second sensor (which is the one I use in the frontend and automations) is basically for setting the value to 0 in case the chlorine sensor reports a negative value.

Congratulations on your work! Thanks to you, I was able to integrate the pH-W18 perfectly. However, the readings are incorrect because I didn’t calibrate it. I have some questions about the calibration:

  • Should I calibrate the pH probe with the solution? Should I calibrate the EC and ORP with distilled water?
  • Regarding the pH, did you only do the initial calibration or the 3-point correction?
  • One last question: how often do you recalibrate the probes?

Thank you and everyone for your time!

I’ve also implemented my Yieryi 8 in 1 solution with probes into the tubing of my swimming pool. I’ve been able to make it in such a way that it’s removable and water tight without and 3D printing and out of stock components.

I’ve gone for 1" wart for electricity boxes but it perfectly clamps the probes.
For the ones in the Netherlands, this is what I’ve used.
https://www.elektramat.nl/hummel-wartel-1inch-hsk-k-zwart-1209100171/

I’m still looking around to be able to calculate the amount of free chlorine, that hasn’t been so accurate up till now


1 Like

Did you have any issues when connecting up the replacement pH probe? I have ordered the same one but cannot get a reading below 15, which I assume means the PH-W218 cannot get a reading from the probe.

Instructions say it is ‘slow response’ so I’ll give it a few hours and see if anything changes, just figured I’d reach out to see if you had the same issue :slightly_smiling_face:

Thanks,
Sam

Hi Sam,

I bought this replacement pH probe:

:link: https://es.aliexpress.com/item/1005007575561954.html

And I can confirm it’s fully compatible with the PH-W218. It worked well from the start, although I did need to perform a small calibration adjustment to fine-tune the values.

After that, it started giving stable and accurate readings — around pH 7.4 in my pool.

If your probe is stuck at 15, here are a few tips that might help:

1.Check the BNC connection

A constant reading of 15 usually means the device isn’t receiving any signal. Make sure the BNC connector is fully inserted — sometimes it takes a bit of pressure to click into place properly.

2.Soak the probe before first use

While it wasn’t strictly necessary in my case, it’s often recommended to soak new probes for 1–2 hours in pH 7.00 buffer solution (or at least in tap water) to rehydrate the electrode, especially if it’s been stored dry.

3.Give it some time

In my setup, the reading took a few minutes to stabilize after connecting. Once calibrated, it has remained consistent and reliable.

Let me know how it goes. If you need help with calibration or integration into Home Assistant, happy to help.

Best regards,
yuanca

This is also very good and clean solution
Hidroten
Porta sondas de pH / Redox
No need for any 3D printed part

Are there high-quality replacement probes that the device is compatible with?

How do you control the dosing pumps to ensure they don’t run too long or in the worst case, continuously add chloride to the water?

What probes do you use?
How long do they last?
Do they need to be calibrated?