2 Number item Verbinden zu einem (neg pos Werte)

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: 2 Number item Verbinden zu einem (neg pos Werte)

Beitrag von udo1toni »

Ja, das kommt davon...

Probiere es bitte mal so:

Code: Alles auswählen

Number:Power AkkuLoad "Akku Leistung" {channel="inChannel"[profile="transform:DSL",toItemScript="|if(Float::parseFloat(input)> 0 ) - Float::parseFloat(input)"],
                                       channel="outChannel"[profile="transform:DSL",toItemScript="|if(Float::parseFloat(input)> 0 )Float::parseFloat(input)"], 
                                       unit="W", stateDescription=""[pattern="%.3f kW"]} 
Falls der Channel eine Einheit mitliefert, wird auch das nicht korrekt funktionieren, falls aber keine Einheit geliefert wird, sollte es klappen.

Wenn die Einheit mit kommt, wäre dies hier möglich:

Code: Alles auswählen

Number:Power AkkuLoad "Akku Leistung" {channel="inChannel"[profile="transform:DSL",toItemScript="|if(Float::parseFloat(input.substring(0,input.length -2))> 0 ) - Float::parseFloat(input.substring(0,input.length -2))"],
                                       channel="outChannel"[profile="transform:DSL",toItemScript="|if(Float::parseFloat(input.substring(0,input.length -2))> 0 )Float::parseFloat(input.substring(0,input.length -2))"], 
                                       unit="W", stateDescription=""[pattern="%.3f kW"]} 
Zugegeben - das sieht nicht mehr so übersichtlich aus... ;) Es ginge auch in jeder anderen installierten Scriptsprache, wobei die unterschiedlichen Sprachen hier unterschiedliche Möglichkeiten bieten :)
Der Ausdruck

Code: Alles auswählen

Float::parseFloat(input.substring(0,input.length -2))
interpretiert den übergebenen String als Float Zahl, wobei die letzten zwei Zeichen des Strings abgeschnitten werden. Sollte als Einheit also mehr als (z.B.) kW übergeben werden (das müsste dann auch in die Unit des Items...), müsste man die Anzahl abgeschnittener Zeichen anpassen. Das Leerzeichen zwischen Zahl und Einheit sollte hingegen beim Parsen keine Probleme bereiten.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

nw378
Beiträge: 296
Registriert: 22. Sep 2018 10:38
Answers: 5

Re: 2 Number item Verbinden zu einem (neg pos Werte)

Beitrag von nw378 »

Alternativ könnte man statt

Code: Alles auswählen

input.substring(0,input.length -2)
auch

Code: Alles auswählen

input.split(" ").get(0)
nehmen.
Wenn keine Einheit vorhanden ist, wird nix abgetrennt, und wenn eine vorhanden ist (egal, wie viele Buchstaben) wird beim Leerzeichen getrennt.
openHAB 4.3.3 @ RPi 4 / SSD - InfluxDB2 und Grafana @ Synology Docker - KNX

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: 2 Number item Verbinden zu einem (neg pos Werte)

Beitrag von Harka »

Moin,
Frage: reicht es nicht aus einfach ein Minuszeichen davor zu kleben? Das hätte den Vorteil, dass es egal ist ob der Wert mit oder ohne Einheit rein kommt. Mit Javascript habe ich gerade folgendes erfolgreich getestet

Code: Alles auswählen

| parseFloat(input) > 0 ? '-' +  input : 0

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

Re: 2 Number item Verbinden zu einem (neg pos Werte)

Beitrag von udo1toni »

Nein, das Problem ist, dass der Wert nur dann ins Item geleitet werden darf, wenn er sich von 0 unterscheidet. Die Werte kommen über unterschiedliche Channel und werden zusammengeführt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Harka
Beiträge: 489
Registriert: 30. Apr 2021 13:13
Answers: 19

Re: 2 Number item Verbinden zu einem (neg pos Werte)

Beitrag von Harka »

Sorry, den Teil meine ich auch nicht. Kommt nur falsch rüber weil ich es mir mit der Testumgebung (zu)einfach gemacht habe.
Dir Frage bezieht sich auf den true-Teil. Wenn der Rückgabewert einer Transformation als String auswertbar sein muss, könnte er doch gleich auch als solcher behandelt werden. Kp ob es in DSL nennenswert mehr Arbeit macht. Spricht was dagegen den Wert einfach um ein Minuszeichen zu erweitern?

