mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-01-31 06:39:11 +00:00
351774dd4d
git-svn-id: https://svn.fhem.de/fhem/trunk@26701 2b470e98-0d58-463d-a4d8-8e2adae1ed80
180 lines
4.8 KiB
Perl
180 lines
4.8 KiB
Perl
################################################################
|
|
# $Id$
|
|
################################################################
|
|
|
|
package main;
|
|
use strict;
|
|
use warnings;
|
|
|
|
sub CommandJsonList2($$);
|
|
|
|
#####################################
|
|
sub
|
|
JsonList2_Initialize($$)
|
|
{
|
|
my %lhash = ( Fn=>"CommandJsonList2",
|
|
Hlp=>"[<devspec>],list definitions as JSON" );
|
|
$cmds{jsonlist2} = \%lhash;
|
|
}
|
|
|
|
|
|
#####################################
|
|
sub
|
|
JsonList2_Escape($)
|
|
{
|
|
my $a = shift;
|
|
return "null" if(!defined($a));
|
|
$a =~ s/([\x00-\x09\x0b-\x1f\x5c])/sprintf '\u%04x', ord($1)/ge; # Forum 57377
|
|
$a =~ s/"/\\"/g;
|
|
$a =~ s/\n/\\n/g;
|
|
my $b = "x$a";
|
|
$a = "<BINARY>" if(!utf8::decode($b) && !$unicodeEncoding); # Forum #55318
|
|
return $a;
|
|
}
|
|
|
|
sub
|
|
JsonList2_dumpHash($$$$$$)
|
|
{
|
|
my ($arrp, $name, $h, $isReading, $showInternal, $attr) = @_;
|
|
my $ret = "";
|
|
my %filter;
|
|
%filter = map { $_=>1 } @$attr if(@$attr);
|
|
|
|
my @arr = grep { ($showInternal || $_ !~ m/^\./) &&
|
|
($isReading || $_ eq "IODev" || !ref($h->{$_}) ) &&
|
|
(!@$attr || $filter{$_}) } sort keys %{$h};
|
|
for(my $i2=0; $i2 < @arr; $i2++) {
|
|
my $k = $arr[$i2];
|
|
my $v = $h->{$k};
|
|
$ret .= " \"".JsonList2_Escape($k)."\": ";
|
|
if($isReading) {
|
|
$ret .= "{ \"Value\":\"".JsonList2_Escape($v->{VAL})."\",";
|
|
$ret .= " \"Time\":\"".JsonList2_Escape($v->{TIME})."\" }";
|
|
} else {
|
|
$v = $v->{NAME} if($k eq "IODev" && ref($v) eq "HASH" && $v->{NAME});
|
|
$ret .= "\"".JsonList2_Escape($v)."\"";
|
|
}
|
|
$ret .= "," if($i2 < int(@arr)-1);
|
|
$ret .= "\n" if(int(@arr)>1);
|
|
}
|
|
if(@arr > 1) {
|
|
push @{$arrp}, " \"$name\": {\n$ret }";
|
|
} else {
|
|
push @{$arrp}, " \"$name\": {$ret }";
|
|
}
|
|
}
|
|
|
|
#####################################
|
|
sub
|
|
CommandJsonList2($$)
|
|
{
|
|
my ($cl, $param) = @_;
|
|
my @d;
|
|
my $ret;
|
|
my $cnt=0;
|
|
my $si = AttrVal("global", "showInternalValues", 0);
|
|
my @attr;
|
|
|
|
$cl->{contenttype} = "application/json; charset=utf-8" if($cl);
|
|
|
|
if($param) {
|
|
@attr = split(" ", $param);
|
|
@d = devspec2array(shift(@attr),$cl);
|
|
|
|
} else {
|
|
@d = devspec2array(".*", $cl); # Needed for Authorization
|
|
$param="";
|
|
|
|
}
|
|
|
|
$ret = "{\n";
|
|
$ret .= " \"Arg\":\"".JsonList2_Escape($param)."\",\n",
|
|
$ret .= " \"Results\": [\n";
|
|
|
|
for(my $i1 = 0; $i1 < int(@d); $i1++) {
|
|
my $d = $d[$i1];
|
|
next if(IsIgnored($d));
|
|
|
|
my $h = $defs{$d};
|
|
my $n = $h->{NAME};
|
|
next if(!$h || !$n);
|
|
|
|
my @r;
|
|
if(!@attr) {
|
|
push(@r," \"PossibleSets\":\"".JsonList2_Escape(getAllSets($n))."\"");
|
|
push(@r," \"PossibleAttrs\":\"".JsonList2_Escape(getAllAttr($n))."\"");
|
|
}
|
|
JsonList2_dumpHash(\@r, "Internals", $h, 0, $si, \@attr);
|
|
JsonList2_dumpHash(\@r, "Readings", $h->{READINGS}, 1, $si, \@attr);
|
|
JsonList2_dumpHash(\@r, "Attributes",$attr{$d}, 0, $si, \@attr);
|
|
|
|
next if(!@r);
|
|
$ret .= ",\n" if($cnt);
|
|
$ret .= " {\n";
|
|
$ret .= " \"Name\":\"".JsonList2_Escape($n)."\",\n".join(",\n",@r)."\n";
|
|
$ret .= " }";
|
|
$cnt++;
|
|
}
|
|
|
|
$ret .= " ],\n";
|
|
$ret .= " \"totalResultsReturned\":$cnt\n";
|
|
$ret .= "}\n";
|
|
return $ret;
|
|
}
|
|
|
|
1;
|
|
|
|
=pod
|
|
=item command
|
|
=item summary show device data in JSON format
|
|
=item summary_DE zeigt Gerätedaten in JSON Format an
|
|
|
|
=begin html
|
|
|
|
<a name="JsonList2"></a>
|
|
<h3>JsonList2</h3>
|
|
<ul>
|
|
<code>jsonlist2 [<devspec>] [<value1> <value2> ...]</code>
|
|
<br><br>
|
|
This is a command, to be issued on the command line (FHEMWEB or telnet
|
|
interface). Can also be called via HTTP by
|
|
<ul>
|
|
http://fhemhost:8083/fhem?cmd=jsonlist2&XHR=1
|
|
</ul>
|
|
Returns an JSON tree of the internal values, readings and attributes of the
|
|
requested definitions.<br>
|
|
If valueX is specified, then output only the corresponding internal (like DEF,
|
|
TYPE, etc), reading (actuator, measured-temp) or attribute for all devices
|
|
from the devspec.<br><br>
|
|
<b>Note</b>: the old command jsonlist (without the 2 as suffix) is deprecated
|
|
and will be removed in the future<br>
|
|
</ul>
|
|
|
|
=end html
|
|
|
|
=begin html_DE
|
|
|
|
<a name="JsonList2"></a>
|
|
<h3>JsonList2</h3>
|
|
<ul>
|
|
<code>jsonlist2 [<devspec>] [<value1> <value2> ...]</code>
|
|
<br><br>
|
|
Dieses Befehl sollte in der FHEMWEB oder telnet Eingabezeile ausgeführt
|
|
werden, kann aber auch direkt über HTTP abgerufen werden über
|
|
<ul>
|
|
http://fhemhost:8083/fhem?cmd=jsonlist2&XHR=1
|
|
</ul>
|
|
Es liefert die JSON Darstellung der internen Variablen, Readings und
|
|
Attribute zurück.<br>
|
|
|
|
Wenn valueX angegeben ist, dann wird nur der entsprechende Internal (DEF,
|
|
TYPE, usw), Reading (actuator, measured-temp) oder Attribut
|
|
zurückgeliefert für alle Geräte die in devspec angegeben sind.
|
|
<br><br>
|
|
<b>Achtung</b>: die alte Version dieses Befehls (jsonlist, ohne 2 am Ende) is
|
|
überholt, und wird in der Zukunft entfernt.<br>
|
|
</ul>
|
|
|
|
=end html_DE
|
|
=cut
|