Hauptmenü

neue svg-Funktion: card

Begonnen von Damian, 04 April 2021, 12:58:15

Vorheriges Thema - Nächstes Thema

Damian

Version 0.7 behebt das Problem, dass nach einem Neustart des Systems card nicht dargestellt wurde.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#16
Eincheck-Kandidat Ver. 0.8. Ringgrößen wurden vereinheitlicht, Überschrift mit Icon ausgerichtet. Die Collector-Angabe col ohne Zahl ist auf 24h voreingestellt.

Es sind keine Warnung mehr bei mir gekommen. Wenn keine Probleme oder Verbesserungsvorschläge mehr gemeldet werden, dann werde ich diese Version bald einchecken.

Hier der aktuelle Layoutvergleich ohne und mit Header.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

xenos1984

Sieht sehr gut aus!

Was sich mir noch nicht ganz erschließt ist der Mechanismus der Datensammlung. Was triggert denn das Speichern eines neuen Wertes im Ringspeicher? Reicht es dafür, die Funktion card irgendwo (z.B. in der myUtils) eingebaut zu haben? Muss man sie regelmäßig aufrufen? Oder muss sie in einem DOIF mit uiTable stehen?

rabehd

Was wird in der unteren Zeile dargestellt?
Ich vermute min-max, aber da wären entweder die Dreiecke vertauscht oder die Werte.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

#19
Zitat von: xenos1984 am 07 April 2021, 14:34:47
Sieht sehr gut aus!

Was sich mir noch nicht ganz erschließt ist der Mechanismus der Datensammlung. Was triggert denn das Speichern eines neuen Wertes im Ringspeicher? Reicht es dafür, die Funktion card irgendwo (z.B. in der myUtils) eingebaut zu haben? Muss man sie regelmäßig aufrufen? Oder muss sie in einem DOIF mit uiTable stehen?

Es ist etwas tricky. Die Angabe [<device>:<reading>:col<zahl>] muss irgendwo im DOIF stehen, damit entsprechende Triggermechanismen vom Modul aufgesetzt werden können. Das Ergebnis der Angabe ist aber kein Wert, sondern eine Referenz auf einen Hash mit den gesammelten Daten.

Die card-Funktion erwartet als ersten Parameter diese Referenz, um auf die erforderlichen Informationen, die dort abgelegt sind, zuzugreifen.

Da card eine Perlfunktion ist, kann man sie natürlich auslagern. Wichtig ist, dass in uiTable die Angabe mit [dev:reading:col] angegeben wird, damit das Modul entsprechende Triggermechanismen aufsetzen kann.

Im Gegensatz zu anderen SVG-Funktionen würde card z. B. in devIcon nicht funktionieren, weil der entsprechende Hash mit den gesammelten Daten fehlen würde.

Was aber funktioniert ist so etwas:

defmod di_collect_test DOIF ##
attr di_collect_test uiTable {package ui_Table;;\
  sub test {\
    my ($value)=@_;;\
    card($value,undef,"weather_rain_gauge",0,100,undef,undef,"unit")\
  }\
}\
test([test:state:col1])\
## entspricht card([test:state:col1],undef,"weather_rain_gauge",0,100,undef,undef,"unit")


Man kann natürlich auch auf die internen Daten über die Referenz zugreifen, wenn man den Aufbau kennt:

z. B.

${[test:state:col1]}{value}

liefert den aktuellen Wert, hinter [test:state:col1] verbirgt sich auch nur eine Perlfunktion.

Auf diese Weise hat man alle Möglichkeiten, die es in Perl gibt, für den Anwender bleibt dagegen die Definition überschaubar, ohne dass man ihm die internen Mechanismen erklären muss.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Zitat von: rabehd am 07 April 2021, 15:34:08
Was wird in der unteren Zeile dargestellt?
Ich vermute min-max, aber da wären entweder die Dreiecke vertauscht oder die Werte.

ja, wenn Pfeil nach oben das Maximum anzeigen soll und nicht dass es heraufgeht, weil es ein Minimum ist, dann muss ich die noch tauschen. :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rabehd

