Этот девайс больше всего актуален для тех, кто живёт в загородном доме и уже знаком с особыми «сюрпризами» в унитазе, когда дренажный колодец переполняется.

Вы бежите к колодцу, поднимаете тяжеленную крышку, а там... уже всё плавает. А через пару минут доходит осознание: насос благополучно проспал момент включения. Привет, внеплановые 20 минут откачки и «удобрение» участка самым неожиданным способом.

Мой путь борьбы с колодцем: от сложного к простому

Сначала был дренажный насос с герконом. Идея простая: поплавок с герконом плавает, замыкает контакты при достижении уровня воды — насос включается. На деле оказалось, что при вибрации насос болтается, геркон залипает, а иногда просто «молчит как партизан». Фиксировать его — отдельная головная боль.

Потом я поставил надёжного «Малыша» и умную розетку. Включение насоса прямо с телефона, о круто! Но как узнать, что он наполнился? Каждый раз таскать тяжеленную крышку, чтобы заглянуть в колодец, — то ещё удовольствие, включать «наугад»?

Я посмотрел в сторону готовых решений за 3000+ рублей (используют емкостной метод (измеряют точный уровень 0-100%), имеют качественный корпус, готовое приложение и гарантию), но обнаружил, на мой взгляд, подводные камни: мало отзывов — устройства довольно новые на рынке, закрытая система — нельзя ничего доработать под свои нужды.

 А мне было нужно простое, как лопата, решение. Чтобы устройство оповестило меня: «Колодец полный, не желаешь ли включить насос? ПОЖАЛУЙСТА ?» — и желательно в Telegram, где я точно замечу это сообщение.

Так родилась идея: сердито, эффективно и не дороже 1500 рублей собрать свою систему мониторинга на основе ESP32 и геркона.

Во сколько обойдётся самостоятельная сборка?

Вот приблизительный расчёт от Озон.

Если поискать на антресолях или в сарае, можно сильно сократить расходы.

Что часто уже есть в хозяйстве:

Кабель (сечение до 0.5 мм) → старый от электропроводки (экономия 160 ₽)

Труба → обрезки после ремонта (экономия 100 ₽)

Корпус → пищевой контейнер + герметик (экономия 185 ₽)

Блок питания → зарядка от старого телефона

Что нужно от системы:

Полный контроль — система делает только то, что вы ей сказали.

Гибкость — легко доработать или подключить к другой smart-системе.

Надёжность геркона — механическая простота, минимум ложных срабатываний.

Независимость — ваш ESP32 перестанет работать только «из-за банкротства вашего счета за интернет».

От идеи к работающей системе: собираем и улучшаем

В своих предыдущих статьях я рассказал: как прошить MicroPython, настроить отправку оповещений и загружать файлы на микроконтроллер. Если вы их пропустили — рекомендую ознакомиться, там весь базис. В этой статье я не буду останавливаться на азах, а покажу, что получилось.

Оживляем ESP8266 и ESP32 за 15 минут без программистских заморочек с помощью MicroPython

WebREPL и uPyLoader: Выбираем способ беспроводного управления ESP

Даем голос ESP: Уведомления в Telegram и ntfy

Сначала логика, потом код: как писать программы для ESP на MicroPython

Вот как это выглядит у меня (возможно немного «неказисто»)

Сборка датчика
Сборка датчика
Установка датчика
Установка датчика
Фото датчика
Фото датчика

Вот код, который установлен у меня, в предыдущей статье я его подробно разбирал:

Скрытый текст

main.py

from machine import Pin, WDT, reset
from time import sleep
from gc import collect
from urequests import get
from config import TELEGRAM_TOKEN, TELEGRAM_CHAT_ID

# НАСТРОЙКИ
SENSOR_PIN = 4
CHECK_INTERVAL = 20
WD_TIME = 35000
REBOOT_INTERVAL = 604800

# ТЕКСТЫ СООБЩЕНИЙ
MSG_WATER_ALARM = "? ВНИМАНИЕ: Вода в колодце! Включите насос!"
MSG_WATER_OK = "? Воды нет. Система мониторинга работает"

# ИНИЦИАЛИЗАЦИЯ ДАТЧИКА
water_sensor = Pin(SENSOR_PIN, Pin.IN, Pin.PULL_UP)
print("water_sensor", water_sensor)
def read_water_sensor():
    """
    Оптимизированное чтение датчика воды
    """
    count = 0
    
    for _ in range(3):
        if water_sensor.value() == 0:
            count += 1
        sleep(0.01)
    
    return count >= 2

