2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-13 05:06:35 +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_zlib_checked;
my $FW_use_zlib = 1; my $FW_use_zlib = 1;
my $FW_activateInform = 0; 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. # 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_iconDirs; # Directory search order for icons
my $FW_RETTYPE; # image/png or the like my $FW_RETTYPE; # image/png or the like
my %FW_rooms; # hash of all rooms my %FW_rooms; # hash of all rooms
my @FW_roomsArr; # ordered list of rooms
my %FW_groups; # hash of all groups my %FW_groups; # hash of all groups
my %FW_types; # device types, for sorting my %FW_types; # device types, for sorting
my %FW_hiddengroup;# hash of hidden groups my %FW_hiddengroup;# hash of hidden groups
@ -590,7 +593,11 @@ FW_answerCall($)
return -1; 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"); my $t = AttrVal("global", "title", "Home, Sweet Home");
@ -791,6 +798,17 @@ FW_updateHashes()
} }
$FW_room = AttrVal($FW_detail, "room", "Unsorted") if($FW_detail); $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 sub
FW_roomIdx(\@$) FW_roomIdx($$)
{ {
my ($arr,$v) = @_; my ($arr,$v) = @_;
my ($index) = grep { $v =~ /^$arr->[$_]$/ } 0..$#$arr; my ($index) = grep { $v =~ /^$arr->[$_]$/ } 0..$#$arr;
@ -1084,22 +1102,10 @@ FW_roomOverview($)
} }
$FW_room = "" if(!$FW_room); $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 # Rooms and other links
foreach my $r (@rlist) { foreach my $r (@FW_roomsArr) {
next if($r eq "hidden" || $FW_hiddenroom{$r}); next if($r eq "hidden" || $FW_hiddenroom{$r});
$FW_room = $r if(!$FW_room && $FW_ss); $FW_room = $r if(!$FW_room && $FW_ss);
$r =~ s/</&lt;/g; $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(%readyfnlist); # devices which want a "readyfn"
use vars qw(%selectlist); # devices which want a "select" use vars qw(%selectlist); # devices which want a "select"
use vars qw(%value); # Current values, see commandref.html 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 ". my $AttrList = "verbose:0,1,2,3,4,5 room group comment alias ".
"eventMap userReadings"; "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 my @cmdList; # Remaining commands in a chain. Used by sleep
$init_done = 0; $init_done = 0;
$lastDefChange = 0;
$readytimeout = ($^O eq "MSWin32") ? 0.1 : 5.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/); if(!$attr{global}{motd} || $attr{global}{motd} =~ m/^$sc_text/);
$init_done = 1; $init_done = 1;
$lastDefChange = 1;
foreach my $d (keys %defs) { foreach my $d (keys %defs) {
if($defs{$d}{IODevMissing}) { if($defs{$d}{IODevMissing}) {
Log 3, "No I/O device found for $defs{$d}{NAME}"; Log 3, "No I/O device found for $defs{$d}{NAME}";
@ -1565,6 +1569,7 @@ CommandDefine($$)
%ntfyHash = (); %ntfyHash = ();
DoTrigger("global", "DEFINED $name", 1) if($init_done); DoTrigger("global", "DEFINED $name", 1) if($init_done);
} }
$lastDefChange++ if(!$hash{TEMPORARY});
return $ret; return $ret;
} }
@ -1589,6 +1594,7 @@ CommandModify($$)
"$a[0] $hash->{TYPE}".(defined($a[1]) ? " $a[1]" : "")); "$a[0] $hash->{TYPE}".(defined($a[1]) ? " $a[1]" : ""));
$hash->{DEF} = $hash->{OLDDEF} if($ret); $hash->{DEF} = $hash->{OLDDEF} if($ret);
delete($hash->{OLDDEF}); delete($hash->{OLDDEF});
$lastDefChange++ if(!$hash->{TEMPORARY});
return $ret; return $ret;
} }
@ -1651,7 +1657,7 @@ CommandDelete($$)
my ($cl, $def) = @_; my ($cl, $def) = @_;
return "Usage: delete <name>$namedef\n" if(!$def); return "Usage: delete <name>$namedef\n" if(!$def);
my @rets; my (@rets, $isReal);
foreach my $sdev (devspec2array($def)) { foreach my $sdev (devspec2array($def)) {
if(!defined($defs{$sdev})) { if(!defined($defs{$sdev})) {
push @rets, "Please define $sdev first"; push @rets, "Please define $sdev first";
@ -1669,6 +1675,8 @@ CommandDelete($$)
next; next;
} }
$isReal = 1 if(!$defs{$sdev}{TEMPORARY});
# Delete releated hashes # Delete releated hashes
foreach my $p (keys %selectlist) { foreach my $p (keys %selectlist) {
if($selectlist{$p} && $selectlist{$p}{NAME} eq $sdev) { if($selectlist{$p} && $selectlist{$p}{NAME} eq $sdev) {
@ -1686,6 +1694,7 @@ CommandDelete($$)
DoTrigger("global", "DELETED $sdev", 1) if(!$temporary); DoTrigger("global", "DELETED $sdev", 1) if(!$temporary);
} }
$lastDefChange++ if($isReal);
return join("\n", @rets); return join("\n", @rets);
} }
@ -1698,7 +1707,7 @@ CommandDeleteAttr($$)
my @a = split(" ", $def, 2); my @a = split(" ", $def, 2);
return "Usage: deleteattr <name> [<attrname>]\n$namedef" if(@a < 1); return "Usage: deleteattr <name> [<attrname>]\n$namedef" if(@a < 1);
my @rets; my (@rets, $isReal);
foreach my $sdev (devspec2array($a[0])) { foreach my $sdev (devspec2array($a[0])) {
if(!defined($defs{$sdev})) { if(!defined($defs{$sdev})) {
@ -1718,6 +1727,8 @@ CommandDeleteAttr($$)
next; next;
} }
$isReal = 1 if(!$defs{$sdev}{TEMPORARY});
if(@a == 1) { if(@a == 1) {
delete($attr{$sdev}); delete($attr{$sdev});
} else { } else {
@ -1726,6 +1737,7 @@ CommandDeleteAttr($$)
} }
$lastDefChange++ if($isReal);
return join("\n", @rets); return join("\n", @rets);
} }
@ -2025,6 +2037,7 @@ CommandRename($$)
CallFn($new, "RenameFn", $new,$old);# ignore replies CallFn($new, "RenameFn", $new,$old);# ignore replies
DoTrigger("global", "RENAMED $old $new", 1); DoTrigger("global", "RENAMED $old $new", 1);
$lastDefChange++ if(!$defs{$new}{TEMPORARY});
return undef; return undef;
} }
@ -2158,8 +2171,7 @@ sub
CommandAttr($$) CommandAttr($$)
{ {
my ($cl, $param) = @_; my ($cl, $param) = @_;
my $ret = undef; my ($ret, $isReal, @a);
my @a;
@a = split(" ", $param, 3) if($param); @a = split(" ", $param, 3) if($param);
@ -2234,6 +2246,8 @@ CommandAttr($$)
next; next;
} }
$isReal = 1 if(!$defs{$sdev}{TEMPORARY});
$a[0] = $sdev; $a[0] = $sdev;
$ret = CallFn($sdev, "AttrFn", "set", @a); $ret = CallFn($sdev, "AttrFn", "set", @a);
if($ret) { if($ret) {
@ -2258,6 +2272,8 @@ CommandAttr($$)
} }
} }
$lastDefChange++ if($isReal);
Log 3, join(" ", @rets) if(!$cl && @rets); Log 3, join(" ", @rets) if(!$cl && @rets);
return join("\n", @rets); return join("\n", @rets);
} }