Zum Inhalt

Einen Sensor hinzufügen

Wann man dies verwenden sollte

Wenn das Gerät periodisch einen physischen Sensor auslesen muss (Temperatur, Luftfeuchtigkeit, Gewicht usw.) und die Messwerte an die Cloud oder einen LAN-Client veröffentlichen soll — verwenden Sie dieses Rezept.

Schlüsselfertig-Code

Kopieren Sie in Ihr Projekt und ersetzen Sie MyClimate durch Ihren Klassennamen:

// MyClimate.h — product sensor driver
#pragma once
#include <stdint.h>

class MyClimate {
public:
    bool  begin();
    void  tick(uint32_t nowMs);  // non-blocking, no 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();
        }
    }
    // Publishing is automatic, on the telemetryPeriodMs timer from Config.
}

Erklärung

Das Produkt füllt nur die s_link.telemetry.* Felder in loop() auf. Die Fassade veröffentlicht sie auf MQTT und Local WS alle Config.telemetryPeriodMs Millisekunden von selbst — es ist nicht nötig, publishTelemetryNow() manuell aufzurufen. Dies ist der Hauptunterschied zum manuellen MQTT: Keine StaticJsonDocument, keine publishTelemetry, keine separate Publisher-Klasse.

Wenn Sie Messwerte sofort außerhalb des Timers veröffentlichen müssen — rufen Sie s_link.publishTelemetryNow() auf.

Die Flags hasAirTemp / hasAirHumidity in Config steuern, welche Felder im JSON erscheinen. Ein Feld mit dem Flag false wird nicht veröffentlicht.

Vollständige Liste der Telemetriefelder: Telemetrie-Felder.

Vollständiges Beispiel im Repo

Referenzimplementierung: Sht31ClimateSensor + Füllung von s_link.telemetry.airTempC[0] / s_link.telemetry.airHumidityPct[0] in iDryer-Storage/src/main.cpp.