Перейти к содержанию

NVS Reference

Все ключи в NVS-разделе flash (nvs partition, 0x9000…0xE000 = 20 КБ). Доступ через библиотеку Preferences (Arduino-обёртка над nvs_flash).

Источник истины — структура kSchema в src/nvs_backup.cpp, которая используется для GET /api/system/backup и POST /api/system/restore.

Конвенции:

  • Namespace = тематика модуля (dosator, int_smtp, ap-config и т.д.).
  • Все секреты (пароли, токены) перечислены в kSecrets[] и при backup'е шифруются AES-256-GCM ключом, производным от admin-пароля.
  • Дефолты применяются на чтение: если ключа нет — возвращается значение по умолчанию из таблиц ниже.
  • Запись в NVS делается транзакционно prefs.begin(ns, false)put*prefs.end(). После end() данные на flash.

auth — учётные записи

Ключ Тип Default Описание
admin string admin123 Пароль роли ADMIN (полный доступ)
duty string duty123 Пароль роли DUTY (оператор мойки)

Секрет: оба пароля. Backup сохраняет их шифрованными. Источник: src/auth_manager.cpp.


ap-config — точка доступа WiFi

Ключ Тип Default Описание
ssid string <device_name>_Setup (derived) Имя сети AP
ssid_expl bool false Пользователь задал SSID явно (≠ derived from device_name)
password string 12345678 Пароль AP (8…64 символа)
timeout ulong 600000 (10 мин) Время автоотключения AP, мс
ip string 192.168.4.1 IP устройства в AP
gateway string 192.168.4.1 Gateway AP-подсети
subnet string 255.255.255.0 Маска подсети
channel uchar 1 WiFi-канал (1…13), auto-sync на канал STA при connect
hidden bool false Скрытый SSID
max_clients uchar (legacy, игнор.) Hardcoded в 1 в ap_manager.cpp

Секрет: password.

Флаг ssid_expl: при смене device_name AP SSID автоматически обновляется на <новое-имя>_Setup, ЕСЛИ ssid_expl == false. Если пользователь хотя бы раз задал кастомный SSID через POST /api/ap/config — флаг становится true и derive перестаёт работать (имя зафиксировано). Сброс — factory-reset или явно отправить ssid равный <device_name>_Setup.

channel auto-sync: ESP32 единым радио вынужденно тащит AP на канал STA. При успешном STA-подключении ap-config:channel обновляется на канал текущего link — на следующем boot AP стартует сразу на нужном канале (иначе клиенты AP отлетают, когда STA link-up утаскивает радио).

Источник: src/ap_manager.cpp, defaults в include/config.h.


sta-config — клиент WiFi (станция)

Ключ Тип Default Описание
ssid string "" SSID домашней сети
password string "" Пароль WPA
useStaticIP bool false DHCP (false) или статика (true)
staticIP string 0.0.0.0 Статический IP
gateway string 0.0.0.0 Шлюз
subnet string 255.255.255.0 Маска
dns1 string 0.0.0.0 Первичный DNS
dns2 string 0.0.0.0 Вторичный DNS

Секрет: password. Источник: src/sta_manager.cpp.


net-mgr — менеджер сети (общий)

Ключ Тип Default Описание
idle_ms ulong Таймаут idle-состояния network manager, мс

Источник: src/net_manager.cpp.


wifi — настройки радио

Ключ Тип Default Описание
tx_power uchar 44 TX-мощность в quarter-dBm (44 = 11 dBm), диапазон 8…78

Применяется в wifiInit() после WiFi.mode(WIFI_AP_STA). Меняется через Web UI → Сеть → STA → Радио, или POST /api/net/radio с tx_power_q. Источник: src/wifi_manager.cpp.

AP-канал хранится в ap-config:channel (см. выше). При успешном подключении STA к BS контроллер автоматически обновляет этот ключ на канал STA — так на следующей загрузке AP стартует сразу на том же канале (ESP32 единым радио вынужденно тащит AP на канал STA).


