📘 Фикус-контроллер: путь от простого скетча до мини-платформы

 

ficus

 

🌱 Введение

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


🟩 1. С чего всё началось

Идея была довольно простая (ну как «простая» 😄):

  • ESP32 в роли «мозга»;
  • датчик DHT22 для температуры и влажности;
  • реле для фитолампы и нагревателя;
  • минимальный веб-интерфейс прямо на ESP32 (ESPAsyncWebServer);
  • Wi-Fi + общение с сервером (статус, команды, пороги и т. п.).

Скетч постепенно разрастался: появились красивые карточки на вебморде, авторизация, настройки порогов, LED-индикация, работа по HTTPS, watchdog и прочие радости жизни 😎

Но вскоре стало понятно, что:

  • отлаживать HTML/CSS/JS на самом ESP32 — боль и страдания;
  • каждая правка вебморды = пересборка скетча + перепрошивка;
  • хочется фокусироваться на фронтенде в нормальном браузере на ПК, а не через сериал-лог.

Отсюда родилась ключевая мысль: вынести вебморду на отдельный сервер и сделать «эмулятор ESP32», который будет вести себя как настоящий контроллер.


🟩 2. Вебморда переезжает на Apache

Для ускорения разработки фронтенда было решено:

  • поднять Apache2 на отдельной машине (192.168.88.17);
  • создать каталог /webserver/ficus.ard-s.ru под файлы сайта;
  • сделать отдельный виртуальный хост, который слушает порт 9090.

Пример конфигурации виртуального хоста:

<VirtualHost *:9090>
    ServerName  ficus.ard-s.ru
    ServerAlias www.ficus.ard-s.ru
    DocumentRoot /webserver/ficus.ard-s.ru

    <Directory /webserver/ficus.ard-s.ru>
        Require all granted
    </Directory>

    ProxyPreserveHost On
    ProxyPass        /api/ http://127.0.0.1:999/
    ProxyPassReverse /api/ http://127.0.0.1:999/

    ErrorLog ${APACHE_LOG_DIR}/ficus_error.log
    CustomLog ${APACHE_LOG_DIR}/ficus_access.log combined
</VirtualHost>

Идея простая:

  • Apache отдаёт статический фронтенд (HTML, CSS, JS) по адресу http://ficus.ard-s.ru:9090/;
  • все запросы к /api/... он проксирует на бэкэнд-эмулятор на порту 999.

Так мы получили привычный нормальный сайт, который открывается в браузере и не зависит от прошивки ESP32.


🟩 3. Samba: чтобы папка фикуса была доступна с рабочего ПК 😁

Чтобы удобнее редактировать файлы вебморды, каталог /webserver/ficus.ard-s.ru был выведен через Samba. Фрагмент конфига:

nano /etc/samba/smb.conf

[global]
workgroup = ARD
server string = ARD File Server
security = user

# Оставляем для производительности
use sendfile = yes

map to guest = never
guest ok = no

# Логи
log file = /var/log/samba/log.%m
max log size = 1000
logging = file
log level = 3 auth:5

# БЕЗОПАСНОСТЬ: SMB3 + шифрование
server min protocol = SMB2_10
server max protocol = SMB3
client min protocol = SMB2_10
client max protocol = SMB3
smb encrypt = required

# ОТКЛЮЧАЕМ NetBIOS (не нужен)
disable netbios = yes
smb ports = 445

# ОГРАНИЧЕНИЕ ПО IP (локалка + внешний)
hosts allow = 192.168.88.0/24 85.142.172.178
hosts deny = 0.0.0.0/0

# Отключаем слабые методы
lanman auth = no
ntlm auth = no

# ——— ШАРА: ard-s.ru (веб-сайт) ———
[ard-s.ru]
comment = ARD-S Site Folder
path = /webserver/ard-s.ru
browseable = yes
read only = no
guest ok = no
valid users = madmentat
writable = yes
create mask = 0644
directory mask = 0755
force user = www-data
force group = www-data

# Шифрование для этой шары (на всякий)
smb encrypt = required

# ——— ШАРА: ficus.ard-s.ru (вебморда фикуса) ———
[ficus.ard-s.ru]
comment = Ficus Folder
path = /webserver/ficus.ard-s.ru
browseable = yes
read only = no
guest ok = no
valid users = madmentat
writable = yes
create mask = 0644
directory mask = 0755
force user = www-data
force group = www-data

# Шифрование для этой шары (на всякий)
smb encrypt = required

Теперь можно просто подключить шару с рабочего ПК и редактировать:

  • index.html
  • style.css
  • app.js

Как обычный набор файлов сайта: открыл в редакторе → сохранил → обновил страницу в браузере — и сразу видишь результат. Никаких перепрошивок контроллера 🔥


🟩 4. "Православный" демон: эмулятор ESP32 на C++

Чтобы вебморда чувствовала себя «как дома» и не подозревала, что живёт не на ESP32, мы написали небольшой бекэнд-сервер на C++ — эмулятор ESP32.

