Hauptmenü

uiTable - neue Funktionen

Begonnen von Damian, 06 Dezember 2019, 22:24:21

Vorheriges Thema - Nächstes Thema

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Zitat von: Damian am 29 Dezember 2019, 19:59:32
Package-Konzept: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Package-Konzept.2C_Auslagerung_eigener_Funktionen.2C_der_IMPORT-Befehl

Das ist ja die Lösung eines Themas, an dem ich geknabbert hatte: Klappt auch wie beschrieben mit einem kleinen Punkt, wo ich nicht beurteilen kann, ob das im Konzept noch verbesserbar ist:

Ich habe eine umfangreiche uiTable, der ich die Darstellung verschiedener Sensoren teils über die eingebauten Funktionen wie temp und hum formatiere und teils über angepasste Funktionen in einer eigenen TPL. Zum Beispiel möchte ich den "grünen" Bereich eines Temp-Sensor am Kessel woanders haben als bei der WAF-Temperatur im Wohnzimmer.
Das klappt gut, meine abgewandelten Funktionen heißen also z.B. temp2 und temp3 und werden über eine uiTable_cw.tpl importiert. Für den Style wollte ich eigentlich die Standardfunktion temp_style aus uiTable.tpl verwenden. Das klappt dann aber nicht, ich muss die völlig unveränderte Funktion temp_style noch eigens in meiner  uiTable_cw.tpl aufnehmen, egal ob ich den Import-Befehl vor oder nach dem Perl-Block oder den Definitionen-Block positioniere.

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Zitat von: cwagner am 31 Dezember 2019, 13:53:12
Das ist ja die Lösung eines Themas, an dem ich geknabbert hatte: Klappt auch wie beschrieben mit einem kleinen Punkt, wo ich nicht beurteilen kann, ob das im Konzept noch verbesserbar ist:

Ich habe eine umfangreiche uiTable, der ich die Darstellung verschiedener Sensoren teils über die eingebauten Funktionen wie temp und hum formatiere und teils über angepasste Funktionen in einer eigenen TPL. Zum Beispiel möchte ich den "grünen" Bereich eines Temp-Sensor am Kessel woanders haben als bei der WAF-Temperatur im Wohnzimmer.
Das klappt gut, meine abgewandelten Funktionen heißen also z.B. temp2 und temp3 und werden über eine uiTable_cw.tpl importiert. Für den Style wollte ich eigentlich die Standardfunktion temp_style aus uiTable.tpl verwenden. Das klappt dann aber nicht, ich muss die völlig unveränderte Funktion temp_style noch eigens in meiner  uiTable_cw.tpl aufnehmen, egal ob ich den Import-Befehl vor oder nach dem Perl-Block oder den Definitionen-Block positioniere.

Herzliche Grüße

Christian

Wie sieht die uiTable-Definition bei dir aus?
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Hallo Damian,
den Fall habe ich mehrfach, die eigene TPL lautet, die das prägnanteste Beispiel:

{
package $SELF;
# Varianten von CW für uiTable Subs
# 29.12.2019

#Styles
############## ohne Temp-Symbol und mit Temperaturspanne 15-25°
sub temp2
{
   my ($temp,$size)=@_;
   return($temp."°C","font-weight:bold;font-size:".$size."pt;".temp_style2($temp));
}

sub temp_style2
{
     my ($temp)=@_;
     return ("color:".::DOIF_hsv ($temp,15,22,240,150,90,95));
}

############## ohne Temp-Symbol und mit Temperaturspanne -20-30°
sub temp3
{
   my ($temp,$size)=@_;
   return($temp."°C","font-weight:bold;font-size:".$size."pt;".temp_style3($temp));
}
sub temp_style3
{
     my ($temp)=@_;
     if ($temp >=30) {
   return ("color:".::DOIF_hsv ($temp,30,50,20,0,90,95));
     } elsif ($temp >= 10) {
       return ("color:".::DOIF_hsv ($temp,10,30,73,20,80,95)); 
} elsif ($temp >= 0) {
   return ("color:".::DOIF_hsv ($temp,0,10,211,73,60,95));
} elsif ($temp >= -20) {
   return ("color:".::DOIF_hsv ($temp,-20,0,277,211,50,95));
}
}

############### ohne Hum-Symbol
sub hum2
{
    my ($hum,$size)=@_;
    return($hum." %","font-weight:bold;font-size:".$size."pt;color:".::DOIF_hsv ($hum,30,100,30,260,60,90));
}

}


