24_TPLinkHS110: Extra debugging in case of json error

git-svn-id: https://svn.fhem.de/fhem/trunk/fhem@16831 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
vk 2018-06-07 13:11:49 +00:00
parent 042f821b38
commit 20bfef79fb

View File

@ -37,6 +37,7 @@ use IO::Socket::INET;
use IO::Socket::Timeout; use IO::Socket::Timeout;
use JSON; use JSON;
use SetExtensions; use SetExtensions;
use Data::Dumper;
##################################### #####################################
@ -84,6 +85,7 @@ sub TPLinkHS110_Get($$)
{ {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my($success,$json,$realtimejson);
return "Device disabled in config" if ($attr{$name}{"disable"} eq "1"); return "Device disabled in config" if ($attr{$name}{"disable"} eq "1");
RemoveInternalTimer($hash); RemoveInternalTimer($hash);
InternalTimer(gettimeofday()+$hash->{INTERVAL}, "TPLinkHS110_Get", $hash, 1); InternalTimer(gettimeofday()+$hash->{INTERVAL}, "TPLinkHS110_Get", $hash, 1);
@ -108,18 +110,17 @@ sub TPLinkHS110_Get($$)
my $retval = $socket->recv($data,8192); my $retval = $socket->recv($data,8192);
$socket->close(); $socket->close();
unless( defined $retval) { return undef; } unless( defined $retval) { return undef; }
readingsBeginUpdate($hash);
$data = decrypt(substr($data,4)); $data = decrypt(substr($data,4));
my $json;
eval { ($success,$json) = TPLinkHS110__evaljson($name,$data);
$json = decode_json($data); if(!$success) {
} or do { readingsEndUpdate($hash, 1);
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting statistical data";
Log3 $hash, 5, "TPLinkHS110: $name json-raw: $data";
return; return;
}; }
Log3 $hash, 3, "TPLinkHS110: $name Get called. Relay state: $json->{'system'}->{'get_sysinfo'}->{'relay_state'}, RSSI: $json->{'system'}->{'get_sysinfo'}->{'rssi'}"; Log3 $hash, 3, "TPLinkHS110: $name Get called. Relay state: $json->{'system'}->{'get_sysinfo'}->{'relay_state'}, RSSI: $json->{'system'}->{'get_sysinfo'}->{'rssi'}";
readingsBeginUpdate($hash);
my $hw_ver = $json->{'system'}->{'get_sysinfo'}->{'hw_ver'}; my $hw_ver = $json->{'system'}->{'get_sysinfo'}->{'hw_ver'};
my %hwMap = hwMapping(); my %hwMap = hwMapping();
@ -158,19 +159,17 @@ sub TPLinkHS110_Get($$)
$socket->close(); $socket->close();
unless( defined $retval) { return undef; } unless( defined $retval) { return undef; }
$rdata = decrypt(substr($rdata,4)); $rdata = decrypt(substr($rdata,4));
my $realtimejson;
if (length($rdata)==0) { if (length($rdata)==0) {
Log3 $hash, 1, "TPLinkHS110: $name: Received zero bytes of realtime data. Cannot process realtime data"; Log3 $hash, 1, "TPLinkHS110: $name: Received zero bytes of realtime data. Cannot process realtime data";
return; return;
} }
eval {
$realtimejson = decode_json($rdata); ($success,$realtimejson) = TPLinkHS110__evaljson($name,$rdata);
} or do { if(!$success) {
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting realtime data";
Log3 $hash, 5, "TPLinkHS110: $name json-raw: $rdata";
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
return; return;
}; }
my %emeterReadings = (); my %emeterReadings = ();
@ -209,8 +208,9 @@ sub TPLinkHS110_Get($$)
$socket->close(); $socket->close();
unless( defined $retval) { return undef; } unless( defined $retval) { return undef; }
$data = decrypt(substr($data,4)); $data = decrypt(substr($data,4));
eval {
my $json = decode_json($data); ($success,$json) = TPLinkHS110__evaljson($name,$data);
if($success && $json) {
my $total=0; my $total=0;
foreach my $key (sort keys @{$json->{'emeter'}->{'get_daystat'}->{'day_list'}}) { foreach my $key (sort keys @{$json->{'emeter'}->{'get_daystat'}->{'day_list'}}) {
foreach my $key2 ($json->{'emeter'}->{'get_daystat'}->{'day_list'}[$key]) { foreach my $key2 ($json->{'emeter'}->{'get_daystat'}->{'day_list'}[$key]) {
@ -232,12 +232,10 @@ sub TPLinkHS110_Get($$)
$count = @{$json->{'emeter'}->{'get_daystat'}->{'day_list'}}; $count = @{$json->{'emeter'}->{'get_daystat'}->{'day_list'}};
readingsBulkUpdate($hash, "monthly_total", $total); readingsBulkUpdate($hash, "monthly_total", $total);
if ($count) { readingsBulkUpdate($hash, "daily_average", $total/$count)}; if ($count) { readingsBulkUpdate($hash, "daily_average", $total/$count)};
1; } else {
} or do {
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting daily stat data";
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
return; return;
}; }
} }
readingsEndUpdate($hash, 1); readingsEndUpdate($hash, 1);
Log3 $hash, 3, "TPLinkHS110: $name Get end"; Log3 $hash, 3, "TPLinkHS110: $name Get end";
@ -249,9 +247,10 @@ sub TPLinkHS110_Set($$)
{ {
my ( $hash, $name, $cmd, @args ) = @_; my ( $hash, $name, $cmd, @args ) = @_;
my $cmdList = "on off"; my $cmdList = "on off";
my($success,$json,$realtimejson);
return "\"set $name\" needs at least one argument" unless(defined($cmd)); return "\"set $name\" needs at least one argument" unless(defined($cmd));
return "Device disabled in config" if ($attr{$name}{"disable"} eq "1"); return "Device disabled in config" if ($attr{$name}{"disable"} eq "1");
Log3 $hash, 3, "TPLinkHS110: $name Set <". $cmd ."> called"; Log3 $hash, 3, "TPLinkHS110: $name Set <". $cmd ."> called" if ($cmd !~ /\?/);
my $command=""; my $command="";
if($cmd eq "on") if($cmd eq "on")
@ -281,14 +280,15 @@ sub TPLinkHS110_Set($$)
my $retval = $socket->recv($data,8192); my $retval = $socket->recv($data,8192);
$socket->close(); $socket->close();
unless( defined $retval) { return undef; } unless( defined $retval) { return undef; }
readingsBeginUpdate($hash);
$data = decrypt(substr($data,4)); $data = decrypt(substr($data,4));
my $json;
eval { ($success,$json) = TPLinkHS110__evaljson($name,$data);
$json = decode_json($data); if(!$success) {
} or do { readingsEndUpdate($hash, 1);
Log3 $hash, 2, "TPLinkHS110: $name json-decoding failed. Problem decoding getting statistical data";
return; return;
}; }
if ($json->{'system'}->{'set_relay_state'}->{'err_code'} eq "0") { if ($json->{'system'}->{'set_relay_state'}->{'err_code'} eq "0") {
TPLinkHS110_Get($hash,""); TPLinkHS110_Get($hash,"");
@ -445,6 +445,34 @@ sub hwMapping {
return %hwMap; return %hwMap;
} }
###############################################################################
# Test ob JSON-String empfangen wurde
sub TPLinkHS110__evaljson($$) {
my ($name,$data)= @_;
my $hash = $defs{$name};
my $json;
my $success = 1;
my $jerr = "ok";
Log3 $name, 5, "$name - Data returned: ". Dumper $data;
eval {$json = decode_json($data);} or do
{
$success = 0;
};
if($@) {
$jerr = $@;
};
readingsBulkUpdate($hash, "decode_json", $jerr);
if($success) {
return($success,$json);
} else {
return($success,undef);
}
}
###################################################################################### ######################################################################################
1; 1;