Мониторинг удалённых объектов без интернета: ESP, MacroDroid и старый Android

от автора

«SIM800/900 против старого телефона: битва за дачу»

В системах удалённого мониторинга часто требуется передача данных из точек без покрытия интернета. Классическое решение — GSM-модули семейства SIM800/SIM900, управляемые через AT-команды, но у этого подхода, на мой личный взгляд и опыт, есть недостаток — написать кучу AT-команд.

 Одна из альтернатив — использование старого Android-смартфона как GSM-шлюза. У него уже есть: сотовая связь (для SMS), Wi-Fi (для локальной сети без интернета с ESP), установленное приложение MacroDroid и аккумулятор, зарядкой которого тоже можно управлять через MacroDroid

Осталось только «подружить» его с микроконтроллером.

В этой статье я предлагаю архитектуру двусторонней связи между ESP и телефоном через SMS с использованием HTTP-протокола в локальной сети. Рассмотрены сценарии:

Запрос статуса от пользователя (SMS от пользователя  → Телефон с MacroDroid →  ESP → Телефон с MacroDroid → SMS пользователю)

 Экстренные уведомления от ESP (ESP → Телефон с MacroDroid → SMS пользователю)

 Всё работает без интернета, без облачных сервисов, без SIM800/900. Только ESP c MicroPython и  старый сотовый телефон с MacroDroid, в который мы вдохнем жизнь и пусть он проведет остаток своей жизни с пользой.

 Прежде чем приступить к описанию сценариев, необходимо уточнить несколько технических моментов.

 1. Схема сети

Телефон работает в режиме точки доступа (AP) название в телефоне примерно «Мобильная точка доступа и модем», WiFi должен быть отключен (желательно в настройках убрать галочку с Автоматическое включение WiFi). В созданной телефоном локальной сети телефон (он же роутер) обычно имеет IP-адрес 192.168.43.1. В настройках «Мобильная точка доступа и модем» есть название сети и пароль (или вы сами их можете задать), которые необходимы для подключения к сети и нужен для написания кода на микроконтроллере.

 ESP подключается к телефону как клиент (STA_IF) и получает IP-адрес вида 192.168.43.x. Адрес выдаётся по DHCP, и при каждом переподключении он может меняться. Чтобы ESP всегда был доступен по одному адресу, необходимо закрепить за ним статический IP:

 sta.ifconfig(("192.168.43.99", "255.255.255.0", "192.168.43.1", "8.8.8.8"))

 Это гарантирует, что ESP всегда будет доступен по адресу, который вы укажете в настройках MacroDroid.

Вот мы их и «подружили» и они находятся в одной сети.

 Устройства общаются по протоколу HTTP:

ESP слушает порт 80 (стандартный для HTTP) или любой другой (например, 8080). Если используете порт 80, имейте в виду: на некоторых сборках MicroPython для ESP32-S3 порт 80 может быть занят системой, тогда используйте порт 8080.

 MacroDroid на телефоне слушает порт 8080 (настраивается в триггере «HTTP-запрос (сервер)»).

 Расстояние: стабильная работа гарантирована на расстоянии 8–10 метров в помещении, до 20 метров на открытом пространстве. Сигнал можно проверить в настройках телефона: «Подключённые устройства» → найти свой ESP по имени.

Детальную настройку сети и сервера я описал в статье «Клиент-сервер на ESP (MicroPython): чистый socket и прикладной HTTP — конспект-справочник»

 2. Роль MacroDroid

 MacroDroid выполняет две функции:

Сервер — принимает HTTP-запросы от ESP (например, /alert_temp) и отправляет SMS

Клиент — отправляет HTTP-запросы на ESP (например, /status) при получении SMS или событии.

 3. Формат данных

 Все ответы от ESP — короткие текстовые строки: on, off, 24.5. Это сделано для экономии SMS-символов и упрощения обработки в MacroDroid.

 4. Ограничения MacroDroid

 В бесплатной версии доступно только 5 макросов. Поэтому мы используем один макрос на каждый сценарий.

 5. Управление зарядкой

 Телефон должен работать 24/7. Чтобы аккумулятор не деградировал от постоянной зарядки (литиевые аккумуляторы «не любят» находиться на зарядке при 100%), необходимо предусмотреть автоматизацию:

 Вариант 1: Умная розетка

Готовая умная розетка (желательно механическая из-за отсутствия интернета) с таймером. Настраивается по времени: заряжать, например, с 02:00 до 04:00.

 Вариант 2: Самодельная умная розетка на ESP

