From f35495e6cb8621d49d1b7932c3211288e7a981fd Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Thu, 19 Sep 2019 18:53:36 +0000 Subject: [PATCH] 95_Dashboard: new attribute "noLinks" - no links to devices detail git-svn-id: https://svn.fhem.de/fhem/trunk@20199 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 1 + fhem/FHEM/95_Dashboard.pm | 325 +++--- fhem/contrib/DS_Starter/95_Dashboard.pm | 1248 ++++++++++++++--------- 3 files changed, 948 insertions(+), 626 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 6b18c9559..f73a50141 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - feature: 95_Dashboard: new attribute "noLinks" - no links to devices detail - feature: 49_SSCamSTRM: new attribute "noLink" - suppress link to detail view - bugfix: 49_SSCam: fix warnings, Forum: 45671#msg975610 - change: 70_ZoneMinder: improved contents of state (thx Florian_GT) diff --git a/fhem/FHEM/95_Dashboard.pm b/fhem/FHEM/95_Dashboard.pm index ad3440b87..a0d17b482 100644 --- a/fhem/FHEM/95_Dashboard.pm +++ b/fhem/FHEM/95_Dashboard.pm @@ -55,6 +55,7 @@ use vars qw($FW_ss); # is smallscreen, needed by 97_GROUP/95_VIEW # Versions History intern our %Dashboard_vNotesIntern = ( + "3.11.1" => "16.09.2019 new attribute noLinks ", "3.11.0" => "16.09.2019 attr dashboard_activetab is now working properly, commandref revised, calculate attribute ". "dashboard_activetab (is now a userattr) ", "3.10.1" => "29.06.2018 added FW_hideDisplayName, Forum #88727 ", @@ -84,19 +85,19 @@ sub Dashboard_Initialize ($) { $hash->{FW_detailFn} = "Dashboard_DetailFN"; $hash->{AttrFn} = "Dashboard_attr"; $hash->{AttrList} = "disable:0,1 ". - "dashboard_colcount:1,2,3,4,5 ". - "dashboard_debug:0,1 ". + "dashboard_backgroundimage ". + "dashboard_colcount:1,2,3,4,5 ". + "dashboard_customcss " . + "dashboard_debug:0,1 ". + "dashboard_flexible " . "dashboard_rowtopheight ". "dashboard_rowbottomheight ". - "dashboard_row:top,center,bottom,top-center,center-bottom,top-center-bottom ". - "dashboard_showtogglebuttons:0,1 ". - "dashboard_width ". + "dashboard_row:top,center,bottom,top-center,center-bottom,top-center-bottom ". "dashboard_rowcenterheight ". "dashboard_rowcentercolwidth ". "dashboard_showfullsize:0,1 ". "dashboard_showtabs:tabs-and-buttonbar-at-the-top,tabs-and-buttonbar-on-the-bottom,tabs-and-buttonbar-hidden ". - "dashboard_customcss " . - "dashboard_flexible " . + "dashboard_showtogglebuttons:0,1 ". "dashboard_tab1name " . "dashboard_tab1groups " . "dashboard_tab1devices " . @@ -113,7 +114,8 @@ sub Dashboard_Initialize ($) { "dashboard_tab[0-9]+colcount " . "dashboard_tab[0-9]+rowcentercolwidth " . "dashboard_tab[0-9]+backgroundimage " . - "dashboard_backgroundimage"; + "dashboard_width ". + "noLinks:1,0 "; $data{FWEXT}{jquery}{SCRIPT} = "/pgm2/".$fwjquery if (!$data{FWEXT}{jquery}{SCRIPT}); $data{FWEXT}{jqueryui}{SCRIPT} = "/pgm2/".$fwjqueryui if (!$data{FWEXT}{jqueryui}{SCRIPT}); @@ -147,8 +149,8 @@ sub Dashboard_define ($$) { my $url = '/dashboard/' . $name; - $data{FWEXT}{$url}{CONTENTFUNC} = 'Dashboard_CGI'; - $data{FWEXT}{$url}{LINK} = 'dashboard/' . $name; + $data{FWEXT}{$url}{CONTENTFUNC} = 'Dashboard_CGI'; # $data{FWEXT} = FHEMWEB Extension, siehe 01_FHEMWEB.pm + $data{FWEXT}{$url}{LINK} = 'dashboard/'.$name; $data{FWEXT}{$url}{NAME} = $name; return; @@ -180,6 +182,7 @@ sub Dashboard_Get($@) { my $arg = (defined($a[1]) ? $a[1] : ""); my $arg2 = (defined($a[2]) ? $a[2] : ""); + if ($arg eq "config") { my $name = $hash->{NAME}; my $attrdata = $attr{$name}; @@ -217,9 +220,10 @@ sub Dashboard_Get($@) { $res .= "}\n"; return $res; } + } elsif ($arg eq "groupWidget") { -#### Comming Soon ###### -# For dynamic load of GroupWidgets from JavaScript + #### Comming Soon ###### + # For dynamic load of GroupWidgets from JavaScript #my $dbgroup = ""; #for (my $p=2;$p<@a;$p++){$dbgroup .= @a[$p]." ";} #For Groupnames with Space #for (my $p=2;$p<@a;$p++){$dbgroup .= $a[$p]." ";} #For Groupnames with Space @@ -228,17 +232,17 @@ sub Dashboard_Get($@) { #%group = Dashboard_BuildGroupList($dashboard_groupListfhem); #$res .= Dashboard_BuildGroupWidgets(1,1,1212,trim($dbgroup),"t1c1,".trim($dbgroup).",true,0,0:"); #return $res; - #For dynamic loading of tabs + #For dynamic loading of tabs } elsif ($arg eq "tab" && $arg2 =~ /^\d+$/) { return Dashboard_BuildDashboardTab($arg2, $hash->{NAME}); + } elsif ($arg eq "icon") { shift @a; shift @a; - my $icon = join (' ', @a); - return FW_iconPath($icon); + } else { return "Unknown argument $arg choose one of config:noArg groupWidget tab icon"; } @@ -248,8 +252,9 @@ sub Dashboard_Escape($) { my $a = shift; return "null" if(!defined($a)); my %esc = ("\n" => '\n', "\r" => '\r', "\t" => '\t', "\f" => '\f', "\b" => '\b', "\"" => '\"', "\\" => '\\\\', "\'" => '\\\'', ); - $a =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/eg; - return $a; + $a =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/eg; + +return $a; } ################################################################ @@ -288,7 +293,7 @@ sub Dashboard_attr($$$) { if ($attrName =~ m/alias/) { # if an alias is set to the dashboard, replace the name shown in the left navigation by this alias - my $url = '/dashboard/' . $name; + my $url = '/dashboard/'.$name; $data{FWEXT}{$url}{NAME} = $attrVal; } } @@ -296,7 +301,7 @@ sub Dashboard_attr($$$) { # die Argumente für das Attribut dashboard_activetab dynamisch ermitteln und setzen my $f = Dashboard_calcAttrActiveTab ($name); delFromDevAttrList($name, "dashboard_activetab"); - addToDevAttrList($name, "dashboard_activetab:$f"); + addToDevAttrList ($name, "dashboard_activetab:$f"); return; } @@ -311,10 +316,10 @@ sub Dashboard_DetailFN() { my $ret = ""; $ret .= "\n"; $ret .= "\n"; $ret .= "
Helper:\n
\n"; - $ret .= " \n"; - $ret .= " \n"; - $ret .= " \n"; - $ret .= "
\n"; + $ret .= "\n"; + $ret .= "\n"; + $ret .= "\n"; + $ret .= "\n"; $ret .= "
\n"; @@ -327,15 +332,15 @@ return $ret; sub Dashboard_CGI($) { my ($htmlarg) = @_; - $htmlarg =~ s/^\///; # eliminate leading / + $htmlarg =~ s/^\///; # eliminate leading / my @params = split(/\//,$htmlarg); # split URL by / - my $ret = ''; - my $name = $params[1]; + my $ret = ''; + my $name = $params[1]; $ret = '
'; if ($name && defined($defs{$name})) { - my $showfullsize = AttrVal($defs{$name}{NAME}, "dashboard_showfullsize", 0); + my $showfullsize = AttrVal($name, "dashboard_showfullsize", 0); if ($showfullsize) { if ($FW_RET =~ m/]*class="([^"]+)"[^>]*>/) { @@ -346,7 +351,7 @@ sub Dashboard_CGI($) { } $ret .= Dashboard_SummaryFN($FW_wname,$name,$FW_room,undef); } else { - $ret .= 'Dashboard "' . $name . '" not found'; + $ret .= 'Dashboard "'.$name.'" not found'; } $ret .= '
'; @@ -367,7 +372,8 @@ sub DashboardAsHtml($) { } ############################################################################################# -# SummaryFn +# zentrale Dashboard Generierung +# (beachte $data{FWEXT} bzw. $data{FWEXT}{CONTENTFUNC} in 01_FHEMWEB.pm) ############################################################################################# sub Dashboard_SummaryFN ($$$$) { my ($FW_wname, $d, $room, $pageHash) = @_; @@ -413,11 +419,11 @@ sub Dashboard_SummaryFN ($$$$) { return ""; } - if ($debug == 1) { $debugfield = "edit"; } + if ($debug == 1) { $debugfield = "edit"; } if ($showtabs eq "tabs-and-buttonbar-at-the-top") { $showbuttonbar = "top"; } if ($showtabs eq "tabs-and-buttonbar-on-the-bottom") { $showbuttonbar = "bottom"; } - if ($showbuttonbar eq "hidden") { $lockstate = "lock"; } - if ($activetab > $tabcount) { $activetab = $tabcount; } + if ($showbuttonbar eq "hidden") { $lockstate = "lock"; } + if ($activetab > $tabcount) { $activetab = $tabcount; } $colwidth =~ tr/,/:/; if (not ($colheight =~ /^\d+$/)) { $colheight = 400; } @@ -434,29 +440,29 @@ sub Dashboard_SummaryFN ($$$$) { if ($room ne "all") { ############################ Set FHEM url to avoid hardcoding it in javascript ############################ - $ret .= ""; + $ret .= ""; $ret .= "
\n"; - $ret .= "
\n"; - $ret .= " \n"; - $ret .= "
\n"; - $ret .= " \n"; - $ret .= " \n"; - $ret .= " "; - $ret .= " "; + $ret .= "
\n"; + $ret .= "\n"; + $ret .= "
\n"; + $ret .= "
Tabtitle:
Tabicon:
\n"; + $ret .= "\n"; + $ret .= ""; + $ret .= ""; # the method FW_multipleSelect seems not to be available any more in fhem - #$ret .= " "; - $ret .= " "; - $ret .= " "; - $ret .= "
Tabtitle:
Tabicon:
Groups:
Groups:
\n"; - $ret .= "
\n"; - $ret .= "
\n"; + #$ret .= "Groups:"; + $ret .= "Groups:"; + $ret .= ""; + $ret .= "\n"; + $ret .= "
\n"; + $ret .= "
\n"; $ret .= "Comming soon"; - $ret .= "
\n"; - $ret .= "
\n"; + $ret .= "
\n"; + $ret .= "\n"; $ret .= "\n"; $ret .= "
$name
\n"; @@ -466,7 +472,7 @@ sub Dashboard_SummaryFN ($$$$) { $ret .= "\n"; $ret .= "\n"; $ret .= "\n"; - $ret .= "
\n"; + $ret .= "
\n"; ########################### Dashboard Tab-Liste ############################################## $ret .= "
    \n"; @@ -503,21 +509,22 @@ return $ret; # Dashboard Tabs erstellen ############################################################################################# sub Dashboard_BuildDashboardTab ($$) { - my ($t, $d) = @_; + my ($t, $name) = @_; + my $hash = $defs{$name}; - my $id = $defs{$d}{NR}; - my $colcount = AttrVal($defs{$d}{NAME}, 'dashboard_tab' . ($t + 1) . 'colcount', AttrVal($defs{$d}{NAME}, "dashboard_colcount", 1)); - my $colwidths = AttrVal($defs{$d}{NAME}, 'dashboard_tab' . ($t + 1) . 'rowcentercolwidth', AttrVal($defs{$d}{NAME}, "dashboard_rowcentercolwidth", 100)); + my $id = $hash->{NR}; + my $colcount = AttrVal($name, 'dashboard_tab'.($t + 1).'colcount', AttrVal($name, "dashboard_colcount", 1)); + my $colwidths = AttrVal($name, 'dashboard_tab'.($t + 1).'rowcentercolwidth', AttrVal($name, "dashboard_rowcentercolwidth", 100)); $colwidths =~ tr/,/:/; - my $backgroundimage = AttrVal($defs{$d}{NAME}, 'dashboard_tab' . ($t + 1) . 'backgroundimage', ""); - my $row = AttrVal($defs{$d}{NAME}, "dashboard_row", "center"); - my $tabcount = Dashboard_GetTabCount($defs{$d}, 1); - my $tabgroups = AttrVal($defs{$d}{NAME}, "dashboard_tab" . ($t + 1) . "groups", ""); - my $tabsortings = AttrVal($defs{$d}{NAME}, "dashboard_tab" . ($t + 1) . "sorting", ""); - my $tabdevicegroups = AttrVal($defs{$d}{NAME}, "dashboard_tab" . ($t + 1) . "devices", ""); + my $backgroundimage = AttrVal($name, 'dashboard_tab'.($t + 1).'backgroundimage', ""); + my $row = AttrVal($name, "dashboard_row", "center"); + my $tabgroups = AttrVal($name, "dashboard_tab".($t + 1)."groups", ""); + my $tabsortings = AttrVal($name, "dashboard_tab".($t + 1)."sorting", ""); + my $tabdevicegroups = AttrVal($name, "dashboard_tab".($t + 1)."devices", ""); + my $tabcount = Dashboard_GetTabCount($hash, 1); unless ($tabgroups || $tabdevicegroups) { - readingsSingleUpdate( $defs{$d}, "state", "No Groups or devices set", 0 ); + readingsSingleUpdate($hash, "state", "No Groups or devices set", 0); return ""; } @@ -547,16 +554,16 @@ sub Dashboard_BuildDashboardTab ($$) { my @index = grep { $groups[$_] eq $stabgroup[0] } (0 .. @groups-1); if (@index == 0) { - my $matchGroup = '^' . $stabgroup[0] . '$'; + my $matchGroup = '^'.$stabgroup[0] . '$'; @index = grep { $groups[$_] =~ m/$matchGroup/ } (0 .. @groups-1); } if (@index > 0) { for (my $j=0; $j<@index;$j++) { my $groupname = @groups[$index[$j]]; - $groupname .= '$$$' . 'a:group=' . $groupname; + $groupname .= '$$$'.'a:group='.$groupname; if (@stabgroup > 1) { - $groupname .= '$$$' . $stabgroup[1]; + $groupname .= '$$$'.$stabgroup[1]; } push(@tabdevicegroups,$groupname); } @@ -568,7 +575,7 @@ sub Dashboard_BuildDashboardTab ($$) { # add sortings for groups not already having a defined sorting for (my $i=0;$i<@tabdevicegroups;$i++) { my @stabgroup = split(/\$\$\$/, trim($tabdevicegroups[$i])); - my $matchGroup = "," . quotemeta(trim($stabgroup[0])) . ","; + my $matchGroup = ",".quotemeta(trim($stabgroup[0])).","; if ($tabsortings !~ m/$matchGroup/) { $tabsortings = $tabsortings."t".$t."c".Dashboard_GetMaxColumnId($row,$colcount).",".trim($stabgroup[0]).",true,0,0:"; @@ -576,21 +583,22 @@ sub Dashboard_BuildDashboardTab ($$) { } my $ret = "
    \n"; - $ret .= "
      \n"; - $ret .= " \n"; + $ret .= "
        \n"; + $ret .= "
      \n"; + ##################### Top Row (only one Column) ############################################# if ($row eq "top-center-bottom" || $row eq "top-center" || $row eq "top"){ - $ret .= Dashboard_BuildDashboardTopRow($t,$id,$tabgroups,$tabsortings); + $ret .= Dashboard_BuildDashboardTopRow($name,$t,$id,$tabgroups,$tabsortings); } ##################### Center Row (max. 5 Column) ############################################ if ($row eq "top-center-bottom" || $row eq "top-center" || $row eq "center-bottom" || $row eq "center") { - $ret .= Dashboard_BuildDashboardCenterRow($t,$id,$tabgroups,$tabsortings,$colcount); + $ret .= Dashboard_BuildDashboardCenterRow($name,$t,$id,$tabgroups,$tabsortings,$colcount); } ############################# Bottom Row (only one Column) ############################################ if ($row eq "top-center-bottom" || $row eq "center-bottom" || $row eq "bottom"){ - $ret .= Dashboard_BuildDashboardBottomRow($t,$id,$tabgroups,$tabsortings); + $ret .= Dashboard_BuildDashboardBottomRow($name,$t,$id,$tabgroups,$tabsortings); } - ############################################################################################# + $ret .= "
      \n"; $ret .= "
    \n"; $ret .= "
    \n"; @@ -601,14 +609,14 @@ return $ret; ############################################################################################# # Oberste Zeile erstellen ############################################################################################# -sub Dashboard_BuildDashboardTopRow ($$$$) { - my ($t,$id, $devicegroups, $groupsorting) = @_; +sub Dashboard_BuildDashboardTopRow ($$$$$) { + my ($name,$t,$id, $devicegroups, $groupsorting) = @_; my $ret; $ret .= "\n"; $ret .= "
    \n"; $ret .= "
    \n"; - $ret .= Dashboard_BuildGroupWidgets($t,"100",$id,$devicegroups,$groupsorting); + $ret .= Dashboard_BuildGroupWidgets($name,$t,"100",$id,$devicegroups,$groupsorting); $ret .= "
    \n"; $ret .= "
    \n"; $ret .= "\n"; @@ -619,8 +627,8 @@ return $ret; ############################################################################################# # ############################################################################################# -sub Dashboard_BuildDashboardCenterRow ($$$$$) { - my ($t,$id, $devicegroups, $groupsorting, $colcount) = @_; +sub Dashboard_BuildDashboardCenterRow ($$$$$$) { + my ($name,$t,$id, $devicegroups, $groupsorting, $colcount) = @_; my $ret = "\n"; $ret .= "
    \n"; @@ -639,7 +647,7 @@ sub Dashboard_BuildDashboardCenterRow ($$$$$) { for (my $i=0;$i<$colcount;$i++){ $ret .= "
    \n"; - $ret .= Dashboard_BuildGroupWidgets($t,$i,$id,$devicegroups,$groupsorting); + $ret .= Dashboard_BuildGroupWidgets($name,$t,$i,$id,$devicegroups,$groupsorting); $ret .= "
    \n"; } $ret .= "
    \n"; @@ -651,13 +659,13 @@ return $ret; ############################################################################################# # ############################################################################################# -sub Dashboard_BuildDashboardBottomRow ($$$$) { - my ($t,$id, $devicegroups, $groupsorting) = @_; +sub Dashboard_BuildDashboardBottomRow ($$$$$) { + my ($name,$t,$id, $devicegroups, $groupsorting) = @_; my $ret; $ret .= "\n"; $ret .= "
    \n"; $ret .= "
    \n"; - $ret .= Dashboard_BuildGroupWidgets($t,"200",$id,$devicegroups,$groupsorting); + $ret .= Dashboard_BuildGroupWidgets($name,$t,"200",$id,$devicegroups,$groupsorting); $ret .= "
    \n"; $ret .= "
    \n"; $ret .= "\n"; @@ -668,13 +676,13 @@ return $ret; ############################################################################################# # ############################################################################################# -sub Dashboard_BuildGroupWidgets ($$$$$) { - my ($tab,$column,$id,$devicegroups, $groupsorting) = @_; +sub Dashboard_BuildGroupWidgets ($$$$$$) { + my ($name,$tab,$column,$id,$devicegroups,$groupsorting) = @_; my $ret = ""; - my $counter = 0; - my %sorting = (); - my %groups = (); + my $counter = 0; + my %sorting = (); + my %groups = (); my @groupnames = (); foreach (split(":", $groupsorting)) { @@ -707,7 +715,7 @@ sub Dashboard_BuildGroupWidgets ($$$$$) { next if (index($sorting{$groupname}, 't'.$tab.'c'.$column) < 0); my $groupId = $id."t".$tab."c".$column."w".$counter; - $ret .= BuildGroup( ($groupname,$groupdevices,$sorting{$groupname},$groupId,$groupicon) ); + $ret .= Dashboard_BuildGroup($name,$groupname,$groupdevices,$sorting{$groupname},$groupId,$groupicon); $counter++; } @@ -752,33 +760,33 @@ return $ret; ############################################################################################# # ############################################################################################# -sub BuildGroup { - my ($groupname,$devices,$sorting,$groupId,$icon) = @_; - my $ret = ""; - my $row = 1; - my %extPage = (); +sub Dashboard_BuildGroup ($$$$$$) { + my ($name,$groupname,$devices,$sorting,$groupId,$icon) = @_; + my $row = 1; + my %extPage = (); my $foundDevices = 0; my $replaceGroup = ""; + my $ret = ""; - my $rf = ($FW_room ? "&room=$FW_room" : ""); # stay in the room - - $ret .= "
    \n"; - $ret .= "
    \n"; + my $rf = ($FW_room ? "&room=$FW_room" : ""); # stay in the room + + $ret .= "
    \n"; + $ret .= "
    \n"; if ($groupname && $groupname ne $devices) { - $ret .= "
    "; + $ret .= "
    "; if ($icon) { $ret.= FW_makeImage($icon,$icon,"dashboard_group_icon"); } - $ret .= $groupname . "
    \n"; + $ret .= $groupname."
    \n"; } - $ret .= "
    \n"; + $ret .= "
    \n"; $ret .= ""; my %seen; # make sure devices are not contained twice in the list - my @devices = grep { ! $seen{$_} ++ } devspec2array($devices); + my @devices = grep { !$seen{$_}++ } devspec2array($devices); # sort the devices in alphabetical order by sortby, alias, name @devices = sort { lc(AttrVal($a,'sortby',AttrVal($a,'alias',$a))) cmp lc(AttrVal($b,'sortby',AttrVal($b,'alias',$b))) } @devices; @@ -789,40 +797,43 @@ sub BuildGroup { $ret .= sprintf("", ($row&1)?"odd":"even"); - my $type = $defs{$d}{TYPE}; + my $type = $defs{$d}{TYPE}; my $devName = AttrVal($d, "alias", $d); - my $icon = AttrVal($d, "icon", ""); - - $icon = FW_makeImage($icon,$icon,"icon dashboard_groupicon") . " " if($icon); - - $devName="" if($modules{$defs{$d}{TYPE}}{FW_hideDisplayName}); # Forum 88667 - if (!$modules{$defs{$d}{TYPE}}{FW_atPageEnd}) { # Don't show Link for "atEnd"-devices - $ret .= FW_pH "detail=$d", "$icon$devName", 1, "col1", 1; - } + my $icon = AttrVal($d, "icon", ""); + $icon = FW_makeImage($icon,$icon,"icon dashboard_groupicon")." " if($icon); + $devName = "" if($modules{$defs{$d}{TYPE}}{FW_hideDisplayName}); # Forum 88667 + + if (!$modules{$defs{$d}{TYPE}}{FW_atPageEnd}) { # Don't show Link for "atEnd"-devices + if(AttrVal($name, "noLinks", 0)) { + $ret .= ""; # keine Links zur Detailansicht des Devices + } else { + $ret .= FW_pH ("detail=$d", "$icon$devName", 1, "col1", 1); # FW_pH = add href (, , , , , ) + } + } $row++; - $extPage{group} = $groupname; + $extPage{group} = $groupname; my ($allSets, $cmdlist, $txt) = FW_devState($d, $rf, \%extPage); - $allSets = FW_widgetOverride($d, $allSets); + $allSets = FW_widgetOverride($d, $allSets); ############## Customize Result for Special Types ##################### my @txtarray = split(">", $txt); if ($modules{$defs{$d}{TYPE}}{FW_atPageEnd}) { no strict "refs"; - my $devret = &{$modules{$defs{$d}{TYPE}}{FW_summaryFn}}($FW_wname, $d, - $FW_room, \%extPage); - $ret .= ""; } - ###### Commands, slider, dropdown + ############## Commands, slider, dropdown ##################### my $smallscreenCommands = AttrVal($FW_wname, "smallscreenCommands", ""); if((!$FW_ss || $smallscreenCommands) && $cmdlist) { my @a = split("[: ]", AttrVal($d, "cmdIcon", "")); @@ -1255,6 +1266,18 @@ return; Default: 100%
    + + +
  • noLinks
    + No link generation to the detail view of the devices takes place.

    + + Note:
    + Some device types deliver the links to their detail view integrated in the devices name or alias. + In such cases you have to deactivate the link generation inside of the device (for example in devices of type readingsGroup, + SSCamSTRM or SMAPortal). +
  • +
    + @@ -1329,13 +1352,15 @@ return;
  • dashboard_activetab
    Legt das aktuell aktivierte Tab fest. Wenn nicht gesetzt, wird das zuletzt aktivierte Tab ausgewählt (Default: 1) -

  • + +
  • dashboard_backgroundimage
    Zeig in Hintergrundbild im Dashboard an. Das Bild wird nicht gestreckt, es sollte daher auf die Größe des Dashboards passen oder diese überschreiten. -

  • + +
  • dashboard_colcount
    @@ -1343,33 +1368,38 @@ return; in einer Spalte nebeneinander zu positionieren. Dies ist abhängig von der Breite der Spalten und Gruppen.
    Gilt nur für die mittlere Spalte!
    Standard: 1 -

  • + +
  • dashboard_debug
    Zeigt Debug-Felder an. Sollte nicht gesetzt werden!
    Standard: 0 -

  • + +
  • dashboard_flexible
    Hat dieser Parameter einen Wert > 0, dann können die Widgets in den Tabs frei positioniert werden und hängen nicht mehr an den Spalten fest. Der Wert gibt ebenfalls das Raster an, in dem die Positionierung "zu schnappt". Standard: 0 -

  • + +
  • dashboard_row
    Auswahl welche Zeilen angezeigt werden sollen. top (nur Oben), center (nur Mitte), bottom (nur Unten) und den Kombinationen daraus.
    Standard: center -

  • + +
  • dashboard_rowcenterheight
    Höhe der mittleren Zeile, in der die Gruppen angeordnet werden.
    Standard: 400 -

  • + +
  • dashboard_rowcentercolwidth
    @@ -1379,13 +1409,15 @@ return; Sind mehr Spalten als Breiten definiert werden die fehlenden Breiten um die Differenz zu 100 festgelegt. Sind hingegen weniger Spalten als Werte definiert werden die überschüssigen Werte ignoriert.
    Standard: 100 -

  • + +
  • dashboard_rowtopheight
    Höhe der oberen Zeile, in der die Gruppen angeordnet werden.
    Standard: 250 -

  • + +
  • dashboard_rowbottomheight
    @@ -1398,14 +1430,16 @@ return; Blendet die FHEMWEB Raumliste (kompleter linker Bereich der Seite) und den oberen Bereich von FHEMWEB aus wenn der Wert auf 1 gesetzt ist.
    Default: 0 -

  • + +
  • dashboard_showtabs
    Zeigt die Tabs/Schalterleiste des Dashboards oben oder unten an, oder blendet diese aus. Wenn die Schalterleiste ausgeblendet wird ist das Dashboard gespert.
    Standard: tabs-and-buttonbar-at-the-top -

  • + +
  • dashboard_showtogglebuttons
    @@ -1416,13 +1450,15 @@ return;
  • dashboard_tabXname
    Titel des X Tab. -

  • + +
  • dashboard_tabXsorting
    Enthält die Positionierung jeder Gruppe im Tab X. Der Wert wird mit der Schaltfläche "Set" geschrieben. Es wird nicht empfohlen dieses Attribut manuell zu ändern. -

  • + +
  • dashboard_tab1groups
    @@ -1433,7 +1469,8 @@ return; Beispiel: Light:Icon_Fisch@blue,AVIcon_Fisch@red,Single Lights:Icon_Fisch@yellow
    Der Gruppenname kann ebenfalls einen regulären Ausdruck beinhalten, um alle Gruppen anzuzeigen, die darauf passen.
    Beispiel: .*Licht.* zeigt alle Gruppen an, die das Wort "Licht" im Namen haben. -

  • + +
  • dashboard_tabXdevices
    @@ -1442,13 +1479,15 @@ return; Das Icon ist optional. Auch der Gruppenname muss nicht vorhanden sein. Im Falle dass dieser fehlt, werden die gefunden Geräte nicht gruppiert sondern als einzelne Widgets im Tab angezeigt. Für weitere Details bezüglich devspec: Dev-Spec -

  • + +
  • dashboard_tabXicon
    Zeigt am Tab ein Icon an. Es muss sich dabei um ein exisitereindes Icon mit modpath Verzeichnis handeln. Handelt es sich um ein SVG Icon kann der Suffix @colorname für die Farbe des Icons angegeben werden. -

  • + +
  • dashboard_tabXcolcount
    @@ -1456,20 +1495,34 @@ return; in einer Spalte nebeneinander zu positionieren. Dies ist abhängig von der Breite der Spalten und Gruppen.
    Gilt nur für die mittlere Spalte!
    Standard: <dashboard_colcount> -

  • + +
  • dashboard_tabXbackgroundimage
    Zeigt ein Hintergrundbild für den X-ten Tab an. Das Bild wird nicht gestreckt, es sollte also auf die Größe des Tabs passen oder diese überschreiten. -

  • + +
  • dashboard_width
    Zum bestimmen der Dashboardbreite. Der Wert kann in % (z.B. 80%) angegeben werden oder als absolute Breite (z.B. 1200) in Pixel.
    Standard: 100% -

  • + +
    + + +
  • noLinks
    + Es erfolgt keine Linkerstellung zur Detailansicht von Devices.

    + + Hinweis:
    + Bei manchen Devicetypen wird der Link zur Detailansicht integriert im Namen bzw. Alias des Device mitgeliefert. + In diesen Fällen muß die Linkgenerierung direkt im Device abgestellt werden (z.B. bei Devices der Typen readingsGroup, + SSCamSTRM oder SMAPortal). +
  • +
    diff --git a/fhem/contrib/DS_Starter/95_Dashboard.pm b/fhem/contrib/DS_Starter/95_Dashboard.pm index b213994c0..49283e436 100644 --- a/fhem/contrib/DS_Starter/95_Dashboard.pm +++ b/fhem/contrib/DS_Starter/95_Dashboard.pm @@ -1,4 +1,4 @@ -# $Id: 95_Dashboard.pm 16920 2018-06-29 12:01:56Z DS_Starter $ +# $Id: 95_Dashboard.pm 20185 2019-09-17 22:13:48Z DS_Starter $ ######################################################################################## # 95_Dashboard.pm # @@ -41,6 +41,8 @@ package main; use strict; use warnings; +eval "use FHEM::Meta;1" or my $modMetaAbsent = 1; + use vars qw(%FW_icons); # List of icons use vars qw($FW_dir); # base directory for web server use vars qw($FW_icondir); # icon base directory @@ -53,7 +55,9 @@ use vars qw($FW_ss); # is smallscreen, needed by 97_GROUP/95_VIEW # Versions History intern our %Dashboard_vNotesIntern = ( - "3.11.0" => "16.09.2019 attr dashboard_activetab is now working properly (initial version) ", + "3.11.1" => "16.09.2019 new attribute noLinks ", + "3.11.0" => "16.09.2019 attr dashboard_activetab is now working properly, commandref revised, calculate attribute ". + "dashboard_activetab (is now a userattr) ", "3.10.1" => "29.06.2018 added FW_hideDisplayName, Forum #88727 ", "1.0.0" => "20.12.2013 initial version released to testers " ); @@ -67,9 +71,8 @@ sub Dashboard_GetGroupList(); # Global variables my %group; my $dashboard_groupListfhem; -my $fwjquery = "jquery.min.js"; -my $fwjqueryui = "jquery-ui.min.js"; -my $dashboardversion = "3.10.1"; +my $fwjquery = "jquery.min.js"; +my $fwjqueryui = "jquery-ui.min.js"; ############################################################################################# sub Dashboard_Initialize ($) { @@ -82,20 +85,19 @@ sub Dashboard_Initialize ($) { $hash->{FW_detailFn} = "Dashboard_DetailFN"; $hash->{AttrFn} = "Dashboard_attr"; $hash->{AttrList} = "disable:0,1 ". - "dashboard_colcount:1,2,3,4,5 ". - "dashboard_debug:0,1 ". + "dashboard_backgroundimage ". + "dashboard_colcount:1,2,3,4,5 ". + "dashboard_customcss " . + "dashboard_debug:0,1 ". + "dashboard_flexible " . "dashboard_rowtopheight ". "dashboard_rowbottomheight ". - "dashboard_row:top,center,bottom,top-center,center-bottom,top-center-bottom ". - "dashboard_showtogglebuttons:0,1 ". - "dashboard_activetab:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 ". - "dashboard_width ". + "dashboard_row:top,center,bottom,top-center,center-bottom,top-center-bottom ". "dashboard_rowcenterheight ". "dashboard_rowcentercolwidth ". "dashboard_showfullsize:0,1 ". "dashboard_showtabs:tabs-and-buttonbar-at-the-top,tabs-and-buttonbar-on-the-bottom,tabs-and-buttonbar-hidden ". - "dashboard_customcss " . - "dashboard_flexible " . + "dashboard_showtogglebuttons:0,1 ". "dashboard_tab1name " . "dashboard_tab1groups " . "dashboard_tab1devices " . @@ -112,12 +114,15 @@ sub Dashboard_Initialize ($) { "dashboard_tab[0-9]+colcount " . "dashboard_tab[0-9]+rowcentercolwidth " . "dashboard_tab[0-9]+backgroundimage " . - "dashboard_backgroundimage"; + "dashboard_width ". + "noLinks:1,0 "; - $data{FWEXT}{jquery}{SCRIPT} = "/pgm2/".$fwjquery if (!$data{FWEXT}{jquery}{SCRIPT}); + $data{FWEXT}{jquery}{SCRIPT} = "/pgm2/".$fwjquery if (!$data{FWEXT}{jquery}{SCRIPT}); $data{FWEXT}{jqueryui}{SCRIPT} = "/pgm2/".$fwjqueryui if (!$data{FWEXT}{jqueryui}{SCRIPT}); $data{FWEXT}{z_dashboard}{SCRIPT} = "/pgm2/dashboard.js" if (!$data{FWEXT}{z_dashboard}); - $data{FWEXT}{x_dashboard}{SCRIPT} = "/pgm2/svg.js" if (!$data{FWEXT}{x_dashboard}); + $data{FWEXT}{x_dashboard}{SCRIPT} = "/pgm2/svg.js" if (!$data{FWEXT}{x_dashboard}); + + eval { FHEM::Meta::InitMod( __FILE__, $hash ) }; # für Meta.pm (https://forum.fhem.de/index.php/topic,97589.0.html) return undef; } @@ -129,20 +134,23 @@ sub Dashboard_define ($$) { my ($hash, $def) = @_; my @args = split (" ", $def); + my $now = time(); + my $name = $hash->{NAME}; + + $hash->{HELPER}{MODMETAABSENT} = 1 if($modMetaAbsent); # Modul Meta.pm nicht vorhanden - my $now = time(); - my $name = $hash->{NAME}; - $hash->{VERSION} = $dashboardversion; + # Versionsinformationen setzen + Dashboard_setVersionInfo($hash); readingsSingleUpdate( $hash, "state", "Initialized", 0 ); RemoveInternalTimer($hash); - InternalTimer ($now + 5, 'CheckDashboardAttributUssage', $hash, 0); + InternalTimer ($now + 5, 'Dashboard_CheckDashboardAttributUssage', $hash, 0); my $url = '/dashboard/' . $name; - $data{FWEXT}{$url}{CONTENTFUNC} = 'Dashboard_CGI'; - $data{FWEXT}{$url}{LINK} = 'dashboard/' . $name; + $data{FWEXT}{$url}{CONTENTFUNC} = 'Dashboard_CGI'; # $data{FWEXT} = FHEMWEB Extension, siehe 01_FHEMWEB.pm + $data{FWEXT}{$url}{LINK} = 'dashboard/'.$name; $data{FWEXT}{$url}{NAME} = $name; return; @@ -165,23 +173,16 @@ sub Dashboard_Set($@) { } } -sub Dashboard_Escape($) { - my $a = shift; - return "null" if(!defined($a)); - my %esc = ("\n" => '\n', "\r" => '\r', "\t" => '\t', "\f" => '\f', "\b" => '\b', "\"" => '\"', "\\" => '\\\\', "\'" => '\\\'', ); - $a =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/eg; - return $a; -} - ################################################################ # Get ################################################################ sub Dashboard_Get($@) { my ($hash, @a) = @_; - my $res = ""; + my $res = ""; - my $arg = (defined($a[1]) ? $a[1] : ""); + my $arg = (defined($a[1]) ? $a[1] : ""); my $arg2 = (defined($a[2]) ? $a[2] : ""); + if ($arg eq "config") { my $name = $hash->{NAME}; my $attrdata = $attr{$name}; @@ -196,10 +197,12 @@ sub Dashboard_Get($@) { my @iconFolders = split(":", AttrVal($FW_wname, "iconPath", "$FW_sp:default:fhemSVG:openautomation")); my $iconDirs = ""; + foreach my $idir (@iconFolders) {$iconDirs .= "$attr{global}{modpath}/www/images/".$idir.",";} - $res .= " \"icondirs\": \"$iconDirs\", \"dashboard_tabcount\": " . GetTabCount($hash, 0). ", \"dashboard_activetab\": " . GetActiveTab($hash->{NAME}); - + + $res .= " \"icondirs\": \"$iconDirs\", \"dashboard_tabcount\": " . Dashboard_GetTabCount($hash, 0). ", \"dashboard_activetab\": " . Dashboard_GetActiveTab($hash->{NAME}); $res .= ($i != $x) ? ",\n" : "\n"; + foreach my $attr (sort keys %$attrdata) { $i++; @splitattr = split("@", $attrdata->{$attr}); @@ -217,33 +220,43 @@ sub Dashboard_Get($@) { $res .= "}\n"; return $res; } + } elsif ($arg eq "groupWidget") { -#### Comming Soon ###### -# For dynamic load of GroupWidgets from JavaScript + #### Comming Soon ###### + # For dynamic load of GroupWidgets from JavaScript #my $dbgroup = ""; #for (my $p=2;$p<@a;$p++){$dbgroup .= @a[$p]." ";} #For Groupnames with Space #for (my $p=2;$p<@a;$p++){$dbgroup .= $a[$p]." ";} #For Groupnames with Space #$dashboard_groupListfhem = Dashboard_GetGroupList; - #%group = BuildGroupList($dashboard_groupListfhem); - #$res .= BuildGroupWidgets(1,1,1212,trim($dbgroup),"t1c1,".trim($dbgroup).",true,0,0:"); + #%group = Dashboard_BuildGroupList($dashboard_groupListfhem); + #$res .= Dashboard_BuildGroupWidgets(1,1,1212,trim($dbgroup),"t1c1,".trim($dbgroup).",true,0,0:"); #return $res; - #For dynamic loading of tabs + #For dynamic loading of tabs } elsif ($arg eq "tab" && $arg2 =~ /^\d+$/) { - return BuildDashboardTab($arg2, $hash->{NAME}); + return Dashboard_BuildDashboardTab($arg2, $hash->{NAME}); + } elsif ($arg eq "icon") { shift @a; shift @a; - my $icon = join (' ', @a); - return FW_iconPath($icon); + } else { return "Unknown argument $arg choose one of config:noArg groupWidget tab icon"; } } +sub Dashboard_Escape($) { + my $a = shift; + return "null" if(!defined($a)); + my %esc = ("\n" => '\n', "\r" => '\r', "\t" => '\t', "\f" => '\f', "\b" => '\b', "\"" => '\"', "\\" => '\\\\', "\'" => '\\\'', ); + $a =~ s/([\x22\x5c\n\r\t\f\b])/$esc{$1}/eg; + +return $a; +} + ################################################################ # Undefine ################################################################ @@ -256,7 +269,7 @@ sub Dashboard_undef ($$) { RemoveInternalTimer($hash); - return undef; +return undef; } ################################################################ @@ -265,39 +278,34 @@ sub Dashboard_undef ($$) { sub Dashboard_attr($$$) { my ($cmd, $name, $attrName, $attrVal) = @_; - # add dynamic attributes - if ( - $cmd eq "set" && - ( - $attrName =~ m/dashboard_tab([1-9][0-9]*)groups/ - || $attrName =~ m/dashboard_tab([1-9][0-9]*)devices/ - ) - ) { - addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "name"); - addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "devices"); - addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "groups"); - addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "sorting"); - addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "icon"); - addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "colcount"); - addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "rowcentercolwidth"); - addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "backgroundimage"); + if ($cmd eq "set") { + if ($attrName =~ m/dashboard_tab([1-9][0-9]*)groups/ || $attrName =~ m/dashboard_tab([1-9][0-9]*)devices/) { + # add dynamic attributes + addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "name"); + addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "devices"); + addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "groups"); + addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "sorting"); + addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "icon"); + addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "colcount"); + addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "rowcentercolwidth"); + addToDevAttrList($name, "dashboard_tab" . ($1 + 1) . "backgroundimage"); + } + + if ($attrName =~ m/alias/) { + # if an alias is set to the dashboard, replace the name shown in the left navigation by this alias + my $url = '/dashboard/'.$name; + $data{FWEXT}{$url}{NAME} = $attrVal; + } } + + # die Argumente für das Attribut dashboard_activetab dynamisch ermitteln und setzen + my $f = Dashboard_calcAttrActiveTab ($name); + delFromDevAttrList($name, "dashboard_activetab"); + addToDevAttrList ($name, "dashboard_activetab:$f"); - # if an alias is set to the dashboard, replace the name shown in the left navigation - # by this alias - if ( - $cmd eq "set" - && $attrName =~ m/alias/ - ) { - my $url = '/dashboard/' . $name; - - $data{FWEXT}{$url}{NAME} = $attrVal; - } - - return; +return; } - ################################################################ # Routine für FHEMWEB Detailanzeige ################################################################ @@ -308,13 +316,14 @@ sub Dashboard_DetailFN() { my $ret = ""; $ret .= "
    $icon$devName$txt
    \n"; $ret .= "\n"; $ret .= "
    Helper:\n
    \n"; - $ret .= " \n"; - $ret .= " \n"; - $ret .= " \n"; - $ret .= "
    \n"; + $ret .= "\n"; + $ret .= "\n"; + $ret .= "\n"; + $ret .= "\n"; $ret .= "
    \n"; - return $ret; + +return $ret; } ############################################################################################# @@ -323,15 +332,15 @@ sub Dashboard_DetailFN() { sub Dashboard_CGI($) { my ($htmlarg) = @_; - $htmlarg =~ s/^\///; # eliminate leading / + $htmlarg =~ s/^\///; # eliminate leading / my @params = split(/\//,$htmlarg); # split URL by / - my $ret = ''; - my $name = $params[1]; + my $ret = ''; + my $name = $params[1]; $ret = '
    '; if ($name && defined($defs{$name})) { - my $showfullsize = AttrVal($defs{$name}{NAME}, "dashboard_showfullsize", 0); + my $showfullsize = AttrVal($name, "dashboard_showfullsize", 0); if ($showfullsize) { if ($FW_RET =~ m/]*class="([^"]+)"[^>]*>/) { @@ -342,7 +351,7 @@ sub Dashboard_CGI($) { } $ret .= Dashboard_SummaryFN($FW_wname,$name,$FW_room,undef); } else { - $ret .= 'Dashboard "' . $name . '" not found'; + $ret .= 'Dashboard "'.$name.'" not found'; } $ret .= '
    '; @@ -363,7 +372,8 @@ sub DashboardAsHtml($) { } ############################################################################################# -# SummaryFn +# zentrale Dashboard Generierung +# (beachte $data{FWEXT} bzw. $data{FWEXT}{CONTENTFUNC} in 01_FHEMWEB.pm) ############################################################################################# sub Dashboard_SummaryFN ($$$$) { my ($FW_wname, $d, $room, $pageHash) = @_; @@ -371,48 +381,49 @@ sub Dashboard_SummaryFN ($$$$) { my $ret = ""; my $showbuttonbar = "hidden"; my $debugfield = "hidden"; - my $h = $defs{$d}; - my $name = $defs{$d}{NAME}; + my $hash = $defs{$d}; + my $name = $d; my $id = $defs{$d}{NR}; ######################### Read Dashboard Attributes and set Default-Values #################################### - my $lockstate = ($defs{$d}->{READINGS}{lockstate}{VAL}) ? $defs{$d}->{READINGS}{lockstate}{VAL} : "unlock"; + my $lockstate = ReadingsVal($name, "lockstate", "unlock"); my $showhelper = ($lockstate eq "unlock") ? 1 : 0; - my $disable = AttrVal($defs{$d}{NAME}, "disable", 0); - my $colcount = AttrVal($defs{$d}{NAME}, "dashboard_colcount", 1); - my $colwidth = AttrVal($defs{$d}{NAME}, "dashboard_rowcentercolwidth", 100); - my $colheight = AttrVal($defs{$d}{NAME}, "dashboard_rowcenterheight", 400); - my $rowtopheight = AttrVal($defs{$d}{NAME}, "dashboard_rowtopheight", 250); - my $rowbottomheight = AttrVal($defs{$d}{NAME}, "dashboard_rowbottomheight", 250); - my $showtabs = AttrVal($defs{$d}{NAME}, "dashboard_showtabs", "tabs-and-buttonbar-at-the-top"); - my $showtogglebuttons = AttrVal($defs{$d}{NAME}, "dashboard_showtogglebuttons", 1); - my $showfullsize = AttrVal($defs{$d}{NAME}, "dashboard_showfullsize", 0); - my $flexible = AttrVal($defs{$d}{NAME}, "dashboard_flexible", 0); - my $customcss = AttrVal($defs{$d}{NAME}, "dashboard_customcss", "none"); - my $backgroundimage = AttrVal($defs{$d}{NAME}, "dashboard_backgroundimage", ""); - my $row = AttrVal($defs{$d}{NAME}, "dashboard_row", "center"); - my $debug = AttrVal($defs{$d}{NAME}, "dashboard_debug", "0"); - my $activetab = GetActiveTab($d); - my $tabcount = GetTabCount($defs{$d}, 1); - my $dbwidth = AttrVal($defs{$d}{NAME}, "dashboard_width", "100%"); + my $disable = AttrVal($name, "disable", 0); + my $colcount = AttrVal($name, "dashboard_colcount", 1); + my $colwidth = AttrVal($name, "dashboard_rowcentercolwidth", 100); + my $colheight = AttrVal($name, "dashboard_rowcenterheight", 400); + my $rowtopheight = AttrVal($name, "dashboard_rowtopheight", 250); + my $rowbottomheight = AttrVal($name, "dashboard_rowbottomheight", 250); + my $showtabs = AttrVal($name, "dashboard_showtabs", "tabs-and-buttonbar-at-the-top"); + my $showtogglebuttons = AttrVal($name, "dashboard_showtogglebuttons", 1); + my $showfullsize = AttrVal($name, "dashboard_showfullsize", 0); + my $flexible = AttrVal($name, "dashboard_flexible", 0); + my $customcss = AttrVal($name, "dashboard_customcss", "none"); + my $backgroundimage = AttrVal($name, "dashboard_backgroundimage", ""); + my $row = AttrVal($name, "dashboard_row", "center"); + my $debug = AttrVal($name, "dashboard_debug", "0"); + my $activetab = Dashboard_GetActiveTab($name); + my $tabcount = Dashboard_GetTabCount($hash, 1); + my $dashboardversion = $hash->{HELPER}{VERSION}; + my $dbwidth = AttrVal($name, "dashboard_width", "100%"); my @tabnames = (); my @tabsortings = (); for (my $i = 0; $i < $tabcount; $i++) { - $tabnames[$i] = AttrVal($defs{$d}{NAME}, "dashboard_tab" . ($i + 1) . "name", "Dashboard-Tab " . ($i + 1)); - $tabsortings[$i] = AttrVal($defs{$d}{NAME}, "dashboard_tab" . ($i + 1) . "sorting", ""); + $tabnames[$i] = AttrVal($name, "dashboard_tab" . ($i + 1) . "name", "Dashboard-Tab " . ($i + 1)); + $tabsortings[$i] = AttrVal($name, "dashboard_tab" . ($i + 1) . "sorting", ""); } if ($disable == 1) { - readingsSingleUpdate( $defs{$d}, "state", "Disabled", 0 ); + readingsSingleUpdate($hash, "state", "Disabled", 0 ); return ""; } - if ($debug == 1) { $debugfield = "edit"; } + if ($debug == 1) { $debugfield = "edit"; } if ($showtabs eq "tabs-and-buttonbar-at-the-top") { $showbuttonbar = "top"; } if ($showtabs eq "tabs-and-buttonbar-on-the-bottom") { $showbuttonbar = "bottom"; } - if ($showbuttonbar eq "hidden") { $lockstate = "lock"; } - if ($activetab > $tabcount) { $activetab = $tabcount; } + if ($showbuttonbar eq "hidden") { $lockstate = "lock"; } + if ($activetab > $tabcount) { $activetab = $tabcount; } $colwidth =~ tr/,/:/; if (not ($colheight =~ /^\d+$/)) { $colheight = 400; } @@ -422,69 +433,70 @@ sub Dashboard_SummaryFN ($$$$) { #------------------- Check dashboard_sorting on false content ------------------------------------ for (my $i=0;$i<@tabsortings;$i++){ if (($tabsortings[$i-1] !~ /[0-9]+/ || $tabsortings[$i-1] !~ /:/ || $tabsortings[$i-1] !~ /,/ ) && ($tabsortings[$i-1] ne "," && $tabsortings[$i-1] ne "")){ - Log3 $d, 3, "[".$name." V".$dashboardversion."] Value of attribut dashboard_tab".$i."sorting is wrong. Saved sorting can not be set. Fix Value or delete the Attribute. [".$tabsortings[$i-1]."]"; - } else { Log3 $d, 5, "[".$name." V".$dashboardversion."] Sorting OK or Empty: dashboard_tab".$i."sorting "; } + Log3 $name, 3, "[".$name." V".$dashboardversion."] Value of attribut dashboard_tab".$i."sorting is wrong. Saved sorting can not be set. Fix Value or delete the Attribute. [".$tabsortings[$i-1]."]"; + } else { Log3 $name, 5, "[".$name." V".$dashboardversion."] Sorting OK or Empty: dashboard_tab".$i."sorting "; } } #------------------------------------------------------------------------------------------------- if ($room ne "all") { ############################ Set FHEM url to avoid hardcoding it in javascript ############################ - $ret .= ""; + $ret .= ""; $ret .= "
    \n"; - $ret .= "
    \n"; - $ret .= " \n"; - $ret .= "
    \n"; - $ret .= " \n"; - $ret .= " \n"; - $ret .= " "; - $ret .= " "; + $ret .= "
    \n"; + $ret .= "\n"; + $ret .= "
    \n"; + $ret .= "
    Tabtitle:
    Tabicon:
    \n"; + $ret .= "\n"; + $ret .= ""; + $ret .= ""; # the method FW_multipleSelect seems not to be available any more in fhem - #$ret .= " "; - $ret .= " "; - $ret .= " "; - $ret .= "
    Tabtitle:
    Tabicon:
    Groups:
    Groups:
    \n"; - $ret .= "
    \n"; - $ret .= "
    \n"; + #$ret .= "Groups:"; + $ret .= "Groups:"; + $ret .= ""; + $ret .= "\n"; + $ret .= "
    \n"; + $ret .= "
    \n"; $ret .= "Comming soon"; - $ret .= "
    \n"; - $ret .= "
    \n"; + $ret .= "
    \n"; + $ret .= "
    \n"; $ret .= "
    \n"; - $ret .= "
    $d
    \n"; + $ret .= "
    $name
    \n"; $ret .= "\n"; $ret .= "\n"; - $ret .= "\n"; $ret .= "
    \n"; $ret .= "\n"; $ret .= "\n"; $ret .= "
    \n"; + $ret .= "
    \n"; ########################### Dashboard Tab-Liste ############################################## $ret .= " \n"; ######################################################################################## for (my $t=0;$t<$tabcount;$t++) { if ($t == $activetab - 1) { - $ret .= BuildDashboardTab($t, $d); + $ret .= Dashboard_BuildDashboardTab($t, $name); } } $ret .= "
    \n"; + } else { $ret .= ""; - $ret .= ""; - $ret .= "\n"; @@ -613,8 +627,8 @@ return $ret; ############################################################################################# # ############################################################################################# -sub BuildDashboardCenterRow ($$$$$) { - my ($t,$id, $devicegroups, $groupsorting, $colcount) = @_; +sub Dashboard_BuildDashboardCenterRow ($$$$$$) { + my ($name,$t,$id, $devicegroups, $groupsorting, $colcount) = @_; my $ret = "\n"; @@ -662,13 +676,13 @@ return $ret; ############################################################################################# # ############################################################################################# -sub BuildGroupWidgets ($$$$$) { - my ($tab,$column,$id,$devicegroups, $groupsorting) = @_; +sub Dashboard_BuildGroupWidgets ($$$$$$) { + my ($name,$tab,$column,$id,$devicegroups,$groupsorting) = @_; my $ret = ""; - my $counter = 0; - my %sorting = (); - my %groups = (); + my $counter = 0; + my %sorting = (); + my %groups = (); my @groupnames = (); foreach (split(":", $groupsorting)) { @@ -701,7 +715,7 @@ sub BuildGroupWidgets ($$$$$) { next if (index($sorting{$groupname}, 't'.$tab.'c'.$column) < 0); my $groupId = $id."t".$tab."c".$column."w".$counter; - $ret .= BuildGroup( ($groupname,$groupdevices,$sorting{$groupname},$groupId,$groupicon) ); + $ret .= Dashboard_BuildGroup($name,$groupname,$groupdevices,$sorting{$groupname},$groupId,$groupicon); $counter++; } @@ -711,7 +725,7 @@ return $ret; ############################################################################################# # ############################################################################################# -sub BuildGroupList ($) { +sub Dashboard_BuildGroupList ($) { my @dashboardgroups = split(",", $_[0]); #array for all groups to build an widget my %group = (); @@ -746,33 +760,33 @@ return $ret; ############################################################################################# # ############################################################################################# -sub BuildGroup { - my ($groupname,$devices,$sorting,$groupId,$icon) = @_; - my $ret = ""; - my $row = 1; - my %extPage = (); +sub Dashboard_BuildGroup ($$$$$$) { + my ($name,$groupname,$devices,$sorting,$groupId,$icon) = @_; + my $row = 1; + my %extPage = (); my $foundDevices = 0; my $replaceGroup = ""; + my $ret = ""; - my $rf = ($FW_room ? "&room=$FW_room" : ""); # stay in the room - - $ret .= "
    \n"; - $ret .= "
    \n"; + my $rf = ($FW_room ? "&room=$FW_room" : ""); # stay in the room + + $ret .= "
    \n"; + $ret .= "
    \n"; if ($groupname && $groupname ne $devices) { - $ret .= "
    "; + $ret .= "
    "; if ($icon) { $ret.= FW_makeImage($icon,$icon,"dashboard_group_icon"); } - $ret .= $groupname . "
    \n"; + $ret .= $groupname."
    \n"; } - $ret .= "
    \n"; + $ret .= "
    \n"; $ret .= "
    ".$defs{$d}{TYPE}."
    "; + $ret .= ""; + $ret .= ""; $ret .= "
    ".$hash->{TYPE}."
    {TYPE}."\" class=\"block wide\">"; $ret .= ""; - $ret .= ""; - $ret .= ""; + $ret .= ""; + $ret .= ""; $ret .= ""; $ret .= "
    ".$defs{$d}{STATE}."
    ".$hash->{STATE}."
    "; @@ -496,22 +508,23 @@ return $ret; ############################################################################################# # Dashboard Tabs erstellen ############################################################################################# -sub BuildDashboardTab ($$) { - my ($t, $d) = @_; +sub Dashboard_BuildDashboardTab ($$) { + my ($t, $name) = @_; + my $hash = $defs{$name}; - my $id = $defs{$d}{NR}; - my $colcount = AttrVal($defs{$d}{NAME}, 'dashboard_tab' . ($t + 1) . 'colcount', AttrVal($defs{$d}{NAME}, "dashboard_colcount", 1)); - my $colwidths = AttrVal($defs{$d}{NAME}, 'dashboard_tab' . ($t + 1) . 'rowcentercolwidth', AttrVal($defs{$d}{NAME}, "dashboard_rowcentercolwidth", 100)); + my $id = $hash->{NR}; + my $colcount = AttrVal($name, 'dashboard_tab'.($t + 1).'colcount', AttrVal($name, "dashboard_colcount", 1)); + my $colwidths = AttrVal($name, 'dashboard_tab'.($t + 1).'rowcentercolwidth', AttrVal($name, "dashboard_rowcentercolwidth", 100)); $colwidths =~ tr/,/:/; - my $backgroundimage = AttrVal($defs{$d}{NAME}, 'dashboard_tab' . ($t + 1) . 'backgroundimage', ""); - my $row = AttrVal($defs{$d}{NAME}, "dashboard_row", "center"); - my $tabcount = GetTabCount($defs{$d}, 1); - my $tabgroups = AttrVal($defs{$d}{NAME}, "dashboard_tab" . ($t + 1) . "groups", ""); - my $tabsortings = AttrVal($defs{$d}{NAME}, "dashboard_tab" . ($t + 1) . "sorting", ""); - my $tabdevicegroups = AttrVal($defs{$d}{NAME}, "dashboard_tab" . ($t + 1) . "devices", ""); + my $backgroundimage = AttrVal($name, 'dashboard_tab'.($t + 1).'backgroundimage', ""); + my $row = AttrVal($name, "dashboard_row", "center"); + my $tabgroups = AttrVal($name, "dashboard_tab".($t + 1)."groups", ""); + my $tabsortings = AttrVal($name, "dashboard_tab".($t + 1)."sorting", ""); + my $tabdevicegroups = AttrVal($name, "dashboard_tab".($t + 1)."devices", ""); + my $tabcount = Dashboard_GetTabCount($hash, 1); unless ($tabgroups || $tabdevicegroups) { - readingsSingleUpdate( $defs{$d}, "state", "No Groups or devices set", 0 ); + readingsSingleUpdate($hash, "state", "No Groups or devices set", 0); return ""; } @@ -541,16 +554,16 @@ sub BuildDashboardTab ($$) { my @index = grep { $groups[$_] eq $stabgroup[0] } (0 .. @groups-1); if (@index == 0) { - my $matchGroup = '^' . $stabgroup[0] . '$'; + my $matchGroup = '^'.$stabgroup[0] . '$'; @index = grep { $groups[$_] =~ m/$matchGroup/ } (0 .. @groups-1); } if (@index > 0) { for (my $j=0; $j<@index;$j++) { my $groupname = @groups[$index[$j]]; - $groupname .= '$$$' . 'a:group=' . $groupname; + $groupname .= '$$$'.'a:group='.$groupname; if (@stabgroup > 1) { - $groupname .= '$$$' . $stabgroup[1]; + $groupname .= '$$$'.$stabgroup[1]; } push(@tabdevicegroups,$groupname); } @@ -562,29 +575,30 @@ sub BuildDashboardTab ($$) { # add sortings for groups not already having a defined sorting for (my $i=0;$i<@tabdevicegroups;$i++) { my @stabgroup = split(/\$\$\$/, trim($tabdevicegroups[$i])); - my $matchGroup = "," . quotemeta(trim($stabgroup[0])) . ","; + my $matchGroup = ",".quotemeta(trim($stabgroup[0])).","; if ($tabsortings !~ m/$matchGroup/) { - $tabsortings = $tabsortings."t".$t."c".GetMaxColumnId($row,$colcount).",".trim($stabgroup[0]).",true,0,0:"; + $tabsortings = $tabsortings."t".$t."c".Dashboard_GetMaxColumnId($row,$colcount).",".trim($stabgroup[0]).",true,0,0:"; } } my $ret = "
    \n"; - $ret .= "
      \n"; - $ret .= " \n"; + $ret .= "
        \n"; + $ret .= "
      \n"; + ##################### Top Row (only one Column) ############################################# if ($row eq "top-center-bottom" || $row eq "top-center" || $row eq "top"){ - $ret .= BuildDashboardTopRow($t,$id,$tabgroups,$tabsortings); + $ret .= Dashboard_BuildDashboardTopRow($name,$t,$id,$tabgroups,$tabsortings); } ##################### Center Row (max. 5 Column) ############################################ if ($row eq "top-center-bottom" || $row eq "top-center" || $row eq "center-bottom" || $row eq "center") { - $ret .= BuildDashboardCenterRow($t,$id,$tabgroups,$tabsortings,$colcount); + $ret .= Dashboard_BuildDashboardCenterRow($name,$t,$id,$tabgroups,$tabsortings,$colcount); } ############################# Bottom Row (only one Column) ############################################ if ($row eq "top-center-bottom" || $row eq "center-bottom" || $row eq "bottom"){ - $ret .= BuildDashboardBottomRow($t,$id,$tabgroups,$tabsortings); + $ret .= Dashboard_BuildDashboardBottomRow($name,$t,$id,$tabgroups,$tabsortings); } - ############################################################################################# + $ret .= "
      \n"; $ret .= "
    \n"; $ret .= "
    \n"; @@ -595,14 +609,14 @@ return $ret; ############################################################################################# # Oberste Zeile erstellen ############################################################################################# -sub BuildDashboardTopRow ($$$$) { - my ($t,$id, $devicegroups, $groupsorting) = @_; +sub Dashboard_BuildDashboardTopRow ($$$$$) { + my ($name,$t,$id, $devicegroups, $groupsorting) = @_; my $ret; $ret .= "
    \n"; $ret .= "
    \n"; $ret .= "
    \n"; - $ret .= BuildGroupWidgets($t,"100",$id,$devicegroups,$groupsorting); + $ret .= Dashboard_BuildGroupWidgets($name,$t,"100",$id,$devicegroups,$groupsorting); $ret .= "
    \n"; $ret .= "
    \n"; $ret .= "
    \n"; $ret .= "
    \n"; @@ -633,7 +647,7 @@ sub BuildDashboardCenterRow ($$$$$) { for (my $i=0;$i<$colcount;$i++){ $ret .= "
    \n"; - $ret .= BuildGroupWidgets($t,$i,$id,$devicegroups,$groupsorting); + $ret .= Dashboard_BuildGroupWidgets($name,$t,$i,$id,$devicegroups,$groupsorting); $ret .= "
    \n"; } $ret .= "
    \n"; @@ -645,13 +659,13 @@ return $ret; ############################################################################################# # ############################################################################################# -sub BuildDashboardBottomRow ($$$$) { - my ($t,$id, $devicegroups, $groupsorting) = @_; +sub Dashboard_BuildDashboardBottomRow ($$$$$) { + my ($name,$t,$id, $devicegroups, $groupsorting) = @_; my $ret; $ret .= "
    \n"; $ret .= "
    \n"; $ret .= "
    \n"; - $ret .= BuildGroupWidgets($t,"200",$id,$devicegroups,$groupsorting); + $ret .= Dashboard_BuildGroupWidgets($name,$t,"200",$id,$devicegroups,$groupsorting); $ret .= "
    \n"; $ret .= "
    \n"; $ret .= "
    "; my %seen; # make sure devices are not contained twice in the list - my @devices = grep { ! $seen{$_} ++ } devspec2array($devices); + my @devices = grep { !$seen{$_}++ } devspec2array($devices); # sort the devices in alphabetical order by sortby, alias, name @devices = sort { lc(AttrVal($a,'sortby',AttrVal($a,'alias',$a))) cmp lc(AttrVal($b,'sortby',AttrVal($b,'alias',$b))) } @devices; @@ -783,40 +797,43 @@ sub BuildGroup { $ret .= sprintf("", ($row&1)?"odd":"even"); - my $type = $defs{$d}{TYPE}; + my $type = $defs{$d}{TYPE}; my $devName = AttrVal($d, "alias", $d); - my $icon = AttrVal($d, "icon", ""); - - $icon = FW_makeImage($icon,$icon,"icon dashboard_groupicon") . " " if($icon); - - $devName="" if($modules{$defs{$d}{TYPE}}{FW_hideDisplayName}); # Forum 88667 - if (!$modules{$defs{$d}{TYPE}}{FW_atPageEnd}) { # Don't show Link for "atEnd"-devices - $ret .= FW_pH "detail=$d", "$icon$devName", 1, "col1", 1; - } + my $icon = AttrVal($d, "icon", ""); + $icon = FW_makeImage($icon,$icon,"icon dashboard_groupicon")." " if($icon); + $devName = "" if($modules{$defs{$d}{TYPE}}{FW_hideDisplayName}); # Forum 88667 + + if (!$modules{$defs{$d}{TYPE}}{FW_atPageEnd}) { # Don't show Link for "atEnd"-devices + if(AttrVal($name, "noLinks", 0)) { + $ret .= ""; # keine Links zur Detailansicht des Devices + } else { + $ret .= FW_pH ("detail=$d", "$icon$devName", 1, "col1", 1); # FW_pH = add href (, , , , , ) + } + } $row++; - $extPage{group} = $groupname; + $extPage{group} = $groupname; my ($allSets, $cmdlist, $txt) = FW_devState($d, $rf, \%extPage); - $allSets = FW_widgetOverride($d, $allSets); + $allSets = FW_widgetOverride($d, $allSets); ############## Customize Result for Special Types ##################### my @txtarray = split(">", $txt); if ($modules{$defs{$d}{TYPE}}{FW_atPageEnd}) { no strict "refs"; - my $devret = &{$modules{$defs{$d}{TYPE}}{FW_summaryFn}}($FW_wname, $d, - $FW_room, \%extPage); - $ret .= ""; } - ###### Commands, slider, dropdown + ############## Commands, slider, dropdown ##################### my $smallscreenCommands = AttrVal($FW_wname, "smallscreenCommands", ""); if((!$FW_ss || $smallscreenCommands) && $cmdlist) { my @a = split("[: ]", AttrVal($d, "cmdIcon", "")); @@ -866,7 +883,7 @@ return $ret; ############################################################################################# # ############################################################################################# -sub GetMaxColumnId ($$) { +sub Dashboard_GetMaxColumnId ($$) { my ($row, $colcount) = @_; my $maxcolid = "0"; @@ -880,13 +897,13 @@ return $maxcolid; ############################################################################################# # ############################################################################################# -sub CheckDashboardEntry ($) { +sub Dashboard_CheckDashboardEntry ($) { my ($hash) = @_; my $now = time(); my $timeToExec = $now + 5; RemoveInternalTimer($hash); - InternalTimer ($timeToExec, 'CheckDashboardAttributUssage', $hash, 0); + InternalTimer ($timeToExec, 'Dashboard_CheckDashboardAttributUssage', $hash, 0); return; } @@ -894,10 +911,11 @@ return; ############################################################################################# # replaces old disused attributes and their values | set minimal attributes ############################################################################################# -sub CheckDashboardAttributUssage($) { +sub Dashboard_CheckDashboardAttributUssage($) { my ($hash) = @_; - my $d = $hash->{NAME}; - my $detailnote = ""; + my $d = $hash->{NAME}; + my $dashboardversion = $hash->{HELPER}{VERSION}; + my $detailnote = ""; # --------- Set minimal Attributes in the hope to make it easier for beginners -------------------- my $tab1groups = AttrVal($defs{$d}{NAME}, "dashboard_tab1groups", ""); @@ -927,7 +945,7 @@ sub CheckDashboardAttributUssage($) { { FW_fC("deleteattr ".$d." dashboard_showhelper"); } Log3 $hash, 3, "[".$hash->{NAME}. " V".$dashboardversion."]"." Using an outdated no longer used Attribute or Value. This has been corrected. Don't forget to save config. [dashboard_showhelper]"; } - my $showtabs = AttrVal($defs{$d}{NAME}, "dashboard_showtabs", ""); # delete values 04.2014 + my $showtabs = AttrVal($defs{$d}{NAME}, "dashboard_showtabs", ""); # delete values 04.2014 if ($showtabs eq "tabs-at-the-top-buttonbar-hidden") { { FW_fC("set ".$d." dashboard_showtabs tabs-and-buttonbar-at-the-top"); } Log3 $hash, 3, "[".$hash->{NAME}. " V".$dashboardversion."]"." Using an outdated no longer used Attribute or Value. This has been corrected. Don't forget to save config. [tabs-at-the-top-buttonbar-hidden]"; @@ -943,7 +961,7 @@ return; ############################################################################################# # Anzahl der vorhandenen Tabs ermitteln und zurück geben ############################################################################################# -sub GetTabCount ($$) { +sub Dashboard_GetTabCount ($$) { my ($hash, $defaultTabCount) = @_; my $tabCount = 0; @@ -958,10 +976,10 @@ return $tabCount ? $tabCount : $defaultTabCount; ############################################################################################# # Aktives Tab selektieren ############################################################################################# -sub GetActiveTab ($) { +sub Dashboard_GetActiveTab ($) { my ($d) = @_; - my $maxTab = GetTabCount($defs{$d}, 1); + my $maxTab = Dashboard_GetTabCount($defs{$d}, 1); my $activeTab = 1; if (defined($FW_httpheader{Cookie})) { @@ -978,9 +996,57 @@ sub GetActiveTab ($) { return $dat; } +############################################################################################# +# Wertevorrat für Attribut dashboard_activetab ermitteln und setzen +############################################################################################# +sub Dashboard_calcAttrActiveTab ($) { + my ($name) = @_; + my $f; + + my $maxTab = Dashboard_GetTabCount($defs{$name}, 1); + for my $i (1..$maxTab) { + $f .= "," if($f); + $f .= $i; + } + +return $f; +} + +################################################################ +# Versionierungen des Moduls setzen +# Die Verwendung von Meta.pm und Packages wird berücksichtigt +################################################################ +sub Dashboard_setVersionInfo($) { + my ($hash) = @_; + my $name = $hash->{NAME}; + + my $v = (sortTopicNum("desc",keys %Dashboard_vNotesIntern))[0]; + my $type = $hash->{TYPE}; + $hash->{HELPER}{PACKAGE} = __PACKAGE__; + $hash->{HELPER}{VERSION} = $v; + + if($modules{$type}{META}{x_prereqs_src} && !$hash->{HELPER}{MODMETAABSENT}) { # META-Daten sind vorhanden + $modules{$type}{META}{version} = "v".$v; # Version aus META.json überschreiben, Anzeige mit {Dumper $modules{SMAPortal}{META}} + if($modules{$type}{META}{x_version}) { # {x_version} ( nur gesetzt wenn $Id: 95_Dashboard.pm 20185 2019-09-17 22:13:48Z DS_Starter $ im Kopf komplett! vorhanden ) + $modules{$type}{META}{x_version} =~ s/1.1.1/$v/g; + } else { + $modules{$type}{META}{x_version} = $v; + } + return $@ unless (FHEM::Meta::SetInternals($hash)); # FVERSION wird gesetzt ( nur gesetzt wenn $Id: 95_Dashboard.pm 20185 2019-09-17 22:13:48Z DS_Starter $ im Kopf komplett! vorhanden ) + if(__PACKAGE__ eq "FHEM::$type" || __PACKAGE__ eq $type) { # es wird mit Packages gearbeitet -> Perl übliche Modulversion setzen + use version 0.77; our $VERSION = FHEM::Meta::Get( $hash, 'version' ); # mit {->VERSION()} im FHEMWEB kann Modulversion abgefragt werden + } + } else { + $hash->{VERSION} = $v; # herkömmliche Modulstruktur + } + +return; +} + 1; =pod +=encoding utf8 =item summary Dashboard for showing multiple devices sorted in tabs =item summary_DE Dashboard zur Anzeige mehrerer Geräte in verschiedenen Tabs =begin html @@ -994,162 +1060,228 @@ return $dat; Define +

    +
      - define <name> Dashboard +
        +
      • define <name> Dashboard

        - Example:
        -
          - define anyViews Dashboard -

        + Example:
        + define anyViews Dashboard +

        - Bestpractice beginner configuration -

        - + Bestpractice beginner configuration: +
        define anyViews Dashboard
        attr anyViews dashboard_colcount 2
        attr anyviews dashboard_rowcentercolwidth 30,70
        attr anyViews dashboard_tab1groups <Group1>,<Group2>,<Group3>
        -
      +
    +
    - Set + Set +

    +
      - set <name> lock

      - locks the Dashboard so that no position changes can be made
      - set <name> unlock

      - unlock the Dashboard
      +
        +
      • set <name> lock
        + Locks the Dashboard so that no position changes can be made. +

      • + +
      • set <name> unlock
        + Unlock the Dashboard, +
        +
      • +

    - Get
      N/A

    + Get +
      +
        + N/A +
      +
    +
    +
    + Attributes +
    +
    +
      - -
    • dashboard_tabcount
      - Returns the number of displayed tabs. (Does not need to be set any more. It is read automatically from the configured tabs) - Default: 1 -

    • - -
    • dashboard_activetab
      - Specifies which tab is activated. If it isn't set, the last active tab will also be the current tab. (Default: 1) -

    • - -
    • dashboard_tabXname
      - Title of Tab at position X. -

    • - -
    • dashboard_tabXsorting
      - Contains the position of each group in Tab X. Value is written by the "Set" button. It is not recommended to take manual changes. -

    • - -
    • dashboard_row
      - To select which rows are displayed. top only; center only; bottom only; top and center; center and bottom; top,center and bottom.
      - Default: center -

    • - -
    • dashboard_width
      - To determine the Dashboardwidth. The value can be specified, or an absolute width value (eg 1200) in pixels in% (eg 80%).
      - Default: 100% -

    • - -
    • dashboard_rowcenterheight
      - Height of the center row in which the groups may be positioned.
      - Default: 400 -

    • - -
    • dashboard_rowcentercolwidth
      - About this attribute, the width of each column of the middle Dashboardrow can be set. It can be stored for each column a separate value. - The values ​​must be separated by a comma (no spaces). Each value determines the column width in%! The first value specifies the width of the first column, - the second value of the width of the second column, etc. Is the sum of the width greater than 100 it is reduced. - If more columns defined as widths the missing widths are determined by the difference to 100. However, are less columns are defined as the values ​​of - ignores the excess values​​.
      - Default: 100 -

    • - -
    • dashboard_rowtopheight
      - Height of the top row in which the groups may be positioned.
      - Default: 250 -

    • - -
    • "dashboard_rowbottomheight
      - Height of the bottom row in which the groups may be positioned.
      - Default: 250 -

    • - -
    • dashboard_tabXgroups
      - Comma-separated list of the names of the groups to be displayed in Tab X.
      - Each group can be given an icon for this purpose the group name, the following must be completed ":<icon>@<color>"
      - Example: Light:Icon_Fisch@blue,AVIcon_Fisch@red,Single Lights:Icon_Fisch@yellow
      - Additionally a group can contain a regular expression to show all groups matching a criteria. - Example: .*Light.* to show all groups that contain the string "Light" -

    • - -
    • dashboard_tabXdevices
      - devspec list of devices that should appear in the tab. The format is:
      - GROUPNAME:devspec1,devspec2,...,devspecN:ICONNAME
      - THe icon name is optional. Also the group name is optional. In case of missing group name, the matching devices are not grouped but shown as separate widgets without titles. For further details on the devspec format see:
      - Dev-Spec -

    • - -
    • dashboard_tabXicon
      - Set the icon for a Tab. There must exist an icon with the name ico.(png|svg) in the modpath directory. If the image is referencing an SVG icon, then you can use the @colorname suffix to color the image. -

    • - -
    • dashboard_colcount
      - Number of columns in which the groups can be displayed. Nevertheless, it is possible to have multiple groups
      - to be positioned in a column next to each other. This is depend on the width of columns and groups.
      - Default: 1 -

    • - -
    • dashboard_tabXcolcount
      - Number of columns for a specific tab in which the groups can be displayed. Nevertheless, it is possible to have multiple groups
      - to be positioned in a column next to each other. This depends on the width of columns and groups.
      - Default: -

    • - -
    • dashboard_tabXbackgroundimage
      - Shows a background image for the X tab. The image is not stretched in any way, it should therefore match the tab size or extend it. - Standard: -

    • - -
    • dashboard_flexible
      - If set to a value > 0, the widgets are not positioned in columns any more but can be moved freely to any position in the tab.
      - The value for this parameter also defines the grid, in which the position "snaps in". - Default: 0 -

    • - -
    • dashboard_showfullsize
      - Hide FHEMWEB Roomliste (complete left side) and Page Header if Value is 1.
      - Default: 0 -

    • - -
    • dashboard_showtabs
      - Displays the Tabs/Buttonbar on top or bottom, or hides them. If the Buttonbar is hidden lockstate is "lock" is used.
      - Default: tabs-and-buttonbar-at-the-top -

    • - -
    • dashboard_showtogglebuttons
      - Displays a Toogle Button on each Group do collapse.
      - Default: 0 -

    • - -
    • dashboard_backgroundimage
      - Displays a background image for the complete dashboard. The image is not stretched in any way so the size should match/extend the - dashboard height/width. - Default: -

    • - -
    • dashboard_debug
      - Show Hiddenfields. Only for Maintainer's use.
      - Default: 0 -

    • -
    - +
      + +
    • dashboard_activetab
      + Specifies which tab is activated. If it isn't set, the last active tab will also be the current tab. (Default: 1) +

    • + + +
    • dashboard_backgroundimage
      + Displays a background image for the complete dashboard. The image is not stretched in any way so the size should + match/extend the dashboard height/width. +

    • + + +
    • dashboard_colcount
      + Number of columns in which the groups can be displayed. Nevertheless, it is possible to have multiple groups
      + to be positioned in a column next to each other. This is depend on the width of columns and groups.
      + Default: 1 +
    • +
      + + +
    • dashboard_debug
      + Show Hiddenfields. Only for Maintainer's use.
      + Default: 0 +
    • +
      + + +
    • dashboard_flexible
      + If set to a value > 0, the widgets are not positioned in columns any more but can be moved freely to any position in + the tab.
      + The value for this parameter also defines the grid, in which the position "snaps in". + Default: 0 +

    • + + +
    • dashboard_row
      + To select which rows are displayed. top only; center only; bottom only; top and center; center and bottom; top,center and bottom.
      + Default: center +

    • + + +
    • dashboard_rowbottomheight
      + Height of the bottom row in which the groups may be positioned.
      + Default: 250 +

    • + + +
    • dashboard_rowcenterheight
      + Height of the center row in which the groups may be positioned.
      + Default: 400 +

    • + + +
    • dashboard_rowcentercolwidth
      + About this attribute, the width of each column of the middle Dashboardrow can be set. It can be stored for each column + a separate value. + The values ​​must be separated by a comma (no spaces). Each value determines the column width in%! The first value + specifies the width of the first column, the second value of the width of the second column, etc. Is the sum of the + width greater than 100 it is reduced. + If more columns defined as widths the missing widths are determined by the difference to 100. However, are less + columns are defined as the values ​​of ignores the excess values​​.
      + Default: 100 +

    • + + +
    • dashboard_rowtopheight
      + Height of the top row in which the groups may be positioned.
      + Default: 250 +

    • + + +
    • dashboard_showfullsize
      + Hide FHEMWEB Roomliste (complete left side) and Page Header if Value is 1.
      + Default: 0 +

    • + + +
    • dashboard_showtabs
      + Displays the Tabs/Buttonbar on top or bottom, or hides them. If the Buttonbar is hidden lockstate is "lock" is used.
      + Default: tabs-and-buttonbar-at-the-top +

    • + + +
    • dashboard_showtogglebuttons
      + Displays a Toogle Button on each Group do collapse.
      + Default: 0 +

    • + + +
    • dashboard_tabXname
      + Title of Tab at position X. +

    • + + +
    • dashboard_tabXsorting
      + Contains the position of each group in Tab X. Value is written by the "Set" button. It is not recommended to take + manual changes. +

    • + + +
    • dashboard_tabXgroups
      + Comma-separated list of the names of the groups to be displayed in Tab X.
      + Each group can be given an icon for this purpose the group name, the following must be + completed ":<icon>@<color>"

      + + Example:
      + Light:Icon_Fisch@blue,AVIcon_Fisch@red,Single Lights:Icon_Fisch@yellow

      + + Additionally a group can contain a regular expression to show all groups matching a criteria.

      + + Example:
      + .*Light.* to show all groups that contain the string "Light" +

    • + + +
    • dashboard_tabXdevices
      + devspec list of devices that should appear in the tab. The format is:
      + GROUPNAME:devspec1,devspec2,...,devspecN:ICONNAME

      + + The icon name is optional. Also the group name is optional. In case of missing group name, the matching devices are + not grouped but shown as separate widgets without titles. + For further details on the devspec format see Dev-Spec. +

    • + + +
    • dashboard_tabXicon
      + Set the icon for a Tab. There must exist an icon with the name ico.(png|svg) in the modpath directory. If the image is + referencing an SVG icon, then you can use the @colorname suffix to color the image. +

    • + + +
    • dashboard_tabXcolcount
      + Number of columns for a specific tab in which the groups can be displayed. Nevertheless, it is possible to have + multiple groups.
      + to be positioned in a column next to each other. This depends on the width of columns and groups.
      + Default: <dashboard_colcount> +

    • + + +
    • dashboard_tabXbackgroundimage
      + Shows a background image for the X tab. The image is not stretched in any way, it should therefore match the tab size + or extend it. +

    • + + +
    • dashboard_width
      + To determine the Dashboardwidth. The value can be specified, or an absolute width value (eg 1200) in pixels in% (eg 80%).
      + Default: 100% +
    • +
      + + +
    • noLinks
      + No link generation to the detail view of the devices takes place.

      + Note:
      + Some device types deliver the links to their detail view integrated in the devices name or alias. + In such cases you have to deactivate the link generation inside of the device (for example in devices of type readingsGroup, + SSCamSTRM or SMAPortal). +
    • +
      + +
    + + + =end html =begin html_DE @@ -1157,166 +1289,302 @@ return $dat;

    Dashboard

      Erstellt eine Übersicht in der Gruppen angeordnet werden können. Dabei können die Gruppen mit Drag'n Drop frei positioniert
      - und in mehreren Spalten angeordnet werden. Auch kann die Breite und Höhe einer Gruppe über die Mindestgröße hinaus gezogen werden.
      + und in mehreren Spalten angeordnet werden. Auch kann die Breite und Höhe einer Gruppe über die Mindestgröße hinaus gezogen + werden. +

      Define
        - define <name> Dashboard -

        - Beispiel:
        -
          - define anyViews Dashboard -

        +
          +
        • define <name> Dashboard
          +
          + Beispiel:
          + define anyViews Dashboard +
          +
          - Bestpractice Anfängerkonfiguration -

          - + Bestpractice Anfängerkonfiguration:
          define anyViews Dashboard
          attr anyViews dashboard_colcount 2
          attr anyViews dashboard_rowcentercolwidth 30,70
          attr anyViews dashboard_tab1groups <Group1>,<Group2>,<Group3>
          -
          +
        • +

      Set
        - set <name> lock

        - Sperrt das Dashboard so das keine Positionsänderungen vorgenommen werden können
        - set <name> unlock

        - Entsperrt das Dashboard
        +
          + +
        • set <name> lock
          + Sperrt das Dashboard sodass keine Positionsänderungen vorgenommen werden können.
          +
          +
        • + +
        • set <name> unlock
          + Entsperrt das Dashboard. +
        • +
          +

      - Get
        N/A

      - - Attributes + Get
        - -
      • dashboard_tabcount
        - Gibt die Anzahl der angezeigten Tabs an. (Dieser Parameter is veraletet, die Anzahl der Tabs wird aus der Dashboard-Konfiguration gelesen) - Standard: 1 -

      • - -
      • dashboard_activetab
        - Legt das aktuell aktivierte Tab fest. Wenn nicht gesetzt, wird das zuletzt aktivierte Tab ausgewählt (Default: 1) -

      • - -
      • dashboard_tabXname
        - Titel des X. Tab. -

      • - -
      • dashboard_tabXsorting
        - Enthält die Poistionierung jeder Gruppe im Tab X. Der Wert wird mit der Schaltfläche "Set" geschrieben. Es wird nicht empfohlen dieses Attribut manuelle zu ändern -

      • - -
      • dashboard_row
        - Auswahl welche Zeilen angezeigt werden sollen. top (nur Oben), center (nur Mitte), bottom (nur Unten) und den Kombinationen daraus.
        - Standard: center -

      • - -
      • dashboard_width
        - Zum bestimmen der Dashboardbreite. Der Wert kann in % (z.B. 80%) angegeben werden oder als absolute Breite (z.B. 1200) in Pixel.
        - Standard: 100% -

      • - -
      • dashboard_rowcenterheight
        - Höhe der mittleren Zeile, in der die Gruppen angeordnet werden.
        - Standard: 400 -

      • - -
      • dashboard_rowcentercolwidth
        - Über dieses Attribut wird die Breite der einzelnen Spalten der mittleren Dashboardreihe festgelegt. Dabei kann je Spalte ein separater Wert hinterlegt werden. - Die Werte sind durch ein Komma (ohne Leerzeichen) zu trennen. Jeder Wert bestimmt die Spaltenbreite in %! Der erste Wert gibt die Breite der ersten Spalte an, - der zweite Wert die Breite der zweiten Spalte usw. Ist die Summe der Breite größer als 100 werden die Spaltenbreiten reduziert. - Sind mehr Spalten als Breiten definiert werden die fehlenden Breiten um die Differenz zu 100 festgelegt. Sind hingegen weniger Spalten als Werte definiert werden - die überschüssigen Werte ignoriert.
        - Standard: 100 -

      • - -
      • dashboard_rowtopheight
        - Höhe der oberen Zeile, in der die Gruppen angeordnet werden.
        - Standard: 250 -

      • - -
      • "dashboard_rowbottomheight
        - Höhe der unteren Zeile, in der die Gruppen angeordnet werden.
        - Standard: 250 -

      • - -
      • dashboard_tab1groups
        - Durch Komma getrennte Liste mit den Namen der Gruppen, die im Tab 1 angezeigt werden. Falsche Gruppennamen werden hervorgehoben.
        - Jede Gruppe kann zusätzlich ein Icon anzeigen, dazu muss der Gruppen name um ":<icon>@<farbe>"ergänzt werden
        - Beispiel: Light:Icon_Fisch@blue,AVIcon_Fisch@red,Single Lights:Icon_Fisch@yellow
        - Der Gruppenname kann ebenfalls einen regulären Ausdruck beinhalten, um alle Gruppen anzuzeigen, die darauf passen.
        - Beispiel: .*Licht.* zeigt alle Gruppen an, die das Wort "Licht" im Namen haben. -

      • - -
      • dashboard_tabXdevices
        - devspec Liste von Geräten, die im Tab angezeigt werden sollen. Das format ist:
        - GROUPNAME:devspec1,devspec2,...,devspecN:ICONNAME
        - Das Icon ist optional. Auch der Gruppenname muss nicht vorhanden sein. Im Falle dass dieser fehlt, werden die gefunden Geräte nicht gruppiert sondern als einzelne Widgets im Tab angezeigt. Für weitere Details bezüglich devspec: - Dev-Spec -

      • - -
      • dashboard_tabXicon
        - Zeigt am Tab ein Icon an. Es muss sich dabei um ein exisitereindes Icon mit modpath Verzeichnis handeln. Handelt es sich um ein SVG Icon kann der Suffix @colorname für die Farbe des Icons angegeben werden. -

      • - -
      • dashboard_colcount
        - Die Anzahl der Spalten in der Gruppen dargestellt werden können. Dennoch ist es möglich, mehrere Gruppen
        - in einer Spalte nebeneinander zu positionieren. Dies ist abhängig von der Breite der Spalten und Gruppen.
        - Gilt nur für die mittlere Spalte!
        - Standard: 1 -

      • - -
      • dashboard_tabXcolcount
        - Die Anzahl der Spalten im Tab X in der Gruppen dargestellt werden können. Dennoch ist es möglich, mehrere Gruppen
        - in einer Spalte nebeneinander zu positionieren. Dies ist abhängig von der Breite der Spalten und Gruppen.
        - Gilt nur für die mittlere Spalte!
        - Standard: -

      • - -
      • dashboard_tabXbackgroundimage
        - Zeigt ein Hintergrundbild für den X-ten Tab an. Das Bild wird nicht gestreckt, es sollte also auf die Größe des Tabs passen oder diese überschreiten. - Standard: -

      • - -
      • dashboard_flexible
        - Hat dieser Parameter einen Wert > 0, dann können die Widgets in den Tabs frei positioniert werden und hängen nicht mehr an den Spalten fest. Der Wert gibt ebenfalls das Raster an, in dem die Positionierung "zu schnappt". - Standard: 0 -

      • - -
      • dashboard_showfullsize
        - Blendet die FHEMWEB Raumliste (kompleter linker Bereich der Seite) und den oberen Bereich von FHEMWEB aus wenn der Wert auf 1 gesetzt ist.
        - Default: 0 -

      • - -
      • dashboard_showtabs
        - Zeigt die Tabs/Schalterleiste des Dashboards oben oder unten an, oder blendet diese aus. Wenn die Schalterleiste ausgeblendet wird ist das Dashboard gespert.
        - Standard: tabs-and-buttonbar-at-the-top -

      • - -
      • dashboard_showtogglebuttons
        - Zeigt eine Schaltfläche in jeder Gruppe mit der man diese auf- und zuklappen kann.
        - Standard: 0 -

      • - -
      • dashboard_backgroundimage
        - Zeig in Hintergrundbild im Dashboard an. Das Bild wird nicht gestreckt, es sollte daher auf die Größe des Dashboards passen oder diese überschreiten. - Default: -

      • - -
      • dashboard_debug
        - Zeigt Debug-Felder an. Sollte nicht gesetzt werden!
        - Standard: 0 -

      • -
      +
        + N/A +
      +
    +
    + + + Attributes +
    +
    +
      +
        + + +
      • dashboard_activetab
        + Legt das aktuell aktivierte Tab fest. Wenn nicht gesetzt, wird das zuletzt aktivierte Tab ausgewählt (Default: 1) +
      • +
        + + +
      • dashboard_backgroundimage
        + Zeig in Hintergrundbild im Dashboard an. Das Bild wird nicht gestreckt, es sollte daher auf die Größe des Dashboards + passen oder diese überschreiten. +
      • +
        + + +
      • dashboard_colcount
        + Die Anzahl der Spalten in der Gruppen dargestellt werden können. Dennoch ist es möglich, mehrere Gruppen
        + in einer Spalte nebeneinander zu positionieren. Dies ist abhängig von der Breite der Spalten und Gruppen.
        + Gilt nur für die mittlere Spalte!
        + Standard: 1 +
      • +
        + + +
      • dashboard_debug
        + Zeigt Debug-Felder an. Sollte nicht gesetzt werden!
        + Standard: 0 +
      • +
        + + +
      • dashboard_flexible
        + Hat dieser Parameter einen Wert > 0, dann können die Widgets in den Tabs frei positioniert werden und hängen nicht + mehr an den Spalten fest. Der Wert gibt ebenfalls das Raster an, in dem die Positionierung "zu schnappt". + Standard: 0 +
      • +
        + + +
      • dashboard_row
        + Auswahl welche Zeilen angezeigt werden sollen. top (nur Oben), center (nur Mitte), bottom (nur Unten) und den + Kombinationen daraus.
        + Standard: center +
      • +
        + + +
      • dashboard_rowcenterheight
        + Höhe der mittleren Zeile, in der die Gruppen angeordnet werden.
        + Standard: 400 +
      • +
        + + +
      • dashboard_rowcentercolwidth
        + Über dieses Attribut wird die Breite der einzelnen Spalten der mittleren Dashboardreihe festgelegt. Dabei kann je Spalte ein separater Wert hinterlegt werden. + Die Werte sind durch ein Komma (ohne Leerzeichen) zu trennen. Jeder Wert bestimmt die Spaltenbreite in %! Der erste Wert gibt die Breite der ersten Spalte an, + der zweite Wert die Breite der zweiten Spalte usw. Ist die Summe der Breite größer als 100 werden die Spaltenbreiten reduziert. + Sind mehr Spalten als Breiten definiert werden die fehlenden Breiten um die Differenz zu 100 festgelegt. Sind hingegen weniger Spalten als Werte definiert werden + die überschüssigen Werte ignoriert.
        + Standard: 100 +
      • +
        + + +
      • dashboard_rowtopheight
        + Höhe der oberen Zeile, in der die Gruppen angeordnet werden.
        + Standard: 250 +
      • +
        + + +
      • dashboard_rowbottomheight
        + Höhe der unteren Zeile, in der die Gruppen angeordnet werden.
        + Standard: 250 +

      • + + +
      • dashboard_showfullsize
        + Blendet die FHEMWEB Raumliste (kompleter linker Bereich der Seite) und den oberen Bereich von FHEMWEB aus wenn der + Wert auf 1 gesetzt ist.
        + Default: 0 +
      • +
        + + +
      • dashboard_showtabs
        + Zeigt die Tabs/Schalterleiste des Dashboards oben oder unten an, oder blendet diese aus. Wenn die Schalterleiste + ausgeblendet wird ist das Dashboard gespert.
        + Standard: tabs-and-buttonbar-at-the-top +
      • +
        + + +
      • dashboard_showtogglebuttons
        + Zeigt eine Schaltfläche in jeder Gruppe mit der man diese auf- und zuklappen kann.
        + Standard: 0 +

      • + + +
      • dashboard_tabXname
        + Titel des X Tab. +
      • +
        + + +
      • dashboard_tabXsorting
        + Enthält die Positionierung jeder Gruppe im Tab X. Der Wert wird mit der Schaltfläche "Set" geschrieben. Es wird nicht + empfohlen dieses Attribut manuell zu ändern. +
      • +
        + + +
      • dashboard_tab1groups
        + Durch Komma getrennte Liste mit den Namen der Gruppen, die im Tab 1 angezeigt werden. Falsche Gruppennamen werden + hervorgehoben.
        + Jede Gruppe kann zusätzlich ein Icon anzeigen, dazu muss der Gruppen name um ":<icon>@<farbe>"ergänzt + werden.
        + Beispiel: Light:Icon_Fisch@blue,AVIcon_Fisch@red,Single Lights:Icon_Fisch@yellow
        + Der Gruppenname kann ebenfalls einen regulären Ausdruck beinhalten, um alle Gruppen anzuzeigen, die darauf passen.
        + Beispiel: .*Licht.* zeigt alle Gruppen an, die das Wort "Licht" im Namen haben. +
      • +
        + + +
      • dashboard_tabXdevices
        + devspec Liste von Geräten, die im Tab angezeigt werden sollen. Das format ist:
        + GROUPNAME:devspec1,devspec2,...,devspecN:ICONNAME
        + Das Icon ist optional. Auch der Gruppenname muss nicht vorhanden sein. Im Falle dass dieser fehlt, werden die gefunden + Geräte nicht gruppiert sondern als einzelne Widgets im Tab angezeigt. Für weitere Details bezüglich devspec: + Dev-Spec +
      • +
        + + +
      • dashboard_tabXicon
        + Zeigt am Tab ein Icon an. Es muss sich dabei um ein exisitereindes Icon mit modpath Verzeichnis handeln. Handelt es + sich um ein SVG Icon kann der Suffix @colorname für die Farbe des Icons angegeben werden. +
      • +
        + + +
      • dashboard_tabXcolcount
        + Die Anzahl der Spalten im Tab X in der Gruppen dargestellt werden können. Dennoch ist es möglich, mehrere Gruppen
        + in einer Spalte nebeneinander zu positionieren. Dies ist abhängig von der Breite der Spalten und Gruppen.
        + Gilt nur für die mittlere Spalte!
        + Standard: <dashboard_colcount> +
      • +
        + + +
      • dashboard_tabXbackgroundimage
        + Zeigt ein Hintergrundbild für den X-ten Tab an. Das Bild wird nicht gestreckt, es sollte also auf die Größe des Tabs + passen oder diese überschreiten. +
      • +
        + + +
      • dashboard_width
        + Zum bestimmen der Dashboardbreite. Der Wert kann in % (z.B. 80%) angegeben werden oder als absolute Breite (z.B. 1200) + in Pixel.
        + Standard: 100% +
      • +
        + + +
      • noLinks
        + Es erfolgt keine Linkerstellung zur Detailansicht von Devices.

        + + Hinweis:
        + Bei manchen Devicetypen wird der Link zur Detailansicht integriert im Namen bzw. Alias des Device mitgeliefert. + In diesen Fällen muß die Linkgenerierung direkt im Device abgestellt werden (z.B. bei Devices der Typen readingsGroup, + SSCamSTRM oder SMAPortal). +
      • +
        + +
      +
    =end html_DE + +=for :application/json;q=META.json 95_Dashboard.pm +{ + "abstract": "Dashboard for showing multiple devices sorted in tabs", + "x_lang": { + "de": { + "abstract": "Dashboard zur Anzeige mehrerer Geräte in verschiedenen Tabs" + } + }, + "keywords": [ + "Dashboard", + "Tablet", + "UI", + "Browser" + ], + "version": "v1.1.1", + "release_status": "stable", + "author": [ + "Heiko Maaz " + ], + "x_fhem_maintainer": [ + "DS_Starter" + ], + "x_fhem_maintainer_github": [ + "nasseeder1" + ], + "prereqs": { + "runtime": { + "requires": { + "FHEM": 5.00918799, + "perl": 5.014 + }, + "recommends": { + "FHEM::Meta": 0 + }, + "suggests": { + } + } + }, + "resources": { + "x_wiki": { + "web": "https://wiki.fhem.de/wiki/Dashboard", + "title": "Dashboard" + }, + "repository": { + "x_dev": { + "type": "svn", + "url": "https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter", + "web": "https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter/95_Dashboard.pm", + "x_branch": "dev", + "x_filepath": "fhem/contrib/", + "x_raw": "https://svn.fhem.de/fhem/trunk/fhem/contrib/DS_Starter/95_Dashboard.pm" + } + } + } +} +=end :application/json;q=META.json + =cut
    $icon$devName$txt