From 84f8a0e74645e00fd19e0d54635e3d4dcc5cad26 Mon Sep 17 00:00:00 2001 From: rudolfkoenig Date: Thu, 29 May 2014 10:25:01 +0000 Subject: [PATCH] fhem.pl: add $lastDefChange, FHEMWEB: UpdateHashes only if necessary git-svn-id: svn://svn.code.sf.net/p/fhem/code/trunk@6001 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/01_FHEMWEB.pm | 36 +++++++++++++++++++++--------------- fhem/fhem.pl | 24 ++++++++++++++++++++---- 2 files changed, 41 insertions(+), 19 deletions(-) diff --git a/fhem/FHEM/01_FHEMWEB.pm b/fhem/FHEM/01_FHEMWEB.pm index 02ba3be33..d37264462 100755 --- a/fhem/FHEM/01_FHEMWEB.pm +++ b/fhem/FHEM/01_FHEMWEB.pm @@ -82,6 +82,8 @@ $FW_formmethod = "post"; my $FW_zlib_checked; my $FW_use_zlib = 1; my $FW_activateInform = 0; +my $FW_lastWebName = ""; # Name of last FHEMWEB instance, for caching +my $FW_lastHashUpdate = 0; ######################### # As we are _not_ multithreaded, it is safe to use global variables. @@ -93,6 +95,7 @@ my %FW_icons; # List of icons my @FW_iconDirs; # Directory search order for icons my $FW_RETTYPE; # image/png or the like my %FW_rooms; # hash of all rooms +my @FW_roomsArr; # ordered list of rooms my %FW_groups; # hash of all groups my %FW_types; # device types, for sorting my %FW_hiddengroup;# hash of hidden groups @@ -590,7 +593,11 @@ FW_answerCall($) return -1; } - FW_updateHashes(); + if($FW_lastWebName ne $FW_wname || $FW_lastHashUpdate != $lastDefChange) { + FW_updateHashes(); + $FW_lastWebName = $FW_wname; + $FW_lastHashUpdate = $lastDefChange; + } my $t = AttrVal("global", "title", "Home, Sweet Home"); @@ -791,6 +798,17 @@ FW_updateHashes() } $FW_room = AttrVal($FW_detail, "room", "Unsorted") if($FW_detail); + + if(AttrVal($FW_wname, "sortRooms", "")) { # Slow! + my @sortBy = split( " ", AttrVal( $FW_wname, "sortRooms", "" ) ); + my %sHash; + map { $sHash{$_} = FW_roomIdx(\@sortBy,$_) } keys %FW_rooms; + @FW_roomsArr = sort { $sHash{$a} cmp $sHash{$b} } keys %FW_rooms; + + } else { + @FW_roomsArr = sort keys %FW_rooms; + + } } ############################## @@ -1009,7 +1027,7 @@ FW_makeTableFromArray($$@) { } sub -FW_roomIdx(\@$) +FW_roomIdx($$) { my ($arr,$v) = @_; my ($index) = grep { $v =~ /^$arr->[$_]$/ } 0..$#$arr; @@ -1084,22 +1102,10 @@ FW_roomOverview($) } $FW_room = "" if(!$FW_room); - my @rlist; - if(AttrVal($FW_wname, "sortRooms", "")) { # Slow! - my @sortBy = split( " ", AttrVal( $FW_wname, "sortRooms", "" ) ); - my %sHash; - map { $sHash{$_} = FW_roomIdx(@sortBy,$_) } keys %FW_rooms; - @rlist = sort { $sHash{$a} cmp $sHash{$b} } keys %FW_rooms; - - } else { - @rlist = sort keys %FW_rooms; - - } - ########################## # Rooms and other links - foreach my $r (@rlist) { + foreach my $r (@FW_roomsArr) { next if($r eq "hidden" || $FW_hiddenroom{$r}); $FW_room = $r if(!$FW_room && $FW_ss); $r =~ s/{TYPE}".(defined($a[1]) ? " $a[1]" : "")); $hash->{DEF} = $hash->{OLDDEF} if($ret); delete($hash->{OLDDEF}); + $lastDefChange++ if(!$hash->{TEMPORARY}); return $ret; } @@ -1651,7 +1657,7 @@ CommandDelete($$) my ($cl, $def) = @_; return "Usage: delete $namedef\n" if(!$def); - my @rets; + my (@rets, $isReal); foreach my $sdev (devspec2array($def)) { if(!defined($defs{$sdev})) { push @rets, "Please define $sdev first"; @@ -1669,6 +1675,8 @@ CommandDelete($$) next; } + $isReal = 1 if(!$defs{$sdev}{TEMPORARY}); + # Delete releated hashes foreach my $p (keys %selectlist) { if($selectlist{$p} && $selectlist{$p}{NAME} eq $sdev) { @@ -1686,6 +1694,7 @@ CommandDelete($$) DoTrigger("global", "DELETED $sdev", 1) if(!$temporary); } + $lastDefChange++ if($isReal); return join("\n", @rets); } @@ -1698,7 +1707,7 @@ CommandDeleteAttr($$) my @a = split(" ", $def, 2); return "Usage: deleteattr []\n$namedef" if(@a < 1); - my @rets; + my (@rets, $isReal); foreach my $sdev (devspec2array($a[0])) { if(!defined($defs{$sdev})) { @@ -1718,6 +1727,8 @@ CommandDeleteAttr($$) next; } + $isReal = 1 if(!$defs{$sdev}{TEMPORARY}); + if(@a == 1) { delete($attr{$sdev}); } else { @@ -1726,6 +1737,7 @@ CommandDeleteAttr($$) } + $lastDefChange++ if($isReal); return join("\n", @rets); } @@ -2025,6 +2037,7 @@ CommandRename($$) CallFn($new, "RenameFn", $new,$old);# ignore replies DoTrigger("global", "RENAMED $old $new", 1); + $lastDefChange++ if(!$defs{$new}{TEMPORARY}); return undef; } @@ -2158,8 +2171,7 @@ sub CommandAttr($$) { my ($cl, $param) = @_; - my $ret = undef; - my @a; + my ($ret, $isReal, @a); @a = split(" ", $param, 3) if($param); @@ -2234,6 +2246,8 @@ CommandAttr($$) next; } + $isReal = 1 if(!$defs{$sdev}{TEMPORARY}); + $a[0] = $sdev; $ret = CallFn($sdev, "AttrFn", "set", @a); if($ret) { @@ -2258,6 +2272,8 @@ CommandAttr($$) } } + + $lastDefChange++ if($isReal); Log 3, join(" ", @rets) if(!$cl && @rets); return join("\n", @rets); }