Собрать розетку на основе ESP и реле, которая будет управляться через MacroDroid. В этом случае MacroDroid отслеживает уровень заряда:

 Триггер: Уровень батареи < 20% → отправляет HTTP-запрос на ESP → ESP включает реле зарядки.

 Триггер: Уровень батареи > 95% → отправляет HTTP-запрос на ESP → ESP выключает реле зарядки.

 Этот вариант полностью автономен, не требует интернета и использует ту же локальную сеть, что и основная система.

 6. Сим карта для телефона.

 Для работы шлюза необходима SIM-карта с активным сотовым подключением. Важно, чтобы телефон находился в зоне покрытия сети (можно уточнить у оператора или посмотреть зону покрытия оператора).

 Я использовал SIM-карту для умных устройств от МТС 2G: стоимость: 150 руб/месяц, включено: 50 SMS в месяц.

Этого объёма достаточно для ежедневной проверки статуса (2-3 SMS), аварийных уведомлений (температура, свет), управления системой (включение/выключение).

 Если ваш оператор предоставляет пакет SMS, убедитесь, что их количества достаточно для ваших сценариев.

Запрос статуса от пользователя (SMS от пользователя  → Телефон с MacroDroid →  ESP → Телефон с MacroDroid → SMS пользователю)

Шаг 1: Открываем MacroDroid и создаём макрос

 Откройте приложение MacroDroid на телефоне.

В нижней части экрана нажмите на вкладку «Макросы» (иконка списка).

Нажмите на «+» (Добавить макрос) в правом нижнем углу.

В появившемся окне введите название макроса: например «Запрос».

Нажмите «ОК» или галочку, чтобы сохранить название или можно после создания макроса «Сохранить изменения»

 Шаг 2: Настраиваем триггер «Получение SMS»

 Нажмите «+» рядом с полем «Триггер».

В списке категорий выберите «Вызовы и смс».

В открывшемся списке выберите «Получение SMS».

Появится окно настройки триггера:

 «Получатель»: Оставьте «Любой» (если хотите, чтобы макрос срабатывал на SMS с любого номера) или выберите конкретный контакт (если вы хотите, чтобы команды принимались только от вас).

 «Тип»: Оставьте «Любой тип» (это позволяет макросу срабатывать на любые SMS, даже если они не являются стандартными текстовыми).

 «Содержит текст»: В этом поле можно оставить пустым, потому что мы будем фильтровать SMS внутри макроса. Это нужно для нашего сценария. Если вы укажете текст status в триггере, макрос будет срабатывать только когда в SMS есть это слово.

Нажмите «ОК», чтобы сохранить триггер.

 Шаг 3: Настраиваем действие «HTTP-запрос»

 Нажмите «+» рядом с полем «Действия».

В списке категорий выберите «Взаимодействие с сетью».

 Выберите «HTTP-запрос».

 В настройках HTTP-запроса заполните:

 Метод запроса: GET

Введите URL-адрес: http://192.168.43.96:80/ !!!ЗДЕСЬ НАЖИМАЕМ СИНИЙ КВАДРАТИК СПРАВА И ВЫБИРАЕМ «Текст входящего сообщения» нажимаем ОК и у вас должно получиться

http://192.168.43.96:80/{sms_message}

где 192.168.43.96 — IP-адрес вашего ESP в сети телефона,

:80 – порт который вы укажите на ESP при настройке сервера,

{sms_message} – это текст входящего сообщения. Например вы отправляете смс с текстом status, MacroDroid автоматически добавит его в URL и полный вариант для запроса будет http://192.168.43.96:80/ status.

 ВАЖНО!!! Поставьте галочку(выберете пункт) «Блокировать следующие действия» — блокирующий режим запроса «пока не выполню никаких действий». Без неё — макрос не дожидается сервера и работает дальше, что приведет к отправке старых команд и адресат получает либо пустое сообщение, либо старое значение из переменной от предыдущего запроса.

 Тайм-аут (сек): 5-10 (если ESP не ответит за 5 секунд, запрос прервётся)

Опускаемся вниз и включаете опцию «Сохранить ответ в строковую переменную»:

Выбираете «Локальная переменная» Имя переменной, например, response

В этой переменной будет храниться ответ от сервера, который потом уйдет по смс обратно

Нажмите «ОК», чтобы сохранить переменную.

В правом верхнем углу нажимаете «галочку», чтобы сохранить действие.

 Шаг 4: Настраиваем действие «Отправить SMS»

 Нажмите «+» рядом с полем «Действия» (добавляем второе действие).

 В списке категорий выберите «Сообщения».

 Выберите «Отправить SMS».

 В настройках заполните:

 «Получатель»: Введите номер телефона, на который нужно отправить ответ.

