FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: hummeruli am 15 Juni 2026, 19:26:21

Titel: Funktion ausführen nur wenn sich Wert erhöht
Beitrag von: hummeruli am 15 Juni 2026, 19:26:21
Leider stehe ich gerade voll au dem Schlauch.
Ich brauche eine Art Zähler der immer dann wenn sich ein Wert erhöht ein Relais schaltet. Wenn sich der Wert verringert, dann darf er nichts machen.

Also zum Beispiel:

Zähler = 0                  "keine Reaktion"
Zähler wechselt von 0 > 1   "Relais schaltet eine Sekunde (mit ON-FOR-TIMER 1)"
Zähler wechselt von 1 > 2   "Relais schaltet eine Sekunde (mit ON-FOR-TIMER 1)"
''
Zähler wechselt von 7 > 5   "keine Reaktion"
Zähler wechselt von 3 > 0   "keine Reaktion"

Würde mich freuen wenn mir jemand einen Schubser geben könnte.

Danke

Uli
Titel: Aw: Funktion ausführen nur wenn sich Wert erhöht
Beitrag von: passibe am 15 Juni 2026, 19:41:48
Wo steht denn der Zähler bzw. wo kommt er her?
Wenn er aus einem Reading kommt, dann kannst du vermutlich mittels attr oldreadings <readingName> und OldReadingsNum() arbeiten. Dann kannst du alten und neuen Wert vergleichen, also z.B.
if (ReadingsNum("device", "readingName", "1") > OldReadingsNum("device", "readingName", "2")) {
    fhem("set relay on");
}
(Nur der Vollständigkeit halber, um oldreadings verwenden zu können, muss das jeweilige Reading ein Event erzeugen. Wenn es nicht funktioniert also im Event Monitor schauen, ob das der Fall ist und wenn nicht, dann event-on-* anpassen.)
Titel: Aw: Funktion ausführen nur wenn sich Wert erhöht
Beitrag von: hummeruli am 15 Juni 2026, 19:46:56
Zitat von: passibe am 15 Juni 2026, 19:41:48Wo steht denn der Zähler bzw. wo kommt er her?
Wenn er aus einem Reading kommt, dann kannst du vermutlich mittels attr oldreadings <readingName> und OldReadingsNum() arbeiten. Dann kannst du alten und neuen Wert vergleichen, also z.B.
if (ReadingsNum("device", "readingName", "1") > OldReadingsNum("device", "readingName", "2")) {
    fhem("set relay on");
}
(Nur der Vollständigkeit halber, um oldreadings verwenden zu können, muss das jeweilige Reading ein Event erzeugen. Wenn es nicht funktioniert also im Event Monitor schauen, ob das der Fall ist und wenn nicht, dann event-on-* anpassen.)

Danke für die schelle Antwort, aber wenn ich deinen Code verstehe macht er es ja nur von 1 > 2. Oder?

Es geht darum um bei einem Unifi Cloudkey der an FHEM angebunden ist ein Relais jedes mal wenn ein Gerät sich einloggt zu schalten. Wenn Jemand das WLAN verlässt juckt es nicht.
Titel: Aw: Funktion ausführen nur wenn sich Wert erhöht
Beitrag von: rabehd am 15 Juni 2026, 20:42:56
Zitat von: hummeruli am 15 Juni 2026, 19:46:56macht er es ja nur von 1 > 2. Oder?
nein.

Tipp: Bitte mal nachlesen zu ReadingsNum und OldReadingsNum.
Titel: Aw: Funktion ausführen nur wenn sich Wert erhöht
Beitrag von: hummeruli am 15 Juni 2026, 20:49:42
Wenn ich das aber richtig verstehe, so wird das Relais nur einmal eingeschaltet und bleibt an. Ich brauche ja dass das Relais jedes mal wenn sich der Wert erhöht, für eine Sekunde anzieht (ON-FOR-TIMER 1.
Titel: Aw: Funktion ausführen nur wenn sich Wert erhöht
Beitrag von: passibe am 16 Juni 2026, 02:08:04
Zitat von: hummeruli am 15 Juni 2026, 19:46:56macht er es ja nur von 1 > 2
Nein. Das > ist "größer als". 1 > 2 kann also schon gar nicht true werden und den Code im if ausführen, weil 1 nicht größer 2 ist.

Die 1 und 2 in den Klammern sind die Defaultwerte, d.h. das, was (Old)ReadingsNum ausgibt, wenn das Reading nicht existiert oder aus irgendeinem anderen Grund nicht ausgelesen werden kann. Ich habe diese Defaultwerte extra so gewählt, dass, sollten beide Defaultwerte zum Einsatz kommen, das if nicht ausgeführt wird. Einfach zur Sicherheit. Vermutlich wäre es besser die 2 auf irgendeine hohe Zahl, 9999999 oder so, zu ändern.

on-for-timer kannst du ja einfach benutzen, statt nur on.