Mit dem sub temp_Style2 werden dann die Temperaturen gezeigt, die von dieser Definition bestimmt werden:
{
$SHOWNODEVICELINE = "Aktuell";
$ATTRIBUTESFIRST =  1;
$TC{0,1,3,5}= "style='font-weight:bold;font-size:11pt;'";
$TC{1,2,4,5}="align='right'";
$TD{0}{0}="style='position:relative'";
sub FUNC_CO2 {return ("font-weight:bold;font-size:11pt;color:".DOIF_hsv ($_[0],600,1000,122,0,60,90));}
}
IMPORT contrib/DOIF/uiTableCW.tpl
temp3([T_Aussen:temperature:d1],12),temp3([CN_Wind:Windchill:d1]),hum2([TF.Aussen:humidity:d1],10)|[$SELF:state],"Letzter Switch:".[$SELF:EWTLast:d1]."°C","Stellung:".[Steller_Zuluft:Stufe]."%"|"Fortluft".":".temp3([Fortluft:temperature:d1],12),"Frischluft".":".temp3([Frischluft:temperature:d1],12)," "," "|WID ([DI_Sommer_Winter.state],"iconSwitch,Sommer,svn\@yellow,Winter,control_x\@blue"),STY("")|"Zuluft".":".temp2([Zuluft2:temperature:d1],12),"Abluft".":".temp2([Abluft:temperature:d1],12),"Ø gestern ↑".":".temp2([Abluft:temperature_AVG_LD:d1])|STY([CO2Sensor:CO2:d0]." ppm CO2",FUNC_CO2([CO2Sensor:CO2:d0])),"Nebler".WID ([Switch_Lueftung:Nebler],"iconSwitch,ON,power\@green,OFF,power\@red")


[noch habe ich nicht alle Deine Vereinfachungen nachgearbeitet]

In der Anlage dann die Optik dazu (aktuell ist passend für die Silvesterknallerei Windstille, so sind beide Temperaturen ganz links gleich).

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Wenn du in deiner tpl-Datei statt package $SELF; package ui_Table; schreibst, dann wird die interne ui_Table um deine Funktionen erweitert. Durch den Import der Datei befindest du dich dann in package ui_Table und kannst deine und die internen Funktionen direkt (ohne Angabe des package) nutzen. Das ist dieser Fall, den ich präferiere: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg#Eigene_ausgelagerte_uiTable-Funktionen

Deine FUNC_-Funktion solltest du anders benennen (ohne FUNC am Anfang) ansonsten musst du :: davorstellen - das hatte wir ja schon mal.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

So einfach, so klar: Funktioniert. Ein umweltfreundlicher Knaller zum Abschied des alten Jahres.

Guten Rutsch und Danke!

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

eddy242

Hallo zusammen,

ich habe das Beispiel mit der Batterie-Anzeige (Färbung, Icon) übernommen. Nun habe ich ca. 20 Devices mit Batterien, muss ich für jedes einzelne eine Zeile mit expliziten Namen (DeviceXYZ:batteryLevel) angeben oder kann ich auch einen Trick mit Regexp machen, also simplerweise sowas wie [DevicesmitBattery.*:batteryLevel]?

Danke!

Damian

Zitat von: eddy242 am 03 Januar 2020, 22:54:15
Hallo zusammen,

ich habe das Beispiel mit der Batterie-Anzeige (Färbung, Icon) übernommen. Nun habe ich ca. 20 Devices mit Batterien, muss ich für jedes einzelne eine Zeile mit expliziten Namen (DeviceXYZ:batteryLevel) angeben oder kann ich auch einen Trick mit Regexp machen, also simplerweise sowas wie [DevicesmitBattery.*:batteryLevel]?

Danke!

Bei den Readingangaben sind keine Regex möglich - das war beim DOIF immer schon so.

