User requested changes

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@1031 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
rudolfkoenig 2011-10-01 10:57:31 +00:00
parent a8cb40db3e
commit cb54e3d1ef
4 changed files with 136 additions and 90 deletions

View File

@ -12,11 +12,12 @@ sub FW_calcWeblink($$);
sub FW_dev2image($); sub FW_dev2image($);
sub FW_digestCgi($); sub FW_digestCgi($);
sub FW_doDetail($); sub FW_doDetail($);
sub FW_dumpFileLog($$);
sub FW_fatal($); sub FW_fatal($);
sub FW_fileList($); sub FW_fileList($);
sub FW_logWrapper($); sub FW_logWrapper($);
sub FW_makeEdit($$$); sub FW_makeEdit($$$);
sub FW_makeTable($$); sub FW_makeTable($$@);
sub FW_ReadIcons(); sub FW_ReadIcons();
sub FW_roomOverview($); sub FW_roomOverview($);
sub FW_select($$$); sub FW_select($$$);
@ -531,9 +532,9 @@ FW_updateHashes()
############################## ##############################
sub sub
FW_makeTable($$) FW_makeTable($$@)
{ {
my($name, $hash) = (@_); my($name, $hash, $cmd) = (@_);
return if(!$hash || !int(keys %{$hash})); return if(!$hash || !int(keys %{$hash}));
pO " <table class=\"block wide\">"; pO " <table class=\"block wide\">";
@ -571,6 +572,9 @@ FW_makeTable($$)
} }
} }
pH "cmd.$name=$cmd $name $n&amp;detail=$name", $cmd, 1
if($cmd && !$FW_ss);
pO "</tr>"; pO "</tr>";
} }
@ -586,11 +590,14 @@ FW_makeSelect($$$)
my ($d, $cmd, $list) = @_; my ($d, $cmd, $list) = @_;
return if(!$list || $FW_hiddenroom{input}); return if(!$list || $FW_hiddenroom{input});
my @al = map { s/[:;].*//;$_ } split(" ", $list); my @al = map { s/[:;].*//;$_ } split(" ", $list);
pO FW_submit("cmd.$cmd$d", $cmd) .
"&nbsp;$d" . pO "<form method=\"get\" action=\"$FW_ME\">";
FW_hidden("dev.$cmd$d", $d); pO FW_hidden("detail", $d);
pO FW_hidden("dev.$cmd$d", $d);
pO FW_submit("cmd.$cmd$d", $cmd) . "&nbsp;$d";
pO FW_select("arg.$cmd$d",\@al,undef); pO FW_select("arg.$cmd$d",\@al,undef);
pO FW_textfield("val.$cmd$d", 30); pO FW_textfield("val.$cmd$d", 30);
pO "</form>";
} }
@ -612,24 +619,11 @@ FW_doDetail($)
pO "Readings" if($defs{$d}{READINGS}); pO "Readings" if($defs{$d}{READINGS});
FW_makeTable($d, $defs{$d}{READINGS}); FW_makeTable($d, $defs{$d}{READINGS});
FW_makeSelect($d, "attr", getAllAttr($d)); FW_makeSelect($d, "attr", getAllAttr($d));
FW_makeTable($d, $attr{$d}); FW_makeTable($d, $attr{$d}, "deleteattr");
if($t eq "FileLog" ) { if($t eq "FileLog" ) {
pO " <table class=\"block wide\">"; pO " <table class=\"block wide\">";
my $row = 1; FW_dumpFileLog($d, 0);
foreach my $f (FW_fileList($defs{$d}{logfile})) {
my $nr;
foreach my $ln (split(",", AttrVal($d, "logtype", "text"))) {
my ($lt, $name) = split(":", $ln);
$name = $lt if(!$name);
pF " <tr class=\"%s\">", ($row&1)?"odd":"even";
pF "<td><div class=\"dname\">%s</div></td>", ($nr ? "" : $f);
pH "cmd=logwrapper $d $lt $f",
"<div class=\"dval\">$name</div>", 1, "dval";
pO "</tr>";
$nr++; $row++;
}
}
pO " </table>"; pO " </table>";
} }
@ -780,90 +774,106 @@ FW_showRoom()
pO "<form method=\"get\" action=\"$FW_ME\">"; pO "<form method=\"get\" action=\"$FW_ME\">";
pO "<div id=\"content\">"; pO "<div id=\"content\">";
pO " <table class=\"block\">"; pO " <table>"; # Need for equal width of subtables
my @list = ($FW_room eq "all" ? keys %defs : keys %{$FW_rooms{$FW_room}}); my @list = ($FW_room eq "all" ? keys %defs : keys %{$FW_rooms{$FW_room}});
my $rf = ($FW_room ? "&amp;room=$FW_room" : ""); # stay in the room my $rf = ($FW_room ? "&amp;room=$FW_room" : ""); # stay in the room
my $row=1; my $row=1;
foreach my $d (sort @list) { foreach my $type (sort keys %FW_types) {
next if(IsIgnored($d));
my $type = $defs{$d}{TYPE};
next if(!$type || $type eq "weblink"); next if(!$type || $type eq "weblink");
my $allSets = " " . getAllSets($d) . " "; #################
my $hasOnOff = ($allSets =~ m/ on / && $allSets =~ m/ off /); # Check if there is a device of this type in the room
if(!$hasOnOff) { # Check the eventMap my @devs = grep { $FW_rooms{$FW_room}{$_} && !IsIgnored($_) }
my $em = AttrVal($d, "eventMap", "") . " "; keys %{$FW_types{$type}};
$hasOnOff = ($em =~ m/:on / && $em =~ m/:off /); next if($FW_room && $FW_room ne "all" && !@devs);
}
pF " <tr class=\"%s\">", ($row&1)?"odd":"even"; pO " <tr><td><div class=\"devType\">$type</div></td></tr>";
pO " <tr><td>";
pO " <table class=\"block wide\" id=\"$type\">";
if($FW_hiddenroom{detail}) { foreach my $d (sort @devs) {
pO "<td><div class=\"col1\">$d</div></td>"; my $type = $defs{$d}{TYPE};
} else { my $allSets = " " . getAllSets($d) . " ";
pH "detail=$d", $d, 1, "col1"; my $hasOnOff = ($allSets =~ m/ on / && $allSets =~ m/ off /);
if(!$hasOnOff) { # Check the eventMap
my $em = AttrVal($d, "eventMap", "") . " ";
$hasOnOff = ($em =~ m/:on / && $em =~ m/:off /);
}
} pF " <tr class=\"%s\">", ($row&1)?"odd":"even";
$row++; if($FW_hiddenroom{detail}) {
pO "<td><div class=\"col1\">$d</div></td>";
my $state = $defs{$d}{STATE}; } else {
$state = "" if(!defined($state)); pH "detail=$d", $d, 1, "col1";
my $txt = $state;
if(defined(AttrVal($d, "showtime", undef))) { }
$txt = $defs{$d}{READINGS}{state}{TIME};
} elsif($allSets =~ m/ desired-temp /) { $row++;
$txt = ReadingsVal($d, "measured-temp", "");
$txt =~ s/ .*//;
$txt .= "&deg;"
} else { my $state = $defs{$d}{STATE};
my $icon; $state = "" if(!defined($state));
$icon = FW_dev2image($d); my $txt = $state;
$txt = "<img src=\"$FW_ME/icons/$icon\" alt=\"$txt\"/>" if($icon);
} if(defined(AttrVal($d, "showtime", undef))) {
$txt = $defs{$d}{READINGS}{state}{TIME};
pO "<td>";
pO "<table border=\"0\"><tr><td>" if(!$FW_ss);
# align needed for FireFox
$txt = "<div align=\"center\" class=\"col2\">$txt</div>" if($FW_ss);
if($hasOnOff) {
pHPlain "cmd.$d=set $d ".($state eq "on" ? "off":"on").$rf, $txt, 0;
} else {
pO $txt;
}
if(!$FW_ss) {
pO "</td>";
if($hasOnOff) {
pH "cmd.$d=set $d on$rf", ReplaceEventMap($d, "on", 1), 1, "col2";
pH "cmd.$d=set $d off$rf", ReplaceEventMap($d, "off", 1), 1, "col2";
} elsif($allSets =~ m/ desired-temp /) { } elsif($allSets =~ m/ desired-temp /) {
$txt = ReadingsVal($d, "measured-temp", ""); $txt = ReadingsVal($d, "measured-temp", "");
$txt =~ s/ .*//; $txt =~ s/ .*//;
$txt = sprintf("%2.1f", int(2*$txt)/2) if($txt =~ m/[0-9.-]/); $txt .= "&deg;"
my @tv = map { ($_.".0", $_+0.5) } (5..30);
shift(@tv); # 5.0 is not valid } else {
$txt = int($txt*20)/$txt if($txt =~ m/^[0-9].$/); my $icon;
$icon = FW_dev2image($d);
$txt = "<img src=\"$FW_ME/icons/$icon\" alt=\"$txt\"/>" if($icon);
pO "<td>".
FW_hidden("arg.$d", "desired-temp") .
FW_hidden("dev.$d", $d) .
FW_select("val.$d", \@tv, ReadingsVal($d, "desired-temp", $txt)) .
"</td><td>".
FW_submit("cmd.$d", "set").
"</td>";
} }
pO "</tr></table>";
pO "<td>";
# align needed for FireFox
$txt = "<div align=\"center\" class=\"col2\">$txt</div>" if($FW_ss);
if($hasOnOff) {
pHPlain "cmd.$d=set $d ".($state eq "on" ? "off":"on").$rf, $txt, 0;
} else {
pO $txt;
}
if(!$FW_ss) {
pO "</td>";
if($hasOnOff) {
pH "cmd.$d=set $d on$rf", ReplaceEventMap($d, "on", 1), 1, "col2";
pH "cmd.$d=set $d off$rf", ReplaceEventMap($d, "off", 1), 1, "col2";
} elsif($allSets =~ m/ desired-temp /) {
$txt = ReadingsVal($d, "measured-temp", "");
$txt =~ s/ .*//;
$txt = sprintf("%2.1f", int(2*$txt)/2) if($txt =~ m/[0-9.-]/);
my @tv = map { ($_.".0", $_+0.5) } (5..30);
shift(@tv); # 5.0 is not valid
$txt = int($txt*20)/$txt if($txt =~ m/^[0-9].$/);
pO "<td>".
FW_hidden("arg.$d", "desired-temp") .
FW_hidden("dev.$d", $d) .
FW_select("val.$d", \@tv, ReadingsVal($d, "desired-temp", $txt)) .
"</td><td>".
FW_submit("cmd.$d", "set").
"</td>";
} elsif($type eq "FileLog") {
FW_dumpFileLog($d, 1);
}
}
pO "</td>";
} }
pO "</td>"; pO " </table>";
pO " </td></tr>";
} }
pO " </table><br>"; pO " </table><br>";
@ -879,7 +889,7 @@ FW_showRoom()
$defs{$d}{WLTYPE} eq "fileplot" && $defs{$d}{WLTYPE} eq "fileplot" &&
!AttrVal($d, "fixedrange", undef)) { !AttrVal($d, "fixedrange", undef)) {
pO "<br>"; pO "<br>" if($row > 1);
$buttonsDisplayed = 1; $buttonsDisplayed = 1;
FW_zoomLink("zoom=-1", "Zoom-in.png", "zoom in"); FW_zoomLink("zoom=-1", "Zoom-in.png", "zoom in");
FW_zoomLink("zoom=1", "Zoom-out.png","zoom out"); FW_zoomLink("zoom=1", "Zoom-out.png","zoom out");
@ -1487,17 +1497,14 @@ pH(@)
pO "<td>" if($td); pO "<td>" if($td);
$link = ($link =~ m,^/,) ? $link : "$FW_ME?$link"; $link = ($link =~ m,^/,) ? $link : "$FW_ME?$link";
$class = " class=\"$class\"" if($class);
$class = "" if(!defined($class)); $class = "" if(!defined($class));
$class = " class=\"$class\"" if($class);
if($FW_ss) { # No pointer change if using onClick if($FW_ss || $FW_tp) { # No pointer change if using onClick
pO "<a onClick=\"location.href='$link'\"><div $class>$txt</div></a>"; pO "<a onClick=\"location.href='$link'\"><div$class>$txt</div></a>";
} elsif($FW_tp) {
pO "<a onClick=\"location.href='$link'\"><div $class>$txt</div></a>";
} else { } else {
pO "<a href=\"$link\">$txt</a>"; pO "<a href=\"$link\"><div$class>$txt</div></a>";
} }
pO "</td>" if($td); pO "</td>" if($td);
} }
@ -1679,4 +1686,38 @@ FW_makeEdit($$$)
pO "</td>"; pO "</td>";
} }
sub
FW_dumpFileLog($$)
{
my ($d, $oneRow) = @_;
my $row = 1;
foreach my $f (FW_fileList($defs{$d}{logfile})) {
my $nr;
if($oneRow) {
pF "<tr class=\"%s\">", ($row&1)?"odd":"even";
pF "<td><div class=\"dname\">$f</div></td>";
}
foreach my $ln (split(",", AttrVal($d, "logtype", "text"))) {
my ($lt, $name) = split(":", $ln);
$name = $lt if(!$name);
if(!$oneRow) {
pF "<tr class=\"%s\">", ($row&1)?"odd":"even";
pF "<td><div class=\"dname\">%s</div></td>", ($nr ? "" : $f);
}
pH "cmd=logwrapper $d $lt $f",
"<div class=\"dval\">$name</div>", 1, "dval";
if(!$oneRow) {
pO "</tr>";
$row++;
}
$nr++;
}
if($oneRow) {
pO "</tr>";
$row++;
}
}
}
1; 1;