ntp-config — синхронизация времени

Ключ Тип Default Описание
server string pool.ntp.org NTP-сервер
tz_offset int 10800 (UTC+3) Смещение в секундах от UTC

Источник: src/ntp_manager.cpp.


dosator — каналы дозирования (3 канала)

Для каждого канала ch ∈ {0, 1, 2} четыре ключа с суффиксом.

Ключ Тип Default Описание
prop_<ch> uchar 0 Пропорция ШИМ (0…99)
window_ms_<ch> ushort 2000 Длина окна дозирования, мс (100…60000)
mode_<ch> uchar 0 Режим: 0 пропорциональный, 1 импульсный
notify_thr_<ch> uint 720000 Интервал сервиса, секунд (default 200 ч)
notify_sent_<ch> uint 0 1 = уведомление о сервисе уже отправлено
notify_en_<ch> bool true Слать ли уведомление о сервисе

Подробности алгоритма: см. dosing-logic.md. Источник: src/dosator.cpp.


hmi — индикатор и кнопки

Ключ Тип Default Описание
active_ch uchar 0 Активный канал на дисплее при старте (0…2)
hmi_bright uchar 7 Яркость дисплея TM1638 (1…7)

Источник: src/hmi.cpp.


int_telegram — интеграция Telegram

Ключ Тип Default Описание
token string "" Bot API token (12345:AAFr...)
chat_id string "" Целевой chat_id для уведомлений (числовая ID)
chat_bot string "" Имя бота (для логов)
interval_s ulong 30 Период polling getUpdates, сек
enabled bool false Активна ли интеграция
allowed_uid string "" Whitelist user_id для команд (через запятую)
cursor long 0 offset для long-polling getUpdates
sec_token string "" Security-токен для команд (валидация в /start)

Секреты: token, sec_token. Источник: src/integration/bot_manager.cpp.


int_maxbot — интеграция MaxBot

Те же ключи, что у int_telegram, плюс:

Ключ Тип Default Описание
bd_senders string "" JSON-кэш [{"u":"<uid>","n":"<имя>"}], до 8 записей

bd_senders заполняется в recordBoardSender() когда пользователь пишет в board-чат; используется UI карточкой MaxBot для подстановки имён в поле «Разрешены». Persist в NVS добавлен чтобы UI не показывал голые user_id после ребута.

Источник: src/integration/maxbot/, bot_manager.cpp.


int_smtp — исходящая почта

Ключ Тип Default Описание
host string "" SMTP-сервер (smtp.gmail.com)
port ushort 465 Порт (465 = SMTPS, 587 = STARTTLS)
username string "" Логин SMTP
password string "" Пароль (app password)
from string "" Адрес отправителя
to string "" Адрес получателя уведомлений

Секрет: password. Источник: src/integration/mail/smtp_manager.cpp.


int_imap — входящая почта (команды по email)

Ключ Тип Default Описание
host string "" IMAP-сервер
port ushort 993 Порт IMAPS
username string "" Логин
password string "" Пароль
folder string AWDC Папка для команд
interval_s ulong 60 Период polling, сек
token string "" Security-token для команд
allowed_from string "" Whitelist email отправителей (через запятую)

Секреты: password, token. Источник: src/integration/mail/imap_manager.cpp.


ota — состояние OTA-обновления

Используется OtaSession для персистентного состояния между перезагрузками.

Ключ Тип Описание
ota_pending bool Флаг «ожидается reboot для применения OTA»
st uchar Состояние сессии (enum OtaState)
l_err uchar Последняя ошибка (enum OtaError)
l_err_msg string Текст последней ошибки
u_bytes uint Загружено байт
t_bytes uint Всего байт в прошивке
b_att uchar Счётчик попыток boot после OTA (для rollback)
p_ver string Pending version (которую пытаемся загрузить)
lg_ver string Last-good version (для отката)
lg_part uchar Last-good partition (app0/app1)
c_sha string Вычисленный SHA-256 прошивки
e_sha string Ожидаемый SHA-256 (из манифеста)
mf string JSON-манифест прошивки
host_url string URL сервера обновлений (https-хост с папкой /firmware/)
channel string Канал обновлений (stable / dev), default = BUILD_CHANNEL