Z. Zt. musst du für jedes Reading die Funktion aufrufen. Ich arbeite aber an einer Template-Erweiterung, die eine ganze Tabelle für mehrere Readings mit entsprechenden Formatierungen ausspuckt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

cwagner

Gerne würde ich ein Perl-DOIF über die Switch-Funktion in einer uiTable ein- und ausschalten. Die Idee war: |switch([RR_Wohnzimmer:mode],"10px-kreis-gruen","10px-kreis-rot","enable","disable". Das klappt aber nicht, vermutlich weil die entsprechenden Mode-Readings enabled und disabled heißen. Bin ich auf einem Irrweg?

Herzliche Grüße

Christian
PI 2B+/3B+ Raspbian 12, Perl 5.36.0, FHEM 6.3: 295 Module in ConfigDB: Steuerung Heizkessel, FBH, Solarthermie, kontr. Lüftung mit WRG. Smarthome u.a. HMCUL, 1-Wire (FT232RL ; DS2480B), EnOcean (TCM EPS3), MQTT2. DOIF, PID20, Threshold, OWX; Micropelt IRTV, Volkszähler, SolarForecast; MariaDB

Damian

ja, geschaltet wird über set enable, angezeigt wird aber enabled, das geht schlecht über FHEM-widgets, wahrscheinlich lässt sich das über das Umbiegen des Kommandos mit eventMaps realisieren.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#26
Zitat von: Damian am 03 Januar 2020, 23:09:25
Bei den Readingangaben sind keine Regex möglich - das war beim DOIF immer schon so.

Z. Zt. musst du für jedes Reading die Funktion aufrufen. Ich arbeite aber an einer Template-Erweiterung, die eine ganze Tabelle für mehrere Readings mit entsprechenden Formatierungen ausspuckt.

uiTable erhält ein mächtiges Kommando: FOR

Syntax: FOR (<Array>,<Zellendefinitionen, $_ wird durch das jeweilige Element des Arrays ersetzt>)

Der Befehl entspricht der Perl-Schleife: foreach

Damit können ganze Tabellen jeweils mit einem Einzeiler definiert werden.

Bsp:

defmod di_for DOIF ##
IMPORT contrib/DOIF/my_uiTable.tpl\
\
## Tabellendefinition: Zeige alle Devices, die ein Reading battery haben mit einem entsprechenden Symbol\
FOR (::AggrDoIf('@','','battery'),"$_"|bat([$_:battery]))


Der erste Parameter ist ein Array, hier können insbesondere DOIF-Aggregationsfunktionen benutzt werden, aber auch alle anderen Funktionen, die ein Array liefern, wie z. B. devspec2array

Entsprechende Anwendungsbeispiele mit Dokumentation zu FOR werde ich demnächst in wiki einstellen.

Ergebnis der obigen Definition siehe Anhang

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

#28
Ich habe mal eine neue Funktion namens bin(<Art der Tonne>,<Anzahl der Tage>) für Abfall gebastelt:

defmod Abfall DOIF
attr Abfall DOIF_Readings bio:[#min:"^abfall$":"Bioabfall.*_days$"], GelberSack:[#min:"^abfall$":"GelberSack.*_days$"], Gruenschnitt:[#min:"^abfall$":"Gruenschnitt.*_days$"]
attr Abfall uiTable {\
  $TC{0..4}="align='center'";;\
  $SHOWNOSTATE=1;;\
}\
IMPORT .\contrib\DOIF\my_uitable.tpl\
## mit der Funktion 'bin' können Abfallbehälter visualisiert werden
bin("yellow",[$SELF:GelberSack])|bin("blue",[abfall:Altpapier_days])|bin("grey",[abfall:Restmuell_days])|bin("green",[$SELF:bio])|bin("greengreen",[$SELF:Gruenschnitt])
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Damian

Hier mal eine Abfalllösung ohne zusätzliche Abfallmodule https://forum.fhem.de/index.php/topic,103238.msg1020288.html#msg1020288.

Es wurde lediglich das Calendar-Modul definiert. Die Visualisierung-Funktion der Abfalleimer mit einem Counter kommt demnächst ins DOIF in einer allgemeineren Form, der entsprechende Wiki-Beitrag für uiTable wird dann aktualisiert.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF