<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Diy on Miloš Kozák</title><link>https://pubs.miloskozak.cz/tags/diy/</link><description>Recent content in Diy on Miloš Kozák</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sat, 12 Jul 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://pubs.miloskozak.cz/tags/diy/index.xml" rel="self" type="application/rss+xml"/><item><title>Smart Water Management System (DIY)</title><link>https://pubs.miloskozak.cz/posts/smart-water-management/</link><pubDate>Sat, 12 Jul 2025 00:00:00 +0000</pubDate><guid>https://pubs.miloskozak.cz/posts/smart-water-management/</guid><description>&lt;p&gt;&lt;em&gt;(The full ESPHome config and wiring live in &lt;a href="https://github.com/lejmr/dyi-ha-water-management"&gt;lejmr/dyi-ha-water-management&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I have a 16m³ underground concrete rain water tank, a well, and a cellar that sits uncomfortably close to both. When the groundwater rises, it finds its way through the concrete and into the cellar — so I wanted a system that watches both water levels and runs the pump &lt;em&gt;before&lt;/em&gt; the water starts redecorating. And since it irrigates the lawn anyway, the water doesn&amp;rsquo;t even go to waste.&lt;/p&gt;
&lt;p&gt;The requirements I set myself: DIN rail mount (three positions max, power supply included), reliability, minimal maintenance — and everything visible in Home Assistant, because a water level I can&amp;rsquo;t chart might as well not exist.&lt;/p&gt;
&lt;h2 id="off-the-shelf-first"&gt;Off-the-shelf first&lt;/h2&gt;
&lt;p&gt;I did try to buy my way out of it. &lt;a href="https://catalogue.lovatoelectric.com/cz_cs/Hladinova-rele-Modularni-verze-Jednonapetova-rele-Multifunkcni-Automaticky-reset-Napajeci-napeti-110-127VAC/LVM40A127/snp"&gt;Lovato LVM40A127&lt;/a&gt; and &lt;a href="https://www.elkoep.cz/hladinovy-spinac---hrh-6"&gt;Elko HRH-6&lt;/a&gt; both do the job functionally — but neither speaks Home Assistant, and a dumb relay was exactly what I didn&amp;rsquo;t want. So: DIY.&lt;/p&gt;
&lt;h2 id="the-build"&gt;The build&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://esphome.io"&gt;ESPHome&lt;/a&gt; was the obvious software choice — native Home Assistant integration, config in one YAML file. For sensing I picked &lt;a href="https://www.aliexpress.com/item/1005006071143565.html"&gt;RS-485 water level transmitters&lt;/a&gt; (the 24V DC version), on the strength of recommendations from various DIY forums.&lt;/p&gt;
&lt;p&gt;The rest of the hardware follows from that decision: a &lt;a href="https://www.wemos.cc/en/latest/s2/s2_mini.html"&gt;Wemos S2 mini&lt;/a&gt; ESP32 board, a &lt;a href="https://www.aliexpress.com/item/1005006071143565.html"&gt;MAX485 converter&lt;/a&gt; because ESP boards don&amp;rsquo;t speak RS-485, a &lt;a href="https://dratek.cz/arduino/1738-step-down-modul-napajeni-mini-buck-nastavitelny.html"&gt;24V→5V step-down&lt;/a&gt; to power the logic, all soldered onto a universal &lt;a href="https://www.aliexpress.com/item/1005008742636890.html"&gt;prototyping board&lt;/a&gt; and packed into a &lt;a href="https://www.aliexpress.com/item/1005006067012648.html"&gt;SZOMK DIN rail enclosure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pubs.miloskozak.cz/img/smart-water-management/wiring.png" alt="Wiring"&gt;
&lt;img src="https://pubs.miloskozak.cz/img/smart-water-management/testing.jpg" alt="Initial solution"&gt;
&lt;img src="https://pubs.miloskozak.cz/img/smart-water-management/prototype.jpg" alt="Prototype"&gt;&lt;/p&gt;
&lt;p&gt;Prototype ready for deployment:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pubs.miloskozak.cz/img/smart-water-management/final-preparation.jpg" alt="Final test"&gt;&lt;/p&gt;
&lt;p&gt;The ESP board&amp;rsquo;s configuration lives in &lt;a href="https://github.com/lejmr/dyi-ha-water-management/blob/master/wemos.yml"&gt;&lt;code&gt;wemos.yml&lt;/code&gt;&lt;/a&gt; and gets flashed like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;esphome run --device /dev/tty.usbmodem01 wemos.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The final deployment ended up in two places: the wiring cabinet and the well itself.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://pubs.miloskozak.cz/img/smart-water-management/deployment.jpg" alt="Deployment in wiring deck"&gt;
&lt;img src="https://pubs.miloskozak.cz/img/smart-water-management/well.jpeg" alt="Deployment in well"&gt;&lt;/p&gt;
&lt;p&gt;The pump itself is powered through a &lt;a href="https://kb.shelly.cloud/knowledge-base/shelly-1pm-gen4"&gt;Shelly 1PM gen4&lt;/a&gt;, driven by a Home Assistant automation: when the well level climbs above 190 cm, switch on; wait until it drops below 140 cm, switch off.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;alias&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Reduce level in the well&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;triggers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;device&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sensor.well_level&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;above&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;190&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;turn_on&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;switch.well_pump&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;wait_for_trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;trigger&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;device&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;value&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;sensor.well_level&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;below&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;140&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;turn_off&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entity_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;switch.well_pump&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;single&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="how-it-holds-up"&gt;How it holds up&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The water level sensor is very accurate — genuinely surprised for the price.&lt;/li&gt;
&lt;li&gt;The whole setup (2x RS-485 converter, 1x level sensor) consumes about 1 W while reading every 5 seconds.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://pubs.miloskozak.cz/img/smart-water-management/ha.png" alt="Graphs in Home Assistant"&gt;&lt;/p&gt;
&lt;h2 id="challenges"&gt;Challenges&lt;/h2&gt;
&lt;p&gt;One mystery remains: with both RS-485 converters connected, the ESP refuses to join Wi-Fi. Remove one and everything works. So the second measuring point waits until I figure that one out.&lt;/p&gt;
&lt;h2 id="future-work"&gt;Future work&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Shrink the device to a single DIN position in the wiring cabinet&lt;/li&gt;
&lt;li&gt;Support two measuring locations (see above)&lt;/li&gt;
&lt;li&gt;Upgrade to &lt;a href="https://www.waveshare.com/wiki/ESP32-S3-Zero"&gt;ESP32-S3-Zero&lt;/a&gt;, which should lower consumption and save space in the box&lt;/li&gt;
&lt;li&gt;Let the device control the Shelly directly — the goal is to set the water levels from Home Assistant and have the device drive the pump on its own, even when Home Assistant is down&lt;/li&gt;
&lt;li&gt;A Home Assistant blueprint for device configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://community.home-assistant.io/t/water-level-sensor-qdy30a-modbus-rs485-with-esp32-s2-mini/698712"&gt;https://community.home-assistant.io/t/water-level-sensor-qdy30a-modbus-rs485-with-esp32-s2-mini/698712&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description></item></channel></rss>