host_url и channel принадлежат OtaPuller (pull-mode OTA с https-хоста). При первом старте channel инициализируется значением скомпилированного BUILD_CHANNEL — стабильная прошивка по умолчанию проверяет stable-канал, dev-прошивка — dev. Меняется через POST /api/ota/channel.

Источник: src/ota/OtaSession.cpp, src/ota/OtaManager.cpp, src/ota/OtaPuller.cpp.


ota-test — проверка целостности NVS после OTA

Ключ Тип Описание
key uint Tag-значение для post-boot validation (kTestValue)

Источник: src/ota/BootValidation.cpp.


eeprom_mig — версия миграции EEPROM

Ключ Тип Default Описание
version uchar 0 Версия схемы EEPROM (для миграций ADR-007)

Источник: src/ota/EepromMigration.cpp.

См. также memory-map.md для физической раскладки EEPROM (M24C16).


ui — настройки web-интерфейса и identity

Ключ Тип Default Описание
idle_min uchar 10 Таймаут idle-разлогина, минут (0 — отключено)
dev_name string "" (→ default) device_name — master alias для mDNS и AP SSID

dev_name — master alias устройства. Валидация: ^[a-z0-9-]{2,16}$, не начинается/кончается дефисом, не в reserved-list (awdc/admin/root/device/setup/localhost). Default при пустом значении — awdc-<последние 4 hex от MAC> (например, awdc-3f2c).

Производные значения:

  • mDNS hostname → <dev_name>.local
  • AP SSID → <dev_name>_Setup (если ap-config:ssid_expl == false)

API:

  • GET /api/system/identity — возвращает текущее имя + derived names
  • POST /api/ui/dev_name — сменить, требует ADMIN. При смене live-restart MDNS и обновление AP SSID (если ssid_expl=false). UI предупреждает о необходимости переподключения к новому SSID.

Источник: src/device_identity.cpp, src/API/System/identity.cpp, src/API/System/ui_config.cpp.


Backup / restore

GET /api/system/backup?password=<admin> — возвращает JSON со всеми полями plaintext (по схеме выше) + блок _secrets с AES-GCM-шифрованными секретами.

POST /api/system/restore с тем же admin-паролем восстанавливает namespaces. Подробности: admin/backup-restore.md.


Factory reset

POST /api/system/factory-reset стирает user-config NVS и перезагружает устройство «как из коробки». Не трогает заводские настройки и EEPROM-наработку.

Wiped (стирается полностью)

Namespace Что внутри
sta-config WiFi STA credentials, static IP
int_smtp SMTP-сервер, отправитель
int_imap IMAP-сервер, команды по email
int_telegram Telegram bot token, chat
int_maxbot MaxBot token, разрешённые UID
ntp-config NTP-сервер, timezone
ota host_url, channel, OTA-state
ota-test Boot-validation flag
net-mgr idle timeout, sta_ondemand
wifi TX power
ui idle_min, device_name (!)
dosator Пропорции, window, mode, notify-thresholds
selftest_v Self-test версия (форсирует re-run)

Preserved (НЕ трогается)

Namespace Почему
auth factory creds сохраняются — иначе после reset нет доступа
ap-config AP должен остаться доступен сразу после reset
eeprom_mig Версия миграции EEPROM привязана к схеме чипа
eeprom_* Наработка дозаторов (отдельная I²C-микросхема)

После reset устройство загружается с:

  • admin/admin123 + duty/duty123 (дефолты)
  • AP SSID без изменений (если был кастомный — остаётся)
  • device_name сбрасывается → MDNS вернётся к awdc-<MAC4>.local
  • STA не настроен — устройство в AP-only режиме
  • Все интеграции выключены

Подробности: admin/factory-reset.md.