event-on-change-reading invertieren?

Begonnen von HB86, 02 November 2016, 18:36:03

Vorheriges Thema - Nächstes Thema

HB86

Hallo,

ich hab eine Frage zu event-on-change-reading. Bei dem Attribut kann ich ja einen Bereich angeben, sodass nur ein neues Event erzeugt wird wenn der nächste Wert ausserhalb des Bereiches ist.
Kann man das auch irgendwie invertieren, sodass die Werte nur ein Event erzeugen wenn sie innerhalb eines angegebene Bereiches sind?

Wäre für Hilfe dankbar!

Hollo

Der Wert zu dem Attribut gibt keinen "Bereich", sondern mehr den "Abstand" an; z.B. Temperaturänderung um mehr als 0,5K.
Also um welche "Differenz" der neue Wert vom vorherigen abweichen muss (unabhängig ob positiv oder negativ), damit ein Event erzeugt wird.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

HB86

Danke für die Antwort. Aber die Funktion von event-on-change ist mir schon klar.
Hab mich vielleicht etwas missverständlich ausgedrückt.

Wenn ich dein Beispiel aufgreife, möchte ich nicht dass das Event erzeugt wird wenn sich der Wert mindestens um 0.5 ändert sondern nur wenn sich der Wert um maximal 0.5 ändert.

Hintergrund ist, dass meine Temperatursensoren öfter mal falsche Werte liefern, z.B. -20°C oder +60°C Innentemperatur.
Und ich möchte nicht das solche Werte ein Event auslösen.

Hollo

Verstehe, das macht Sinn. Habe aber leider keine direkte Idee zur Umsetzung.

Wenn Du das Event nicht "verhindern" kannst, könntest Du evtl. die Verarbeitung verhindern, indem Du diese von einer Bedingung "Differenz neuer Wert zu altem Wert ist max. x Kelvin" abhängig machst!?
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

HB86

Ich weiß nicht genau ob das Sinn macht? Von der Raumtemperatur ist halt meine Heizungssteuerung abhängig.

Wie müsste denn sowas aussehen?

Gesendet von meinem D5803 mit Tapatalk


EIB-Fan

Hallo HB86,

du kannst mit OldValue +0.5 und -0.5 den alten Wert zu dem aktuellen Wert vergleichen.

Habe da aktuell kein Beispiel.

Such mal im Forum nach OldValue.

Viel Erfolg!

Gruß jens

HB86

Ich find dazu nicht wirklich was passendes!  :(

Gibts nicht irgendwie eine Möglichkeit festzulegen in welchen Bereich sich Readings bewegen dürfen, z.B. Temperatur zw. 10 bis 40°C, und alles andere wird ignoriert.

HB86


herrmannj

da gehst Du am besten über ein userreading. Dort hinterlegst Du Deine Prüfung als perl code und regelst anschließend anhand des neu generierten readings,

vg
joerg

HB86

Wie mach ich das genau? Hab leider nicht wirklich Ahnung von Perl.

Gesendet von meinem D5803 mit Tapatalk


HB86

Wäre für Hilfe sehr dankbar!

Gesendet von meinem D5803 mit Tapatalk


marvin78

In der Regel läuft das hier so, dass man die Stichworte, die einem gegeben werden nimmt, danach in der Doku sucht, die Doku verinnerlicht, es danach selbst versucht und wenn das nicht klappt, hier mit dem entsprechenden Code frage, was ggf. falsch ist. Du willst ja sicher lernen weil man schneller alleine vorwärts kommt. Fertige Lösungen geben ist kaum zielführend ;)

HB86

Danke für die überaus hilfreiche Antwort  ;)

Die Doku habe ich mir schon angesehen. userReadings hab ich auch verstanden. Allerdings sind da ja nur Berechnung angegeben. Ich will meine Werte ja nicht wirklich weiterverarbeiten, sondern nur in einem Bereich eingrenzen.
Ich versteht halt nicht wie ich in Perl einen Wertebereich festlegen kann. Dazu habe ich leider nix passendes gefunden.

Habe schon ewig gesucht!

marvin78

Vielleicht kommt jemand, der dir eine fertige Lösung liefert. Ich werde das nicht sein denn ich habe noch nichts gesehen, was du probiert hast. Ich gebe dir aber den wirklich hilfreichen Tipp, dich ein wenig mir Perl zu beschäftigen. Das wird dir nachhaltig sehr helfen. Du wirst um userReading einfach ein wenig mit if....else und Vergleichen arbeiten müssen um den Wertebereich abzustecken. Wirklich schwer ist das nicht.

Ein unkonkretes Beispiel:


attr DEVICE userReadings newReading:oldReading.* {ReadingsNum($name,"oldReading",-1)<20 && ReadingsNum($name,"oldReading",-1)>10?ReadingsNum($name,"oldReading",-1):ReadingsNum($name,"newReading",-1)}