def send_telegram_message(message):
    """
    Отправка сообщения в Telegram
    """
    collect()
    
    try:
        url = f"https://api.telegram.org/bot{TELEGRAM_TOKEN}/sendMessage"
        url += f"?chat_id={TELEGRAM_CHAT_ID}&text={message}"
        
        response = get(url)
        success = response.status_code == 200
        response.close()
        
        collect()
        if success:
            sleep(2) 
        return success
        
    except Exception as e:
        collect()
        return False

def main():
    """
    Главный цикл мониторинга системы
    """
    # Инициализация сторожевого пса
    wdt = WDT(timeout=WD_TIME)
    send_telegram_message("Система мониторинга воды запущена!")
    sleep(3)
    # Переменная для хранения предыдущего состояния
    previous_water_state = None
    # Счётчик времени работы системы
    system_uptime = 0
    
    # Бесконечный цикл мониторинга
    while True:
        # Сбрасываем сторожевого пса
        wdt.feed()
        
        # Читаем текущее состояние датчика
        current_water_state = read_water_sensor()
        
        # Логика отправки сообщений
        if previous_water_state is None or current_water_state != previous_water_state:
            if current_water_state:
                send_telegram_message(MSG_WATER_ALARM)
            else:
                send_telegram_message(MSG_WATER_OK)
        
        # Сохраняем текущее состояние для следующего цикла
        previous_water_state = current_water_state
        
        # Учет времени для плановой перезагрузки
        system_uptime += CHECK_INTERVAL
        if system_uptime >= REBOOT_INTERVAL:
            send_telegram_message("Плановая перезагрузка системы для профилактики")
            sleep(2)
            reset()
        
        # Пауза перед следующей проверкой
        sleep(CHECK_INTERVAL)
        collect()

# ЗАПУСК СИСТЕМЫ
main()

boot.py

from network import WLAN, STA_IF #  Wi-Fi модуль +  режим клиента (подключение к роутеру) 
from time import sleep # Отслеживаем время 
from gc import collect # Уборка памяти 
from config import WIFI_SSID, WIFI_PASSWORD, WEBREPL_PASSWORD, WEBREPL_SSID, WEBREPL_WIFI_PASSWORD # Необходимые настройки 
  
def connect_wifi(): 
    """WiFi-инженер - подключает к интернету""" 
    collect()# Уборка памяти 
    wlan = WLAN(STA_IF) # Создаем соединение в режиме клиента 
    wlan.active(True) # Активируем/включаем соединение 
    
    # Если не подключено, то передаем пароль и пробуем законектиться (даем 15 попыток), при каждой попытке – чистим память, если в одной из попыток – сработало, сохраняем результат True, если неудачно, то фиксируем результат  False 
    if not wlan.isconnected(): 
        wlan.connect(WIFI_SSID, WIFI_PASSWORD) 
        for i in range(15): 
            if wlan.isconnected(): 
                collect()  # Финальная очистка перед возвратом    
                return True 
            sleep(1) 
            collect()     
    return wlan.isconnected()
def start_webrepl(): 
    """WebREPL-администратор - настраивает точку доступа и запускает сервер""" 
    if WEBREPL_PASSWORD: 
        collect()# Уборка памяти 
  
       #  Создаем и настраиваем точку доступа 
        from network import WLAN, AP_IF 
        ap = WLAN(AP_IF) 
        ap.active(True) 
        
        #  Создаем настройки 
        ap.config( 
            essid=WEBREPL_SSID, 
            password=WEBREPL_WIFI_PASSWORD, 
            security=3, # WPA2-PSK (рекомендуется), если без пароля, то значение 0 
            channel=6, # Wi-Fi канал, более стабильный 
            hidden=False       # Видимая сеть 
        ) 
        collect()# Уборка памяти 
        # Запускаем WebREPL 
        import webrepl 
        webrepl.start(password=WEBREPL_PASSWORD) 
        collect() 
        return True  #  Успешный запуск 
        
    else: 
        return False  #  WebREPL отключен 
connect_wifi()
start_webrepl()
print("Boot.py: WiFi и WebREPL запущены")

config.py