Zitat von: Damian am 07 April 2021, 15:51:59
ja, wenn Pfeil nach oben das Maximum anzeigen soll und nicht dass es heraufgeht, weil es ein Minimum ist, dann muss ich die noch tauschen. :)
Ich würde es so sehen.
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Neue Version wurde eingecheckt.

siehe: https://svn.fhem.de/trac/browser/trunk/fhem/FHEM?order=date&desc=1

Man kann jetzt beim Headertext auch Style-Attribute angeben.

Doku kommt wie immer ins Wiki.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

rabehd

card ($collected_reading,$title,$icon,$min,$max,$minColor,$maxColor,$unit,$func,$decfont,$model,$lightness)

Ich spiele mit $minColor und $maxColor herum. Ohne sichtbae Veränderung.
Welche Anzeige sollte sich da eigentlich ändern?
Auch funktionierende Lösungen kann man hinterfragen.

Damian

Zitat von: rabehd am 07 April 2021, 20:15:15
card ($collected_reading,$title,$icon,$min,$max,$minColor,$maxColor,$unit,$func,$decfont,$model,$lightness)

Ich spiele mit $minColor und $maxColor herum. Ohne sichtbae Veränderung.
Welche Anzeige sollte sich da eigentlich ändern?

Vom Ring und Plot, es sei denn du hast eine colorFunction angegeben

Zu den Farbverläufen im Plot muss man sagen, dass sie sich immer am höchsten dargestellten Punkt des Plots orientieren, die Werte dazwischen werden dann von Javascript berechnet und stimmen nicht mit den errechneten Farben der jeweiligen Werte, so wie auch beim Ringfarbenverlauf, überein.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#25
Der erste Wiki-Eintrag ist auch schon da: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Anzeige_eines_Werteverlaufs_und_des_aktuellen_Wertes_mit_Hilfe_der_SVG-Funktion_card

Ich werde noch schönere Verläufe über 24 Stunden abbilden, aber so viel Zeit hatte ich für die Erstellung noch nicht gehabt :)

Unter "Anwendungensbeispiele" werde ich später eine Wetterstation von hier https://forum.fhem.de/index.php/topic,119612.msg1140489.html#msg1140489 mit card-Funktionen visualisieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Moin,

habe heute morgen das Update gemacht, und wollte direkt die neue "Card"-Funktion testen.
Die läuft bei mir nicht, und im Log sehe ich folgenden Eintrag:

2021.04.08 09:19:14.803 3: di_WetterCard:Warning in DOIF_RegisterEvalAll:'error Undefined subroutine &main::card called at (eval 5877) line 1.
in expression: card(::ReadingValDoIf($hash,'WeatherScreenPro','rain','','col6'),undef,"weather_rain_gauge",0,10,180,270,"mm/h")'


Das Device "WeatherScreenPro" nutze ich mit den Readings fehlerfrei im ui-Table. Wo liegt der Fehler den ich hier nicht sehe ?

Hier noch das List: (Device ist jetzt deaktiviert damit es mir nicht das Log zumüllt bis ich den Fehler gefunden hab)

Internals:
   DEF        ##
   FUUID      606e8af0-f33f-7539-bb2c-733e53a8c56f6d1e
   MODEL      FHEM
   NAME       di_WetterCard
   NOTIFYDEV  global
   NR         1567
   NTFY_ORDER 50-di_WetterCard
   STATE      deactivated
   TYPE       DOIF
   VERSION    24173 2021-04-07 17:28:37
   READINGS:
     2021-04-08 09:18:54   mode            deactivated
     2021-04-08 09:18:54   state           deactivated
   Regex:
   condition:
   do:
     0:
   helper:
     DEVFILTER  ^global$
     NOTIFYDEV  global
   uiTable:
     dev        WeatherScreenPro
     package   
     reading    pressureAbs
     table:
       0:
         0:
           0:
             0          'error Undefined subroutine &main::card called at (eval 5874) line 1.
in expression: card(::ReadingValDoIf($hash,'WeatherScreenPro','temperature','','col6'),undef,"temp_outside",-10,30,undef,undef,"°C",\&temp_hue)'
         1:
           0:
             0          'error Undefined subroutine &main::card called at (eval 5875) line 1.
