| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- ################################################################################
- # 95 VIEW
- # Feedback: http://groups.google.com/group/fhem-users
- # Define Custom View
- # Stand: 04.2011
- # Version: 1.0
- ################################################################
- #
- # Copyright notice
- #
- # (c) 2011 Copyright: Axel Rieger (fhem bei anax punkt info)
- # All rights reserved
- #
- # This script free software; you can redistribute it and/or modify
- # it under the terms of the GNU General Public License as published by
- # the Free Software Foundation; either version 2 of the License, or
- # (at your option) any later version.
- #
- # The GNU General Public License can be found at
- # http://www.gnu.org/copyleft/gpl.html.
- # A copy is found in the textfile GPL.txt and important notices to the license
- # from the author is found in LICENSE.txt distributed with these scripts.
- #
- # This script is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- ################################################################################
- # Usage
- # define <NAME> VIEW
- # attr <NAME> ViewRegExType -> Chose Device-Type (Perl-RegExp)
- # attr <NAME> ViewRegExName -> Chose Device-Name (Perl-RegExp)
- # attr <NAME> ViewRegExReading -> Chose Readings (Perl-RegExp)
- # attr <Name> ViewRegExReadingStringCompare -> Chose ReadingValue (Perl-RegEx)
- #
- # Examples:
- # Show all Device with Type FHT
- # attr MyFHT ViewRegExType FHT
- # attr MyFHT ViewRegExName * or NotSet
- # attr MyFHT ViewRegExReading * or NotSet
- # attr MyFHT ViewRegExReadingStringCompare * or Notset
- #
- # Show all Warnings of ALL Devices without "none"-Values
- # attr MyFHT ViewRegExType * or NotSet
- # attr MyFHT ViewRegExName * or NotSet
- # attr MyFHT ViewRegExReading warnings
- # attr MyFHT ViewRegExReadingStringCompare [^none]
- ################################################################################
- package main;
- use strict;
- use warnings;
- use Data::Dumper;
- use vars qw(%data);
- #-------------------------------------------------------------------------------
- sub VIEW_Initialize($)
- {
- my ($hash) = @_;
- $hash->{DefFn} = "VIEW_Define";
- $hash->{AttrList} = "ViewRegExType ViewRegExName ViewRegExReading ViewRegExReadingStringCompare loglevel:0,5";
- # CGI
- my $name = "MyVIEWS";
- my $fhem_url = "/" . $name ;
- $data{FWEXT}{$fhem_url}{FUNC} = "VIEW_CGI";
- $data{FWEXT}{$fhem_url}{LINK} = $name;
- $data{FWEXT}{$fhem_url}{NAME} = $name;
- # Global-Config for CSS
- # $attr{global}{VIEW_CSS} = "";
- $modules{_internal_}{AttrList} .= " VIEW_CSS";
- return undef;
- }
- #-------------------------------------------------------------------------------
- sub VIEW_Define(){
- my ($hash, $def) = @_;
- $hash->{STATE} = $hash->{NAME};
- return undef;
- }
- #-------------------------------------------------------------------------------
- sub VIEW_CGI(){
- my ($htmlarg) = @_;
- # Remove trailing slash
- $htmlarg =~ s/^\///;
- # Log 0,"VIEW: htmlarg: " . $htmlarg ."\n";
- # URL: http(s)://[FHEM:xxxx]/fhem/MyVIEWS/<View-Name>
- my @params = split(/\//,$htmlarg);
- my $ret_html;
- if(int(@params) > 2) {
- $ret_html = "ERROR: Wrong URL \n";
- return ("text/plain; charset=ISO-8859-1", $ret_html);
- }
- my $view = $params[1];
- if($htmlarg ne "MyVIEWS"){
- if(!defined($defs{$view})){
- $ret_html = "ERROR: View $view not definde \n";
- return ("text/plain; charset=ISO-8859-1", $ret_html);
- }
- }
- $ret_html = "<!DOCTYPE html PUBLIC \"-\/\/W3C\/\/DTD HTML 4.01\/\/EN\" \"http:\/\/www.w3.org\/TR\/html4\/strict.dtd\">\n";
- $ret_html .= "<html>\n";
- $ret_html .= "<head>\n";
- # Select CSS-Style-Sheet
- my $css = $attr{global}{VIEW_CSS};
- if($css eq ""){$ret_html .= "<link href=\"$FW_ME/style.css\" rel=\"stylesheet\"/>\n";}
- else {$ret_html .= "<link href=\"$FW_ME/$css\" rel=\"stylesheet\"/>\n";}
- $ret_html .= "<title>FHEM VIEWS<\/title>\n";
- $ret_html .= "<\/head>\n";
- $ret_html .= "<body>\n";
- # DIV HDR
- $ret_html .= &VIEW_CGI_TOP($view);
- # DIV LEFT
- $ret_html .= &VIEW_CGI_LEFT();
- # DIV RIGHT
- if($view) {
- $ret_html .= &VIEW_CGI_RIGHT($view);
- }
- else{
- $ret_html .= "<div id=\"content\">\n";
- $ret_html .= "</div>\n";
- }
- # HTML
- $ret_html .= "</body>\n";
- $ret_html .= "</html>\n";
- return ("text/html; charset=ISO-8859-1", $ret_html);
- }
- #-------------------------------------------------------------------------------
- sub VIEW_CGI_TOP($) {
- my $v = shift(@_);
- # rh = return-Html
- my $rh;
- $rh = "<div id=\"hdr\">\n";
- $rh .= "<form method=\"get\" action=\"" . $FW_ME . "\">\n";
- $rh .= "<table WIDTH=\"100%\">\n";
- $rh .= "<tr>";
- if($v) {
- $rh .= "<td><a href=\"" . $FW_ME . "\">FHEM:</a>$v</td>";
- }
- else {
- $rh .= "<td><a href=\"" . $FW_ME . "\">FHEM:</a></td>";
- }
- $rh .= "<td><input type=\"text\" name=\"cmd\" size=\"30\"/></td>";
- $rh .= "</tr>\n";
- $rh .= "</table>\n";
- $rh .= "</form>\n";
- $rh .= "<br>\n";
- $rh .= "</div>\n";
- return $rh;
- }
- #-------------------------------------------------------------------------------
- sub VIEW_CGI_LEFT(){
- # rh = return-Html
- my $rh;
- $rh = "<div id=\"logo\"><img src=\"" . $FW_ME . "/fhem.png\"></div>";
- $rh .= "<div id=\"menu\">\n";
- # Print VIEWS
- $rh .= "<table class=\"room\">\n";
- foreach my $d (sort keys %defs) {
- next if ($defs{$d}{TYPE} ne "VIEW");
- $rh .= "<tr><td>";
- $rh .= "<a href=\"" . $FW_ME . "/MyVIEWS/$d\">$d</a></h3>";
- $rh .= "</td></tr>\n";
- }
- $rh .= "</table><br>\n";
- $rh .= "</div>\n";
- return $rh;
- }
- #-------------------------------------------------------------------------------
- sub VIEW_CGI_RIGHT(){
- my ($v) = @_;
- # rh = return-Html
- my $rh;
- # Filters ViewRegExType ViewRegExName ViewRegExReading
- my $f_type = ".*";
- if(defined($attr{$v}{ViewRegExType})) {
- $f_type = $attr{$v}{ViewRegExType};
- }
- my $f_name = ".*";
- if(defined($attr{$v}{ViewRegExName})){
- $f_name = $attr{$v}{ViewRegExName};
- }
- my $f_reading = ".*";
- if(defined($attr{$v}{ViewRegExReading})) {
- $f_reading = $attr{$v}{ViewRegExReading};
- }
- my $f_reading_val = ".*";
- if(defined($attr{$v}{ViewRegExReadingStringCompare})) {
- $f_reading_val = $attr{$v}{ViewRegExReadingStringCompare};
- }
- my $row = 1;
- $rh = "<div id=\"content\">\n";
- $rh .= "<hr>\n";
- $rh .= "[RegEx] Type: \"$f_type\" Name: \"$f_name\" Reading: \"$f_reading\" Value:\"$f_reading_val\"\n";
- $rh .= "<hr>\n";
- my ($d,$r,$tr_class);
- my $th = undef;
- # Get Devices and Readings
- foreach $d (sort keys %defs){
- if($defs{$d}{TYPE} =~ m/$f_type/ && $d =~ m/$f_name/){
- # Log 0,"VIEW-RIGHT: Device-Match $d";
- # Weblink
- my $web_rt;
- if($defs{$d}{TYPE} eq "weblink" && $f_reading eq ".*" && $f_reading_val eq ".*") {
- $rh .= "<table class=\"block\">\n";
- $rh .="<tr><td>WEBLINK: $d</td></tr>\n";
- # $rh .= FW_showWeblink($d, $defs{$d}{LINK}, $defs{$d}{WLTYPE});
- $rh .= VIEW_showWeblink($d, $defs{$d}{LINK}, $defs{$d}{WLTYPE});
- # Log 0,"VIEW-RIGHT: FW_showWeblink \n $web_rt\n";
- # FW_showWeblink($d, $defs{$d}{LINK}, $defs{$d}{WLTYPE});
- # Log 0,"VIEW-RIGHT: Render-Weblink $d";
- $rh .= "</table>\n";
- }
- else {
- foreach $r (sort keys %{$defs{$d}{READINGS}}) {
- if($r =~ m/$f_reading/) {
- # ViewRegExReadingStringCompare
- if($defs{$d}{READINGS}{$r}{VAL} =~ m/$f_reading_val/){
- $tr_class = $row?"odd":"even";
- if(!$th) {
- $rh .= "<br>\n";
- $rh .= "<table class=\"block\" id=\"" . $defs{$d}{TYPE} . "\" >\n";
- $rh .= "<tr class=\"" . $tr_class . "\">";
- $rh .= "<td align=\"left\"><a href=\"$FW_ME?detail=$d\">$d</a></td>";
- if(defined($attr{$d}{comment})) {
- $rh .= "<td>" . $attr{$d}{comment} . "</td>";
- }
- else {
- $rh .= "<td>" . $defs{$d}{TYPE} . "</td>";
- }
- $rh .= "<td>" . $defs{$d}{STATE} . "</td>";
- $rh .= "</tr>\n";
- $th = 1;
- $row = ($row+1)%2;
- $tr_class = $row?"odd":"even";
- }
- $rh .= "<tr class=\"" . $tr_class . "\">";
- $rh .= "<td>$r</td>";
- $rh .= "<td>" . $defs{$d}{READINGS}{$r}{VAL} . "</td>";
- $rh .= "<td>" . $defs{$d}{READINGS}{$r}{TIME} . "</td>";
- $rh .= "</tr>\n";
- $row = ($row+1)%2;
- # ViewRegExReadingStringCompare
- }
- }
- }
- $rh .= "</table>\n";
- }
- }
- $th = undef;
- }
- $rh .= "</div>\n";
- return $rh;
- }
- #-------------------------------------------------------------------------------
- sub VIEW_showWeblink($$$)
- {
- # Customized Function from 01_FHEMWEB.pm
- my $FW_plotmode = "gnuplot-scroll";
- my $FW_plotsize = "800,225";
- my ($d, $v, $t) = @_;
- my $rh;
- if($t eq "link") {
- $rh .= "<td><a href=\"$v\">$d</a></td>\n"; # no pH, want to open extra browser
- }
- elsif($t eq "image") {
- $rh .= "<td><img src=\"$v\"><br>";
- $rh .= "<a href=\"$FW_ME?detail=$d\">$d</a>";
- $rh .= "</td>\n";
- }
- elsif($t eq "fileplot") {
- my @va = split(":", $v, 3);
- if(@va != 3 || !$defs{$va[0]} || !$defs{$va[0]}{currentlogfile}) {
- $rh .= "<td>Broken definition: $v</td>\n";
- }
- else {
- if($va[2] eq "CURRENT") {
- $defs{$va[0]}{currentlogfile} =~ m,([^/]*)$,;
- $va[2] = $1;
- }
- $rh .= "<table><tr><td>";
- my $wl = "&pos=";
- my $arg="$FW_ME?cmd=showlog $d $va[0] $va[1] $va[2]$wl";
- if(AttrVal($d,"plotmode",$FW_plotmode) eq "SVG") {
- my ($w, $h) = split(",", AttrVal($d,"plotsize",$FW_plotsize));
- $rh .= "<embed src=\"$arg\" type=\"image/svg+xml\"" .
- "width=\"$w\" height=\"$h\" name=\"$d\"/>\n";
- }
- else {
- $rh .= "<img src=\"$arg\"/>";
- }
- $rh .= "</td>\n";
- $rh .= "<td><a href=\"$FW_ME?detail=$d\">$d</a></td>\n";
- $rh .= "</tr></table>";
-
- }
- }
- }
- #-------------------------------------------------------------------------------
- 1;
|