WIFI_SSID = "Ваша сеть"
WIFI_PASSWORD = b"Ваш пароль"
TELEGRAM_TOKEN = "Ваш токен"
TELEGRAM_CHAT_ID = 5308543785 # Ваш чат ID
WEBREPL_PASSWORD = "1234"        # ← пароль WebREPL тут
WEBREPL_SSID = "ESP32-WebREPL-Water"    # Имя точки доступа (можно изменить) 
WEBREPL_WIFI_PASSWORD = "12345678" # Пароль Wi-Fi сети (можно изменить)

Что я поменял «в бою»:

Самая неприятная проблема, с которой я столкнулся — модуль «подзавис» после кратковременного отключения электроэнергии. ESP32 подавалось питание, но в цикл мониторинга он не входил. Решается это двумя простыми, но очень эффективными мерами:

  1. Сторожевой пёс (Watchdog Timer). Это система антизависания. Теперь при любом сбое система не висит мёртвым грузом — она перезагружается и снова выходит на связь.

  2. Плановая еженедельная перезагрузка. Даже самая стабильная программа в MicroPython может со временем начать подъедать память или в ней могут накапливаться ошибки. Раз в неделю система сама себя перезагружает, чтобы начать с чистого листа. Это профилактика для долгосрочной стабильности.

 WEBREPL: инструмент на любителя

Честно говоря, за всё время я использовал WebREPL лишь однажды — для первоначальной отладки. Если вы не планируете активно удалённо менять код прямо на устройстве, смело можете его отключить. Это сэкономит немного оперативной памяти и упростит конфигурацию. Ставьте, только если вам реально нужен удалённый доступ к консоли.

Итоги: что получилось

Независимо: Работает автономно, лишь изредка требуя вашего внимания через уведомления.

Надёжно: Само восстанавливается после сбоев питания и чистит свою память.

Доступно: Его стоимость в разы ниже рыночных аналогов, а ремонтопригодность — на порядок выше.

Гибко: Вы можете легко адаптировать его под свои нужды — добавить второй датчик, сменить текст оповещений или интегрировать в другую систему умного дома.

Этот проект — отличный пример того, как понимание основ и несколько простых компонентов позволяют решить бытовую проблему, сэкономив при этом значительную сумму.

 Творите, экспериментируйте и пусть ваш унитаз больше не оповещает вас о проблемах!

P.S. Возможно, найдутся те, кто скажет, что на C++ с библиотеками вроде Arduino можно сделать лучше и проще, но акцентирую ваше внимание, я ни в коем случае не агитирую против C++ и не утверждаю, что MicroPython — это «лучше», просто делюсь своим опытом. Так как я погружен в Python, то для решения бытовых задач (считать датчик, отправить данные)  мне ближе MicroPython, так как оказался удобным способом погрузиться в мир МК, и мне не надо переключаться на совершенно новую парадигму, а использовать уже знакомые модели и через REPL в реальном времени «пощупать» железо для начальных стадий прототипирования.