Можно из выпадающего списка выбрать «Контакт входящего смс» (появиться {sms_name}) или «Номер входящего смс» (появиться {sms_number}) они автоматически подставит номер отправителя исходного SMS.

 «Сообщение»: Из выпадающего списка выберите «Локальная переменная» – ОК – выбираем переменную  response — это переменная, в которую мы сохранили HTTP-ответ от ESP. Или просто вбейте {lv= response}

 В правом верхнем углу нажимаете «галочку», чтобы сохранить действие.

 Тестовый код

"""Тестовый HTTP-сервер на ESP для проверки сценария №1Режим: блокирующий (ожидает запросы последовательно)Порт: 80"""import timeimport socketimport network# ===== НАСТРОЙКИ =====SSID = "ВАШЕ ИМЯ СЕТИ"        # Имя сети телефона (точки доступа)PASSWORD = "ВАШ ПАРОЛЬ"         # Пароль от сети# ===== ПОДКЛЮЧЕНИЕ К WI-FI =====print("📡 Подключение к Wi-Fi...")sta = network.WLAN(network.STA_IF)sta.active(True)sta.connect(SSID, PASSWORD)while not sta.isconnected():    time.sleep(0.5)    print(".", end="")print("\n✅ Подключено! IP:", sta.ifconfig()[0])# ===== СОЗДАНИЕ СЕРВЕРА =====print("🌐 Создание сервера...")addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]server = socket.socket()server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server.bind(addr)server.listen(5)print("🌐 Сервер запущен на порту 80")print("🔄 Ожидание запросов...")print("-" * 40)# ===== ОСНОВНОЙ ЦИКЛ (БЛОКИРУЮЩИЙ) =====while True:    # Ждём подключения клиента (БЛОКИРУЮЩИЙ ВЫЗОВ!)    print("⏳ Ожидание входящего соединения...")    conn, addr = server.accept()    print(f"📨 Получен запрос от {addr}")        # Читаем запрос    request = conn.recv(1024).decode()    print(f"   Запрос (первые 100 символов): {request[:100]}...")        # Извлекаем путь из запроса    if request:        first_line = request.split('\r\n')[0]        parts = first_line.split(' ')        if len(parts) >= 2:            path = parts[1]            print(f"   ➜ Путь: {path}")        else:            path = "/"            print("   ➜ Путь: / (не удалось распарсить)")    else:        path = "/"        print("   ➜ Путь: / (пустой запрос)")        # ===== ОБРАБОТЧИКИ =====    if path == '/status':        print("   📋 Обработчик: /status")        response = "All GOOD, BE Happy"            elif path == '/temp':        print("   📋 Обработчик: /temp")        response = "24.5 HOT"            else:        print(f"   ⚠️ Неизвестный путь: {path}")        response = "USE command status or temp"        print(f"   📤 Ответ: {response}")        # Формируем и отправляем HTTP-ответ    response_bytes = response.encode('utf-8')    conn.send("HTTP/1.1 200 OK\r\n")    conn.send("Content-Type: text/plain; charset=utf-8\r\n")    conn.send(f"Content-Length: {len(response_bytes)}\r\n")    conn.send("Connection: close\r\n")    conn.send("\r\n")    conn.send(response_bytes)    print("   ✅ Ответ отправлен")        # Закрываем соединение    conn.close()    print(f"   🔒 Соединение закрыто")    print("-" * 40)

Сценарий №2: Экстренные уведомления от ESP32 (ESP → MacroDroid → SMS)

В этом сценарии ESP сам отправляет HTTP-запрос на телефон, когда происходит критическое событие. Макрос в MacroDroid принимает запрос, извлекает текст из тела POST-запроса и отправляет SMS на указанный номер.

 Порядок действий по созданию нового макроса как и в предыдущей главе: Откройте MacroDroid → Макросы → «+» → Название: например «Alert»

Шаг 1: Настраиваем триггер «HTTP-запрос (сервер)»

Нажмите «+» рядом с полем «Триггер».

 В списке категорий выберите «Взаимодействие с сетью» (в некоторых версиях — «Связь» или «Подключение»).

 В открывшемся списке выберите «HTTP-запрос (сервер)».

 Появится окно настройки триггера.

 Основные настройки:

«Путь»: Введите /alert — это путь, по которому ESP будет отправлять POST-запросы.

 «Порт»: Оставьте 8080 (по умолчанию)  — главное, чтобы он совпадал с портом, на который ESP отправляет запросы. В нашем проекте мы используем порт 8081.

 Важно! В этом триггере мы используем POST-запросы, так как ESP передаёт текст сообщения в теле запроса, а не в URL.

 Сохраняем тело запроса в переменную

