Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Beitrag von Pepe1907 »

Hallo ihr Lieben,
Habe folgendes Problem:

Ich habe einen Ultraschallsensor am Teich installiert der mir den aktuellen Wasserstand durchgibt.
Dieser Wert wird in einem String-Item geschrieben und dann in ein Number-Item umgeschrieben.
Nur haut der Sensor mir in unregelmäßigen Abständen fehlerhafte Werte raus. (circa 1 mal die Wochen)
Dieses sieht dann in dem Graphen relativ bescheiden aus.
teich.items

Code: Alles auswählen

String 	teichstring  						{channel="exec:command:teichstand:output"}
Switch 	teichmessung 						{channel="exec:command:teichstand:run"}
Number 	teichstand2	"Wasserstand [%.1f cm]" <flow>
Number  teichchart
teichstand.rules

Code: Alles auswählen

rule "Teichstand"
  when
     Item teichstring received update
    then

        teichstand2.postUpdate(Float::parseFloat(teichstring.state.toString))
 
end
Würde gerne nur teichstand2 "postUpdaten" wenn teichstring einen gültigen Zahlenwert liefert z.B. in meinem Bereich zwischen 100 - 120.
Ist dieses Möglich? oder muss ich noch ein Number Item dazwischen schalten
von udo1toni » 27. Aug 2020 00:10
Du musst nur die Rule entsprechend formulieren. z.B.:

Code: Alles auswählen

rule "Teichstand"
when
    Item teichstring received update
then
    var Number nWater = Float::parseFloat(teichstring.state.toString)
    if(nWater >= 100 && nWater <= 120)
        teichstand2.postUpdate(nWater)
    else
        logWarn("teich","Teich Füllhöhe Messfehler: {} ({})",teichstring.state,nWater)
end
Es ist hier sinnvoll, mit einer Variablen zu arbeiten. Man könnte auch den Ausdruck verwenden, aber so ist es doch erheblich übersichtlicher.
Falls die Füllhöhe außerhalb des Bereichs liegt, erfolgt hier noch eine Warnmeldung im Log, das kann man natürlich auch weg lassen.

Auch wenn die fixen Werte immer passen sollten, wäre es eventuell sinnvoller, zu prüfen, wie sehr der neue wert vom alten Wert abweicht. so:

Code: Alles auswählen

rule "Teichstand"
when
    Item teichstring received update
then
    var Number nWater = Float::parseFloat(teichstring.state.toString)
    var Number nOld = nWater
    if(teichstand2.state instandeof Number)
        nOld = teichstand2.state as Number
    if(nWater - nOld <= 1 && nWater - nOld >= -1)
        teichstand2.postUpdate(nWater)
    else
        logWarn("teich","Teich Füllhöhe Messfehler: {} ({}) alter Wert: {}",teichstring.state,nWater,nOld)
end
Der neue Wert darf also maximal +/-1 vom letzten Wert abweichen. Für den Fall, dass noch kein Wert vorliegt (Neustart des Systems) wird der aktuelle Wert genutzt. Natürlich sollte dann nicht gerade die erste Messung einen komplett falschen Wert liefern...
Die Ober/Untergrenze ist hier getrennt zu verstellen. Ob das notwendig ist, hängt von verschiedenen Faktoren ab, die nur Du kennst :) aber im Zweifel ist diese Variante leicht realisierbar.
Gehe zur vollständigen Antwort

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Beitrag von udo1toni »

Du musst nur die Rule entsprechend formulieren. z.B.:

Code: Alles auswählen

rule "Teichstand"
when
    Item teichstring received update
then
    var Number nWater = Float::parseFloat(teichstring.state.toString)
    if(nWater >= 100 && nWater <= 120)
        teichstand2.postUpdate(nWater)
    else
        logWarn("teich","Teich Füllhöhe Messfehler: {} ({})",teichstring.state,nWater)
end
Es ist hier sinnvoll, mit einer Variablen zu arbeiten. Man könnte auch den Ausdruck verwenden, aber so ist es doch erheblich übersichtlicher.
Falls die Füllhöhe außerhalb des Bereichs liegt, erfolgt hier noch eine Warnmeldung im Log, das kann man natürlich auch weg lassen.

Auch wenn die fixen Werte immer passen sollten, wäre es eventuell sinnvoller, zu prüfen, wie sehr der neue wert vom alten Wert abweicht. so:

Code: Alles auswählen

rule "Teichstand"
when
    Item teichstring received update
then
    var Number nWater = Float::parseFloat(teichstring.state.toString)
    var Number nOld = nWater
    if(teichstand2.state instandeof Number)
        nOld = teichstand2.state as Number
    if(nWater - nOld <= 1 && nWater - nOld >= -1)
        teichstand2.postUpdate(nWater)
    else
        logWarn("teich","Teich Füllhöhe Messfehler: {} ({}) alter Wert: {}",teichstring.state,nWater,nOld)