in expression: card(::ReadingValDoIf($hash,'WeatherScreenPro','humidity','','col6'),undef,"temperature_humidity",0,100,undef,undef,"%",\&hum_hue)'
         2:
           0:
             0          'error Undefined subroutine &main::card called at (eval 5876) line 1.
in expression: card(::ReadingValDoIf($hash,'WeatherScreenPro','wind_speed','','col6'),undef,::ReadingValDoIf($hash,'WeatherScreenPro','wind_speed') > 0 ? "wind".",1,0,0,".::ReadingValDoIf($hash,'WeatherScreenPro','wind_direction'):"no_wind",0,50,120,0,"km/h",undef,1)'
       1:
         0:
           0:
             0          'error Undefined subroutine &main::card called at (eval 5877) line 1.
in expression: card(::ReadingValDoIf($hash,'WeatherScreenPro','rain','','col6'),undef,"weather_rain_gauge",0,10,180,270,"mm/h")'
         1:
           0:
             0          'error Undefined subroutine &main::card called at (eval 5878) line 1.
in expression: card(::ReadingValDoIf($hash,'WeatherScreenPro','UV','','col6'),undef,"sani_solar",,0,10,200,0,"UV",undef,0)'
         2:
           0:
             0          'error Undefined subroutine &main::card called at (eval 5879) line 1.
in expression: card(::ReadingValDoIf($hash,'WeatherScreenPro','luminosity','','col6'),undef,"sani_solar",,0,10,200,0,"UV",undef,0)'
         3:
           0:
             0          'error Undefined subroutine &main::card called at (eval 5880) line 1.
in expression: card(::ReadingValDoIf($hash,'WeatherScreenPro','pressureAbs','','col6'),undef,"weather_barometric_pressure",980,1047,undef,undef,"hPa",[(1008.5,0,1018.5,270,1047,190)],0,undef,'0,1,1,6',",40,45,45,,45")'
     tc:
     td:
       0:
       1:
     tr:
Attributes:
   disable    1
   room       00_Wetter
   uiTable    ##card ($collect,$header,$icon,$min,$max,$minColor,$maxColor,$unit,$func,$decfont,$size,$model,$lightness)|

card([WeatherScreenPro:temperature:col6],undef,"temp_outside",-10,30,undef,undef,"°C",\&temp_hue)|
card([WeatherScreenPro:humidity:col6],undef,"temperature_humidity",0,100,undef,undef,"%",\&hum_hue)|
card([WeatherScreenPro:wind_speed:col6],undef,[WeatherScreenPro:wind_speed] > 0 ? "wind".",1,0,0,".[WeatherScreenPro:wind_direction]:"no_wind",0,50,120,0,"km/h",undef,1)
card([WeatherScreenPro:rain:col6],undef,"weather_rain_gauge",0,10,180,270,"mm/h")|
card([WeatherScreenPro:UV:col6],undef,"sani_solar",,0,10,200,0,"UV",undef,0)|
card([WeatherScreenPro:luminosity:col6],undef,"sani_solar",,0,10,200,0,"UV",undef,0)|
card([WeatherScreenPro:pressureAbs:col6],undef,"weather_barometric_pressure",980,1047,undef,undef,"hPa",[(1008.5,0,1018.5,270,1047,190)],0,undef,'0,1,1,6',",40,45,45,,45")
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Damian

Du hast das Package nicht definiert. Siehe Bespiele im Wiki.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Bartimaus

Danke.... wer lesen kann.... ::)
LG
B.


FHEM@AMD-Ryzen7-5700U@Debian-LXC (ProxmoxHOST), CUL1101,FS20,IT,DS18B20,DS2413(Heizungslogger),DS2423(Stromlogger)Homematic,HM-LAN,ZWave,MiniCULs,Shelly

Damian

#29
Ich habe noch ein nettes Feature eingebaut.

Der maximale, der minimale und der aktuelle Wert werden jetzt im Graphen als Punkt markiert.


Edit: etwas transparent dargestellt
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF