From b15703da9bc62932ed1bbc4112ebaf8d1f94359f Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Fri, 27 Sep 2019 13:08:21 +0000 Subject: [PATCH] 95_Dashboard: new attr "dashboard_homeTab", "dashboard_webRefresh", new set command activateTab, bugfixes, comref revised git-svn-id: https://svn.fhem.de/fhem/trunk@20260 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 2 + fhem/FHEM/95_Dashboard.pm | 551 +++++++++++++++++++++++-------------- fhem/MAINTAINER.txt | 2 +- fhem/www/pgm2/dashboard.js | 60 ++-- 4 files changed, 386 insertions(+), 229 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 929dcd6d0..ab50e7325 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,7 @@ # 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 attr "dashboard_homeTab", "dashboard_webRefresh", + new set command activateTab, bugfixes, comref revised - change: 49_SSCam: set compatibility to SVS version 8.2.6 - feature: 73_DoorBird: No Picture/video menue for stations without camera - new: 70_CanOverEthernet: introducing new module diff --git a/fhem/FHEM/95_Dashboard.pm b/fhem/FHEM/95_Dashboard.pm index 86c4265fe..e82752e10 100644 --- a/fhem/FHEM/95_Dashboard.pm +++ b/fhem/FHEM/95_Dashboard.pm @@ -55,12 +55,16 @@ use vars qw($FW_ss); # is smallscreen, needed by 97_GROUP/95_VIEW # Versions History intern our %Dashboard_vNotesIntern = ( + "3.15.1" => "25.09.2019 change initial attributes, commandref revised ", + "3.15.0" => "24.09.2019 set activateTab, rename dashboard_activetab to dashboard_homeTab, ". + "rename dashboard_activetabRefresh to dashboard_webRefresh, some bugfixes, comref revised ", + "3.14.0" => "22.09.2019 new attribute dashboard_activetabRefresh, activate the active tab in browser ", "3.13.2" => "21.09.2019 new solution to eliminate links for all Devices ", "3.13.1" => "21.09.2019 don't eliminate links for PageEnd-Devices ", "3.13.0" => "20.09.2019 change attribute noLinks to dashboard_noLinks, eliminate links for PageEnd-Devices ", "3.12.0" => "16.09.2019 new attribute noLinks, review comref and get-options ", "3.11.0" => "16.09.2019 attr dashboard_activetab is now working properly, commandref revised, calculate attribute ". - "dashboard_activetab (is now a userattr) ", + "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 " ); @@ -86,7 +90,7 @@ sub Dashboard_Initialize ($) { $hash->{GetFn} = "Dashboard_Get"; $hash->{UndefFn} = "Dashboard_undef"; $hash->{FW_detailFn} = "Dashboard_DetailFN"; - $hash->{AttrFn} = "Dashboard_attr"; + $hash->{AttrFn} = "Dashboard_Attr"; $hash->{AttrList} = "disable:0,1 ". "dashboard_backgroundimage ". "dashboard_colcount:1,2,3,4,5 ". @@ -109,14 +113,6 @@ sub Dashboard_Initialize ($) { "dashboard_tab1colcount " . "dashboard_tab1rowcentercolwidth " . "dashboard_tab1backgroundimage " . - "dashboard_tab[0-9]+name " . - "dashboard_tab[0-9]+groups " . - "dashboard_tab[0-9]+devices " . - "dashboard_tab[0-9]+sorting " . - "dashboard_tab[0-9]+icon " . - "dashboard_tab[0-9]+colcount " . - "dashboard_tab[0-9]+rowcentercolwidth " . - "dashboard_tab[0-9]+backgroundimage " . "dashboard_width ". "dashboard_noLinks:1,0 "; @@ -148,9 +144,10 @@ sub Dashboard_define ($$) { readingsSingleUpdate( $hash, "state", "Initialized", 0 ); RemoveInternalTimer($hash); - InternalTimer ($now + 5, 'Dashboard_CheckDashboardAttributUssage', $hash, 0); + InternalTimer ($now+2, 'Dashboard_init', $hash, 0); + InternalTimer ($now+5, 'Dashboard_CheckDashboardAttributUssage', $hash, 0); - my $url = '/dashboard/' . $name; + my $url = '/dashboard/'.$name; $data{FWEXT}{$url}{CONTENTFUNC} = 'Dashboard_CGI'; # $data{FWEXT} = FHEMWEB Extension, siehe 01_FHEMWEB.pm $data{FWEXT}{$url}{LINK} = 'dashboard/'.$name; @@ -163,17 +160,31 @@ return; # Set ################################################################ sub Dashboard_Set($@) { - my ( $hash, $name, $cmd, @args ) = @_; - - if ( $cmd eq "lock" ) { - readingsSingleUpdate( $hash, "lockstate", "lock", 0 ); - return; - } elsif ( $cmd eq "unlock" ) { - readingsSingleUpdate( $hash, "lockstate", "unlock", 0 ); - return; - }else { - return "Unknown argument " . $cmd . ", choose one of lock:noArg unlock:noArg"; - } + my ($hash, $name, $cmd, @args) = @_; + + my $setlist = "Unknown argument $cmd, choose one of ". + "lock:noArg ". + "unlock:noArg " + ; + + my $tl = Dashboard_possibleTabs ($name); + + $setlist .= "activateTab:$tl " if($tl); + + if ( $cmd eq "lock" ) { + readingsSingleUpdate ($hash, "lockstate", "lock", 0); + return; + } elsif ( $cmd eq "unlock" ) { + readingsSingleUpdate ($hash, "lockstate", "unlock", 0); + return; + } elsif ( $cmd eq "activateTab" ) { + Dashboard_activateTab ($name,$args[0]); + return; + } else { + return $setlist; + } + +return; } ################################################################ @@ -203,7 +214,7 @@ sub Dashboard_Get($@) { foreach my $idir (@iconFolders) {$iconDirs .= "$attr{global}{modpath}/www/images/".$idir.",";} - $res .= " \"icondirs\": \"$iconDirs\", \"dashboard_tabcount\": " . Dashboard_GetTabCount($hash, 0). ", \"dashboard_activetab\": " . Dashboard_GetActiveTab($hash->{NAME}); + $res .= " \"icondirs\": \"$iconDirs\", \"dashboard_tabcount\": " . Dashboard_GetTabCount($hash, 0). ", \"dashboard_homeTab\": " . Dashboard_GetActiveTab($name); $res .= ($i != $x) ? ",\n" : "\n"; foreach my $attr (sort keys %$attrdata) { @@ -212,7 +223,7 @@ sub Dashboard_Get($@) { if (@splitattr == 2) { $res .= " \"".Dashboard_Escape($attr)."\": \"".$splitattr[0]."\",\n"; $res .= " \"".Dashboard_Escape($attr)."color\": \"".$splitattr[1]."\""; - } elsif ($attr ne "dashboard_activetab") { + } elsif ($attr ne "dashboard_homeTab") { $res .= " \"".Dashboard_Escape($attr)."\": \"".$attrdata->{$attr}."\""; } else { next; @@ -252,35 +263,12 @@ sub Dashboard_Get($@) { } } -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 -################################################################ -sub Dashboard_undef ($$) { - my ($hash,$arg) = @_; - - # remove dashboard links from left menu - my $url = '/dashboard/' . $hash->{NAME}; - delete $data{FWEXT}{$url}; - - RemoveInternalTimer($hash); - -return undef; -} - ################################################################ # Attr ################################################################ -sub Dashboard_attr($$$) { +sub Dashboard_Attr($$$) { my ($cmd, $name, $attrName, $attrVal) = @_; + my $hash = $defs{$name}; if ($cmd eq "set") { if ($attrName =~ m/dashboard_tab([1-9][0-9]*)groups/ || $attrName =~ m/dashboard_tab([1-9][0-9]*)devices/) { @@ -300,16 +288,32 @@ sub Dashboard_attr($$$) { my $url = '/dashboard/'.$name; $data{FWEXT}{$url}{NAME} = $attrVal; } + + if ($attrName =~ m/dashboard_homeTab/) { + Dashboard_activateTab ($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"); + + InternalTimer (time()+2, 'Dashboard_init', $hash, 0); return; } +################################################################ +# Undefine +################################################################ +sub Dashboard_undef ($$) { + my ($hash,$arg) = @_; + + # remove dashboard links from left menu + my $url = '/dashboard/'.$hash->{NAME}; + delete $data{FWEXT}{$url}; + + RemoveInternalTimer($hash); + +return undef; +} + ################################################################ # Routine für FHEMWEB Detailanzeige ################################################################ @@ -382,36 +386,36 @@ sub DashboardAsHtml($) { sub Dashboard_SummaryFN ($$$$) { my ($FW_wname, $d, $room, $pageHash) = @_; - my $ret = ""; - my $showbuttonbar = "hidden"; - my $debugfield = "hidden"; - my $hash = $defs{$d}; - my $name = $d; - my $id = $defs{$d}{NR}; + my $ret = ""; + my $showbuttonbar = "hidden"; + my $debugfield = "hidden"; + my $hash = $defs{$d}; + my $name = $d; + my $id = $defs{$d}{NR}; ######################### Read Dashboard Attributes and set Default-Values #################################### - my $lockstate = ReadingsVal($name, "lockstate", "unlock"); - my $showhelper = ($lockstate eq "unlock") ? 1 : 0; - 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 = (); + my $lockstate = ReadingsVal($name, "lockstate", "unlock"); + my $showhelper = ($lockstate eq "unlock") ? 1 : 0; + 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,$tabname) = Dashboard_GetActiveTab($name,1); + 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($name, "dashboard_tab" . ($i + 1) . "name", "Dashboard-Tab " . ($i + 1)); @@ -436,9 +440,11 @@ 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 $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 (($tabsortings[$i-1] !~ /[0-9]+/ || $tabsortings[$i-1] !~ /:/ || $tabsortings[$i-1] !~ /,/ ) && ($tabsortings[$i-1] ne "," && $tabsortings[$i-1] ne "")) { + Log3 ($name, 3, "Dashboard $name - 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, "Dashboard $name - Sorting OK or Empty: dashboard_tab".$i."sorting"); + } } #------------------------------------------------------------------------------------------------- @@ -925,41 +931,41 @@ sub Dashboard_CheckDashboardAttributUssage($) { my $detailnote = ""; # --------- Set minimal Attributes in the hope to make it easier for beginners -------------------- - my $tab1groups = AttrVal($defs{$d}{NAME}, "dashboard_tab1groups", ""); + my $tab1groups = AttrVal($d, "dashboard_tab1groups", ""); if ($tab1groups eq "") { - FW_fC("attr ".$d." dashboard_tab1groups Set Your Groups - See Attribute dashboard_tab1groups-"); + FW_fC("attr ".$d." dashboard_tab1groups Set your FHEM groups here and arrange them on tab 1"); } # ---------------- Delete empty Groups entries ---------------------------------------------------------- - my $tabgroups = AttrVal($defs{$d}{NAME}, "dashboard_tab1groups", "999"); + my $tabgroups = AttrVal($d, "dashboard_tab1groups", "999"); if ($tabgroups eq "1" ) { FW_fC("deleteattr ".$d." dashboard_tab1groups"); } - $tabgroups = AttrVal($defs{$d}{NAME}, "dashboard_tab2groups", "999"); + $tabgroups = AttrVal($d, "dashboard_tab2groups", "999"); if ($tabgroups eq "1" ) { FW_fC("deleteattr ".$d." dashboard_tab2groups"); } - $tabgroups = AttrVal($defs{$d}{NAME}, "dashboard_tab3groups", "999"); + $tabgroups = AttrVal($d, "dashboard_tab3groups", "999"); if ($tabgroups eq "1" ) { FW_fC("deleteattr ".$d." dashboard_tab3groups"); } - $tabgroups = AttrVal($defs{$d}{NAME}, "dashboard_tab4groups", "999"); + $tabgroups = AttrVal($d, "dashboard_tab4groups", "999"); if ($tabgroups eq "1" ) { FW_fC("deleteattr ".$d." dashboard_tab4groups"); } - $tabgroups = AttrVal($defs{$d}{NAME}, "dashboard_tab5groups", "999"); + $tabgroups = AttrVal($d, "dashboard_tab5groups", "999"); if ($tabgroups eq "1" ) { FW_fC("deleteattr ".$d." dashboard_tab5groups"); } - my $lockstate = AttrVal($defs{$d}{NAME}, "dashboard_lockstate", ""); # outdates 04.2014 + my $lockstate = AttrVal($d, "dashboard_lockstate", ""); # outdates 04.2014 if ($lockstate ne "") { { FW_fC("deleteattr ".$d." dashboard_lockstate"); } - 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_lockstate]"; + Log3 ($d, 3, "Dashboard $d - Using an outdated no longer used Attribute or Value. This has been corrected. Don't forget to save config. [dashboard_lockstate]"); } - my $showhelper = AttrVal($defs{$d}{NAME}, "dashboard_showhelper", ""); # outdates 04.2014 + my $showhelper = AttrVal($d, "dashboard_showhelper", ""); # outdates 04.2014 if ($showhelper ne "") { { 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]"; + Log3 $hash, 3, "[".$d. " 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($d, "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]"; + Log3 $hash, 3, "[".$d. " 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]"; } if ($showtabs eq "tabs-on-the-bottom-buttonbar-hidden") { { FW_fC("set ".$d." dashboard_showtabs tabs-and-buttonbar-on-the-bottom"); } - 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-on-the-bottom-buttonbar-hidden]"; + Log3 $hash, 3, "[".$d. " V".$dashboardversion."]"." Using an outdated no longer used Attribute or Value. This has been corrected. Don't forget to save config. [tabs-on-the-bottom-buttonbar-hidden]"; } return; @@ -982,14 +988,20 @@ return $tabCount ? $tabCount : $defaultTabCount; ############################################################################################# # Aktives Tab selektieren +# $gtn setzen um Tabnamen mit abzurufen ############################################################################################# -sub Dashboard_GetActiveTab ($) { - my ($d) = @_; +sub Dashboard_GetActiveTab ($;$) { + my ($name,$gtn) = @_; - my $maxTab = Dashboard_GetTabCount($defs{$d}, 1); + my $maxTab = Dashboard_GetTabCount($defs{$name}, 1); my $activeTab = 1; + foreach my $key (%FW_httpheader) { + Log3 ($name, 5, "Dashboard $name - FW_httpheader $key: ".$FW_httpheader{$key}); + } + if (defined($FW_httpheader{Cookie})) { + Log3 ($name, 4, "Dashboard $name - Cookie set: ".$FW_httpheader{Cookie}); my %cookie = map({ split('=', $_) } split(/; */, $FW_httpheader{Cookie})); if (defined($cookie{dashboard_activetab})) { $activeTab = $cookie{dashboard_activetab}; @@ -997,16 +1009,23 @@ sub Dashboard_GetActiveTab ($) { } } - my $dat = AttrVal($d, 'dashboard_activetab', $activeTab); - $dat = ($dat <= $maxTab)?$dat:$maxTab; + my $tabno = AttrVal($name, 'dashboard_homeTab', $activeTab); + $tabno = ($tabno <= $maxTab)?$tabno:$maxTab; + my $tabname = AttrVal($name, "dashboard_tab".($tabno)."name", ""); + + Log3 ($name, 4, "Dashboard $name - Dashboard active tab: $tabno/$tabname"); -return $dat; + if($gtn) { + return ($tabno,$tabname); + } else { + return $tabno; + } } ############################################################################################# -# Wertevorrat für Attribut dashboard_activetab ermitteln und setzen +# Wertevorrat der möglichen Tabs ermitteln ############################################################################################# -sub Dashboard_calcAttrActiveTab ($) { +sub Dashboard_possibleTabs ($) { my ($name) = @_; my $f; @@ -1050,6 +1069,74 @@ sub Dashboard_setVersionInfo($) { return; } +############################################################################################# +# Tabumschaltung bei setzen Attribut dashboard_homeTab bzw. "set ... activeTab" +############################################################################################# +sub Dashboard_activateTab ($$) { + my ($name,$tab) = @_; + my $hash = $defs{$name}; + + my $url = '/dashboard/'.$name; + return if(!$data{FWEXT}{$url}); + + $tab--; + my $web = AttrVal($name, "dashboard_webRefresh", $hash->{HELPER}{FW}); + my @wa = split(",", $web); + + { map { FW_directNotify("#FHEMWEB:$_", 'dashboard_load_tab('."$tab".');$("#dashboardtabs").tabs("option", "active", '."$tab".')', "") } @wa } + + # Andere Triggermöglichkeiten: + #{ map { FW_directNotify("#FHEMWEB:$_", 'dashboard_load_tab('."$tab".')', "") } @wa } + #{ map { FW_directNotify("#FHEMWEB:$_", '$("#dashboardtabs").tabs("option", "active", '."$tab".')', "") } @wa } + # CommandTrigger(undef,'WEB JS:dashboard_load_tab('."$tab".');JS:$("#dashboardtabs").tabs("option", "active", '."$tab".')' ); + +return; +} + +###################################################################################### +# initiale Routinen für Dashboard +###################################################################################### +sub Dashboard_init ($) { + my ($hash) = @_; + my $name = $hash->{NAME}; + + RemoveInternalTimer($hash, "Dashboard_init"); + + if ($init_done == 1) { + # die Argumente für das Attribut dashboard_webRefresh dynamisch ermitteln und setzen + my $fwd = join(",",devspec2array("TYPE=FHEMWEB:FILTER=STATE=Initialized")); + $hash->{HELPER}{FW} = $fwd; + my $atr = $attr{$name}{dashboard_webRefresh}; + delFromDevAttrList($name, "dashboard_webRefresh"); + addToDevAttrList ($name, "dashboard_webRefresh:multiple-strict,$fwd"); + $attr{$name}{dashboard_webRefresh} = $atr if($atr); + + # die Argumente für das Attribut dashboard_homeTab dynamisch ermitteln und setzen + my $f = Dashboard_possibleTabs ($name); + my $at = $attr{$name}{dashboard_homeTab}; + delFromDevAttrList($name, "dashboard_homeTab"); + addToDevAttrList ($name, "dashboard_homeTab:$f"); + $attr{$name}{dashboard_homeTab} = $at if($at); + + } else { + InternalTimer(time()+3, "Dashboard_init", $hash, 0); + } + +return; +} + +###################################################################################### +# Zeichen escapen +###################################################################################### +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; +} + 1; =pod @@ -1061,9 +1148,14 @@ return;

