Jak přidat nový produkt založený na idryer-core¶
Tento návod použijte, když stavíte nový produkt na idryer-core: sušičku filamentu, topný blok, osvětlení, senzor nebo jiný modul. Ukazuje, co za vás udělá jádro a co musí doplnit kód produktu.
Úplný sestavitelný příklad je vyhřívaná skříň pro skladování z dokumentace Build-Your-Own-iDryer (example/09-cabinet): prochází vším, co je na této stránce.
Na čem produkt stojí¶
Produkt komunikuje s jádrem přes jediný objekt — fasádu iDryer::Link (<iDryer.h>). Uvnitř s_link.begin() a s_link.loop() jádro:
- získá síť Wi-Fi z aplikace iDryer vzduchem (ESPTouch) nebo z webového instalátoru přes USB (Improv) a udržuje spojení;
- propojí zařízení s účtem: čeká na jednorázový párovací token — z aplikace po místní síti nebo přes sériový port (
PAIR_TOKEN:<token>) — a na portálu ho vymění za trvalý tajný klíč; - připojí se k MQTT a publikuje
telemetryastatusv periodách zConfig; - ohlásí se v místní síti (mDNS
_idryer._tcp) a přijímá příkazy z aplikace přes WebSocket; - publikuje card manifest karty zařízení.
Třídy nižší úrovně (IdryerRuntime, CloudStateMachine, LocalAccess a další) jsou vnitřnosti jádra: párovací token se ke cloudové části dostane jen uvnitř iDryer::Link. Stavte produkt na fasádě.
1. Projekt¶
idryer-core patří do lib/idryer-core/ (kopie nebo symbolický odkaz); knihovny jádra si PlatformIO vezme z jeho library.json. Minimální platformio.ini:
[env:my-device]
platform = espressif32
framework = arduino
board = esp32-c3-devkitm-1
; transport ESP8266 ze závislostí espMqttClient: na ESP32 se nesestaví
lib_ignore = ESPAsyncTCP
build_flags =
-DIDRYER_API_BASE='"https://portal.idryer.org/api"'
-DMQTT_BROKER='"mqtt.idryer.org"'
-DMQTT_PORT=8883
-DMQTT_USE_TLS=1
Bez lib_ignore = ESPAsyncTCP sestavení spadne v ESPAsyncTCP.cpp; bez MQTT_BROKER a MQTT_PORT se jádro nezkompiluje.
2. Minimální firmware¶
#include <iDryer.h>
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Unknown, // není produkt iDryer: karta vzniká z manifestu
.unitsCount = 1,
.hasAirTemp = true,
.hasAirHumidity = true,
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "My Device",
};
static iDryer::Link s_link(CFG);
void setup() {
s_link.begin();
// Zařízení bylo na portálu odpojeno: smazat tajný klíč, čekat na nové spárování.
s_link.onCommand("revoke", [](JsonObjectConst) { s_link.handleRevoke(); });
}
void loop() {
s_link.loop();
s_link.telemetry.airTempC[0] = readTemp(); // vaše funkce senzorů
s_link.telemetry.airHumidityPct[0] = readHumidity();
}
s_link.begin() spustí Wi-Fi, propojení, MQTT a místní přístup; s_link.loop() musí běžet neustále, bez delay(). Příkaz revoke přijde z portálu, když zařízení od účtu odpojíte: handleRevoke() smaže tajný klíč a zařízení čeká na nový párovací token.
3. Wi-Fi a propojení — nic v kódu¶
Firmware neobsahuje heslo k síti ani údaje účtu. Uživatel zařízení připojí v aplikaci iDryer: Připojit nové zařízení → krok Wi-Fi (aplikace pošle síť přes ESPTouch) → krok Spárování (aplikace najde zařízení přes mDNS, získá od portálu jednorázový token a předá ho zařízení; token na portálu aktivuje zařízení samo). Dokud Wi-Fi nenaběhne, sériový port mlčí: jádro ho drží pro webový instalátor (Improv).
Krok za krokem a s očekávaným logem — Build-Your-Own-iDryer, kapitola „Spuštění firmwaru na jádře“.
4. Data: telemetrie a stav¶
- Příznaky
has*vConfigurčují, která slovníková pole jdou do telemetrie a které buňky se objeví na kartě. - Hodnoty zapisujte do
s_link.telemetry(airTempC,airHumidityPct,heaterTempC,heaterPower01,fanOn,servoOpen) as_link.status(mode,targetTempC,durationS,elapsedS); jádro je publikuje v periodách zConfigas_link.publishStatusNow()pošle stav hned. - Vlastní pole — přes
s_link.onTelemetryPublish(), na kartu — přess_link.card().sensor(); viz Karta zařízení.
5. Nastavení: menu¶
Nastavení se popisují v src/menu/menu.yaml; generátor menu_gen.py z něj udělá kód C++, uložení v NVS a JSON menu (Menu jako protokol). Kód produktu:
- načte menu před
s_link.begin():menu.initDefaults(),menu.loadFromNVS(),menu_sync_state_to_cache(); - publikuje ho přes
menu_buildFullJson()as_link.devicePublisher()->publishConfigRaw()— po přechodu online a na příkazget_config; - aplikuje příkaz
setpřesmenu_apply_by_bind()(hodnota, NVS i cache najednou) a publikuje menu znovu.
Úplný kód — Build-Your-Own-iDryer, kapitola „Menu z YAML“.
6. Karta zařízení¶
Co karta ukazuje a jaké operace spouští, se deklaruje přes s_link.card() — Karta zařízení: card manifest.
7. Kontrakt¶
Když přidáváte nové topicy nebo měníte payload:
- aktualizujte
contracts/mqtt_contract.yaml; - spusťte
contracts/regen.sha commitněte vygenerované soubory.
Dvoučipová zařízení¶
Pro ESP32, které pracuje se samostatným řadičem (například RP2040) přes UART, má jádro most UART idryer_uart.h; funkční vzor je firmware idryer-link.