Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Introduction

ko-fi
The purpose of this project is to measure the height level of a salt tank for a water softener. It publishes the distance measured to Home Assistant where it can be converted in percentage and displayed as a lovelace card.

For people not interested in using Home Assistant but want a standalone setup, one can setup a Bark key to receive a notification when the salt level goes below a threshold. Bark is a free iOS app which can be installed on any Apple mobile device and is meant to receive notifications.

For Android users, a topic for the app NTFY is generated by the esp32 and one can subscribe to it from a mobile device to receive the notifications.

A WebUI also displays the level directly.

Screenshot 2025-11-17 at 13 44 14

Hardware requirements

Any ESP32 - the platformio file is meant for a nodemcu version but it can be adjusted for any board.

A waterproof ultrasonic sensor with its board: JSN-SR04T

image

Some people have tried with other ultrasonic sensor which ended up being corroded quickly due to the salty environment.

The board needs to be wired to the ESP32 as such:

JSN-SR04T VCC → ESP32 5V
JSN-SR04T GND → ESP32 GND
JSN-SR04T Trig → ESP32 GPIO5
JSN-SR04T Echo → ESP32 GPIO18

Any support to hold the sensor - note the board + ESP32 should not be put inside the tanks otherwise they will get damaged with the salt.
In my case, I've used an insert in the plastic of my tank in order to screw a 3d printed holder for the sensor, in a way which set it in the middle. A piece of wood with a hole, secured on the tank would also work fine.

Software

Quick Start

Rename secrets_template.h into secrets.h and enter your credentials : Wifi + MQTT settings + Bark settings.

MQTT is used if you want to integrate with Home Assistant and display the salt level in a lovelace card.

If you don't have Home Assistant and prefer to keep things simple but still want to receive a notification when the salt level is low, simply install Bark on your mobile and get the API key from there. Define your minimum level in centimeters from the top of the sensor (45cm by default). Bark will send the notification only once and will only reset once the tank is 3cm above the threshold again.

You can change the frequency of the measurement: by default it is set in constant.h at 1hr.

We're using PlatformIO as the IDE and you will find here the instructions to install it together with VSCode in order to compile it and flash the esp32: https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/

Compile the code and upload it to the esp32:

pio run -t clean
pio run -e esp32
pio run -t upload -e esp32
pio device monitor -b 115200

Home Assistant Setup (Optional, requires MQTT)

Use the Yaml files in docs folder for the Home Assistant setup: salt_level.yaml needs to be in a folder loaded by the configuration The yaml in configuration.yaml needs to be copied in the section template of your existing setup. You will need to adjust the max depth to your tanks dimensions.

The lovelace card can be setup using this:

type: gaugeentity: sensor.salt_levelname: Salt Levelmin: 0max: 100unit: "%"severity:
green: 60yellow: 35red: 0

Settings in the WebUI

Browsing to the IP address of the ESP32 or to http://saltlevel-esp32.local/ you will find a webpage to display the status of the salt level, as well as adjust the settings (retained at reboot). The language of the webpage can be switched to french.

The intent behind this was to make it accessible for people without a Home Assistant setup and needed some autonomy in adjustment of the settings without having to recompile the firmware.


About

Tired of forgetting to check your salt level of your water softener ? This is a simple device and code to measure how much salt is in the tank, with an alert system.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Introduction

ko-fi
The purpose of this project is to measure the height level of a salt tank for a water softener. It publishes the distance measured to Home Assistant where it can be converted in percentage and displayed as a lovelace card.

For people not interested in using Home Assistant but want a standalone setup, one can setup a Bark key to receive a notification when the salt level goes below a threshold. Bark is a free iOS app which can be installed on any Apple mobile device and is meant to receive notifications.

For Android users, a topic for the app NTFY is generated by the esp32 and one can subscribe to it from a mobile device to receive the notifications.

A WebUI also displays the level directly.

Screenshot 2025-11-17 at 13 44 14

Hardware requirements

Any ESP32 - the platformio file is meant for a nodemcu version but it can be adjusted for any board.

A waterproof ultrasonic sensor with its board: JSN-SR04T

image

Some people have tried with other ultrasonic sensor which ended up being corroded quickly due to the salty environment.

The board needs to be wired to the ESP32 as such:

JSN-SR04T VCC → ESP32 5V
JSN-SR04T GND → ESP32 GND
JSN-SR04T Trig → ESP32 GPIO5
JSN-SR04T Echo → ESP32 GPIO18

