Настройки¶
http://<ip-платы>/settings.html — admin-only. Шесть секций.
WiFi¶
Список Wi-Fi сетей с приоритетом — плата перебирает их по порядку. Если первая сеть недоступна — пробует вторую, и так далее. Если не подключилась ни к одной — поднимает свой AP.
Список сетей¶
Кнопки в строке: ↑ / ↓ (приоритет), ✏️ (редактировать), 🗑️ (удалить). Кнопка + Добавить.
Поля одной сети:
| Поле | Назначение |
|---|---|
| SSID | Имя сети. Если поле пустое и self_ap.enabled=true — это AP-mode-only «сеть» (нужна только для loop'а). |
| Пароль | Пароль WPA2. Пустой — открытая сеть. В UI скрыт за ***. |
| Retries | Сколько раз пробовать WiFi.begin() (по умолчанию 3, после Refactor-8266 — 5). |
| Timeout (сек) | Сколько ждать каждой попытке. Дефолт 8 сек. |
| Static IP | Чекбокс. Если включён — раскрываются 4 поля: |
| ├ IP | IP платы в сети (192.168.1.50) |
| ├ Gateway | IP роутера (192.168.1.1) |
| ├ Netmask | Обычно 255.255.255.0 |
| └ DNS | Например 8.8.8.8 или 192.168.1.1 |
Маркер «оставить старый пароль»
При редактировании сети в поле пароля стоит ***. Если его не трогать — пароль не изменится. Чтобы сменить — введите новое значение. Чтобы превратить в открытую сеть — очистить поле.
Self-AP fallback¶
Если все настроенные сети недоступны — плата поднимет собственную AP.
| Поле | Назначение |
|---|---|
enabled |
Включить fallback (рекомендуется) |
ssid |
Имя AP. По умолчанию CtrlBoard-Setup |
password |
Пароль AP (пустой = открытая) |
channel |
Канал 1..13, дефолт 6 |
Параметры пробинга¶
После старта плата периодически проверяет, не появилась ли «лучшая» сеть (с большим приоритетом).
| Поле | Назначение |
|---|---|
rescan_interval_sec |
Период проверки. Дефолт 300 сек. |
probe_duration_sec |
Сколько времени даётся для попытки переключения. |
probe_checks |
Сколько успешных проверок подряд нужно, чтобы остаться. |
Submit перезагружает плату, если только в API-запросе не указано "reboot": false (через UI всегда reboot).
Устройство¶
Параметры самой платы.
| Поле | Назначение |
|---|---|
| UUID | Read-only. Генерируется на первом запуске из MAC + random tail. Это идентификатор платы для облака и mesh. |
| Имя | Человекочитаемое имя (для UI и облака). |
| Broadcast IP | auto (вычислить из текущего IP + netmask) или явный 192.168.1.255. Используется для UDP broadcast в mesh-режиме broadcast. |
| Static IP | Тот же блок что в Wi-Fi, но один на устройство (применяется для приоритетной сети). |
| Latitude | Широта, дробное число. Для расчёта восхода/заката. |
| Longitude | Долгота. |
Координаты — это широта/долгота, не IP-геолокация
Например для Москвы: latitude=55.7558, longitude=37.6173. Можно подсмотреть в Google Maps (правая кнопка → координаты копируются в буфер).
Время¶
| Поле | Назначение |
|---|---|
| Текущая эпоха | Read-only — сколько сейчас часов на плате. |
| Источник | ntp (синхронизировано) / manual (поставлено вручную) / persisted (восстановлено из файла на старте). |
| Установить вручную | Поле datetime-local для ввода даты-времени. |
| Кнопка «Из браузера» | Подставит текущее время браузера в поле. |
| Кнопка «Применить» | Сохранить введённое. |
Время сохраняется в /config/time.json каждые ~60 секунд — после reboot восстанавливается с точностью до минуты. Если есть Wi-Fi и интернет — NTP подтянет точное.
NTP-серверы захардкожены: pool.ntp.org, time.google.com. Если они недоступны — time.synced=false, cron-триггеры не работают (UI рисует warning).
Глубокий сон¶
Для батарейных нод. Плата спит большую часть времени, периодически просыпается на короткое окно.
| Поле | Назначение |
|---|---|
enabled |
Включить deep-sleep |
wake_interval_sec |
Период сна в секундах |
awake_window_sec |
Сколько секунд держаться бодрой после просыпания (для обработки heartbeat'а, выполнения задач) |
three_reset_window_sec |
Если три ребута подряд за это окно — deep-sleep отключается до следующего uploadfs/factory-reset (escape) |
ESP8266: нужна перемычка D0 ↔ RST
Без неё плата уснёт и не проснётся. Wake-сигнал идёт с GPIO 16 на RST. Это аппаратное требование, не баг прошивки.
Кнопка 😴 Уснуть сейчас — мгновенный сон до следующего wake-interval (для тестирования).
Авторизация¶
| Поле | Назначение |
|---|---|
| Требовать вход | Toggle. Если выключен — UI работает без логина, любой запрос ходит от имени default_user_id (admin по умолчанию). |
Только для домашней LAN
Выключайте только если плата сидит за защищённым Wi-Fi и недоступна снаружи (нет port-forwarding, нет VPN с широким доступом). В диалоге подтверждения будет ещё одно напоминание.
Бэкап конфигов¶
Снимок всех /config/*.json одним JSON-файлом для переноса между платами или восстановления после factory-reset. CB-133.
Per-platform доступность
Backup-фича включена не на всех платах из-за heap-ограничений ESP8266:
| Платформа (env) | Backup | Примечание |
|---|---|---|
ESP32 (esp32dev) |
✅ | 320 KB DRAM — фича работает без ограничений |
ESP-01S (esp01s) |
✅ | Без UI это единственный способ переноса конфига |
NodeMCU (esp8266) |
❌ | Отключена — -D BACKUP_DISABLED=1 (CB-141) |
На NodeMCU кнопки в этой форме всё ещё отображаются (UI собирается общий), но клик «Скачать конфиг» / «Восстановить» вернёт 404. На NodeMCU настройки переносятся через CRUD API (GET /api/v1/devices, /tasks, и т.п.) — собрать вручную.
Почему отключено на NodeMCU: фича стоит ~2.7 KB DRAM (rodata + WebServer route allocations), при baseline free heap ~10 KB на NodeMCU это слишком впритык к crash-порогу 5 KB. На ESP-01S с NO_WEB_UI-сборкой большая часть .rodata уже исключена, остаточный cost ~2 KB — терпимо.
Скачать конфиг¶
Кнопка «📥 Скачать конфиг» → GET /api/v1/backup → файл ctrl-board-backup-<uuid8>-<date>.json сохраняется в браузере.
В backup попадают:
device_config(UUID, broadcast_ip, static_ip, geo)settings(Wi-Fi networks, AP-настройки)auth_settings(require_auth, default_user_id)users(безpassword_hash)cloud(безapi_key)devices,tasks(вся ваша автоматизация)sensors_enabled,triggers_enabled,conditions_enabled,actions_enabledsleep,time_state
НЕ попадают (по design):
secrets.json—token_secret/password_saltper-board, перенос бессмысленен.password_hashв users — соль другая на новой плате, хэш не сработает.api_keyв cloud — security (backup-файл может попасть наружу).
Восстановить из файла¶
Кнопка «📤 Восстановить из файла…» → выбор файла → диалог подтверждения → POST /api/v1/backup (multipart) → плата применяет секции и перезагружается.
После восстановления:
- Логин —
admin/1234. Старый password_hash в backup отсутствует, при boot'е срабатывает bootstrap. - Cloud — нужно заново ввести
api_key(был замаскирован при export). URL иmqtt_enabledсохраняются. - Всё остальное — на месте.
Headless через API
На ESP-01S (без UI) ту же операцию делаешь напрямую через curl. См. API-рецепты → Бэкап.
Опасная зона¶
Кнопка «Полный сброс к заводским настройкам» — POST /api/v1/factory-reset. После подтверждения:
- Удаляет все
/config/*.json(включая Wi-Fi, устройства, задачи, пользователей). - НЕ трогает
/public/*(HTML/JS/CSS на FS останутся). - Восстанавливает bootstrap-
users.json→ admin/1234 на следующем загруге. - Перезагружает плату → она появится в AP-режиме.
Когда применять: перепродаёте плату, переезжаете в новую конфигурацию с нуля, тестируете onboarding-flow. Резервные копии не сохраняются — экспортируйте конфиг сами через API если хотите вернуть.