Комментарии (16)


  1. Hackfaq
    11.11.2025 12:20

    Непонятно какую проблему решали, ккк по мне тут нужен мониторинг насоса который сам должен включаться, насос должен работать автономно


  1. aamonster
    11.11.2025 12:20

    Увидел надпись "провода-перемычки DuPont", маленько испугался: дома-то они есть, но в систему, контролирующую залитие дома понятно чем, я бы их ставить не стал, как и беспаечную макетку. Только в прототип.


  1. JBFW
    11.11.2025 12:20

    В подобных колодцах лучше всего использовать самый обычный дренажный насос с датчиком-"лягушкой" (внутри - тот же геркон, а "закреплена" она на насосе и всплывает сама).
    И лежит это всё на дне годами, и работает так же годами, пока не помрет наконец.

    Ротационный насос, не обязательно фирма-фирма, таких дешевых полно.
    И не "Малыша" ("Ручеек" и т.п.), с их дикой вибрацией, они вам ил уплотнят в монолит.

    А вот для контроля и самоуспокоения - да, поставить внешний контроллер, и герконом к нему - ту же "лягушку" на длинном проводе, можно просто привязать её к рукоятке насоса.
    Потому что лягушки эти иногда помирают, редко. Чтобы обе померли - это повезти должно.

    Ну и конечно "зачем там Python?!" )
    Простейший контроль пина, и сообщение бросать в MQTT, а не сразу в телеграм.
    Из MQTT его потом куда хош развести можно, хоть в телеграм, хоть на HomeAssistant, хоть в интеллектуальную систему подсчета количества сливов за период, чтобы оценивала, не слишком ли часто приходится это делать и не надо ли обратить внимание, вдруг что не так?


    1. shornikov
      11.11.2025 12:20

      На Вихре в лягухе микропереключатель с большим плечом и железный шар.


      1. JBFW
        11.11.2025 12:20

        Хм, кстати возможно. Наверняка так и есть.

        Но в любом случае - работают они неплохо. Один только раз попалась глючная лягушка: старую выкинули, новую подключили, и всё.


    1. ptr128
      11.11.2025 12:20

      сообщение бросать в MQTT

      Если уже есть брокер. А если его нет, то установка одноплатника с брокером в разы увеличит стоимость решения. Так что не стоит размахивать "золотым молотком", а исходим из задачи.


  1. shornikov
    11.11.2025 12:20

    Все прекрасно работает на макетке, но в бою - увы.
    Фабричные решения обычно лишены этих непонятных начинающим проблем.


  1. nikolz
    11.11.2025 12:20

    До кучи...

    Если взять вот этот модуль

    Вместо взятого в статье, то цена модуля составит не 300-600руб, а 140 руб

    Кроме того, этот модуль примерно 3 раза меньше по длине.

    Блок питания можно взять , например, такой:

    и спрятать его в коробку вместе модулем ESP32, что по размерам как модуль в статье, но без блока питания.

    Геркон можно взять такой же, но дешевле:


    1. LAutour
      11.11.2025 12:20

      По мини-модулю ESP32-C3 на картинке - это версия платы с неудачно разведенной антенной. Сам сталкивался: все было плохо уже при расстоянии передачи в пару метров.


      1. ptr128
        11.11.2025 12:20

        Подтверждаю. Такие намного лучше за те же деньги.

        Зарядник на улице с совсем не герметичным USB разъемом я бы точно не оставлял, а разместил бы 220AC/5DC в том же корпусе.

        Геркон - это хорошо, но явно надежней готовую лягушку (поплавковый выключатель) поставить, которая тоже с герконом.


        1. Heggi
          11.11.2025 12:20

          Я для автополива использовал емкостной датчик. Типа такого https://aliexpress.ru/item/1005006157573420.html
          В целом ничего плохого сказать про него не могу


          1. ptr128
            11.11.2025 12:20

            Ну поливаете же Вы не плавающим дерьмом, которое может на датчик налипнуть.


  1. BlueBeard
    11.11.2025 12:20

    Умный септик версия 2 esp8266, первая успешно пахала года с 17

    контроль уровней в двух емкостях погружными датчиками, авто слив дренажной воды в за 70 метров лес, подогрев этой трассы в зимний период итд итп https://dobego.ru/foxhole/sensors/?textContains=septic-tank::


    1. Servifed
      11.11.2025 12:20

      Код открытый?


  1. CitizenOfDreams
    11.11.2025 12:20

    Сначала был дренажный насос с герконом. Идея простая: поплавок с герконом плавает, замыкает контакты при достижении уровня воды — насос включается. На деле оказалось, что при вибрации насос болтается, геркон залипает, а иногда просто «молчит как партизан».

    Надежно работающий датчик с одной парой контактов у меня сделать не получилось, поэтому возьму Ардуину, напишу программу на Питоне и буду получать уведомления через Интернет, периодически перегружаясь по сторожевому таймеру. Звучит разумно...


  1. Alex-ZiX
    11.11.2025 12:20

    Я не понял из статьи две вещи:

    1. Что за сюрпризы могут быть в унитазе? Для этого унитаз должен стоять ниже верхнего уровня нечистот в колодце. Вы же не хотите сказать, что колодец герметичный, а унитаз в подвале дома.

    2. В статье колодец называется дренажным, хотя дренажный колодец предназначен для осадков и грунтовых вод. Тут же канализационный септик из бетонных колец. Зачем там насос и куда он откачивает то, что там накопилось? У меня такие же два колодца, связанные трубой - первый для более плотных масс, второй для более жидких. Когда они наполняются это время вызывать ассенизатор, а не качать то, что там накопилось, себе под ноги. Логично, что тогда эта автоматика должна заказывать откачку септика, а не включать насос.