Any support to hold the sensor - note the board + ESP32 should not be put inside the tanks otherwise they will get damaged with the salt.
In my case, I've used an insert in the plastic of my tank in order to screw a 3d printed holder for the sensor, in a way which set it in the middle. A piece of wood with a hole, secured on the tank would also work fine.

Software

Quick Start

Rename secrets_template.h into secrets.h and enter your credentials : Wifi + MQTT settings + Bark settings.

MQTT is used if you want to integrate with Home Assistant and display the salt level in a lovelace card.

If you don't have Home Assistant and prefer to keep things simple but still want to receive a notification when the salt level is low, simply install Bark on your mobile and get the API key from there. Define your minimum level in centimeters from the top of the sensor (45cm by default). Bark will send the notification only once and will only reset once the tank is 3cm above the threshold again.

You can change the frequency of the measurement: by default it is set in constant.h at 1hr.

We're using PlatformIO as the IDE and you will find here the instructions to install it together with VSCode in order to compile it and flash the esp32: https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/

Compile the code and upload it to the esp32:

pio run -t clean
pio run -e esp32
pio run -t upload -e esp32
pio device monitor -b 115200

Home Assistant Setup (Optional, requires MQTT)

Use the Yaml files in docs folder for the Home Assistant setup: salt_level.yaml needs to be in a folder loaded by the configuration The yaml in configuration.yaml needs to be copied in the section template of your existing setup. You will need to adjust the max depth to your tanks dimensions.

The lovelace card can be setup using this:

type: gaugeentity: sensor.salt_levelname: Salt Levelmin: 0max: 100unit: "%"severity:
green: 60yellow: 35red: 0

Settings in the WebUI

Browsing to the IP address of the ESP32 or to http://saltlevel-esp32.local/ you will find a webpage to display the status of the salt level, as well as adjust the settings (retained at reboot). The language of the webpage can be switched to french.

The intent behind this was to make it accessible for people without a Home Assistant setup and needed some autonomy in adjustment of the settings without having to recompile the firmware.


About

Tired of forgetting to check your salt level of your water softener ? This is a simple device and code to measure how much salt is in the tank, with an alert system.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Introduction

ko-fi
The purpose of this project is to measure the height level of a salt tank for a water softener. It publishes the distance measured to Home Assistant where it can be converted in percentage and displayed as a lovelace card.

For people not interested in using Home Assistant but want a standalone setup, one can setup a Bark key to receive a notification when the salt level goes below a threshold. Bark is a free iOS app which can be installed on any Apple mobile device and is meant to receive notifications.

For Android users, a topic for the app NTFY is generated by the esp32 and one can subscribe to it from a mobile device to receive the notifications.

A WebUI also displays the level directly.

Screenshot 2025-11-17 at 13 44 14

Hardware requirements

Any ESP32 - the platformio file is meant for a nodemcu version but it can be adjusted for any board.

A waterproof ultrasonic sensor with its board: JSN-SR04T

image

Some people have tried with other ultrasonic sensor which ended up being corroded quickly due to the salty environment.

The board needs to be wired to the ESP32 as such:

JSN-SR04T VCC → ESP32 5V
JSN-SR04T GND → ESP32 GND
JSN-SR04T Trig → ESP32 GPIO5
JSN-SR04T Echo → ESP32 GPIO18

Any support to hold the sensor - note the board + ESP32 should not be put inside the tanks otherwise they will get damaged with the salt.
In my case, I've used an insert in the plastic of my tank in order to screw a 3d printed holder for the sensor, in a way which set it in the middle. A piece of wood with a hole, secured on the tank would also work fine.

Software

Quick Start

Rename secrets_template.h into secrets.h and enter your credentials : Wifi + MQTT settings + Bark settings.

MQTT is used if you want to integrate with Home Assistant and display the salt level in a lovelace card.

If you don't have Home Assistant and prefer to keep things simple but still want to receive a notification when the salt level is low, simply install Bark on your mobile and get the API key from there. Define your minimum level in centimeters from the top of the sensor (45cm by default). Bark will send the notification only once and will only reset once the tank is 3cm above the threshold again.

You can change the frequency of the measurement: by default it is set in constant.h at 1hr.

We're using PlatformIO as the IDE and you will find here the instructions to install it together with VSCode in order to compile it and flash the esp32: https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/

Compile the code and upload it to the esp32:

