Seite 1 von 1

Zugriff auf Einheit aus Label

Verfasst: 16. Sep 2019 08:28
von Tokamak
Hallo,

wenn man in das Label eines Items die Statusdarstellung einträgt, also sowas wie

Code: Alles auswählen

Number Leistung "Leistung [%d W]"
steht in item.label nur "Leistung" ohne "[%d W]".

Wie kann ich in einer Rule auch an den Part "[%d W]" herankommen? Irgendwo muss es ja stehen...

Danke

Re: Zugriff auf Einheit aus Label

Verfasst: 16. Sep 2019 11:35
von peter-pan
Das ist ein Suffix(Pattern) für die Aufbereitung des Wertes und dient der Darstellung in BasicUI, etc. Ich glaube nicht, dass man das so einfach ändern kann.
Wenn du ein Item hast, dass per UoM gesteuert ist steht dieser Suffix auf jeden Fall auch im Status (Wert) des Items (item.state). Was möchtest du denn genau machen?

Re: Zugriff auf Einheit aus Label

Verfasst: 16. Sep 2019 13:38
von Tokamak
Ändern möchte ich es auch gar nicht, zumal ich komplett textbasiert arbeite.

Ich protokolliere für die Außenwelt Items in CSV-Dateien, unabhängig von irgendwelchen OH-Persistenzlösungen.

Das baue ich generisch. Alle Member in einer Gruppe werden protokolliert, ohne dass ich die Rule anpacken muss, wenn sich die Gruppenmember ändern.

Um die Spaltennamen in der CSV zu generieren, würde ich das Label des Items nutzen, sofern vorhanden. Gut gefallen würde mir, wenn ich wüsste, ob es sich bei einem NumberItem um ein Integer oder ein Float handelt und welche Einheit es hat. Beides steht im Pattern.
Die Einheit würde ich dann in den Spaltennamen mit aufnehmen.

Das geht natürlich auch anders, etwa mit einem Tag. Es wäre eben nur praktisch.

Re: Zugriff auf Einheit aus Label

Verfasst: 16. Sep 2019 17:39
von udo1toni
Das Label selbst habe ich noch nie ausgewertet, ich befürtchte aber, dass es nicht so einfach ist, das auszuwerten, weil Steuerzeichen enthalten sind. Wie die Konfiguration genau gespeichert wird, müsste man im Zweifel über den Source Code raus suchen oder einen der Entwickler fragen.

Wenn es sich um UoM Items handelt, könnte man versuchen, über Item.unit die Einheit herauszubekommen. Zumindest zeigt mir VSCode diese Methode an. Ob das funktioniert, habe ich aber nicht ausprobiert.
Im Pattern steht nur, wie der Wert in der UI dargestellt werden soll, aber nicht, welcher Wert sich wirklich dahinter verbirgt.

Re: Zugriff auf Einheit aus Label

Verfasst: 16. Sep 2019 22:35
von peter-pan
Ich weiss zwar nicht ob das Sinn macht oder generisch funktioniert, aber evtl. bietet des Rest-Api hier eine Möglichkeit ?!
Beispiel eines Items:

Code: Alles auswählen

String OutValue "Value: " { http="<[http://192.xxx.yyy.zz:8080/rest/items/localDayTempAVG_0:60000:JSONPATH($.stateDescription.pattern)]"}
Das Ergebnis im Item sieht dann so aus:

Code: Alles auswählen

openhab> smarthome:items list | grep  -i OutValue
OutValue (Type=StringItem, State=%.1f %unit%, Label=Value: , Category=null)
openhab>
Der JSON sieht hier so aus:

Code: Alles auswählen

{
  "link": "http://192.xxx.yyy.zz:8080/rest/items/localDayTempAVG_0",
  "state": "18.65 °C",
  "stateDescription": {
    "pattern": "%.1f %unit%",
    "readOnly": false,
    "options": []
  },
  "editable": false,
  "type": "Number:Temperature",
  "name": "localDayTempAVG_0",
  "label": "Temperatur Ø Heute",
  "category": "temperature",
  "tags": [],
  "groupNames": [
    "gOWM1"
  ]
}
Evtl. lässt sich das in einer Rule auswerten und die einzelnen Felder dann entsprechend in einer Variablen konkatenieren.

Re: Zugriff auf Einheit aus Label

Verfasst: 17. Sep 2019 00:16
von udo1toni
Merke: Wenn etwas sehr kompliziert zu programmieren ist, denkst Du verkehrt ;)

Gut, es kann auch sein, dass der Erfinder/Entwickler schlicht etwas vergessen hat, und das mag in diesem Fall sogar so sein, auf der anderen Seite ist aber schon das Ansinnen, den Event Bus über CSV dateien zu sichern, ziemlich am Konzept von openHAB vorbei.
Es gab mal die logging persistence, die hätte man für so etwas verwenden können, oder man erledigt das über MySQL oder eine andere SQL Datenbank (die haben dann meist auch Exportfilter nach CSV).

Re: Zugriff auf Einheit aus Label

Verfasst: 17. Sep 2019 07:50
von Tokamak
Wie ich an anderer Stelle schon schrieb, habe ich KNX und einen HS 3. Der kann (nur) CSV-Dateien schreiben, in denen ich Zählerstände, Tagessummen und Maximalwerte protokolliere, um sie auswerten zu können. Die Auswertungsinfrastruktur besteht seit Jahren.
Das Schreiben der Archive in OH übernehmen bei mir keine 100 Zeilen Code. Das ist ein zu geringer Preis, um das alles "auf neu" umzustellen.

Die item.unit schaue ich mir an, auch das JSON. Habt vielen Dank für die Ideen.

An den Gedanken, dass das REST-Interface mehr Informationen ausspuckt, als mir in den Rules direkt über die Objekte zur Verfügung stehen, muss ich mich noch gewöhnen. Es widerspricht all meiner Erfahrung.

Re: Zugriff auf Einheit aus Label

Verfasst: 17. Sep 2019 10:24
von udo1toni
Das REST Interface ist im Gegenteil die einzige Stelle, an der alle Informationen bereitstehen :)

Natürlich steht es Dir frei, die Daten in welcher Form auch immer weiter zu verarbeiten ;) allerdings fehlt Dir ja immer noch die Einheit und das Format (und wie ich erwähnt habe, ist das Format nur eine Festlegung der Darstellung, wenn die Zahl nur mit einer Nachkommastelle dargestellt wird, muss der Status noch lange nicht nur eine Nachkommastelle haben. Nur weil als Format Wh angegeben ist, heißt das noch lange nicht, dass diese Einheit auch korrekt ist (es sei denn, es handelt sich um UoM Items, da sollte das schon so sein).
In diesem Fall kann man natürlich davon ausgehen, dass Du die korrekten Einheiten angegeben hast ;)

Es ging mir mehr darum,festzustellen, dass es wesentlich einfachere Wege gibt.

Re: Zugriff auf Einheit aus Label

Verfasst: 18. Sep 2019 08:05
von Tokamak
Tatsächlich steht in item.unit die Einheit. Zuvor hatte ich nur im Interface von GenerlcItem nachgesehen und war nicht auf die Idee kommen, dass die speziellen Item-Klassen eigene Attrinbute haben könnten :roll:

Für das Format habe ich es mit einfach gemacht. Als String umgewandelt schaue ich mir an, ob ein . drin ist. Wenn nein, protokolliere ich den String, ansonsten reichen mir 3 Nachkommastellen.