Přeskočit obsah

Hranice: knihovna a produkt

Co je v knihovně

Knihovna (`lib/idryer-core/`) obsahuje:

  • Celý stack sítě: WiFi, HTTP, MQTT, TLS.
  • Protokol provisioning/claiming.
  • Stavový stroj cloudu (`CloudStateMachine`).
  • UART most a frame protokol.
  • Integrační klienty (Bambu, HA, Moonraker).
  • Rozhraní zařízení (`IWifiManager`, `ICredentialStore`, `IHttpClient`, `IProfile`).
  • Arduino implementace těchto rozhraní.
  • MQTT témata a logika publish/subscribe.

Test na kód patřící do knihovny: jakýkoli produkt s jakýmkoli hardwarem jej může používat bez modifikace.

Co je v produktu

Produkt (`src/`) obsahuje:

  • Implementaci `IProfile` — konfiguraci, informační zátěž, `applyConfig`.
  • Obchodní logiku specifickou pro zařízení (LED kontrola, sušení, topení).
  • Obsluhy `onInvoke` / `onSetCommand`.
  • Senzory produktu a publikování telemetrie.
  • Inicializaci periférie (FastLED, Wire, ImprovWiFi).
  • Kořen kompozice v `main.cpp`.

Test na kód patřící do produktu: bez změny hardwaru nebo konfigurace je to bezvýznamné.

Konkrétní příklady

Kód Kde žije Proč
`MqttClient` knihovna každý produkt potřebuje MQTT
`CloudStateMachine` knihovna provisioning/claiming je stejné pro všechny
`ArduinoWifiManager` knihovna WiFi připojení nezávisí na produktu
`LedStripProfile` produkt specifické pro Storage Link
`LedStripExecutor` produkt řídí FastLED, není potřeba pro jiná zařízení
`Sht31ClimateSensor` produkt specifický senzor pro konkrétní produkt
`StorageTelemetryPublisher` produkt zná formát telemetrie Storage Link
`IProfile` knihovna smlouva, kterou knihovna volá
`BambuClient` knihovna integrace je znovu použita přes iDryer a iHeater

Rozhraní jako hranice

Knihovna zná produkt pouze přes `IProfile`. Veškerá interakce probíhá přes pět metod:

```cpp profile->onOnline(); // knihovna → produkt: poprvé online profile->loop(); // knihovna → produkt: každý cyklus profile->buildInfoJson(buf, len); // knihovna → produkt: potřeba informační zátěž profile->getConfig(doc); // knihovna → produkt: potřeba konfigurace profile->applyConfig(id, val); // knihovna → produkt: přijat set příkaz ```

Produkt zná knihovnu přes `MqttClient` (pro publikování telemetrie/events) a přes zpětná volání `ActionDispatcher` (pro příkazy).

Co nesmí překročit hranici

  • Knihovna nesmí zahrnovat hlavičky produktu.
  • Produkt nesmí volat `CloudStateMachine::handleProvisioning()` nebo jiné privátní metody stack přímo — jen skrze veřejné API.
  • Telemetrie produktu se publikuje přímo skrze `s_mqtt.publishTelemetry()` — runtime ji nevidí.