2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-12 22:56:34 +00:00

fhem.pl: add $lastDefChange, FHEMWEB: UpdateHashes only if necessary

git-svn-id: https://svn.fhem.de/fhem/trunk@6001 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2014-05-29 10:25:01 +00:00
parent fd1f1a5958
commit 8095dd93f0
2 changed files with 41 additions and 19 deletions

View File

@ -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/</&lt;/g;

View File

@ -211,6 +211,7 @@ use vars qw(%oldvalue); # Old values, see commandref.html
use vars qw(%readyfnlist); # devices which want a "readyfn"
use vars qw(%selectlist); # devices which want a "select"
use vars qw(%value); # Current values, see commandref.html
use vars qw($lastDefChange); # number of last def/attr change
my $AttrList = "verbose:0,1,2,3,4,5 room group comment alias ".
"eventMap userReadings";
@ -231,6 +232,7 @@ my %duplicate; # Pool of received msg for multi-fhz/cul setups
my @cmdList; # Remaining commands in a chain. Used by sleep
$init_done = 0;
$lastDefChange = 0;
$readytimeout = ($^O eq "MSWin32") ? 0.1 : 5.0;
@ -481,6 +483,8 @@ $attr{global}{motd} = "$sc_text\n\n"
if(!$attr{global}{motd} || $attr{global}{motd} =~ m/^$sc_text/);
$init_done = 1;
$lastDefChange = 1;
foreach my $d (keys %defs) {
if($defs{$d}{IODevMissing}) {
Log 3, "No I/O device found for $defs{$d}{NAME}";
@ -1565,6 +1569,7 @@ CommandDefine($$)
%ntfyHash = ();
DoTrigger("global", "DEFINED $name", 1) if($init_done);
}
$lastDefChange++ if(!$hash{TEMPORARY});
return $ret;
}
@ -1589,6 +1594,7 @@ CommandModify($$)
"$a[0] $hash->{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 <name>$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 <name> [<attrname>]\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);
}