Funktion ausführen nur wenn sich Wert erhöht

Begonnen von hummeruli, 15 Juni 2026, 19:26:21

Vorheriges Thema - Nächstes Thema

hummeruli

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
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

passibe

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.)

hummeruli

#2
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.
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

rabehd

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.
Auch funktionierende Lösungen kann man hinterfragen.

hummeruli

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.
Beim Erstellen dieser Nachricht kamen weder Tiere zu Schaden, noch wurde Papier verschwendet. Alles von mir geschriebene ist biologisch abbaubar.


FHEM auf Debian Buster in einr Proxmox VM , LaCrosseGateway, AVR-NET-IO, Homematic, Alexa, S300TH, Signalduino..........

passibe

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.