Seite 1 von 1

Analogwert in Prozent umrechnen - MQTT

Verfasst: 17. Jul 2022 17:32
von Acrobat88
Moin Community,

ich habe shcon sie Suche damit beauftragt aber aus keinem thread wurde ich schlau. Ich habe einen Sensor der mir einen Analogwert per MQTT über den ESP32 an OH3 gibt. Nun würde ich gerne die Analogranche 448-864 in Prozent angezeigt haben. Ich habe das Item schon als Percent item angelegt ich kann ja dann auch minimal und maximal angeben jedoch hat das nur eimen unter 1% tigen Shiet angezeigt.
Hat jemand eine leichte Umsetzung ohne irgendwelche Dateien anzulegen oder andere Items?!

Beste

Karl

Re: Analogwert in Prozent umrechnen - MQTT

Verfasst: 17. Jul 2022 20:55
von udo1toni
So geht das nicht. Minimum und Maximum sind Werte für das Senden von Werten. Der Empfang kann ja nicht beeinflusst werden. Es ist auch nicht so, dass Du eine Range vorgeben kannst und dann daraus automatisch 100 % werden.
Wohl aber kannst Du ein JavaScript Script anlegen, was das für Dich erledigt.

Du konfigurierst dafür eine incomingValueTransformation und setzt dort JS:dateiname.js als Wert ein.

JS steht für die JavaScript Transformation, welche Du verständlicherweise aus den Addons installieren musst.

dateiname.js bezeichnet die Datei mit diesem Namen, welche im Ordner /etc/openhab/transform/ liegen muss. Der Dateiname muss auf .js enden. Wie immer gilt, dass Groß/Kleinschreibung beachtet wird, Datei.js ist eine andere Datei als dAtei.js.

Inhalt der Datei:

Code: Alles auswählen

(function(i) {
    var myVal = (i - 448)/416*100; 
    if(myVal < 0) {
        myVal = 0;
    }
    if(myVal > 100) {
        myVal = 100;
    }
    return Math.round(myVal);
})(input)
448 ist dabei der Minimalwert, der dann als 0 % angezeigt werden soll. 416 ergibt sich aus 864-448, das ist also der Maximalwert, der als 100 dargestellt werden soll. Deshalb wird der aktuelle Wert durch 416 geteilt und anschließend mit 100 multipliziert. Kommt bei der Berechnung ein negativer Wert raus, wird der Wert auf 0 korrigiert, kommt ein Wert über 100 raus, wird der Wert auf 100 korrigiert. Abschließend wird der gerundete Wert ausgegeben.
Weil der Wert über die incomingValueTransformation bearbeitet wird, landet der Wert exakt so im Channel, als Wert 0 - 100. Von dort aus geht der Wert in das Number Item der Wahl.

Re: Analogwert in Prozent umrechnen - MQTT

Verfasst: 18. Jul 2022 01:43
von Acrobat88
Lieber udo1toni,

vielen Dank das du mir wieder mal weiter hilfst!
Leider ist das Feld schon mit dem Befehl "JSONPATH:$.ANALOG.A0" besetzt...Wie kann ich beide Befehle dnen in ein Feld schreiben?

Beste

Karl

Re: Analogwert in Prozent umrechnen - MQTT

Verfasst: 18. Jul 2022 01:53
von Acrobat88
Ha ich habe eine Lösung!

Code: Alles auswählen

JSONPATH:$.ANALOG.A0∩JS:percenttrans.js
Jedoch ist mir dieses Zeichen was die beiden Ausdrücke verbindet noch nie in den letzten 27 Jahren am Computer untergekommen?!

Re: Analogwert in Prozent umrechnen - MQTT

Verfasst: 18. Jul 2022 19:17
von udo1toni
Genau.
Super, dass Du es sogar selbst rausgefunden hast. Es handelt sich um das mathematische Zeichen für "Schnittmenge", was naturgemäß auf der normalen Tastatur nicht vorhanden ist.
Der einfachste Weg ist, das Zeichen aus dem Hilfstext in der UI zu kopieren, wo der Trick mit dem Verketten mehrerer Transformations auch anhand eines Beispiels erklärt wird.

Es hätte übrigens noch eine weitere Möglichkeit gegeben, und zwar kann man im Link zwischen Channel und Item ebenfalls die Transformations nutzen, dort über das "Profile" des Links. Auch dort hättest Du also das JavaScript Script unterbringen können.

Re: Analogwert in Prozent umrechnen - MQTT

Verfasst: 18. Jul 2022 19:24
von Acrobat88
ich habe da doch noch eine Frage:

ich hab das Problem das die Prozent genau falsch herum sind. Es sind jetzt 100% bei vollkommener Trockenheit und 0% bei kompletter Nässe. Wie bekomme ich den Wert denn negiert?...Umkehrbruch?!?

Beste Grüße und großen Dank

Karl

Re: Analogwert in Prozent umrechnen - MQTT

Verfasst: 18. Jul 2022 19:49
von udo1toni
Na, dann muss die Formel den Wert halt noch von 100 abziehen:

Code: Alles auswählen

var myVal = 100 - (i - 448)/416*100; 
Rest identisch...