Veřejné API: iDryer::Link¶
iDryer::Link je jediný vstupní bod pro vývojáře zabudovaných systémů. Fasáda skrývá celý SDK stack: WiFi/Improv, cloud stavový stroj, HTTP claim, MQTT, lokální WebSocket, NVS. Produkt stačí vyplnit pole telemetry/status, zaregistrovat zpětná volání a zavolat begin()/loop().
Životní cyklus¶
Typický skelet main.cpp:
#include <iDryer.h>
#include <runtime/idryer_runtime.h> // vyžadováno pouze při použití setCommandHandler
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::StorageLink,
.unitsCount = 1,
.hasAirTemp = true,
.hasAirHumidity = true,
.hasHeaterTemp = false,
.hasHeaterPower = false,
.hasFanStatus = false,
.hasScales = false,
.hasRfid = false,
.telemetryPeriodMs = 10000,
.statusPeriodMs = 0,
.hardwareVersion = "1.0",
.firmwareVersion = "1.0.0",
};
static iDryer::Link link(CFG);
void setup() {
link.begin();
// setCommandHandler — striktně PO begin(): begin() instaluje vlastní dispatcher
link.runtime()->setCommandHandler(handleCommand);
}
void loop() {
link.loop();
link.telemetry.airTempC[0] = sensor.readTemp();
link.telemetry.airHumidityPct[0] = sensor.readHumidity();
}
Konfigurace: iDryer::Config¶
Vyplňuje se jednou v main.cpp, předává se konstruktoru Link. Všechna pole používají agregovanou inicializaci (C++ designované inicializátory).
| Pole | Typ | Účel | Poznámka |
|---|---|---|---|
deviceType |
DeviceType |
Typ zařízení | povinné |
unitsCount |
uint8_t |
Počet jednotek (komor), 1..MAX_UNITS (4) |
povinné |
hasAirTemp |
bool |
Je přítomen senzor teploty vzduchu | false = pole je vynecháno z JSON |
hasAirHumidity |
bool |
Je přítomen senzor vlhkosti | false = pole je vynecháno z JSON |
hasHeaterTemp |
bool |
Je přítomen senzor teploty topidla | — |
hasHeaterPower |
bool |
Je přítomen senzor výkonu topidla | — |
hasFanStatus |
bool |
Je přítomen stav ventilátoru | — |
hasScales |
bool |
Jsou přítomny váhy | — |
hasRfid |
bool |
Je přítomen čtečka RFID | — |
telemetryPeriodMs |
uint32_t |
Období automatického publikování Telemetry (ms) |
0 = nepublikovat |
statusPeriodMs |
uint32_t |
Období automatického publikování Status (ms) |
0 = nepublikovat |
hardwareVersion |
const char* |
Řetězec verze hardwaru | povinné |
firmwareVersion |
const char* |
Řetězec verze firmware | povinné |
Které integrace se dostanou do image, určují
IDRYER_WITH_HA,IDRYER_WITH_BAMBUaIDRYER_WITH_MOONRAKERvplatformio.iniproduktu. Vypnutá integrace v image ani vintegrations/statusnení a příkaz portálu na ni je odmítnut.
Třída iDryer::Link¶
Konstruktor¶
Bere konfiguraci podle konstantní reference. CFG musí existovat po dobu celé životnosti objektu (typicky static const).
Metody¶
begin()¶
Zapne celý SDK stack: WiFi/Improv, cloud stavový stroj, HTTP claim, MQTT, lokální WebSocket, NVS persistence.
Zavolá se jednou v setup(). Vrací true při úspěšné inicializaci.
loop()¶
Jedina povinná metoda. Obsluhuje WiFi/MQTT/LocalAccess a automaticky publikuje telemetrii a stav na jejich časovačích.
Volá se při každé iteraci loop(). Bez tohoto volání není připojení udržováno.
Zdroj: iDryer-Storage/src/main.cpp:253, iHeater-link/src/main.cpp:381.
publishTelemetryNow()¶
Okamžitě publikuje aktuální stav link.telemetry, bez ohledu na časovač telemetryPeriodMs.
publishStatusNow()¶
Okamžitě publikuje aktuální stav link.status. Používá se po zpracování příkazu, když má být nový stav bez prodlevy odrážen na portálu.
raiseEvent()¶
Publikuje událost do tématu idryer/{serial}/events. Odesláno okamžitě.
| Parameter | Typ | Účel |
|---|---|---|
severity |
EventKind |
Info / Warning / Error |
event |
const char* |
Kód události, např. "OVERHEAT", "SESSION_COMPLETE" |
message |
const char* |
Libovolný ladící text |
unitId |
uint8_t |
Index jednotky (0..unitsCount-1) nebo 0xFF pro zařízení |
onCommand()¶
Registruje obsluhu příkazu podle jména. Spustí se, když po MQTT nebo Local WS
dorazí commands/{name} s libovolným JSON.
CommandCallback = void (*)(JsonObjectConst data)
Jméno je libovolné: drying, stop, storage, get_config, set, profile,
led.pulse — cokoli. Vrací false při přetečení (nejvýše 12 příkazů) nebo při
neplatných argumentech.
Vestavěné příkazy link_integration, bambu_apply a ping zpracovává sama
knihovna a nelze je zachytit. Obsluhu se stejným jménem ale zaregistrovat lze —
proběhne až po knihovní.
Důležité: je-li nastaven runtime()->setCommandHandler(...), plný dispečer
zachytí vše a obsluhy registrované zde se nevolají.
onIntegrationStatus()¶
Volá se, když se změní stav připojení integrace (HA, Bambu, Moonraker). Volitelné zpětné volání.
IntegrationStatusCallback = std::function<void(const iDryer::IntegrationStatus&)>
onClaimComplete()¶
Zavolá se jednou, až backend potvrdí spárování — ještě než se zvedne MQTT.
ClaimCompleteCallback = void (*)(const char* deviceId)
isBound()¶
true — zařízení má trvalý tajný klíč a je spárováno s účtem.
false — režim nastavení: zařízení čeká na párovací token z aplikace nebo
flasheru. Produkt to potřebuje, aby stav ukázal člověku.
handleRevoke()¶
Zpracuje příkaz REVOKE z portálu: smaže tajný klíč a vrátí zařízení k čekání
na token. Volá se z onCommand("revoke").
mqttKey()¶
Klíč, pod kterým zařízení publikuje MQTT: před spárováním sériové číslo modulu, po něm sériové číslo kontroléru.
isOnline()¶
Vrací true, pokud je zařízení zaregistrováno a relace MQTT je aktivní.
serial()¶
Sériové číslo zařízení (řetězec z NVS, přiřazeno během claim). Prázdný řetězec před dokončením claim.
seedWifiCredentialsIfEmpty()¶
Zapíše přihlašovací údaje WiFi do NVS pouze pokud ještě nejsou nastaveny. Zavolá se před begin(). Používá se ve vývojových prostředích s pevnými přihlašovacími údaji.
setWifiCredentials()¶
Vždy přepíše přihlašovací údaje WiFi v NVS. Vývojářský pomocník a vynucené přeúčtování.
eraseClaimAndRestart()¶
Odebere token zařízení z NVS a restartuje čip. Po restartu je zařízení neregistrované — automaticky se spustí flow autom. claim. Tato funkce se nevrací.
integrationsManager()¶
Výstup na správce integrací — pro zapojení na straně produktu (Moonraker chamber target callbacks, Bambu printer status, atd.).
Vyžaduje #include <integrations/common/link_integrations_manager.h>.
// iHeater-link/src/main.cpp:337
device().integrationsManager()->setVirtualChamberCallback(onVirtualChamberUpdate);
mqttClient()¶
Výstup na SDK MQTT klienta — pro komponenty, které publikují vlastní témata nebo se integrují do směrování příkazů (např. MenuBridge).
Vyžaduje #include <mqtt/mqtt_client.h>.
devicePublisher()¶
Výstup na duální publikační pomocníka — odesílá jednu zátěž na MQTT i Local WS současně. Používá se pro odpovědi produktu, které se musí dostat na LAN klienta stejným způsobem jako automaticky publikovaná telemetrie.
runtime()¶
Výstup na SDK runtime — používá se k nastavení plného obsluhy příkazů místo fasádního dispatcheru. Po setCommandHandler(...) nejsou obsluhy registrované přes onCommand() volány přes MQTT cestu.
Důležité: volej striktně po begin() — begin() instaluje vlastní dispatcher, který musí být přepsán.
// iDryer-Storage/src/main.cpp:249
link.runtime()->setCommandHandler(handleCommand);
// Podpis obsluhy:
// void handleCommand(const char* cmd, JsonObjectConst data);
Vyžaduje #include <runtime/idryer_runtime.h>.
Telemetrická pole¶
Vyplňuje produkt v loop(). SDK je čte na časovači telemetryPeriodMs a publikuje do MQTT a Local WS.
| Pole | Typ | Příznak konfigurace | Účel |
|---|---|---|---|
telemetry.airTempC[unitId] |
float |
hasAirTemp |
Teplota vzduchu, °C |
telemetry.airHumidityPct[unitId] |
float |
hasAirHumidity |
Vlhkost, % |
telemetry.heaterTempC[unitId] |
float |
hasHeaterTemp |
Teplota topidla, °C |
telemetry.heaterPower01[unitId] |
float |
hasHeaterPower |
Výkon topidla, 0.0..1.0 |
telemetry.fanOn[unitId] |
bool |
hasFanStatus |
Stav ventilátoru |
telemetry.weightG[unitId] |
uint16_t |
hasScales |
Váha, gramy |
// iDryer-Storage/src/main.cpp:267
link.telemetry.airTempC[0] = r.temperature;
link.telemetry.airHumidityPct[0] = r.humidity;
unitId = 0 pro první (nebo jedinou) jednotku. Index musí být < Config.unitsCount.
Pole Status — stejná struktura, ale pro operační stav:
| Pole | Typ | Účel |
|---|---|---|
status.mode[unitId] |
UnitMode |
Aktuální režim jednotky |
status.targetTempC[unitId] |
float |
Cílová teplota |
status.durationS[unitId] |
uint32_t |
Požadovaná doba trvání, s (0 = neurčitá) |
status.elapsedS[unitId] |
uint32_t |
Čas uplynulý od začátku relace, s |
// iHeater-link/src/main.cpp:229
device().status.mode[0] = iDryer::UnitMode::Drying;
device().status.targetTempC[0] = cmd.targetTempC;
device().publishStatusNow();
Registrace zpětného volání přes runtime¶
Pokud je potřeba plná kontrola nad příchozími příkazy (např. produkt zpracovává get_config, set, nestandardní invoke):
// Podpis — z idryer_runtime.h
void handleCommand(const char* cmd, JsonObjectConst data);
// Registrace — striktně po link.begin()
link.runtime()->setCommandHandler(handleCommand);
cmd — řetězec příkazu ("set", "invoke", "ping", "get_config").
data — ArduinoJson JsonObjectConst s zátěží.
Při tomto přístupu nejsou obsluhy z onCommand() volány z MQTT cesty — produkt zpracovává příkazy sám.
Výčty¶
iDryer::DeviceType¶
| Hodnota | Číselně | Účel |
|---|---|---|
Unknown |
0 | Žádný / nedefinovaný |
Dryer |
1 | Sušička (iDryer LINK) |
Heater |
2 | Topidlo |
StorageLink |
4 | Storage Link (ESP32-C3 + LED) |
IHeaterLink |
5 | iHeater Link |
iDryer::UnitMode¶
Idle, Drying, Storage, Profile, Fault, Unknown
iDryer::EventKind¶
Info, Warning, Error
iDryer::RequestKind¶
Start, Stop, Storage, Find, ClearErrors
iDryer::IntegrationKind¶
Ha, Bambu, Moonraker
iDryer::IntegrationState¶
Disabled, Idle, Connecting, Online, ConfigMissing, Error
Kdy jít hlouběji¶
Fasáda je dostatečná pro většinu úkolů. Pokud potřebuješ pracovat pod úrovní fasády — s idryer::IdryerRuntime, idryer::MqttClient, idryer::cloud::LinkIntegrationsManager — podívej se do sekce Architektura.