2011-11-12 07:51:08 +00:00
|
|
|
##############################################
|
|
|
|
# $Id$
|
2008-12-09 14:15:21 +00:00
|
|
|
package main;
|
|
|
|
use strict;
|
|
|
|
use warnings;
|
|
|
|
use POSIX;
|
|
|
|
|
|
|
|
sub CommandXmlList($$);
|
|
|
|
sub XmlEscape($);
|
|
|
|
|
|
|
|
|
|
|
|
#####################################
|
|
|
|
sub
|
|
|
|
XmlList_Initialize($$)
|
|
|
|
{
|
|
|
|
my %lhash = ( Fn=>"CommandXmlList",
|
|
|
|
Hlp=>",list definitions and status info as xml" );
|
|
|
|
$cmds{xmllist} = \%lhash;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#####################################
|
|
|
|
sub
|
|
|
|
XmlEscape($)
|
|
|
|
{
|
|
|
|
my $a = shift;
|
2010-01-20 08:47:08 +00:00
|
|
|
return "" if(!defined($a));
|
2008-12-09 14:15:21 +00:00
|
|
|
$a =~ s/\\\n/<br>/g; # Multi-line
|
|
|
|
$a =~ s/&/&/g;
|
|
|
|
$a =~ s/"/"/g;
|
|
|
|
$a =~ s/</</g;
|
|
|
|
$a =~ s/>/>/g;
|
2012-05-03 06:35:53 +00:00
|
|
|
# Not needed since we've gone UTF-8
|
|
|
|
# $a =~ s/([^ -~])/sprintf("&#%02x;", ord($1))/ge;
|
|
|
|
# Esacape characters 0-31, as they are not part of UTF-8
|
|
|
|
$a =~ s/(\x00-\x19)//g;
|
2011-12-30 09:08:36 +00:00
|
|
|
|
2008-12-09 14:15:21 +00:00
|
|
|
return $a;
|
|
|
|
}
|
|
|
|
|
|
|
|
#####################################
|
|
|
|
sub
|
|
|
|
CommandXmlList($$)
|
|
|
|
{
|
|
|
|
my ($cl, $param) = @_;
|
|
|
|
my $str = "<FHZINFO>\n";
|
|
|
|
my $lt = "";
|
2012-09-12 13:52:08 +00:00
|
|
|
my %filter;
|
|
|
|
|
|
|
|
if($param) {
|
|
|
|
my @arr = devspec2array($param);
|
|
|
|
map { $filter{$_} = 1 } @arr;
|
|
|
|
}
|
|
|
|
delete($modules{""}) if(defined($modules{""})); # ???
|
2008-12-09 14:15:21 +00:00
|
|
|
|
2010-01-20 08:58:37 +00:00
|
|
|
for my $d (sort { my $x = $modules{$defs{$a}{TYPE}}{ORDER}.$defs{$a}{TYPE} cmp
|
|
|
|
$modules{$defs{$b}{TYPE}}{ORDER}.$defs{$b}{TYPE};
|
2008-12-09 14:15:21 +00:00
|
|
|
$x = ($a cmp $b) if($x == 0); $x; } keys %defs) {
|
|
|
|
|
2012-09-12 13:52:08 +00:00
|
|
|
next if(IsIgnored($d) || (%filter && !$filter{$d}));
|
2008-12-09 14:15:21 +00:00
|
|
|
my $p = $defs{$d};
|
|
|
|
my $t = $p->{TYPE};
|
|
|
|
if($t ne $lt) {
|
|
|
|
$str .= "\t</${lt}_LIST>\n" if($lt);
|
|
|
|
$str .= "\t<${t}_LIST>\n";
|
|
|
|
}
|
|
|
|
$lt = $t;
|
2010-01-20 08:47:08 +00:00
|
|
|
|
2008-12-09 14:15:21 +00:00
|
|
|
my $a1 = XmlEscape($p->{STATE});
|
|
|
|
my $a2 = XmlEscape(getAllSets($d));
|
|
|
|
my $a3 = XmlEscape(getAllAttr($d));
|
2010-01-20 08:47:08 +00:00
|
|
|
|
2008-12-09 14:15:21 +00:00
|
|
|
$str .= "\t\t<$t name=\"$d\" state=\"$a1\" sets=\"$a2\" attrs=\"$a3\">\n";
|
2013-01-03 13:01:58 +00:00
|
|
|
my $si = AttrVal("global", "showInternalValues", 0);
|
2010-01-20 08:47:08 +00:00
|
|
|
|
2008-12-09 14:15:21 +00:00
|
|
|
foreach my $c (sort keys %{$p}) {
|
|
|
|
next if(ref($p->{$c}));
|
2013-01-03 13:01:58 +00:00
|
|
|
next if(!$si && $c =~ m/^\./);
|
2008-12-09 14:15:21 +00:00
|
|
|
$str .= sprintf("\t\t\t<INT key=\"%s\" value=\"%s\"/>\n",
|
|
|
|
XmlEscape($c), XmlEscape($p->{$c}));
|
|
|
|
}
|
|
|
|
$str .= sprintf("\t\t\t<INT key=\"IODev\" value=\"%s\"/>\n",
|
2015-07-29 05:46:10 +00:00
|
|
|
$p->{IODev}{NAME}) if($p->{IODev} && $p->{IODev}{NAME});
|
2010-01-20 08:47:08 +00:00
|
|
|
|
2008-12-09 14:15:21 +00:00
|
|
|
foreach my $c (sort keys %{$attr{$d}}) {
|
2013-01-03 13:01:58 +00:00
|
|
|
next if(!$si && $c =~ m/^\./);
|
2008-12-09 14:15:21 +00:00
|
|
|
$str .= sprintf("\t\t\t<ATTR key=\"%s\" value=\"%s\"/>\n",
|
|
|
|
XmlEscape($c), XmlEscape($attr{$d}{$c}));
|
|
|
|
}
|
2010-01-20 08:47:08 +00:00
|
|
|
|
2008-12-09 14:15:21 +00:00
|
|
|
my $r = $p->{READINGS};
|
|
|
|
if($r) {
|
|
|
|
foreach my $c (sort keys %{$r}) {
|
2013-01-03 13:01:58 +00:00
|
|
|
next if(!$si && $c =~ m/^\./);
|
2009-07-25 15:32:13 +00:00
|
|
|
my $h = $r->{$c};
|
2010-01-20 08:47:08 +00:00
|
|
|
next if(!defined($h->{VAL}) || !defined($h->{TIME}));
|
|
|
|
$str .=
|
2008-12-09 14:15:21 +00:00
|
|
|
sprintf("\t\t\t<STATE key=\"%s\" value=\"%s\" measured=\"%s\"/>\n",
|
2009-07-25 15:32:13 +00:00
|
|
|
XmlEscape($c), XmlEscape($h->{VAL}), $h->{TIME});
|
2008-12-09 14:15:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
$str .= "\t\t</$t>\n";
|
|
|
|
}
|
|
|
|
$str .= "\t</${lt}_LIST>\n" if($lt);
|
|
|
|
$str .= "</FHZINFO>\n";
|
|
|
|
return $str;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
1;
|
2012-11-04 13:49:43 +00:00
|
|
|
|
|
|
|
=pod
|
|
|
|
=begin html
|
|
|
|
|
2013-01-14 07:39:43 +00:00
|
|
|
<a name="XmlList"></a>
|
2012-11-04 13:49:43 +00:00
|
|
|
<h3>xmllist</h3>
|
|
|
|
<ul>
|
|
|
|
<code>xmllist [devspec]</code>
|
|
|
|
<br><br>
|
|
|
|
Returns an XML tree of device definitions. <a href="#devspec">devspec</a> is
|
|
|
|
optional, and restricts the list of devices if specified.
|
|
|
|
<br><br>
|
|
|
|
Example:
|
2013-03-11 19:48:01 +00:00
|
|
|
<code>
|
|
|
|
<ul>
|
|
|
|
fhem> xmllist<br>
|
|
|
|
<FHZINFO><br>
|
|
|
|
<ul>
|
|
|
|
<internal_LIST><br>
|
|
|
|
<ul>
|
|
|
|
<internal name="global" state="internal" sets="" attrs="room configfile logfile ..."><br>
|
|
|
|
<ul>
|
|
|
|
<INT key="DEF" value="<no definition>"/><br>
|
|
|
|
<INT key="NR" value="0"/><br>
|
|
|
|
<INT key="STATE" value="internal"/><br>
|
|
|
|
</ul>
|
|
|
|
[...]<br>
|
|
|
|
</ul>
|
|
|
|
</ul>
|
|
|
|
</ul></code>
|
2012-11-04 13:49:43 +00:00
|
|
|
</ul>
|
|
|
|
|
|
|
|
=end html
|
|
|
|
=cut
|