pio run -t clean
pio run -e esp32
pio run -t upload -e esp32
pio device monitor -b 115200

Home Assistant Setup (Optional, requires MQTT)

Use the Yaml files in docs folder for the Home Assistant setup: salt_level.yaml needs to be in a folder loaded by the configuration The yaml in configuration.yaml needs to be copied in the section template of your existing setup. You will need to adjust the max depth to your tanks dimensions.

The lovelace card can be setup using this:

type: gaugeentity: sensor.salt_levelname: Salt Levelmin: 0max: 100unit: "%"severity:
green: 60yellow: 35red: 0

Settings in the WebUI

Browsing to the IP address of the ESP32 or to http://saltlevel-esp32.local/ you will find a webpage to display the status of the salt level, as well as adjust the settings (retained at reboot). The language of the webpage can be switched to french.

The intent behind this was to make it accessible for people without a Home Assistant setup and needed some autonomy in adjustment of the settings without having to recompile the firmware.


About

Tired of forgetting to check your salt level of your water softener ? This is a simple device and code to measure how much salt is in the tank, with an alert system.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Introduction

ko-fi
The purpose of this project is to measure the height level of a salt tank for a water softener. It publishes the distance measured to Home Assistant where it can be converted in percentage and displayed as a lovelace card.

For people not interested in using Home Assistant but want a standalone setup, one can setup a Bark key to receive a notification when the salt level goes below a threshold. Bark is a free iOS app which can be installed on any Apple mobile device and is meant to receive notifications.

For Android users, a topic for the app NTFY is generated by the esp32 and one can subscribe to it from a mobile device to receive the notifications.

A WebUI also displays the level directly.

Screenshot 2025-11-17 at 13 44 14

Hardware requirements

Any ESP32 - the platformio file is meant for a nodemcu version but it can be adjusted for any board.

A waterproof ultrasonic sensor with its board: JSN-SR04T

image

Some people have tried with other ultrasonic sensor which ended up being corroded quickly due to the salty environment.

The board needs to be wired to the ESP32 as such:

JSN-SR04T VCC → ESP32 5V
JSN-SR04T GND → ESP32 GND
JSN-SR04T Trig → ESP32 GPIO5
JSN-SR04T Echo → ESP32 GPIO18

Any support to hold the sensor - note the board + ESP32 should not be put inside the tanks otherwise they will get damaged with the salt.
In my case, I've used an insert in the plastic of my tank in order to screw a 3d printed holder for the sensor, in a way which set it in the middle. A piece of wood with a hole, secured on the tank would also work fine.

Software

Quick Start

Rename secrets_template.h into secrets.h and enter your credentials : Wifi + MQTT settings + Bark settings.

MQTT is used if you want to integrate with Home Assistant and display the salt level in a lovelace card.

If you don't have Home Assistant and prefer to keep things simple but still want to receive a notification when the salt level is low, simply install Bark on your mobile and get the API key from there. Define your minimum level in centimeters from the top of the sensor (45cm by default). Bark will send the notification only once and will only reset once the tank is 3cm above the threshold again.

You can change the frequency of the measurement: by default it is set in constant.h at 1hr.

We're using PlatformIO as the IDE and you will find here the instructions to install it together with VSCode in order to compile it and flash the esp32: https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/

Compile the code and upload it to the esp32:

pio run -t clean
pio run -e esp32
pio run -t upload -e esp32
pio device monitor -b 115200

Home Assistant Setup (Optional, requires MQTT)

Use the Yaml files in docs folder for the Home Assistant setup: salt_level.yaml needs to be in a folder loaded by the configuration The yaml in configuration.yaml needs to be copied in the section template of your existing setup. You will need to adjust the max depth to your tanks dimensions.

The lovelace card can be setup using this:

type: gaugeentity: sensor.salt_levelname: Salt Levelmin: 0max: 100unit: "%"severity:
green: 60yellow: 35red: 0

Settings in the WebUI

Browsing to the IP address of the ESP32 or to http://saltlevel-esp32.local/ you will find a webpage to display the status of the salt level, as well as adjust the settings (retained at reboot). The language of the webpage can be switched to french.

The intent behind this was to make it accessible for people without a Home Assistant setup and needed some autonomy in adjustment of the settings without having to recompile the firmware.


About

Tired of forgetting to check your salt level of your water softener ? This is a simple device and code to measure how much salt is in the tank, with an alert system.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Introduction

