Aktionen ohne Modus: ein Relais und Gerät rufen¶
Nach dieser Seite hat die Karte das Formular Ventilate mit einer Zeit in Minuten und im Kopf eine Taste zum Rufen des Geräts.
Was Sie brauchen¶
- ein Relaismodul mit Ansteuerung ab 3,3 V (oder einen Transistorschalter) an Pin 5;
- einen Lüfter oder eine andere Last am Relais.
Warning
Eine Last an 230 V Netzspannung nur mit Isolation, Sicherung und Gehäuse. Ohne Erfahrung mit Netzspannung mit einer Niedervoltlast aufbauen.
Code¶
#include <Arduino.h>
#include <iDryer.h>
#define RELAY_PIN 5
#define LED_PIN 8
static const iDryer::Config CFG = {
.deviceType = iDryer::DeviceType::Unknown,
.unitsCount = 1,
.hasFan = true, // Zelle „Lüfter an/aus“
.hardwareVersion = "1.0",
.firmwareVersion = "0.1.0",
.model = "Vent Relay",
};
static iDryer::Link s_link(CFG);
static uint32_t s_ventUntilMs = 0; // 0 = Relais aus
static uint8_t s_blinks = 0;
static void onVent(uint8_t, JsonObjectConst args) {
const uint32_t minutes = args["duration"].as<uint32_t>(); // 1..60
s_ventUntilMs = millis() + minutes * 60000UL;
digitalWrite(RELAY_PIN, HIGH);
s_link.telemetry.fanOn[0] = true; // ein Wechsel an/aus wird sofort veröffentlicht
}
static void onIdentify(uint8_t, JsonObjectConst) { s_blinks = 10; }
static void tick() { // alle 250 ms
if (s_ventUntilMs && (int32_t)(millis() - s_ventUntilMs) >= 0) {
s_ventUntilMs = 0;
digitalWrite(RELAY_PIN, LOW);
s_link.telemetry.fanOn[0] = false;
}
if (s_blinks) digitalWrite(LED_PIN, --s_blinks % 2);
}
void setup() {
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
s_link.begin();
s_link.onCommand("revoke", [](JsonObjectConst) { s_link.handleRevoke(); });
auto& card = s_link.card();
// Ohne Modus: die Einheit wird nicht „belegt“, das Formular bleibt auf der Karte.
card.action("vent", nullptr, onVent)
.name("ru", "Проветрить").name("en", "Ventilate")
.param("duration", "duration", 1, 60, 1, 5, "min");
// Taste „Gerät rufen“ im Kartenkopf.
card.action("identify", nullptr, onIdentify).deviceClass("identify");
s_link.every(250, tick);
}
void loop() {
s_link.loop();
}
So funktioniert es¶
- Eine Aktion ohne Modus (
mode=nullptr) macht die Einheit nicht „belegt“: die Karte zeigt keinen Sitzungsblock, das Formular bleibt stehen. - Der Purpose
durationist eine Zeit in Minuten: das Feld bekommt die Beschriftung Zeit, die Grenzen kommen aus.param(...). hasFanliefert die Zelle „Lüfter an/aus“. Einen Wechsel vontelemetry.fanOnveröffentlicht der Kern sofort, ohne auf die Periode zu warten..deviceClass("identify")ist die feste Taste zum Rufen des Geräts im Kartenkopf;clear_errorsist das Zurücksetzen von Fehlern.
Prüfen¶
Stellen Sie auf der Karte eine Zeit ein und tippen Sie auf Ventilate: das Relais schaltet ein, die Lüfterzelle zeigt „an“. Die Ruftaste im Kopf lässt die LED des Boards blinken.