Dashboard

    - Creates a Dashboard in any group can be arranged. The positioning may depend the Groups and column width are made
    - arbitrarily by drag'n drop. Also, the width and height of a Group can be increased beyond the minimum size.
    + Creates a Dashboard in any group and/or devices can be arranged. The positioning may depend the objects and column width are made + arbitrarily by drag'n drop. Also, the width and height of an object can be increased beyond the minimum size.

    + + Note:
    + A group name in the dashboard respectively the attribute "dashboard_tabXgroups" equates the group name in FHEM and depict the + devices which are contained in that group.
    +
    Define @@ -1094,6 +1186,14 @@ return;
        + +
      • set <name> activateTab <TabNo>
        + The Tab with the defined number will be activated. + If the attribute "dashboard_homeTab" is set, this defined tab will be reactivated at next + browser refresh.
        +
        +
      • +
      • set <name> lock
        Locks the Dashboard so that no position changes can be made.

      • @@ -1138,11 +1238,7 @@ return;
            - -
          • 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 @@ -1171,6 +1267,11 @@ return; The value for this parameter also defines the grid, in which the position "snaps in". Default: 0

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

          • dashboard_row
            @@ -1226,20 +1327,21 @@ return; Default: 0

          • - -
          • dashboard_tabXname
            - Title of Tab at position X. + +
          • dashboard_tab1name
            + Title of Tab. (also valid for further dashboard_tabXname)

          • - -
          • 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_tab1sorting
            + Contains the position of each group in Tab. (also valid for further dashboard_tabXsorting)
            + 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.
            + +
          • dashboard_tab1groups
            + Comma separated list of FHEM groups (see attribute "group" in a device) to be displayed in Tab. + (also valid for further dashboard_tabXgroups)
            Each group can be given an icon for this purpose the group name, the following must be completed ":<icon>@<color>"

            @@ -1252,43 +1354,39 @@ return; .*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_tab1devices
            + DevSpec list of devices that should appear in the tab. (also valid for further dashboard_tabXdevices)
            + The format is:

            +
              + GROUPNAME:devspec1,devspec2,...,devspecX:ICONNAME

              +
            + ICONNAME is optional. Also GROUPNAME is optional. In case of missing GROUPNAME, the matching devices are + not grouped, but shown as separate widgets without titles. + For further details on the DevSpec format see DevSpec.

          • - -
          • 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 + +
          • dashboard_tab1icon
            + Set the icon for a Tab. (also valid for further dashboard_tabXicon)
            + 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.
            + +
          • dashboard_tab1colcount
            + Number of columns for a specific tab in which the groups can be displayed. (also valid for further dashboard_tabXcolcount)
            + 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_tab1backgroundimage
            + Shows a background image for the tab. (also valid for further dashboard_tabXbackgroundimage)
            + 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% -
          • -
            -
          • dashboard_noLinks
            No link generation to the detail view of the devices takes place.

            @@ -1298,6 +1396,26 @@ return; In such cases you have to deactivate the link generation inside of the device (for example in SMAPortalSPG).

          • + + +
          • dashboard_webRefresh
            + With this attribute the FHEMWEB-Devices are determined, which:

            +
              +
            • are activating the tab of a dashboard when the attribute "dashboard_homeTab" will be set
            • +
            • are positioning to the tab specified by command "set <name> activateTab"
            • +
            +
            + (default: all) +
            +
          • +
            + + +
          • 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% +
          • +
        @@ -1309,9 +1427,13 @@ return;

        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. + Erstellt eine Übersicht in der Gruppen und/oder Geräte angeordnet werden können. Dabei können die Objekte mit Drag'n Drop + frei positioniert und in mehreren Spalten angeordnet werden. Auch kann die Breite und Höhe eines Objektes über die + Mindestgröße hinaus gezogen werden.

          + + Hinweis:
          + Ein Gruppenname im Dashboard bzw. dem Attribut "dashboard_tabXgroups" entspricht der Gruppe in FHEM und stellt die darin enthaltenen + Geräte im Dashboard dar.

          @@ -1341,8 +1463,15 @@ return;
              +
            • set <name> activateTab <TabNo>
              + Das Tab mit der angegebenen Nummer wird im Dashboard aktiviert. + Ist das Attribut "dashboard_homeTab" gesetzt, wird das in diesem Attribut + definierte Tab beim nächsten Browser-Refresh reaktiviert.
              +
              +
            • +
            • set <name> lock
              - Sperrt das Dashboard sodass keine Positionsänderungen vorgenommen werden können.
              + Sperrt das Dashboard. Es können keine Positionsänderungen vorgenommen werden.

            • @@ -1385,12 +1514,6 @@ 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 @@ -1422,6 +1545,12 @@ return;

                • + +
                • dashboard_homeTab
                  + Legt das aktuell aktivierte Tab fest. Wenn nicht gesetzt, wird das zuletzt gewählte Tab das aktive Tab. (Default: 1) +
                • +
                  +
                • dashboard_row
                  Auswahl welche Zeilen angezeigt werden sollen. top (nur Oben), center (nur Mitte), bottom (nur Unten) und den @@ -1483,38 +1612,47 @@ return; Standard: 0

                • - -
                • dashboard_tabXname
                  - Titel des X Tab. + +
                • dashboard_tab1name
                  + Titel des Tab. (gilt ebenfalls für weitere dashboard_tabXname)

                • - -
                • 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_tab1sorting
                  + Enthält die Positionierung jeder Gruppe im Tab. Der Wert wird mit der Schaltfläche "Set" geschrieben. Es wird nicht + empfohlen dieses Attribut manuell zu ändern. (gilt ebenfalls für weitere dashboard_tabXsorting)

                • - +
                • dashboard_tab1groups
                  - Durch Komma getrennte Liste mit den Namen der Gruppen, die im Tab 1 angezeigt werden. Falsche Gruppennamen werden - hervorgehoben.
                  + Durch Komma getrennte Liste der FHEM-Gruppen (siehe Attribut "group" eines Devices), die im Tab angezeigt werden. + (gilt ebenfalls für weitere dashboard_tabXgroups) + 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. + 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_tab1devices
                  + DevSpec Liste von Geräten, die im Tab angezeigt werden sollen. (gilt ebenfalls für weitere dashboard_tabXdevices)
                  + Das Format ist:

                  +
                    + GROUPNAME:devspec1,devspec2,...,devspecX:ICONNAME

                    +
                  + ICONNAME ist optional. Auch GROUPNAME muss nicht vorhanden sein. Fehlt GROUPNAME, werden die angegebenen + Geräte nicht gruppiert, sondern als einzelne Widgets im Tab angezeigt. Für weitere Details bezüglich DevSpec: + DevSpec

                • @@ -1525,27 +1663,20 @@ return;
                  - -
                • 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.
                  + +
                • dashboard_tab1colcount
                  + Die Anzahl der Spalten im Tab in der Gruppen dargestellt werden können. (gilt ebenfalls für weitere dashboard_tabXcolcount)
                  + 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% + +
                • dashboard_tab1backgroundimage
                  + Zeigt ein Hintergrundbild für den Tab an. (gilt ebenfalls für weitere dashboard_tabXbackgroundimage)
                  + Das Bild wird nicht gestreckt, es sollte also auf die Größe des Tabs passen oder diese überschreiten.

                • @@ -1558,6 +1689,28 @@ return; In diesen Fällen muß die Linkgenerierung direkt im Device abgestellt werden (z.B. bei SMAPortalSPG).
                  + + + +
                • dashboard_webRefresh
                  + Mit diesem Attribut werden FHEMWEB-Devices bestimmt, die:

                  +
                    +
                  • beim Setzen des Attributes "dashboard_homeTab" diesen Tab im Dashboard sofort aktivieren
                  • +
                  • beim Ausführen von "set <name> activateTab" auf diesen Tab im Dashboard positionieren
                  • +
                  +
                  + (default: alle) +
                  +
                • +
                  + + +
                • 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% +
                • +
              diff --git a/fhem/MAINTAINER.txt b/fhem/MAINTAINER.txt index a13b6e14c..90205c850 100644 --- a/fhem/MAINTAINER.txt +++ b/fhem/MAINTAINER.txt @@ -439,7 +439,7 @@ FHEM/94_PWM.pm jamesgo Heizungssteuerung/Raumklima FHEM/95_Alarm.pm pahenning Unterstützende Dienste FHEM/95_Astro.pm pahenning,loredo,CoolTux Unterstützende Dienste FHEM/95_Babble.pm pahenning Unterstützende Dienste -FHEM/95_Dashboard.pm DS_Starter/orphan Frontends +FHEM/95_Dashboard.pm DS_Starter Frontends FHEM/95_FLOORPLAN.pm ulimaass Frontends/FLOORPLAN FHEM/95_holiday.pm rudolfkoenig Sonstiges FHEM/95_PostMe.pm pahenning Unterstützende Dienste diff --git a/fhem/www/pgm2/dashboard.js b/fhem/www/pgm2/dashboard.js index fa99bba9f..8e85bfd4b 100644 --- a/fhem/www/pgm2/dashboard.js +++ b/fhem/www/pgm2/dashboard.js @@ -1,26 +1,26 @@ -//######################################################################################## +//########################################################################################################################################### // dashboard.js -//######################################################################################## +//########################################################################################################################################### // Released : 14.11.2013 Sascha Hermann -// Version : -// 1.01: Released to testers -// 1.02: Add DebugMsg. Fix independent Groupsize adjustment after set & siterefresh. Fix -// wrong set of +Toogle Icon on Siderefresh -// 2.00: First Changes vor Dashboard Tabs. Change method store Positiondata. optimization restore Positiondata. Clear poor routines. -// Change max/min Values for Groupresize. Top- and Bottom-Row always 100% -// 2.01: Add Longpoll function. Dashboard can hide FHEMWEB Roomliste and Header. -// 2.02: Tabs can set on top, bottom or hidden -// 2.03: Fix showhelper Bug on lock/unlock. The error that after a trigger action the curren tab is changed to the "old" activetab tab has -// been fixed. -// 2.04: Dashboard position near Top in showfullsize-mode. Restore ActiveTab funktion -// 2.05: Delete function for set lockstate -// 2.06: change Set and Detail Button. -// 2.07: Insert Configdialog for Tabs. Change handling of parameters in both directions. +// Modified : 24.09.2019 Heiko Maaz // -// Known Bugs/Todo's -// See 95_Dashboard.pm -//######################################################################################## -//######################################################################################## +// Version : +// 2.0.8: dashboard_load_tab(tabIndex) test of defined fhemUrl +// 2.0.7: Insert Configdialog for Tabs. Change handling of parameters in both directions. +// 2.0.6: change Set and Detail Button. +// 2.0.5: Delete function for set lockstate +// 2.0.4: Dashboard position near Top in showfullsize-mode. Restore ActiveTab funktion +// 2.0.3: Fix showhelper Bug on lock/unlock. The error that after a trigger action the curren tab is changed to the "old" activetab tab has +// been fixed. +// 2.0.2: Tabs can set on top, bottom or hidden +// 2.0.1: Add Longpoll function. Dashboard can hide FHEMWEB Roomliste and Header. +// 2.0.0: First Changes vor Dashboard Tabs. Change method store Positiondata. optimization restore Positiondata. Clear poor routines. +// Change max/min Values for Groupresize. Top- and Bottom-Row always 100% +// 1.0.2: Add DebugMsg. Fix independent Groupsize adjustment after set & siterefresh. Fix +// wrong set of +Toogle Icon on Siderefresh +// 1.0.1: Released to testers +// +//########################################################################################################################################### var DashboardConfigHash = {}; var dashboard_buttonbar = "top"; @@ -471,15 +471,17 @@ function dashboard_load_tab(tabIndex) { if ($('#dashboard_tab' + tabIndex).length) { return; } - - dashboard_getData( - fhemUrl+"?cmd=get "+$('#dashboard_define').text(), - "tab " + tabIndex, - "html", - function (tabIndex, data) { - dashboard_insert_tab(tabIndex, data); - }.bind(null, tabIndex) - ); + + if (typeof(fhemUrl) !== 'undefined') { + dashboard_getData( + fhemUrl+"?cmd=get "+$('#dashboard_define').text(), + "tab " + tabIndex, + "html", + function (tabIndex, data) { + dashboard_insert_tab(tabIndex, data); + }.bind(null, tabIndex) + ); + } } function dashboard_insert_tab(tabIndex, content) {