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

Старт прошивки

Каркас проекта полностью повторяет главу из примера со шкафом: PlatformIO, idryer-core в lib/, тот же platformio.ini (замените только имя окружения на filter). Здесь — лишь то, что отличается.

Готовый проект этой главы — example/10-filter в репозитории учебника: оттуда берутся platformio.ini и весь код, который дальше разбирается по частям. Библиотека ядра — idryer-core.

Лог в порт: два флага сборки

У ESP32-C3 вывод Serial по умолчанию уходит на выводы UART0, а не на USB-порт платы — монитор порта остаётся пустым. Чтобы видеть лог, в build_flags нужны две строки:

-DARDUINO_USB_MODE=1
-DARDUINO_USB_CDC_ON_BOOT=1

Сообщения самого ESP-IDF (ошибки mDNS и подобные) идут на USB и без них, поэтому «что-то печатается, а моих строк нет» — признак именно этих недостающих флагов.

Config: устройство нестандартного типа

У фильтра нет ни нагревателя, ни датчика климата из словаря экосистемы. Из «словарных» навыков у него только вентилятор. В src/main.cpp:

#include <iDryer.h>

static const iDryer::Config CFG = {
    .deviceType        = iDryer::DeviceType::Unknown, // нестандартное устройство
    .unitsCount        = 1,
    // Периферия: из словаря экосистемы у нас только вентилятор.
    .hasFan            = true,
    // Периоды автопубликации:
    .telemetryPeriodMs = 5000,
    .statusPeriodMs    = 10000,
    // Идентификация на портале:
    .hardwareVersion   = "1.0",
    .firmwareVersion   = "0.1.0",
    .model             = "DIY Air Filter",
};

static iDryer::Link s_link(CFG);

void setup() {
    Serial.begin(115200);
    s_link.begin();
    // Устройство отвязали на портале: стереть секрет, ждать новой привязки.
    s_link.onCommand("revoke", [](JsonObjectConst) { s_link.handleRevoke(); });
}

void loop() {
    s_link.loop();
}

DeviceType::Unknown — это нормально

Тип Unknown означает «портал не знает такого изделия». Раньше это была проблема: у портала не было карточки для неизвестного типа. Теперь это штатный путь: интерфейс устройства целиком опишет card-манифест (глава 6), и портал построит карточку по нему. Тип нужен только «своим» изделиям iDryer, у которых есть фирменные карточки.

Флаг hasFan = true даёт нам бесплатно: поле fanStatus в телеметрии, ячейку «Вентилятор» на карточке и сущность в манифесте — всё из словаря экосистемы.

VOC-датчика в Config нет — и не должно быть

Обратите внимание: в Config нет флага «hasVoc». Словарь has* описывает периферию, которую знает экосистема. Свой датчик вы добавите не через словарь, а двумя другими механизмами: допишете его показания в телеметрию своим полем и объявите его в card-манифесте — это следующие две главы. В этом и суть подхода: словарь не нужно расширять под каждое новое устройство.

Первый запуск и привязка

Порядок тот же, что у шкафа:

  1. Прошейте плату и откройте Serial Monitor: пока у устройства нет Wi-Fi, лог молчит.
  2. В приложении iDryer: Подключить новое устройство → шаг Wi-Fi (сеть и пароль, Подключить устройство) → шаг Привязка → Привязать.
  3. После Устройство привязано устройство привязано к вашему аккаунту и выходит Online на портале; в логе — MQTT: Connected!.

Подробности, возможные ошибки и повторная привязка — в главе примера со шкафом.

Страница устройства на портале сразу после привязки Устройство на портале: имя, состояние Idle, значок связи. График пуст и меню не пришло — устройство о них ничего не заявляло.

На портале устройство уже видно, но карточка пока почти пустая — данных ведь ещё нет. Идём подключать датчик.