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

🌱 Введение
Эта заметка — небольшой журнал разработки «климат-контроллера для фикуса» на 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
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.htmlstyle.cssapp.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/...);
- позже всё это аккуратно переедет обратно в прошивку контроллера.
Дальше план — продолжать развивать как железо (плата расширения, силовые выходы, датчики, связь), так и софт (настройки, протоколы, стабильность, безопасность), а эту статью дополнять новыми кусочками кода, схемами и скриншотами.
Фикус ещё не знает, но его ждёт фиторай 🌿😄
Пример вебморды на текущий момент
Логин и пароль:
admin/admin
