userReadings um Werte zu filtern?

Begonnen von dreizehn, 19 Juni 2023, 19:59:18

Vorheriges Thema - Nächstes Thema

dreizehn

Hallo Zusammen!

Kontext:
Ich habe einen Temperatursensor der hin und wieder unsinnige Werte liefert. Meist -100 (°C). Diese Werte möchte ich einfach weg filtern.

Idee:
Wenn der Wert Sinnvoll ist soll er in ein neues Reading geschrieben werden. Der Originalwert ist "temperature" der neue, gefilterte soll "temperatureFilter" sein.

Ausführung:
Ich habe folgendes userReadings angefügt:

temperatureFilter {if (ReadingsNum($name,"temperature",-101) > -99) {return ReadingsNum($name,"temperature",0);}}

Problem:
temperatureFilter ist im Fehlerfall nicht bei -100 sondern bei 0. Es wird anscheinend ein else interpretiert, ich möchte aber den Wert nicht schreiben.

Frage;
Gibt es eine schöne, elegante Lösung?

Liebe Grüße

betateilchen

temperatureFilter {(ReadingsNum($name,"temperature",-101) > -99) ? ReadingsNum($name,"temperature",0) : undef}
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

frober

Falls du das Reading weiter verarbeitest, setze ein
attr <Device> oldreadings temperature
und geben diesen Wert zurück (OldReadingsNum()).
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

betateilchen

Was hat das oldreading mit der gestellten Frage zu tun?
Da würde doch auch nur ein falscher Wert landen.

Wenn beim Setzen des userReading ein undef zurückkommt, wird der im reading vorhandene Wert nicht angetastet. Der neue (unsinnige) Wert wird ignoriert und es kann immer noch auf den vorherigen Wert zugegriffen werden.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Beta-User

Evtl. sollte es auch gehen, mit einer readingsChange-Instanz die "falschen" Events ganz zu löschen.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

betateilchen

Dann geh ich jetzt Popcorn holen, setze mich auf meine Couch und bin gespannt, wer letztendlich den kompliziertesten Lösungvorschlag hier reinschreibt...

Den gewünschten (!!!) Lösungsweg hatte der Fragesteller ja in seinem ersten Beitrag eindeutig beschrieben, er wusste lediglich nicht genau, wie man das umsetzt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

frober

Zitat von: betateilchen am 22 Juni 2023, 13:58:00Was hat das oldreading mit der gestellten Frage zu tun?
Da würde doch auch nur ein falscher Wert landen.

Wenn beim Setzen des userReading ein undef zurückkommt, wird der im reading vorhandene Wert nicht angetastet. Der neue (unsinnige) Wert wird ignoriert und es kann immer noch auf den vorherigen Wert zugegriffen werden.

Bei undef wird der vorhandene Wert nicht angetastet, wusste ich nicht.
Danke für die Aufklärung.

Sollte nur ein Tip sein, sorry.
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...

dreizehn

Vielen Dank!
Die Lösung von betateilchen funktioniert für mich perfekt. Es hat aber etwas gedauert bis der Sensor wieder "falsche" Werte lieferte. undef war mir bisher noch nicht bekannt, wieder etwas gelernt.

frober

Zitat von: frober am 22 Juni 2023, 12:22:02Falls du das Reading weiter verarbeitest, setze ein
attr <Device> oldreadings temperature
und geben diesen Wert zurück (OldReadingsNum()).


...und sorry nochmals, ich benutze natürlich (noch, zukünftig undef) das Zielreading (hier temperatureFilter) als OldReading...
Raspi 3b mit Raspbian Bullseye und relativ aktuellem Fhem,  FS20, LGW, PCA301, Zigbee, MQTT, MySensors mit RS485(CAN-Receiver) und RFM69, etc.,
einiges umgesetzt, vieles in Planung, smile

********************************************
...man wächst mit der Herausforderung...