Přeskočit obsah

Přidání senzoru

Kdy použít

Pokud zařízení potřebuje periodicky číst fyzický senzor (teplota, vlhkost, váha, atd.) a publikovat údaje do cloudu nebo LAN klienta — použij tento návod.

Hotový kód

Zkopíruj do svého projektu a nahraď MyClimate názvem své třídy:

// MyClimate.h — ovladač senzoru produktu
#pragma once
#include <stdint.h>

class MyClimate {
public:
    bool  begin();
    void  tick(uint32_t nowMs);  // bez blokování, bez delay()
    float temperature() const;
    float humidity()    const;
    bool  ok()          const;
};
// main.cpp
#include <iDryer.h>
#include "MyClimate.h"

static const iDryer::Config CFG = {
    .deviceType        = iDryer::DeviceType::StorageLink,
    .unitsCount        = 1,
    .hasAirTemp        = true,
    .hasAirHumidity    = true,
    .telemetryPeriodMs = 10000,
    .hardwareVersion   = "1.0",
    .firmwareVersion   = "1.0.0",
};

static iDryer::Link  s_link(CFG);
static MyClimate     s_climate;
static bool          s_sensorOk = false;

void setup() {
    s_sensorOk = s_climate.begin();
    s_link.begin();
}

void loop() {
    s_link.loop();

    if (s_sensorOk) {
        s_climate.tick(millis());
        if (s_climate.ok()) {
            s_link.telemetry.airTempC[0]       = s_climate.temperature();
            s_link.telemetry.airHumidityPct[0] = s_climate.humidity();
        }
    }
    // Publikování je automatické, na časovači telemetryPeriodMs z Config.
}

Vysvětlení

Produkt pouze vyplňuje pole s_link.telemetry.* v loop(). Fasáda je publikuje do MQTT a Local WS každých Config.telemetryPeriodMs milisekund sama — není třeba ručně volat publishTelemetryNow(). Toto je klíčový rozdíl od manuálního MQTT: žádné StaticJsonDocument, žádné publishTelemetry, žádna samostatná třída publisheru.

Pokud potřebuješ publikovat údaje okamžitě mimo časovač — zavolej s_link.publishTelemetryNow().

Příznaky hasAirTemp / hasAirHumidity v Config řídí, která pole se objevují v JSON. Pole, jehož příznak je false, se nepublikuje.

Úplný seznam telemetrických polí: Telemetrická pole.

Plný příklad v repo

Referenční implementace: Sht31ClimateSensor + vyplnění s_link.telemetry.airTempC[0] / s_link.telemetry.airHumidityPct[0] v iDryer-Storage/src/main.cpp.