ko-fi
The purpose of this project is to measure the height level of a salt tank for a water softener. It publishes the distance measured to Home Assistant where it can be converted in percentage and displayed as a lovelace card.

For people not interested in using Home Assistant but want a standalone setup, one can setup a Bark key to receive a notification when the salt level goes below a threshold. Bark is a free iOS app which can be installed on any Apple mobile device and is meant to receive notifications.

For Android users, a topic for the app NTFY is generated by the esp32 and one can subscribe to it from a mobile device to receive the notifications.

A WebUI also displays the level directly.

Screenshot 2025-11-17 at 13 44 14

Hardware requirements

Any ESP32 - the platformio file is meant for a nodemcu version but it can be adjusted for any board.

A waterproof ultrasonic sensor with its board: JSN-SR04T

image

Some people have tried with other ultrasonic sensor which ended up being corroded quickly due to the salty environment.

The board needs to be wired to the ESP32 as such:

JSN-SR04T VCC → ESP32 5V
JSN-SR04T GND → ESP32 GND
JSN-SR04T Trig → ESP32 GPIO5
JSN-SR04T Echo → ESP32 GPIO18

Any support to hold the sensor - note the board + ESP32 should not be put inside the tanks otherwise they will get damaged with the salt.
In my case, I've used an insert in the plastic of my tank in order to screw a 3d printed holder for the sensor, in a way which set it in the middle. A piece of wood with a hole, secured on the tank would also work fine.

Software

Quick Start

Rename secrets_template.h into secrets.h and enter your credentials : Wifi + MQTT settings + Bark settings.

MQTT is used if you want to integrate with Home Assistant and display the salt level in a lovelace card.

If you don't have Home Assistant and prefer to keep things simple but still want to receive a notification when the salt level is low, simply install Bark on your mobile and get the API key from there. Define your minimum level in centimeters from the top of the sensor (45cm by default). Bark will send the notification only once and will only reset once the tank is 3cm above the threshold again.

You can change the frequency of the measurement: by default it is set in constant.h at 1hr.

We're using PlatformIO as the IDE and you will find here the instructions to install it together with VSCode in order to compile it and flash the esp32: https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/

Compile the code and upload it to the esp32:

pio run -t clean
pio run -e esp32
pio run -t upload -e esp32
pio device monitor -b 115200

Home Assistant Setup (Optional, requires MQTT)

Use the Yaml files in docs folder for the Home Assistant setup: salt_level.yaml needs to be in a folder loaded by the configuration The yaml in configuration.yaml needs to be copied in the section template of your existing setup. You will need to adjust the max depth to your tanks dimensions.

The lovelace card can be setup using this:

type: gaugeentity: sensor.salt_levelname: Salt Levelmin: 0max: 100unit: "%"severity:
green: 60yellow: 35red: 0

Settings in the WebUI

Browsing to the IP address of the ESP32 or to http://saltlevel-esp32.local/ you will find a webpage to display the status of the salt level, as well as adjust the settings (retained at reboot). The language of the webpage can be switched to french.

The intent behind this was to make it accessible for people without a Home Assistant setup and needed some autonomy in adjustment of the settings without having to recompile the firmware.


About

Tired of forgetting to check your salt level of your water softener ? This is a simple device and code to measure how much salt is in the tank, with an alert system.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Introduction

ko-fi
The purpose of this project is to measure the height level of a salt tank for a water softener. It publishes the distance measured to Home Assistant where it can be converted in percentage and displayed as a lovelace card.

For people not interested in using Home Assistant but want a standalone setup, one can setup a Bark key to receive a notification when the salt level goes below a threshold. Bark is a free iOS app which can be installed on any Apple mobile device and is meant to receive notifications.

For Android users, a topic for the app NTFY is generated by the esp32 and one can subscribe to it from a mobile device to receive the notifications.

A WebUI also displays the level directly.

Screenshot 2025-11-17 at 13 44 14

Hardware requirements

Any ESP32 - the platformio file is meant for a nodemcu version but it can be adjusted for any board.

A waterproof ultrasonic sensor with its board: JSN-SR04T

image

Some people have tried with other ultrasonic sensor which ended up being corroded quickly due to the salty environment.

The board needs to be wired to the ESP32 as such:

JSN-SR04T VCC → ESP32 5V
JSN-SR04T GND → ESP32 GND
JSN-SR04T Trig → ESP32 GPIO5
JSN-SR04T Echo → ESP32 GPIO18

