Seite 2 von 3

Re: Modbusregister schreiben

Verfasst: 21. Nov 2024 09:40
von udo1toni
Ich denke, "momentan" wäre die richtige Formulierung, weil es schon mal funktioniert hat. Sprich, da muss der Entwickler ran und reparieren.

Ach so... Und man könnte die eigentliche Funktion (Division um 10 und ergänzen der Einheit in der einen Richtung, Multiplikation um 10 nach Strippen der Einheit in der anderen Richtung) auch mittels Script Transformation über das Profile erledigen, auch inline oder mit Parameterübergabe, z.B. um auch noch ein Offset angeben zu können. Ist halt nicht so elegant...

Re: Modbusregister schreiben

Verfasst: 21. Nov 2024 10:00
von TomW80
udo1toni hat geschrieben: 21. Nov 2024 09:40 Ich denke, "momentan" wäre die richtige Formulierung, weil es schon mal funktioniert hat. Sprich, da muss der Entwickler ran und reparieren.
Der Entwickler warte wohl noch auf Rückmeldung der Core Maintainer, daher tut sich da nichts. :(
https://community.openhab.org/t/modbus- ... 3?u=tomw80
Ich weiß nicht wie man das antriggern könnte.
udo1toni hat geschrieben: 21. Nov 2024 09:40 Ach so... Und man könnte die eigentliche Funktion (Division um 10 und ergänzen der Einheit in der einen Richtung, Multiplikation um 10 nach Strippen der Einheit in der anderen Richtung) auch mittels Script Transformation über das Profile erledigen, auch inline oder mit Parameterübergabe, z.B. um auch noch ein Offset angeben zu können. Ist halt nicht so elegant...
Wenn das so einfach wäre. :roll:
Hast du eine Idee dazu?

Re: Modbusregister schreiben

Verfasst: 21. Nov 2024 14:40
von udo1toni
Das sollte wie bei anderen Addons auch gehen. Z.B. so:

Code: Alles auswählen

Number:Temperature tempTest "Temperatur" {channel="mqtt:topic:mosquitto:test:temp"[profile="transform:DSL",toItemScript="| (Float::parseFloat(input)/10).toString + \" °C\"",commandFromItemScript="| (Float::parseFloat(input)*10).intValue"],unit="°C",stateDescription=""[pattern="%.1f %unit%"]} 
Streng genommen braucht es dabei das Anhängsel über den String gar nicht (....toString + \" °C\"), aber Du könntest an dieser Stelle z.B. auch einen Temperaturwert in °F annehmen und openHAB würde das direkt in °C umrechnen. Die einfache Variante wäre

Code: Alles auswählen

toItemScript="| Float::parseFloat(input)/10"
input ist der übergebene Wert in Form eines Strings. Deshalb muss dieser Wert zunächst geparsed werden. Da der ins Item geschriebene Wert vom Typ Float sein muss, ist hier Float::parseFloat() die richtige Funktion. Der Ausgangswert des Scripts ist - ebenso wie der Eingangswert - immer vom Typ String. openHAB parsed den Ausgangswert automatisch mit einer passenden Funktion unter Berücksichtigung von QuantityType.
In der Gegenrichtung gibt es zwei unterschiedliche Aufrufe, commandFromItemScript sollte der richtige sein. Wieder muss geparsed werden, .intValue schneidet anschließend nach der Multiplikation alle Nachkommastellen ab - schließlich wollen wir nur Ganzzahlen ans Addon weitergeben.

Ich habe die Scripte mit mqtt getestet (dort kann man allerdings direkt mit QuantityType arbeiten, der Umweg wäre also unnötig)

Es gibt für die Empfangsrichtung noch eine "fiese" Abkürzung:

Code: Alles auswählen

toItemScript="| input  + \" d°C\""
input ist per Definition bereits ein String, es wird lediglich die korrekte Einheit (Dezigrad Celsius) angehängt und den Rest erledigt die UoM Implementation. In Senderichtung funktioniert das hier leider nicht.

Die DSL ist bis zum heutigen Tag immer mit an Bord, weshalb das Beispiel auf jeden Fall funktioniert. Wahlweise kannst Du aber auch jede andere installierte Scripting Engine verwenden, z.B. auch JavaScript, Ruby oder Groovy.

Re: Modbusregister schreiben

Verfasst: 21. Nov 2024 23:39
von TomW80
udo1toni hat geschrieben: 21. Nov 2024 14:40 Das sollte wie bei anderen Addons auch gehen. Z.B. so:

Code: Alles auswählen

Number:Temperature tempTest "Temperatur" {channel="mqtt:topic:mosquitto:test:temp"[profile="transform:DSL",toItemScript="| (Float::parseFloat(input)/10).toString + \" °C\"",commandFromItemScript="| (Float::parseFloat(input)*10).intValue"],unit="°C",stateDescription=""[pattern="%.1f %unit%"]} 
...
Die einfache Variante wäre

Code: Alles auswählen

toItemScript="| Float::parseFloat(input)/10"
Danke für Deine Erkläung.
Es funktioniert. :D
Allerdings muss ich bei pattern die Unit angeben, sonst erscheint nichts.

Code: Alles auswählen

[pattern="%.1f °C"]}

Re: Modbusregister schreiben

Verfasst: 22. Nov 2024 01:51
von udo1toni
Du hast den unit-Parameter gesetzt? Und pattern="%.1f %unit%" funktioniert nicht? Strange...
Andererseits ist °C an der Stelle ja auch ok...

Re: Modbusregister schreiben

Verfasst: 22. Nov 2024 09:18
von TomW80
Ja, so siehts aktuell aus:

Code: Alles auswählen

Number input1481Int16 "Heizung Normal Raumtemperatur Istwert [%.2f °C]"    {channel="modbus:data:HovalGWTCP:inputRegisters3:holding1481:number" [profile="transform:DSL",toItemScript="| Float::parseFloat(input)/10",commandFromItemScript="| (Float::parseFloat(input)*10).intValue"],unit="°C",stateDescription=""[pattern="%.1f °C"]} 

Re: Modbusregister schreiben

Verfasst: 22. Nov 2024 09:41
von udo1toni
Welche Version von openHAB nutzt Du?
Es ist zwar eher unwahrscheinlich, dass es an der exakten Version liegt, aber mein Testsystem läuft mit OH4.3-M4, und da funktioniert %unit% im Pattern - und das sollte es auch... openHAB ersetzt %unit% automatisch mit der gewählten default Einheit für den gelieferten QuantityType, hier also °C, weil das die Si Einheit für Number:Temperature ist (und openHAB sollte auf Si eingestellt sein - Einstellungen-Regionale Einstellungen-Einheitensystem-Metrisch).

Re: Modbusregister schreiben

Verfasst: 22. Nov 2024 12:03
von peter-pan
Nur am Rande:
pattern ist: [pattern="%.1f °C"]
Formatter ist: [%.2f °C]

Re: Modbusregister schreiben

Verfasst: 23. Nov 2024 15:17
von TomW80
udo1toni hat geschrieben: 22. Nov 2024 09:41 Welche Version von openHAB nutzt Du?
Es ist zwar eher unwahrscheinlich, dass es an der exakten Version liegt, aber mein Testsystem läuft mit OH4.3-M4, und da funktioniert %unit% im Pattern - und das sollte es auch... openHAB ersetzt %unit% automatisch mit der gewählten default Einheit für den gelieferten QuantityType, hier also °C, weil das die Si Einheit für Number:Temperature ist (und openHAB sollte auf Si eingestellt sein - Einstellungen-Regionale Einstellungen-Einheitensystem-Metrisch).
Ich nutze openhab 4.2.2
Das Einheitensystem war nicht gesetzt, hab es nun auf Metrisch gesetzt, funktioniert aber trotzdem nicht.

Re: Modbusregister schreiben

Verfasst: 23. Nov 2024 15:38
von peter-pan
peter-pan hat geschrieben: 22. Nov 2024 12:03 Das Einheitensystem war nicht gesetzt, hab es nun auf Metrisch gesetzt, funktioniert aber trotzdem nicht.
Hast du OH neu gestartet ?