mqtt payload dividieren

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
Asus
Beiträge: 25
Registriert: 27. Dez 2018 22:31
Answers: 0

mqtt payload dividieren

Beitrag von Asus »

Hallo, brauch wieder mal Hilfe.

Verwende openHAB 2.5.10-1 + binding-mqtt - 2.5.10

Ich schicke von einem Arduino Mega via MQTT die millisekunden millis().
Die Zahl ist natürlich sehr groß. Deshalb möchte ich z.B. durch 1000 dividieren.
Mir ist klar, das kann ich am Arduino problemlos machen, möchte aber aus Interesse das in OH2 lösen.

Subscribe ich am Broker das topic, wo mein Wert drinnen ist, kommt z.B. "PVX/millis 7394608"
Ich kann das dann in xyz.things mit

Code: Alles auswählen

Thing topic PVX "PVX" @ "PVX" {
    Channels:
        Type number : PVX_millis "PXV_millis" [stateTopic="PVX/millis" ]
  }
den Wert abholen und in einem items file xyz.items zuweisen.

Code: Alles auswählen

Number PV_millis "PV millis" <temperature> (fast) { channel="mqtt:topic:mosquitto:PVX:PVX_millis", autoupdate="false"}
Soweit funktioniert alles bestens.

Nun möchte ich durch z.b. 1000 dividieren und habe gelesen ,das soll via Profile? und JS gehen.

Dazu JS-file erstellt .....transform/divide_by_1000.js

Code: Alles auswählen

(function(i) {
    var test = parseFloat(i) /1000.0;
	return test;
})(input)
und das itemsfile geändert.

Code: Alles auswählen

Number PV_millis "PV millis" <temperature> (fast) { channel="mqtt:topic:mosquitto:PVX:PVX_millis"[profile="transform:JS", function="divide_by_1000"]}
Aber nun kommt die Fehlermeldung im Log
Could not transform state '7669508' with function 'divide_by_1000' and format '%s'
Schon mehrere Varianten ausprobiert, aber ich komm nicht weiter.
wo muss ich schrauben?

Danke, solong.
Verwende openHAB 2.5.10-1 auf RasPi

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

Re: mqtt payload dividieren

Beitrag von udo1toni »

Du könntest versuchen, die Konvertierung direkt im Channel einzubauen transformationPattern heißt der Parameter, wenn ich mich richtig erinnere.

Es kann aber sein, dass die Fehlermeldung ein wenig in die Irre führt... Eventuell ist das eigentliche Problem, dass die JS Funktion einen String zurück liefert. Solange man das im Label verwendet, spielt das keine Rolle, wenn der Wert aber als Value übergeben werden soll, muss die Funktion zwingend auch Number zurückliefern.
Das ist aber nur so eine Idee, in welche Richtung Du suchen könntest.
openHAB4.3.6 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet

Asus
Beiträge: 25
Registriert: 27. Dez 2018 22:31
Answers: 0

Re: mqtt payload dividieren

Beitrag von Asus »

Danke Udo
Ich arbeite zwar mit dem System, hab aber viele Zusammenhänge noch nicht durchblickt.
udo1toni hat geschrieben: 21. Mär 2021 12:39 Du könntest versuchen, die Konvertierung direkt im Channel einzubauen transformationPattern heißt der Parameter, wenn ich mich richtig erinnere.
Ich generiere im things-file einen Broker-> Thing -> Channel - denke ich. Dort könnte ich ein

Code: Alles auswählen

transformationPattern="JSONPATH:$.SI7021.Temperature"
einfügen.
Aber ich habe jetzt noch keine anderen transformationPattern gesehen, die sich nicht auf einen JSON String beziehen. Aber ich habe ja nur einen Wert
" PVX/millis 10114675 " topic=PVX/millis Message/Payload=10114675. Das ist keine JSON String? (https://www.openhab.org/addons/transfor ... /jsonpath/)

Aber beides topic und message werden als (normaler) String geliefert wird.
udo1toni hat geschrieben: 21. Mär 2021 12:39 Es kann aber sein, dass die Fehlermeldung ein wenig in die Irre führt... Eventuell ist das eigentliche Problem, dass die JS Funktion einen String zurück liefert. Solange man das im Label verwendet, spielt das keine Rolle, wenn der Wert aber als Value übergeben werden soll, muss die Funktion zwingend auch Number zurückliefern.
Das wäre eine gute Idee, habe ich ausprobiert. Müsste ja dann mit Item als String behoben sein

Code: Alles auswählen

String PV_millis "PV millis" <temperature> (fast,DS1820,G_tPV)	{ channel="mqtt:topic:mosquitto:PVX:PVX_millis"[profile="transform:JS", function="divide_by_1000"]}
hat aber auch nicht geklappt, gleicher Fehler.
udo1toni hat geschrieben: 21. Mär 2021 12:39 Das ist aber nur so eine Idee, in welche Richtung Du suchen könntest.
Noch eine Idee. Unter PaperUI->Configuration->Things->PVX->Channels habe ich PVX_millis. Das kann ich dann editieren -> show more
Da habe ich dann unter "Outgoing Value Format" %s kann dies jedoch nicht ändern bzw. save (ERROR: 409 - Conflict), was ja OK ist, weil ich alles über ein bzw. mehrere Textfiles mache.

Was mich verunsichert ist, da es viele Beiträge im Web gibt, die, so wie ich es mache, ein JS file mit der einfachen Rechnung verwenden und bei allen scheint es zu funktionieren und die haben keine Probleme mit dem Rückgabewert.
Habe auch schon versucht einfach einen String "eeeee" zurück zu geben (Items war dann natürlich Sting). Aber leider :?

Vieleicht gibts ja noch Ideen (oder Lösungen?)

Danke, solong.
Verwende openHAB 2.5.10-1 auf RasPi

Asus
Beiträge: 25
Registriert: 27. Dez 2018 22:31
Answers: 0

Re: mqtt payload dividieren

Beitrag von Asus »

Ergänzung.

Wie unter https://www.openhab.org/addons/transfor ... avascript/
beschrieben wird bei format %s der input unverändert an die JS function weitergegeben (ist bei mir string-denk ich).
Die JS function ist auch funktionsfähig, wie mit dem Tester, auf der openhab seite beschrieben, getestet.
Verwende openHAB 2.5.10-1 auf RasPi

Antworten