end
Der neue Wert darf also maximal +/-1 vom letzten Wert abweichen. Für den Fall, dass noch kein Wert vorliegt (Neustart des Systems) wird der aktuelle Wert genutzt. Natürlich sollte dann nicht gerade die erste Messung einen komplett falschen Wert liefern...
Die Ober/Untergrenze ist hier getrennt zu verstellen. Ob das notwendig ist, hängt von verschiedenen Faktoren ab, die nur Du kennst :) aber im Zweifel ist diese Variante leicht realisierbar.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 27. Aug 2020 00:10 Du musst nur die Rule entsprechend formulieren. z.B.:

Code: Alles auswählen

rule "Teichstand"
when
    Item teichstring received update
then
    var Number nWater = Float::parseFloat(teichstring.state.toString)
    if(nWater >= 100 && nWater <= 120)
        teichstand2.postUpdate(nWater)
    else
        logWarn("teich","Teich Füllhöhe Messfehler: {} ({})",teichstring.state,nWater)
end
Es ist hier sinnvoll, mit einer Variablen zu arbeiten. Man könnte auch den Ausdruck verwenden, aber so ist es doch erheblich übersichtlicher.
Falls die Füllhöhe außerhalb des Bereichs liegt, erfolgt hier noch eine Warnmeldung im Log, das kann man natürlich auch weg lassen.

Auch wenn die fixen Werte immer passen sollten, wäre es eventuell sinnvoller, zu prüfen, wie sehr der neue wert vom alten Wert abweicht. so:

Code: Alles auswählen

rule "Teichstand"
when
    Item teichstring received update
then
    var Number nWater = Float::parseFloat(teichstring.state.toString)
    var Number nOld = nWater
    if(teichstand2.state instandeof Number)
        nOld = teichstand2.state as Number
    if(nWater - nOld <= 1 && nWater - nOld >= -1)
        teichstand2.postUpdate(nWater)
    else
        logWarn("teich","Teich Füllhöhe Messfehler: {} ({}) alter Wert: {}",teichstring.state,nWater,nOld)
end
Der neue Wert darf also maximal +/-1 vom letzten Wert abweichen. Für den Fall, dass noch kein Wert vorliegt (Neustart des Systems) wird der aktuelle Wert genutzt. Natürlich sollte dann nicht gerade die erste Messung einen komplett falschen Wert liefern...
Die Ober/Untergrenze ist hier getrennt zu verstellen. Ob das notwendig ist, hängt von verschiedenen Faktoren ab, die nur Du kennst :) aber im Zweifel ist diese Variante leicht realisierbar.
Vielen Dank Udo, du bist mit Gold nicht zu bezahlen.
Eine Verständnisfrage bleibt aber, wieso muss ich in dieser rule die variablen vorher nicht definieren?
Werde es gleich mal ausprobieren aber denke es wird wie immer klappen bei deinen Regeln :)

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Beitrag von udo1toni »

Wieso? Die einzigen verwendeten Variablen sind nWater und nOld, die sind in der Rule definiert.
Da die Variablen immer zu Beginn der Rule mit dem aktuellen Wert gefüllt werden, reicht es, sie lokal zu definieren (das heißt, in anderen Rules stehen die Variablen nicht zur Verfügung).


Gesendet von iPad mit Tapatalk
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Beitrag von Pepe1907 »

udo1toni hat geschrieben: 27. Aug 2020 15:03 Wieso? Die einzigen verwendeten Variablen sind nWater und nOld, die sind in der Rule definiert.
Da die Variablen immer zu Beginn der Rule mit dem aktuellen Wert gefüllt werden, reicht es, sie lokal zu definieren (das heißt, in anderen Rules stehen die Variablen nicht zur Verfügung).


Gesendet von iPad mit Tapatalk
Hat mal wieder alles extrem gut funktioniert.
Habe die Werte auf meine Bedürfnisse angepasst und was soll ich sagen wie immer perfekt.
Vielen dank nochmal

Pepe1907
Beiträge: 167
Registriert: 1. Jun 2020 17:29
Answers: 2

Re: Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Beitrag von Pepe1907 »

2021-04-06 22:05:15.790 [vent.ItemStateChangedEvent] - teichstring changed from 101.478834629

101.4' to a state type which item 'teichstand2' accepts: [DecimalType, QuantityType, UnDefType].

2021-04-06 22:05:15.799 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Teichstand': Could not cast 101.462479115
Es funktioniert leider nicht mehr

Benutzeravatar
udo1toni
Beiträge: 15271
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Beitrag von udo1toni »

Es scheint, dass da ein ungültiger String geliefert wird:

Code: Alles auswählen

101.478834629

101.4
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Antworten