View File

@ -1,11 +1,14 @@
body { background-color: #FFFFE7; font-family:Arial, sans-serif; font-size:16px;} body { background-color: #FFFFE7;
font-family:Arial, sans-serif; font-size:16px;}
input { font-family:Arial, sans-serif; font-size:16px; } input { font-family:Arial, sans-serif; font-size:16px; }
select { font-family:Arial, sans-serif; font-size:16px; } select { font-family:Arial, sans-serif; font-size:16px; }
#logo { position:absolute; top:10px; left:20px; width:140px; } #logo { position:absolute; top:10px; left:20px; width:140px; }
#menu { position:absolute; top:120px;left:20px; width:140px; } #menu { position:absolute; top:120px;left:20px; width:140px; }
#hdr { position:absolute; top:10px; left:180px; } #hdr { position:absolute; top:10px; left:180px; }
#content { position:absolute; top:50px; left:180px; bottom:20px; right:10px; } #content { position:absolute; top:50px; left:180px; bottom:20px; right:10px; }
.devType { padding-top:20px; }
a { color: #278727; } a { color: #278727; }
img { border-style: none; } img { border-style: none; }

View File

@ -10,6 +10,7 @@ select { font-family:Arial, sans-serif; font-size:16px}
#hdr { position:absolute; top:40px; left:65px; } #hdr { position:absolute; top:40px; left:65px; }
#content { position:absolute; top:85px; left: 0px; right: 0px;} #content { position:absolute; top:85px; left: 0px; right: 0px;}
.devType { padding-top:10px; }
a { color: #278727; } a { color: #278727; }
img { border-style: none; } img { border-style: none; }

View File

@ -9,6 +9,7 @@ select { font-family:Arial, sans-serif; font-size:16px}
#hdr { position:absolute; top:10px; left:140px; } #hdr { position:absolute; top:10px; left:140px; }
#content { position:absolute; top:50px; left:140px; bottom:20px; right:10px; } #content { position:absolute; top:50px; left:140px; bottom:20px; right:10px; }
.devType { padding-top:20px; }
a { color: #278727; } a { color: #278727; }
table.block { border:1px solid gray; width: 100%; background: #F8F8E0; } table.block { border:1px solid gray; width: 100%; background: #F8F8E0; }