Опуститесь вниз настроек триггера и включите опцию «Сохранить тело запроса в строковую переменную»:

 Выберите «Локальная переменная».

 Введите имя переменной: alert.

 Нажмите «ОК».

 Что это даёт: Тело POST-запроса (текст сообщения) будет сохранено в переменную alert. Именно её мы будем использовать при отправке SMS.

 Настройка HTTP-ответа

В том же разделе настроек триггера найдите опцию «Отправить ответ»:

 Включите её.

 В поле «Текст ответа» введите OK.

 Код ответа оставьте 200.

 Зачем это нужно: ESP ожидает получить HTTP-ответ после отправки запроса. Если ответа не будет, ESP32 может считать, что запрос «завис», и повторить его, что приведёт к дублированию SMS.

 Настройка HTTP-сервера

Опуститесь вниз настроек триггера и нажмите «Настройки HTTP-сервера».

 В открывшемся окне необходимо:

 Отключить показ веб-страницы — снимите галочку с опции «Показывать веб-страницу».

 Установить «Тайм-аут запроса HTTP сервера (сек)» = 30.

 Почему мы увеличили таймаут до 30 секунд?

 По умолчанию в MacroDroid параметр «Тайм-аут запроса HTTP сервера» установлен в 10 секунд. В процессе отладки мы обнаружили, что при таком значении SMS-уведомления от ESP32 дублировались и приходили дважды, хотя макрос был только один.

 Причина: Если макрос выполняется дольше 10 секунд, MacroDroid считает запрос «зависшим» и повторно обрабатывает его. Это приводит к двойной отправке SMS.

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

 Сохраняем триггер

Нажмите «ОК», чтобы сохранить настройки триггера.

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

Шаг 2: Настраиваем действие «Отправить SMS»

 Нажмите «+» рядом с полем «Действия».

В списке категорий выберите «Сообщения».

Выберите «Отправить SMS».

В настройках действия заполните:

 «Получатель»: Введите номер телефона, на который нужно отправить уведомление.

 «Сообщение»: Нажмите на поле, затем в выпадающем списке выберите «Локальная переменная» → выберите alert. Либо введите вручную {lv=alert}.

 Нажмите «ОК», чтобы сохранить действие.

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

 Тестовый код для проверки

"""Сценарий №2: Экстренные уведомления от ESPESP32 → MacroDroid → SMS"""import timeimport networkimport urequests# ===== НАСТРОЙКИ =====SSID = "Android000000"  # Ваша сеть точки доступа телефонаPASSWORD = "000000000" # Пароль указатьPHONE_IP = "192.168.43.1"      # IP телефона (точка доступа)MACRODROID_PORT = 8080         # Порт, который слушает MacroDroid# ===== ПОДКЛЮЧЕНИЕ К WI-FI =====def connect_wifi():    sta = network.WLAN(network.STA_IF)    sta.active(True)    sta.connect(SSID, PASSWORD)    print(" Подключение к Wi-Fi...")    while not sta.isconnected():        time.sleep(0.5)        print(".", end="")    print("\nПодключено! IP:", sta.ifconfig()[0])    return True# ===== ОТПРАВКА УВЕДОМЛЕНИЯ =====def send_alert(message):    url = f"http://{PHONE_IP}:{MACRODROID_PORT}/alert"    try:        print(f"Отправка уведомления: {message}")        r = urequests.post(            url,            data=message.encode('utf-8'),            headers={'Content-Type': 'text/plain; charset=utf-8'},            timeout=10        )        print(f"Код: {r.status_code}")        r.close()        return True    except Exception as e:        print(f"Ошибка: {e}")        return False# ===== ТЕСТ =====def test_alerts():    if not connect_wifi():        print("Нет подключения к Wi-Fi")        return    # Отправка тестовых уведомлений    send_alert("⚠️ ВНИМАНИЕ! Температура в помещении упала ниже 10°C!")    time.sleep(3)    send_alert("🔌 Пропало электричество! Работаю от ИБП!")# ===== ЗАПУСК =====test_alerts()

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

ESP — работает как HTTP-сервер (порт 80) и клиент. Отвечает на команды, собирает данные с датчиков, управляет реле.

Телефон — выступает точкой доступа Wi-Fi (AP) и HTTP-сервером (порт 8080). Обеспечивает связь и работает как SMS-шлюз.

MacroDroid — выполняет роль автоматизатора: принимает запросы от ESP, отправляет их по SMS и наоборот.

HTTP-протокол — используется для локальной связи: GET для команд, POST для текстовых уведомлений.

Ключевое преимущество: всё работает без интернета, без облачных сервисов и без GSM-модулей. Только ESP и старый телефон с MacroDroid.

ссылка на оригинал статьи https://habr.com/ru/articles/1068218/