EDIT 2021 09 03 : Ich habe dann noch sowas gefunden
Zitat
192.168.178.40:8083/fhem?cmd=set%20WR_1_Speicher_1_ExternControl%20cmd_6
2021.09.03 15:35:06.836 3: FHEMWEB WEB CSRF error: ne csrf_557238226486953 for client WEB_192.168.178.40_33946 / command set WR_1_Speicher_1_ExternControl cmd_6. For details see the csrfToken FHEMWEB attribute.
Aber wie kann ich da dynamisch das Token einsetzen?
Wenn ich das dann ins stateFormat einbaue, kann ich zwar einen Klick drauf machen, im Fhem Log kommt dann aber auch keine Fehlermeldung wegen des Token
<A HREF="192.168.178.40:8083/fhem?cmd=set%20WR_1_Speicher_1_ExternControl%20cmd_6" target="log">cmd_6 CmdRepeat</A>
Hallo zusammen,
ich habe ein DOIF, bei dem ich ein stateFormat mit html verwende. (siehe Bild unten)
Mein Wunsch wäre nun in der FHEMWEB Oberfläche auch soetwas wie beim webCmd zum Klicken zu haben, um die cmd_[1-12] direkt zu aktivieren.
Kann man so etwas umsetzen?
Eine zweite Variante wäre im Device in der set pull down Liste den cmd_[1-12] sprechende Namen zu geben,das würde mir als Alternative auch weiter helfen.
Oder die dritte Idee wäre im stateFormat html push buttons zu definieren, wofür mir aber die html Kenntnisse fehlen. Ein Beispiel könnte ich sicher selber einbauen ;-)
Hier noch das stateFormat:
{
my $WR = "WR_1";
my $DUMMY = "";
my $Entladung = ReadingsVal($name,"SpeicherEntladung","n/a");
my $Power = ReadingsVal($WR,"Actual_Battery_charge_-minus_or_discharge_-plus_P","0");
my $Status = ($Power < -10) ? "<span style='color:#00FF00'>Laden</span>" : ($Power > 15)? "<span style='color:#FF0000'>Entladen</span>" : "<span style='color:orange'>Standby</span>";
$Power = $Power." W";
my $Solar_Calculation_fc0_day = ReadingsVal($WR,"Solar_Calculation_fc0_day","0");
my $Trigger = ReadingsVal($name,"SpeicherTrigger","none");
my $ExternTrigger = ReadingsVal($name,"SpeicherExternTrigger","none");
my $ZeitStart = ReadingsVal($name,"SpeicherZeitStart","n/a");
my $ZeitEnde = ReadingsVal($name,"SpeicherZeitEnde","n/a");
my $CmdRepeatActive = ReadingsVal($name,"SpeicherCmdRepeatActive","0");
my $CmdRepeatRunning = ReadingsVal($name,"SpeicherCmdRepeatRunning","0");
my $MaxSOCControlActive = ReadingsVal($name,"SpeicherMaxSOCControlActive","0");
my $MaxSOCControlRunning = ReadingsVal($name,"SpeicherMaxSOCControlRunning","0");
my $MiddayControlActive = ReadingsVal($name,"SpeicherMiddayControlActive","0");
my $MiddayControlRunning = ReadingsVal($name,"SpeicherMiddayControlRunning","0");
my $Solar_middayhigh_fc0_start = ReadingsVal($WR,"Solar_middayhigh_fc0_start","00:00");
$Solar_middayhigh_fc0_start = ($MaxSOCControlRunning == 1 and $MiddayControlRunning == 1) ? "12:00" : $Solar_middayhigh_fc0_start ;
my $Solar_middayhigh_fc0_stop = ReadingsVal($WR,"Solar_middayhigh_fc0_stop","00:00");
my $MaxSOC_Actual = ReadingsVal($name,"SpeicherMaxSOC_Actual","0");
my $Act_state_of_charge = sprintf("%d",ReadingsVal($WR,"Act_state_of_charge","0"));
my $MaxSOC_DayBefore = sprintf("%d %%",ReadingsVal($name,"SpeicherMaxSOC_DayBefore","0"));
my $MaxSOC_fc1_Limit = ReadingsVal($name,"SpeicherMaxSOC_fc1_Limit","0");
my $MaxSOC_MinSOC_Time = POSIX::strftime("%H:%M",localtime(time_str2num(ReadingsTimestamp($name, "SpeicherMaxSOC_MinSOC_Time",0))));
my $MaxSOC_MinSOC_MinSOC = sprintf("%d %%",ReadingsVal($name,"SpeicherMaxSOC_MinSOC_MinSOC","0"));
my $Midday_NotBefore = ReadingsVal($name,"SpeicherMidday_NotBefore","0");
my $Midday_MaxSOC = ReadingsVal($name,"SpeicherMidday_MaxSOC","0");
my $Midday_MaxChargePowerAbs_morning = sprintf("%d W" ,ReadingsVal($name,"SpeicherMidday_MaxChargePowerAbs_morning","0"));
$Midday_MaxChargePowerAbs_morning = ( $MiddayControlRunning == 1 and
time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore") and
time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start" and
$Midday_MaxSOC > $Act_state_of_charge) ) ? "<span style='color:#00FF00'>$Midday_MaxChargePowerAbs_morning</span>" : $Midday_MaxChargePowerAbs_morning ;
my $Midday_MaxChargePowerAbs_midday = sprintf("%d W" ,ReadingsVal($name,"SpeicherMidday_MaxChargePowerAbs_midday","0"));
$Midday_MaxChargePowerAbs_midday = ( $MiddayControlRunning == 1 and
time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and
time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Midday_MaxChargePowerAbs_midday</span>" : $Midday_MaxChargePowerAbs_midday ;
$Midday_NotBefore = ( $MiddayControlRunning == 1 and
time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore") and
time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $MaxSOC_MinSOC_MinSOC")) ? "< <span style='color:#FF0000'>$Midday_NotBefore</span>" :
( $MiddayControlRunning == 1 and
time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") ) ? "> <span style='color:#00FF00'>$Midday_NotBefore</span>" : $Midday_NotBefore ;
$Midday_MaxSOC = ( time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Midday_NotBefore")) ? $Midday_MaxSOC." %" :
( $MiddayControlRunning == 1 and
time < time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and
$Midday_MaxSOC > $Act_state_of_charge ) ? "<span style='color:#00FF00'>$Midday_MaxSOC %</span>" :
( time > time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start")) ? $Midday_MaxSOC." %" : "<span style='color:#FF0000'>$Midday_MaxSOC %</span>" ;
$Solar_middayhigh_fc0_start = ( $MiddayControlRunning == 1 and
time >= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and
time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Solar_middayhigh_fc0_start</span>" : $Solar_middayhigh_fc0_start ;
$Solar_middayhigh_fc0_stop = ( $MiddayControlRunning == 1 and
time >= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_start") and
time <= time_str2num(POSIX::strftime("%Y-%m-%d",localtime(time))." $Solar_middayhigh_fc0_stop" ) ) ? "<span style='color:#00FF00'>$Solar_middayhigh_fc0_stop</span>" : $Solar_middayhigh_fc0_stop ;
my $Midday_Inverter_Max_Power = sprintf("%d W" ,ReadingsVal($name,"SpeicherMidday_Inverter_Max_Power","0"));
$Midday_Inverter_Max_Power = ($MiddayControlRunning == 1 ) ? ">= <span style='color:#00FF00'> $Midday_Inverter_Max_Power</span>" : $Midday_Inverter_Max_Power ;
my $MinSOC_fc1_Limit = ReadingsVal($name,"SpeicherMinSOC_fc1_Limit","0");
my $MinSOC_Sommer = sprintf("%d %%" ,ReadingsVal($name,"SpeicherMinSOC_Sommer","0"));
$MinSOC_Sommer = ($Solar_Calculation_fc0_day >= $MinSOC_fc1_Limit) ? "<span style='color:#00FF00'>$MinSOC_Sommer</span>" : $MinSOC_Sommer ;
my $MinSOC_Winter = sprintf("%d %%" ,ReadingsVal($name,"SpeicherMinSOC_Winter","0"));
$MinSOC_Winter = ($Solar_Calculation_fc0_day < $MinSOC_fc1_Limit) ? "<span style='color:#00FF00'>$MinSOC_Winter</span>" : $MinSOC_Winter ;
$MinSOC_fc1_Limit = ($Solar_Calculation_fc0_day >= $MinSOC_fc1_Limit) ? ">= <span style='color:#00FF00'>$MinSOC_fc1_Limit Wh</span>" : $MinSOC_fc1_Limit." Wh" ;
$MaxSOC_fc1_Limit = ($Solar_Calculation_fc0_day >= $MaxSOC_fc1_Limit) ? ">= <span style='color:#00FF00'>$MaxSOC_fc1_Limit Wh</span>" : $MaxSOC_fc1_Limit." Wh" ;
$MaxSOC_Actual = ($MaxSOCControlRunning == 1) ? "<span style='color:#00FF00'>$MaxSOC_Actual %</span>" : $MaxSOC_Actual." %" ;
$Act_state_of_charge = $Act_state_of_charge." %";
$CmdRepeatRunning = ($CmdRepeatRunning == 1) ? "<span style='color:#00FF00'>$CmdRepeatRunning</span>" : $CmdRepeatRunning ;
$MaxSOCControlRunning = ($MaxSOCControlRunning == 1) ? "<span style='color:#00FF00'>$MaxSOCControlRunning</span>" : $MaxSOCControlRunning ;
$MiddayControlRunning = ($MiddayControlRunning == 1) ? "<span style='color:#00FF00'>$MiddayControlRunning</span>" : $MiddayControlRunning ;
$ZeitStart = ($Entladung eq "Zeit") ? "<span style='color:#00FF00'>$ZeitStart</span>" : $ZeitStart ;
$ZeitEnde = ($Entladung eq "Zeit") ? "<span style='color:#00FF00'>$ZeitEnde</span>" : $ZeitEnde ;
"<html><table border=2 bordercolor='darkgreen' cellspacing=0>
<tr><td style='padding-right:5px;padding-left:5px;font-weight:bold'> </td><td style='padding-right:5px;padding-left:5px;font-weight:bold'></td><td style='padding-right:5px;padding-left:5px;font-weight:bold'></td><td style='padding-right:5px;padding-left:5px;text-align:center;font-weight:bold'></td><td style='padding-right:5px;padding-left:5px;text-align:center;font-weight:bold'></td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Speicher<dd>Steuerung / Status / Leistung / aktueller SOC</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Entladung."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$Status."<br></td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Trigger<dd>Status / ExternTrigger / Start / Ende</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Trigger."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$ExternTrigger."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$ZeitStart."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$ZeitEnde."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Kommando Wiederholung<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$CmdRepeatActive."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$CmdRepeatRunning."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>MaxSOC Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOCControlActive."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOCControlRunning."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / aktuell</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOC_fc1_Limit."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$MaxSOC_MinSOC_Time."<br>".$MaxSOC_MinSOC_MinSOC."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOC_DayBefore."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOC_Actual."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Mittags Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MiddayControlActive."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MiddayControlRunning."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br><br>MaxSOC morgens / Power morgens / Power mittags</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Midday_Inverter_Max_Power."<br><br>".$Midday_MaxSOC."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Midday_NotBefore."<br><br>".$Midday_MaxChargePowerAbs_morning."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Solar_middayhigh_fc0_start."<br><br>".$Midday_MaxChargePowerAbs_midday."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Solar_middayhigh_fc0_stop."<br><br><br>".$DUMMY."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>MinSOC Steuerung<dd>fc1_Limit / Winter / Sommer</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MinSOC_fc1_Limit."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MinSOC_Winter."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MinSOC_Sommer."</td></tr>
</table></html>"
}
Jeder Vorschlag ist willkommen.
Gruß Christian
Klar geht das. Beispiel für Buttons in einem Reading in der 99_RoombaUtils.pm im contrib-Ordner. Allerdings rate ich dringend davon ab, wenn man nicht HTML- und JavaScript-Kenntnisse hat.
LG
pah
Zitat von: Prof. Dr. Peter Henning am 03 September 2021, 16:12:54
Klar geht das. Beispiel für Buttons in einem Reading in der 99_RoombaUtils.pm im contrib-Ordner. Allerdings rate ich dringend davon ab, wenn man nicht HTML- und JavaScript-Kenntnisse hat.
Vielen Dank für den Link,
ich möchte ja auch noch etwas dazu lernen :-)
Java würde ich gerne vermeiden, wenn es geht.
Das hier habe ich mit aus dem "Grundriss mit FHEM-Buttons" in der Zwischenzeit schon herausgesucht.
Leider öffnet es jeweils einen neuen TAB, obwohl &XHR=1 oder auch target="log" laut Beispiel auf der rufenden Seite bleiben sollten.
Mit dem Token klappt auch der Fhem Aufruf, jedoch nicht dynamisch, da sich der Token ja auch ändern kann.
<html>
<HEAD>
<TITLE>Status Table</TITLE>
</HEAD>
<body>
<FRAMESET ROWS="*,0" FRAMEBORDER=0 FRAMESPACING=0>
<FRAME NAME="log">
<table frame="control" border=2 bordercolor='darkgreen' cellspacing=0>
<tr><td style='padding-right:5px;padding-left:5px;font-weight:bold'> </td><td style='padding-right:5px;padding-left:5px;font-weight:bold'></td><td style='padding-right:5px;padding-left:5px;font-weight:bold'></td><td style='padding-right:5px;padding-left:5px;text-align:center;font-weight:bold'></td><td style='padding-right:5px;padding-left:5px;text-align:center;font-weight:bold'></td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Speicher<dd>Steuerung / Status / Leistung / aktueller SOC</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Entladung."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$Status."<br></td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$Power."<br>".$Act_state_of_charge."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Trigger<dd>Status / ExternTrigger / Start / Ende</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Trigger."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$ExternTrigger."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$ZeitStart."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$ZeitEnde."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Kommando Wiederholung<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$CmdRepeatActive."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$CmdRepeatRunning."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>MaxSOC Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOCControlActive."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOCControlRunning."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>MaxSOC Limit<dd>fc1_Limit / Minimum SOC Zeit / gestern / aktuell</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOC_fc1_Limit."</td><td style='padding-right:5px;padding-left:5px;text-align:center'>".$MaxSOC_MinSOC_Time."<br>".$MaxSOC_MinSOC_MinSOC."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOC_DayBefore."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MaxSOC_Actual."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Mittags Kontrolle<dd>aktiviert / läuft</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MiddayControlActive."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MiddayControlRunning."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Mittags Limits<dd>Inverter_Max_Power / Laden nicht vor / Start /Stop<br><br>MaxSOC morgens / Power morgens / Power mittags</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Midday_Inverter_Max_Power."<br><br>".$Midday_MaxSOC."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Midday_NotBefore."<br><br>".$Midday_MaxChargePowerAbs_morning."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Solar_middayhigh_fc0_start."<br><br>".$Midday_MaxChargePowerAbs_midday."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$Solar_middayhigh_fc0_stop."<br><br><br>".$DUMMY."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>MinSOC Steuerung<dd>fc1_Limit / Winter / Sommer</dd></td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MinSOC_fc1_Limit."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$DUMMY."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MinSOC_Winter."</td><td style='padding-right:5px;padding-left:5px;text-align:center'><br>".$MinSOC_Sommer."</td></tr>
<tr><td style='padding-right:5px;padding-left:5px;text-align:left;font-weight:bold'>Kommando ausführen</td><td><a href="http://192.168.178.40:8083/fhem?cmd.WR1=set%20WR_1_Speicher_1_ExternControl%20cmd_6&XHR=1&fwcsrf=csrf_557238226486953" target="log">CmdRepeat</a></td><td></td><td></td><td></td>
</table>
</FRAMESET>
</body>
</html>
Wenn du mit DOIF arbeitest, dann kannst du auch gleich uiTable in deinem DOIF-Device definieren. Damit kannst du beliebige Tabelle mit FHEM-Widgets und beliebiger Visualisierung ohne tiefere HTML-Kenntnisse realisieren: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg
Zitat von: Damian am 04 September 2021, 11:40:34
Wenn du mit DOIF arbeitest, dann kannst du auch gleich uiTable in deinem DOIF-Device definieren. Damit kannst du beliebige Tabelle mit FHEM-Widgets und beliebiger Visualisierung ohne tiefere HTML-Kenntnisse realisieren: https://wiki.fhem.de/wiki/DOIF/uiTable_Schnelleinstieg
Okay, das nen ich mal umfangreich :-) Ich denke Ihr werdet einige Zeit nichts mehr von mir hören, bis ich mich da durchgearbeitet habe.
Vielen Dank, für das darstellen von Möglichkeiten
Christian