Any support to hold the sensor - note the board + ESP32 should not be put inside the tanks otherwise they will get damaged with the salt.
In my case, I've used an insert in the plastic of my tank in order to screw a 3d printed holder for the sensor, in a way which set it in the middle. A piece of wood with a hole, secured on the tank would also work fine.

Software

Quick Start

Rename secrets_template.h into secrets.h and enter your credentials : Wifi + MQTT settings + Bark settings.

MQTT is used if you want to integrate with Home Assistant and display the salt level in a lovelace card.

If you don't have Home Assistant and prefer to keep things simple but still want to receive a notification when the salt level is low, simply install Bark on your mobile and get the API key from there. Define your minimum level in centimeters from the top of the sensor (45cm by default). Bark will send the notification only once and will only reset once the tank is 3cm above the threshold again.

You can change the frequency of the measurement: by default it is set in constant.h at 1hr.

We're using PlatformIO as the IDE and you will find here the instructions to install it together with VSCode in order to compile it and flash the esp32: https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/

Compile the code and upload it to the esp32:

pio run -t clean
pio run -e esp32
pio run -t upload -e esp32
pio device monitor -b 115200

Home Assistant Setup (Optional, requires MQTT)

Use the Yaml files in docs folder for the Home Assistant setup: salt_level.yaml needs to be in a folder loaded by the configuration The yaml in configuration.yaml needs to be copied in the section template of your existing setup. You will need to adjust the max depth to your tanks dimensions.

The lovelace card can be setup using this:

type: gaugeentity: sensor.salt_levelname: Salt Levelmin: 0max: 100unit: "%"severity:
green: 60yellow: 35red: 0

Settings in the WebUI

Browsing to the IP address of the ESP32 or to http://saltlevel-esp32.local/ you will find a webpage to display the status of the salt level, as well as adjust the settings (retained at reboot). The language of the webpage can be switched to french.

The intent behind this was to make it accessible for people without a Home Assistant setup and needed some autonomy in adjustment of the settings without having to recompile the firmware.


About

Tired of forgetting to check your salt level of your water softener ? This is a simple device and code to measure how much salt is in the tank, with an alert system.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Introduction

ko-fi
The purpose of this project is to measure the height level of a salt tank for a water softener. It publishes the distance measured to Home Assistant where it can be converted in percentage and displayed as a lovelace card.

For people not interested in using Home Assistant but want a standalone setup, one can setup a Bark key to receive a notification when the salt level goes below a threshold. Bark is a free iOS app which can be installed on any Apple mobile device and is meant to receive notifications.

For Android users, a topic for the app NTFY is generated by the esp32 and one can subscribe to it from a mobile device to receive the notifications.

A WebUI also displays the level directly.

Screenshot 2025-11-17 at 13 44 14

Hardware requirements

Any ESP32 - the platformio file is meant for a nodemcu version but it can be adjusted for any board.

A waterproof ultrasonic sensor with its board: JSN-SR04T

image

Some people have tried with other ultrasonic sensor which ended up being corroded quickly due to the salty environment.

The board needs to be wired to the ESP32 as such:

JSN-SR04T VCC → ESP32 5V
JSN-SR04T GND → ESP32 GND
JSN-SR04T Trig → ESP32 GPIO5
JSN-SR04T Echo → ESP32 GPIO18

Any support to hold the sensor - note the board + ESP32 should not be put inside the tanks otherwise they will get damaged with the salt.
In my case, I've used an insert in the plastic of my tank in order to screw a 3d printed holder for the sensor, in a way which set it in the middle. A piece of wood with a hole, secured on the tank would also work fine.

Software

Quick Start

Rename secrets_template.h into secrets.h and enter your credentials : Wifi + MQTT settings + Bark settings.

MQTT is used if you want to integrate with Home Assistant and display the salt level in a lovelace card.

If you don't have Home Assistant and prefer to keep things simple but still want to receive a notification when the salt level is low, simply install Bark on your mobile and get the API key from there. Define your minimum level in centimeters from the top of the sensor (45cm by default). Bark will send the notification only once and will only reset once the tank is 3cm above the threshold again.

You can change the frequency of the measurement: by default it is set in constant.h at 1hr.

We're using PlatformIO as the IDE and you will find here the instructions to install it together with VSCode in order to compile it and flash the esp32: https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/

Compile the code and upload it to the esp32:

pio run -t clean
pio run -e esp32
pio run -t upload -e esp32
pio device monitor -b 115200

