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 ?
Ausreisser unterdrücken
-
- Beiträge: 295
- Registriert: 22. Sep 2018 10:38
Re: Ausreisser unterdrücken
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
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
-
- Beiträge: 487
- Registriert: 30. Apr 2021 13:13
Re: Ausreisser unterdrücken
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.
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.
-
- Beiträge: 125
- Registriert: 23. Aug 2024 09:34
Re: Ausreisser unterdrücken
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
Aber die Openhab Filter im persist config sind elegant
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 ;
}