Ausreisser unterdrücken

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
rebell21
Beiträge: 125
Registriert: 23. Aug 2024 09:34
Answers: 0

Ausreisser unterdrücken

Beitrag von rebell21 »

ich habe einen CO2 Sensor mit einem ESP32 gebaut. Der funktioniert ganz gut. Aber sporadisch liefert der Sensor (MH-Z19C) Ausreisser. Plötzlich kommt da ein Messwert von 20.000 ppm, obwohl der Sensor stundenlang 403 ppm geliefert hat. Ich habe ihn zum Test in der Außenluft betrieben.

Dieser Ausreisser stört natürlich die grafische Auswertung.

Wie sollte ich den sinnvollerweise unterdrücken ? Ich könnte das bereits an der Quelle in C++ machen, indem ich Werte verwerfe, die x % von den vorherigen Werten abweichen. Dann würden Ausreisser überhaupt nicht bei openhab landen. Könnte ich das auch noch in openhab machen und so verhindern, dass diese in der Datenbank gespeichert werden. Wie macht Ihr das ?

nw378
Beiträge: 295
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: Ausreisser unterdrücken

Beitrag von nw378 »

Du könntest zum Beispiel in der .persist Datei einen Filter setzen.
Dann ändert sich zwar der Wert des Items, der Ausreißer wandert aber nicht in die Datenbank.

https://www.openhab.org/docs/configura ... ld-filter
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Harka
Beiträge: 487
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: Ausreisser unterdrücken

Beitrag von Harka »

Moin,
wenn OH -> schau Dir mal das Basic_Profile-Binding an, speziell conditions="$DELTA.... https://www.openhab.org/addons/transfor ... cprofiles/
Alternativ kannst Du bei MQTT-Cannels auch einen Maximalwert festlegen. Meine erste Wahl wäre aber die Quelle des Übels anzugehen.

rebell21
Beiträge: 125
Registriert: 23. Aug 2024 09:34
Answers: 0

Re: Ausreisser unterdrücken

Beitrag von rebell21 »

Danke für Eure Hinweise. Aber ich habe es direkt im Sensor an der Quelle in C++ mit einer globalen Variablen int CO2_alt gemacht

Werte, die mehr als 1.5 mal so hoch sind wie der Vorgängerwert werden unterdrückt und Werte die kleiner als die Hälfte des Vorgängerwertes

Code: Alles auswählen


server.on("/CO2", HTTP_GET, [](AsyncWebServerRequest * request) {         //co2 Route 

    MHZ19C.measure();
    
    int akt_co2 = getCO2() ;
 
    if ( (akt_co2 > int (CO2_alt * 1.5)) || (akt_co2 < int(CO2_alt / 2 )) ) {  // Wert verwerfen, wenn er zu hoch ist oder zu gering
      akt_co2 = CO2_alt ;  
    }

    char buf[20] ;

    snprintf(buf,sizeof(buf),"[\"%d ppm\"]\n",akt_co2);

    request->send(200, "text/plain", buf);
    CO2_alt = akt_co2 ;
 }   

Aber die Openhab Filter im persist config sind elegant

Antworten