Hallo liebe Gemeinde!
Eines vorweg: ich nutze OpenHABian seit ziemlich genau einem halben Jahr und bin voll begeistert von den Möglichkeiten und habe mir auch schon erfolgreich einiges zusammengebaut. Ich nutze ausschließlich die PaperUI zur Verwaltung und Konfiguration meiner Things, Rules schreibe ich mit VSC und evtl. noch ein paar Items ebenfalls in VSC, wenn die Rules es erfordern. Als Frontend nutze ich ausscchließlich das HABPanel.
Mein aktuelles "Problem" (ok, es ist nur Makulatur, aber trotzdem

):
Ich habe von meiner Netatmo Wetterstation ein Item, das den Luftdruck liefert. Das ist ein float oder vielleicht sogar double Item mit 380 Nachkommastellen. Das caste ich auf int, weil ich gern nur eine Ganzzahl hätte/brauche für die Darstellung im HABPanel.
Das Ganze sieht ungefähr so aus:
Code: Alles auswählen
var tWZ_Pressure = ((netatmo_NAMain_e3a674ca_70ee5017dcbc_Pressure.state as QuantityType<Number>).intValue)
tWZ_Pressure wird dann in ein Item WZ_Pressure geschrieben (postUpdate) und WZ_Pressure wird dann im HABPanel mittels Dummy Widget angezeigt (wie Luftfeuchtigkeit, Lautstärke, etc. auch schon). Soweit auch alles gut!
Dabei nutze ich auch die integrierten Symbole, welche aufgrund des Wertes des Items die Darstellung entsprechend anpassen. Zum Teil nutze ich auch selbsterstellte SVGs, was auch funktioniert.
ABER: Im Gegensatz zur (z.B.) Luftfeuchtigkeit funktioniert das bei dem Luftdruck Item nicht. Hier habe ich das Standard "pressure" icon genommen als benutzerdefiniertes Symbol, und habe dabei folgende SVG Files erstellt:
Die Idee war jetzt, da die Icons ja entsprechend dem Wert des Items gewählt werden (normalerweise zwischen 0 und 100, on oder off, oder 0 und 4) das auch hier für den Luftdruck mit entspr. Angabe des Wertes zu realisieren. D.h. bei einem WZ_Pressure Wert von 1023 sollte das Symbol "pressure-1016" angezeigt werden - wird es aber nicht. HABPanel nimmt - unabhängig des Wertes (der aber als Zahl immer korrekt angezeigt wird im Dummy Widget) das Standard "pressure.svg" Symbol.
Funktionert also die korrekte Darstellung des werteabhängigen Symbols nur bei Werten zwischen 0 und 100? Bei dem QualityOfService Icon gehts ja mit 0,1,2,3,4 - bei der Lautstärke gehts mit 0,33,66,100 - beim Licht auch von 0 - 100 in 10er Schritten, etc.
Weiß hier jemand was oder kann mich mal in die richtige Richtung kicken...?
Danke euch und allzeit ein smartes Home!

von BGrosse » 19. Mär 2021 19:58
Soooo... also es geht grundsätzlich schon, Werte oberhalb der 100er Grenze darzustellen!
Allerdings:
1.) Ohne Weiteres nur, wenn man Symbolnamen ("name-1234567") nutzt, die genau den Wert haben, den man darstellen will (z.B. 1234567). Für meinen Fall ungeeignet, da ich für meinen Wertebereich von 950 bis 1050 dann 101 Symbole bräuchte => theoretisch machbar, praktisch völliger Blödsinn.
2.) Mit Weiterem lässt sich alles machen, wenn man JS Transforms nutzt. Dabei wird der Originalwert z.B. in einer Variablen (var) in einer Rule "downscaled" (durch Berechnung) und in einem Item gespeichert. Diesen downscaled Wert dieses Items übergibt man dann im HABpanel an ein entspr. Widget - dann wird das Symbol korrekt ausgewählt, wenn der downscaled Wert im Bereich zwischen 0 und 100 liegt. Parallel dazu lässt man eine JS Transformation den downscaled Wert des Items wieder "upscalen" - dieser erscheint dann wieder als Originalzahlenwert in besagtem Widget.
Bei mir sieht das jetzt so aus:
ITEM:
Code: Alles auswählen
Number T_WZ_Pressure "Luftdruck Wohnzimmer transformiert [JS(pressure.js):%s]"
DSL RULE:
Code: Alles auswählen
rule "Downscale air pressure value for displaying a dynamic symbol in HABpanel (with JS upscaling)"
when
// when pressure update received
Item netatmo_NAMain_e3a674ca_70ee5017dcbc_Pressure received update
then
logInfo("Sensor.rules", "Pressure is: " + netatmo_NAMain_e3a674ca_70ee5017dcbc_Pressure.state.toString)
// typeCast the pressure to an int value (no float and no UoM) and downscale 950...1050 to 0...100 (for dynamic symbol update)
var tWZ_Pressure = ((netatmo_NAMain_e3a674ca_70ee5017dcbc_Pressure.state as QuantityType<Number>).intValue - 950)
logInfo("Sensor.rules", "Downscaled Pressure is: " + tWZ_Pressure.toString)
// update T_WZ_Pressure to show in HabPanel
postUpdate(T_WZ_Pressure, tWZ_Pressure)
end
PRESSURE.JS
Code: Alles auswählen
// Transformation of already downscaled pressure value (no UoM) up to the original pressure value
(function(i) {
// convert the delivered string i to Intvalue and add 950
var value = ( parseInt(i) + 950 );
return value;
})(input)
Zu erwähnen ist hier noch, dass der in der ITEM Definition dem pressure.js übergebene "Wert" immer als String übergeben wird. Daher muss man im JS file erst den übergebenen "Wert" in eine Zahl wandeln, bevor man damit mathematisch operieren kann. Übergibt man z.B. den downscaled Wert "60" und addiert dann 950, käme als Ausgabe im Widget 60950, also einfach die Verkettung des übergebenen Strings "60" plus die "950". Daher das parseInt(i) - dann operiert das Script mit Zahlen und aus dem + wird kein Verkettungsoperator, sondern die gewollte mathematische Addition.
Wenn man's mal geschnallt hat, eigentlich ganz einfach...
Hier noch der Link ins neudeutsche Forum:
https://community.openhab.org/t/user-de ... l/116782/7
Gehe zur vollständigen Antwort