From dd6823610d3b85d2e4750b99eb50d40076bf92fd Mon Sep 17 00:00:00 2001
From: rudolfkoenig <>
Date: Mon, 24 Oct 2016 06:21:37 +0000
Subject: [PATCH] 01_FHEMWEB.js: add "Raw definition" in the device overview.
git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@12416 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
FHEM/01_FHEMWEB.pm | 1 +
docs/commandref_frame.html | 6 +-
docs/commandref_frame_DE.html | 6 +-
fhem.pl | 150 +++++++++++++++++++++-------------
www/pgm2/fhemweb.js | 61 +++++++++++++-
5 files changed, 165 insertions(+), 59 deletions(-)
diff --git a/FHEM/01_FHEMWEB.pm b/FHEM/01_FHEMWEB.pm
index f059367a7..2ea3a09c2 100755
--- a/FHEM/01_FHEMWEB.pm
+++ b/FHEM/01_FHEMWEB.pm
@@ -1278,6 +1278,7 @@ FW_doDetail($)
FW_pH "cmd=style iconFor $d", "Select icon", undef, "detLink iconFor";
FW_pH "cmd=style showDSI $d", "Extend devStateIcon", undef, "detLink showDSI";
+ FW_pH "cmd=rawDef $d", "Raw defintion", undef, "detLink rawDef";
FW_pH "cmd=delete $d", "Delete this device ($d)", undef, "detLink delDev"
if($d ne "global");
my $sfx = AttrVal("global", "language", "EN");
diff --git a/docs/commandref_frame.html b/docs/commandref_frame.html
index e3cd948d5..24da576c7 100644
--- a/docs/commandref_frame.html
+++ b/docs/commandref_frame.html
@@ -886,7 +886,9 @@ The following local attributes are used by a wider range of devices:
list
- list [devspec] [value]
+ list [devspec] [value]
+ or
+ list -r devspec
Output a list of all definitions, all notify settings and all at
entries. This is one of the few commands which return a string in a
@@ -947,6 +949,8 @@ The following local attributes are used by a wider range of devices:
2006-11-02 09:45:56 actuator 19%
[...]
+ With the -r (raw) option output the device definition in a format suitable
+ for inclusion in fhem.cfg and fhem.state.
diff --git a/docs/commandref_frame_DE.html b/docs/commandref_frame_DE.html
index 0a25bc37a..ac9151e7b 100644
--- a/docs/commandref_frame_DE.html
+++ b/docs/commandref_frame_DE.html
@@ -935,7 +935,9 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
list
- list [devspec] [value]
+ list [devspec] [value]
+ oder
+ list -r devspec
Auflistung aller "definitions", "notify" und
"at"-Definitionen. Dies ist eines der wenigen Befehle, die im
@@ -996,6 +998,8 @@ Die folgenden lokalen Attribute werden von mehreren Geräten verwendet:
2006-11-02 09:45:56 actuator 19%
[...]
+ Mit der -r (raw) Option werden die Daten in einem für fhem.cfg bzw.
+ fhem.state passenden format generiert.
diff --git a/fhem.pl b/fhem.pl
index a5fe280d7..8f3c1acf3 100755
--- a/fhem.pl
+++ b/fhem.pl
@@ -348,7 +348,7 @@ $readingFnAttributes = "event-on-change-reading event-on-update-reading ".
"iowrite" => { Fn=>"CommandIOWrite",
Hlp=>" ,write raw data with iodev" },
"list" => { Fn=>"CommandList",
- Hlp=>"[devspec],list definitions and status info" },
+ Hlp=>"[-r] [devspec],list definitions and status info" },
"modify" => { Fn=>"CommandModify",
Hlp=>"device ,modify the definition (e.g. at, notify)" },
"quit" => { Fn=>"CommandQuit",
@@ -1349,6 +1349,46 @@ CommandQuit($$)
return undef;
}
+sub
+GetAllReadings($)
+{
+ my ($d) = @_;
+ my @ret;
+ my $val = $defs{$d}{STATE};
+ if(defined($val) &&
+ $val ne "unknown" &&
+ $val ne "Initialized" &&
+ $val ne "???") {
+ $val =~ s/;/;;/g;
+ $val =~ s/\n/\\\n/g;
+ push @ret, "setstate $d $val";
+ }
+
+ #############
+ # Now the detailed list
+ my $r = $defs{$d}{READINGS};
+ if($r) {
+ foreach my $c (sort keys %{$r}) {
+
+ my $rd = $r->{$c};
+ if(!defined($rd->{TIME})) {
+ Log 4, "WriteStatefile $d $c: Missing TIME, using current time";
+ $rd->{TIME} = TimeNow();
+ }
+
+ if(!defined($rd->{VAL})) {
+ Log 4, "WriteStatefile $d $c: Missing VAL, setting it to 0";
+ $rd->{VAL} = 0;
+ }
+ my $val = $rd->{VAL};
+ $val =~ s/;/;;/g;
+ $val =~ s/\n/\\\n/g;
+ push @ret,"setstate $d $rd->{TIME} $c $val";
+ }
+ }
+ return @ret;
+}
+
#####################################
sub
WriteStatefile()
@@ -1380,44 +1420,46 @@ WriteStatefile()
print SFH "define $d $defs{$d}{TYPE} $def\n";
}
- my $val = $defs{$d}{STATE};
- if(defined($val) &&
- $val ne "unknown" &&
- $val ne "Initialized" &&
- $val ne "???") {
- $val =~ s/;/;;/g;
- $val =~ s/\n/\\\n/g;
- print SFH "setstate $d $val\n"
- }
-
- #############
- # Now the detailed list
- my $r = $defs{$d}{READINGS};
- if($r) {
- foreach my $c (sort keys %{$r}) {
-
- my $rd = $r->{$c};
- if(!defined($rd->{TIME})) {
- Log 4, "WriteStatefile $d $c: Missing TIME, using current time";
- $rd->{TIME} = TimeNow();
- }
-
- if(!defined($rd->{VAL})) {
- Log 4, "WriteStatefile $d $c: Missing VAL, setting it to 0";
- $rd->{VAL} = 0;
- }
- my $val = $rd->{VAL};
- $val =~ s/;/;;/g;
- $val =~ s/\n/\\\n/g;
- print SFH "setstate $d $rd->{TIME} $c $val\n";
- }
- }
+ my @arr = GetAllReadings($d);
+ printf SFH join(@arr, "\n") if(@arr);
}
return "$attr{global}{statefile}: $!" if(!close(SFH));
return "";
}
+sub
+GetDefAndAttr($)
+{
+ my ($d) = @_;
+ my @ret;
+
+ if($d ne "global") {
+ my $def = $defs{$d}{DEF};
+ if(defined($def)) {
+ $def =~ s/;/;;/g;
+ $def =~ s/\n/\\\n/g;
+ push @ret,"define $d $defs{$d}{TYPE} $def";
+ } else {
+ push @ret,"define $d $defs{$d}{TYPE}";
+ }
+ }
+
+ foreach my $a (sort {
+ return -1 if($a eq "userattr"); # userattr must be first
+ return 1 if($b eq "userattr");
+ return $a cmp $b;
+ } keys %{$attr{$d}}) {
+ next if($d eq "global" &&
+ ($a eq "configfile" || $a eq "version"));
+ my $val = $attr{$d}{$a};
+ $val =~ s/;/;;/g;
+ $val =~ s/\n/\\\n/g;
+ push @ret,"attr $d $a $val";
+ }
+ return @ret;
+}
+
#####################################
sub
CommandSave($$)
@@ -1432,7 +1474,7 @@ CommandSave($$)
@structChangeHist = ();
DoTrigger("global", "SAVE", 1);
- my $ret = WriteStatefile();
+ my $ret = WriteStatefile();
return $ret if($ret);
$ret = ""; # cfgDB_SaveState may return undef
@@ -1484,29 +1526,9 @@ CommandSave($$)
next;
}
- if($d ne "global") {
- my $def = $defs{$d}{DEF};
- if(defined($def)) {
- $def =~ s/;/;;/g;
- $def =~ s/\n/\\\n/g;
- print $fh "define $d $defs{$d}{TYPE} $def\n";
- } else {
- print $fh "define $d $defs{$d}{TYPE}\n";
- }
- }
+ my @arr = GetDefAndAttr($d);
+ print $fh join("\n", @arr)."\n" if(@arr);
- foreach my $a (sort {
- return -1 if($a eq "userattr"); # userattr must be first
- return 1 if($b eq "userattr");
- return $a cmp $b;
- } keys %{$attr{$d}}) {
- next if($d eq "global" &&
- ($a eq "configfile" || $a eq "version"));
- my $val = $attr{$d}{$a};
- $val =~ s/;/;;/g;
- $val =~ s/\n/\\\n/g;
- print $fh "attr $d $a $val\n";
- }
}
print SFH "include $attr{global}{lastinclude}\n"
@@ -2143,6 +2165,22 @@ CommandList($$)
my ($cl, $param) = @_;
my $str = "";
+ if($param =~ m/^-r *(.*)$/) {
+ my $arg = ($1 ? $1 : ".*");
+ foreach my $d (devspec2array($arg,$cl)) {
+ if(!defined($defs{$d})) {
+ $str .= "No device named $d found";
+ last;
+ }
+ $str .= "\n" if($str);
+ my @a = GetDefAndAttr($d);
+ $str .= join("\n", @a)."\n" if(@a);
+ @a = GetAllReadings($d);
+ $str .= join("\n", @a)."\n" if(@a);
+ }
+ return $str;
+ }
+
if(!$param) { # List of all devices
$str = "\nType list for detailed info.\n";
diff --git a/www/pgm2/fhemweb.js b/www/pgm2/fhemweb.js
index 633bdb040..9c7163ca2 100644
--- a/www/pgm2/fhemweb.js
+++ b/www/pgm2/fhemweb.js
@@ -212,8 +212,8 @@ FW_jqueryReadyFn()
FW_smallScreenCommands();
-
FW_inlineModify();
+ FW_rawDef();
}
function
@@ -583,6 +583,65 @@ FW_inlineModify() // Do not generate a new HTML page upon pressing modify
});
}
+function
+FW_rawDef()
+{
+ $("div.rawDef a").each(function(){ // Help on detail window
+ var dev = FW_getLink(this).split(" ").pop();
+ $(this).unbind("click");
+ $(this).attr("href", "#"); // Desktop: show underlined Text
+ $(this).removeAttr("onclick");
+
+ $(this).click(function(evt){
+ if($("#rawDef").length) {
+ $("#rawDef").remove();
+ return;
+ }
+
+ $("#content").append('