mad-mike
Beiträge: 491
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: 2 Number item Verbinden zu einem (neg pos Werte)

Beitrag von mad-mike »

hmm, Vielen Dank schonmal für eure Mühen.

Aber egal welchen Teil ich hier Versuche, immer gibt eine Meldung:

Code: Alles auswählen

Number:Power Sunket "Sunket" {channel="modbus:data:tcpBridge:inputPoller:Akku_load:number"[profile="transform:DSL",toItemScript="|if(Float::parseFloat(input.substring(0,input.length -2))> 0 ) - Float::parseFloat(input.substring(0,input.length -2))"],
                                       channel="modbus:data:tcpBridge:inputPoller:Akku_watt:number"[profile="transform:DSL",toItemScript="|if(Float::parseFloat(input.substring(0,input.length -2))> 0 )Float::parseFloat(input.substring(0,input.length -2))"], 
                                       unit="W", stateDescription=""[pattern="%.3f kW"]} 
Oder so:

Code: Alles auswählen

Number:Power Sunket "Sunket" {channel="modbus:data:tcpBridge:inputPoller:Akku_load:number"[profile="transform:DSL",toItemScript="|if(Float::parseFloat(input)> 0 ) - Float::parseFloat(input)"],
                                       channel="modbus:data:tcpBridge:inputPoller:Akku_watt:number"[profile="transform:DSL",toItemScript="|if(Float::parseFloat(input)> 0 )Float::parseFloat(input)"], 
                                       unit="W", stateDescription=""[pattern="%.3f kW"]}                                       

Ergibt diesen Fehler:

Code: Alles auswählen

2025-06-17 22:16:34.870 [ERROR] [.module.script.profile.ScriptProfile] - Failed to process script 'DSL|if("parse.float(input) > 0 ) - parse.float(input)"': Could not get script for UID 'DSL|if("parse.float(input) > 0 ) - parse.float(input)"'.

2025-06-17 22:16:34.872 [ERROR] [.module.script.profile.ScriptProfile] - Failed to process script 'DSL|if("parse.float(input) > 0 ) - parse.float(input)"': Could not get script for UID 'DSL|if("parse.float(input) > 0 ) - parse.float(input)"'.

:oops:
Gruss mad-mike

openHABian 4.3.5 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: 2 Number item Verbinden zu einem (neg pos Werte)

Beitrag von udo1toni »

Bist Du sicher, dass Du auf Version 4.3.5 bist?
Im Übrigen passt die Fehlermeldung nicht zur Itemdefinition.

Code: Alles auswählen

'DSL|if("parse.float(input) > 0 ) - parse.float(input)"'
Man beachte die Anführungszeichen (also die doppelten), die gehören da nicht hin (vor allem nicht nach der öffnenden Klammer vom if)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 491
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: 2 Number item Verbinden zu einem (neg pos Werte)

Beitrag von mad-mike »

Bist Du sicher, dass Du auf Version 4.3.5 bist?

Code: Alles auswählen

openHAB 4.3.5 - Release Build
Im Übrigen passt die Fehlermeldung nicht zur Itemdefinition.
:mrgreen:

So steht es im Log... ;)

Ähm, bin ja manchmal blöd, kann das Problem schon von einem Step früher kommen??

Code: Alles auswählen

        Thing data Akku_watt "Akku"                       [ readStart="1010", readValueType="uint16", readTransform="JS:komma.js"]
        Thing data Akku_load "Akku_load"                  [ readStart="1012", readValueType="uint16", readTransform="JS:komma.js"]


Im Übrigen so sind die Item direkt verlinkt:

Code: Alles auswählen

Number Akku_watt "Akku Watt [%.1f W]" <flow> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:Akku_watt:number"}
Number Akku_laden "Akku_laden [%.1f W]" <energy> (gGrowatt) {channel="modbus:data:tcpBridge:inputPoller:Akku_load:number"}
Oder gibts da eventuell ein Konflikt, wenn ich die Item in der Wechselrichter übersicht aktiv lasse? :idea:
Gruss mad-mike

openHABian 4.3.5 auf Raspberry Pi 4 Mod. b (8GB) ;)

Antworten