Seite 1 von 1

Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Verfasst: 26. Aug 2020 13:04
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

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

Verfasst: 27. Aug 2020 00:10
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.

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

Verfasst: 27. Aug 2020 13:51
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 :)

Fehlmessungen nicht in Number-Item schreiben( Fehlmessungen ignorieren)

Verfasst: 27. Aug 2020 15:03
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

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

Verfasst: 28. Aug 2020 13:36
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

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

Verfasst: 6. Apr 2021 22:07
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

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

Verfasst: 6. Apr 2021 23:36
von udo1toni
Es scheint, dass da ein ungültiger String geliefert wird:

Code: Alles auswählen

101.478834629

101.4