Основные идеи:

  • используем однофайловую библиотеку httplib.h (cpp-httplib) для HTTP-сервера;
  • поднимаем сервер на 127.0.0.1:999;
  • реализуем эндпоинты:
    • GET /data — отдаёт текущие «показания датчиков» и состояние реле;
    • GET /growlight?state=on/off — включает/выключает фитолампу;
    • GET /heater?state=on/off — включает/выключает нагреватель;
    • GET /settingsData — отдаёт конфиг настроек;
    • POST /saveSettings — принимает и «сохраняет» настройки;
    • GET /wifiList, POST /addWifi — условное управление сетями;
    • POST /resetConfig — сброс настроек к дефолту;
    • POST /login — авторизация (по умолчанию admin/admin).

Эмулятор хранит состояние в структурах наподобие:

struct SensorData {
    double temperature;
    double humidity;
    int soilMoisture;
    bool growLight;
    bool heater;
    bool soilController;
    std::string currentTime;
    std::string wifiSSID;
    int wifiRSSI;
    std::string ipAddress;
    std::string firmwareVersion;
    int firmwareYear;
};

struct AppConfig {
    std::string login;
    std::string password;
    bool soilCardEnabled;
    int lightOnHour, lightOnMinute;
    int lightOffHour, lightOffMinute;
    double heatLow, heatHigh;
};

По сути, это «модель» того, что потом будет жить в прошивке ESP32: те же поля, те же JSON-форматы, те же URL.

С точки зрения вебморды — это уже полноценный контроллер фикуса: она делает fetch('/api/data'), а в ответ получает JSON, как будто общается с реальным модулем.


🟩 5. Жизненный цикл запроса: кто с кем и как разговаривает

Общая схема сейчас выглядит так:

[Браузер]
   |
   |  HTTP (порт 9090)
   v
[Apache:9090] -- статика --> index.html, style.css, app.js
   |
   |  /api/... (ProxyPass)
   v
[C++ эмулятор ESP32:999]

То есть:

  • браузер запрашивает страницу http://ficus.ard-s.ru:9090/ — Apache отдаёт вебморду;
  • JavaScript на странице обращается к /api/data, /api/growlight и т. д.;
  • Apache по ProxyPass перенаправляет эти запросы на http://127.0.0.1:999/...;
  • демон на C++ обрабатывает запрос и возвращает JSON, как это будет делать ESP32;
  • JS в браузере обновляет карточки, статусы, индикаторы, подписи — всё оживает 🌿

При этом вебморде вообще всё равно, кто там за /api — настоящий ESP32 или наш «православный демон». Главное, что API соответствует ожидаемому формату.


🟩 6. Что уже работает сейчас ✅

  • Вебморда отделена от ESP32 и крутится как обычный сайт на Apache;
  • Файлы вебморды доступны по Samba и редактируются напрямую с рабочего ПК;
  • C++-демон-эмулятор принимает и обрабатывает запросы так же, как будет делать контроллер;
  • Карточки фитолампы, нагревателя, контроллера почвы и прочие элементы интерфейса обновляются «вживую»;
  • Настройки (логин/пароль, пороги нагрева, параметры освещения, включение soil-контроллера) сохраняются в конфиг-структуре эмулятора;
  • Архитектура максимально близка к тому, как это будет устроено на самом ESP32.

По сути, сейчас у нас есть полноценный стенд для разработки интерфейса и логики, не зависящий от железа.


🟩 7. Планы на будущее 🔮

7.1. Доработка вебморды

  • 🌗 Карточки с более продвинутыми режимами (авто-режим по расписанию, ручной override);
  • 📊 Отображение истории/логов (хотя бы простенькое);
  • 🧩 Гибкая настройка видимых карточек (что показывать, что скрывать);
  • 💬 Более «говорящие» статусы для ошибок (Wi-Fi, датчики, сервер и т. п.).

7.2. Развитие демона

  • 💾 Сохранение настроек не только в память, но и в файл (JSON на диске);
  • ⚠ Эмуляция ошибок: DHT не отвечает, Wi-Fi «отвалился», сервер «молчит» и т. д.;
  • 🧠 Автоматические режимы по порогам (термостат, влажность, расписание света);
  • 🔗 При желании — имитация протокола общения с внешним сервером (как потом будет у реального ESP32).

7.3. Возвращение фронтенда обратно на ESP32

  • 📦 Перенести отлаженный HTML/CSS/JS в прошивку (через PROGMEM или файловую систему ESP32);
  • 🔐 Подключить реальную авторизацию и хранение конфигурации в NVS/EEPROM;
  • 🌐 Настроить HTTPS (где это уместно) и работу как клиента к внешнему серверу;
  • 🛰 Задуматься об OTA, MQTT, уведомлениях и прочих IoT-радостях.

🟩 8. Итоги

Из простого скетча в духе «ESP32 + DHT22 + пара реле» проект вырос до небольшой, но вполне серьёзной архитектуры:

  • вебморда живёт на Apache и отлаживается как нормальный сайт;
  • эмулятор ESP32 на C++ имитирует всю логику устройства;
  • взаимодействие идёт через чётко определённое JSON-API (/api/...);
  • позже всё это аккуратно переедет обратно в прошивку контроллера.

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

Фикус ещё не знает, но его ждёт фиторай 🌿😄

 

Пример вебморды на текущий момент

http://ficus.ard-s.ru

Логин и пароль:

admin/admin