Seite 1 von 1

HabPanel - wertegesteuertes benutzerdefiniertes Symbol funktioniert nicht

Verfasst: 11. Feb 2021 11:43
von BGrosse
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 :D):
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:
  • pressure.svg
  • pressure-0.svg
  • pressure-100.svg
  • pressure-950.svg
  • pressure-966.svg
  • pressure-983.svg
  • pressure-1000.svg
  • pressure-1016.svg
  • pressure-1033.svg
  • pressure-1050.svg
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...? :shock:

Danke euch und allzeit ein smartes Home!
;)

Re: HabPanel - wertegesteuertes benutzerdefiniertes Symbol funktioniert nicht

Verfasst: 11. Feb 2021 14:33
von udo1toni
Also, ich würde schon erwarten, dass auch Zahlen oberhalb von 100 funktionieren. Ich habe das aber nie ausprobiert und aus der Erinnerung steht dazu leider nichts in der Doku. Wäre eine Frage im englischen Forum wert...

Re: HabPanel - wertegesteuertes benutzerdefiniertes Symbol funktioniert nicht

Verfasst: 11. Feb 2021 16:08
von BGrosse
Danke Dir udo1toni für die Antwort... Wenn sogar der Papst sagt, dass er es so erwarten würde (wie ich), dann hab ich ja spontan wohl nicht alles falsch gemacht :)

Dann werd ich mich mal ins neudeutsche Forum begeben müssen - sollte es eine Lösung dafür geben, werde ich sie natürlich auch hier posten!

Re: HabPanel - wertegesteuertes benutzerdefiniertes Symbol funktioniert nicht

Verfasst: 19. Mär 2021 19:58
von BGrosse
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... :lol:

Hier noch der Link ins neudeutsche Forum: https://community.openhab.org/t/user-de ... l/116782/7