Home Assistant Setup (Optional, requires MQTT)

Use the Yaml files in docs folder for the Home Assistant setup: salt_level.yaml needs to be in a folder loaded by the configuration The yaml in configuration.yaml needs to be copied in the section template of your existing setup. You will need to adjust the max depth to your tanks dimensions.

The lovelace card can be setup using this:

type: gaugeentity: sensor.salt_levelname: Salt Levelmin: 0max: 100unit: "%"severity:
green: 60yellow: 35red: 0

Settings in the WebUI

Browsing to the IP address of the ESP32 or to http://saltlevel-esp32.local/ you will find a webpage to display the status of the salt level, as well as adjust the settings (retained at reboot). The language of the webpage can be switched to french.

The intent behind this was to make it accessible for people without a Home Assistant setup and needed some autonomy in adjustment of the settings without having to recompile the firmware.


About

Tired of forgetting to check your salt level of your water softener ? This is a simple device and code to measure how much salt is in the tank, with an alert system.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

31 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Introduction

ko-fi
The purpose of this project is to measure the height level of a salt tank for a water softener. It publishes the distance measured to Home Assistant where it can be converted in percentage and displayed as a lovelace card.

For people not interested in using Home Assistant but want a standalone setup, one can setup a Bark key to receive a notification when the salt level goes below a threshold. Bark is a free iOS app which can be installed on any Apple mobile device and is meant to receive notifications.

For Android users, a topic for the app NTFY is generated by the esp32 and one can subscribe to it from a mobile device to receive the notifications.

A WebUI also displays the level directly.

Screenshot 2025-11-17 at 13 44 14

Hardware requirements

Any ESP32 - the platformio file is meant for a nodemcu version but it can be adjusted for any board.

A waterproof ultrasonic sensor with its board: JSN-SR04T

image

Some people have tried with other ultrasonic sensor which ended up being corroded quickly due to the salty environment.

The board needs to be wired to the ESP32 as such:

JSN-SR04T VCC → ESP32 5V
JSN-SR04T GND → ESP32 GND
JSN-SR04T Trig → ESP32 GPIO5
JSN-SR04T Echo → ESP32 GPIO18

Any support to hold the sensor - note the board + ESP32 should not be put inside the tanks otherwise they will get damaged with the salt.
In my case, I've used an insert in the plastic of my tank in order to screw a 3d printed holder for the sensor, in a way which set it in the middle. A piece of wood with a hole, secured on the tank would also work fine.

Software

Quick Start

Rename secrets_template.h into secrets.h and enter your credentials : Wifi + MQTT settings + Bark settings.

MQTT is used if you want to integrate with Home Assistant and display the salt level in a lovelace card.

If you don't have Home Assistant and prefer to keep things simple but still want to receive a notification when the salt level is low, simply install Bark on your mobile and get the API key from there. Define your minimum level in centimeters from the top of the sensor (45cm by default). Bark will send the notification only once and will only reset once the tank is 3cm above the threshold again.

You can change the frequency of the measurement: by default it is set in constant.h at 1hr.

We're using PlatformIO as the IDE and you will find here the instructions to install it together with VSCode in order to compile it and flash the esp32: https://randomnerdtutorials.com/vs-code-platformio-ide-esp32-esp8266-arduino/

Compile the code and upload it to the esp32:

pio run -t clean
pio run -e esp32
pio run -t upload -e esp32
pio device monitor -b 115200

Home Assistant Setup (Optional, requires MQTT)

Use the Yaml files in docs folder for the Home Assistant setup: salt_level.yaml needs to be in a folder loaded by the configuration The yaml in configuration.yaml needs to be copied in the section template of your existing setup. You will need to adjust the max depth to your tanks dimensions.

The lovelace card can be setup using this:

type: gaugeentity: sensor.salt_levelname: Salt Levelmin: 0max: 100unit: "%"severity:
green: 60yellow: 35red: 0

Settings in the WebUI

Browsing to the IP address of the ESP32 or to http://saltlevel-esp32.local/ you will find a webpage to display the status of the salt level, as well as adjust the settings (retained at reboot). The language of the webpage can be switched to french.

The intent behind this was to make it accessible for people without a Home Assistant setup and needed some autonomy in adjustment of the settings without having to recompile the firmware.


About

Tired of forgetting to check your salt level of your water softener ? This is a simple device and code to measure how much salt is in the tank, with an alert system.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages