Diverse JSON Strings hinzugefügt, Codeanpassungen und Bugfixes

This commit is contained in:
Marko Oldenburg
2017-05-28 20:45:59 +02:00
parent 874cdb7bf1
commit 3e2de00594
2 changed files with 228 additions and 93 deletions

View File

@@ -41,7 +41,8 @@
###### Möglicher Aufbau eines JSON Strings für die AMADCommBridge ###### Möglicher Aufbau eines JSON Strings für die AMADCommBridge
# #
# first initial String # first initial String
# {"amad": {"amad_id": "37836534","fhemcmd": "setreading"},"payload": {"fhemdevice": "TabletWohnzimmer","fhemserverip": "192.168.1.25","amaddevice_ip": "192.168.1.123"}} # {"amad": {"amad_id": "1495827100156","fhemcmd": "setreading"},"payload": {},"firstrun": {"fhemdevice": "TabletWohnzimmer","fhemserverip": "fhem02.tuxnet.local","amaddevice_ip": "10.6.9.35"}}
# {"amad": {"amad_id": "1495827100156","fhemcmd": "setreading"},"payload": {},"firstrun": {"fhemdevice": "TabletWohnzimmer","fhemserverip": "fhem02.tuxnet.local","amaddevice_ip": "10.6.9.35"}}
# #
# default String # default String
# {"amad": {"amad_id": "37836534","fhemcmd": "setreading"},"payload": {"reading0": "value0","reading1": "value1","readingX": "valueX"}} # {"amad": {"amad_id": "37836534","fhemcmd": "setreading"},"payload": {"reading0": "value0","reading1": "value1","readingX": "valueX"}}
@@ -67,8 +68,8 @@ use TcpServerUtils;
eval "use JSON;1" or $missingModul .= "JSON "; eval "use JSON;1" or $missingModul .= "JSON ";
my $modulversion = "3alpha27"; my $modulversion = "3.9.48";
my $flowsetversion = "2.6.12"; my $flowsetversion = "3.9.48";
@@ -78,7 +79,6 @@ sub AMADCommBridge_Attr(@);
sub AMADCommBridge_Open($); sub AMADCommBridge_Open($);
sub AMADCommBridge_Read($); sub AMADCommBridge_Read($);
sub AMADCommBridge_Define($$); sub AMADCommBridge_Define($$);
sub AMADCommBridge_WriteRequest($$$);
sub AMADCommBridge_Initialize($); sub AMADCommBridge_Initialize($);
sub AMADCommBridge_Set($@); sub AMADCommBridge_Set($@);
sub AMADCommBridge_Write($@); sub AMADCommBridge_Write($@);
@@ -86,6 +86,8 @@ sub AMADCommBridge_Undef($$);
sub AMADCommBridge_ResponseProcessing($$); sub AMADCommBridge_ResponseProcessing($$);
sub AMADCommBridge_Close($); sub AMADCommBridge_Close($);
sub AMADCommBridge_ErrorHandling($$$); sub AMADCommBridge_ErrorHandling($$$);
sub AMADCommBridge_ProcessRead($$);
sub AMADCommBridge_ParseMsg($$);
@@ -99,7 +101,7 @@ sub AMADCommBridge_Initialize($) {
$hash->{ReadFn} = "AMADCommBridge_Read"; $hash->{ReadFn} = "AMADCommBridge_Read";
$hash->{WriteFn} = "AMADCommBridge_Write"; $hash->{WriteFn} = "AMADCommBridge_Write";
$hash->{Clients} = ":AMADDevice:"; $hash->{Clients} = ":AMADDevice:";
$hash->{MatchList} = { "1:AMADDevice" => '.*' }; $hash->{MatchList} = { "1:AMADDevice" => '{"amad": {"amad_id":.+}}' };
# Consumer # Consumer
@@ -246,10 +248,8 @@ sub AMADCommBridge_Set($@) {
sub AMADCommBridge_Write($@) { sub AMADCommBridge_Write($@) {
my ($hash,$amad_id,$uri,$method) = @_; my ($hash,$amad_id,$uri,$header,$method) = @_;
my $header = "Connection: close\r\n"; my $name = $hash->{NAME};
$header .= shift;
my $name = $hash->{NAME};
HttpUtils_NonblockingGet( HttpUtils_NonblockingGet(
@@ -589,6 +589,7 @@ sub AMADCommBridge_Close($) {
sub AMADCommBridge_Read($) { sub AMADCommBridge_Read($) {
my $hash = shift; my $hash = shift;
my $name = $hash->{NAME};
if( $hash->{SERVERSOCKET} ) { # Accept and create a child if( $hash->{SERVERSOCKET} ) { # Accept and create a child
@@ -598,62 +599,39 @@ sub AMADCommBridge_Read($) {
# Read 1024 byte of data # Read 1024 byte of data
my $buf; my $buf;
my $ret = sysread($hash->{CD}, $buf, 1024); my $ret = sysread($hash->{CD}, $buf, 2048);
# When there is an error in connection return # When there is an error in connection return
if( !defined($ret ) || $ret <= 0 ) { if( !defined($ret ) || $ret <= 0 ) {
CommandDelete( undef, $hash->{NAME} ); CommandDelete( undef, $name );
Log3 $name, 5, "AMADCommBridge ($name) - Error in connection";
return; return;
} }
AMADCommBridge_ResponseProcessing($hash,$buf); AMADCommBridge_ProcessRead($hash,$buf);
} }
sub AMADCommBridge_ResponseProcessing($$) { sub AMADCommBridge_ProcessRead($$) {
my ($hash,$buf) = @_; my ($hash, $buf) = @_;
my $name = $hash->{NAME};
my $name = $hash->{NAME}; my @data = split( '\R\R', $buf );
my $bhash = $modules{AMADCommBridge}{defptr}{BRIDGE}; my $data = $data[0];
my $bname = $bhash->{NAME}; my $json = $data[1];
my $buffer = '';
my @data = split( '\R\R', $buf );
#### Verarbeitung der Daten welche über die AMADCommBridge kommen #### Log3 $name, 4, "AMADCommBridge ($name) - process read";
Log3 $bname, 5, "AMADCommBridge ($name) - Receive RAW Message in Debugging Mode: $buf";
my $response; my $response;
my $c; my $c;
my $json = $data[1];
my $decode_json;
$decode_json = eval{decode_json($json)}; if ( $data =~ /currentFlowsetUpdate.xml/ ) {
if($@){
Log3 $bname, 3, "AMADCommBridge ($name) - error while request: $@";
readingsSingleUpdate($bhash, "state", "error", 1);
return;
}
my $amad_id = $decode_json->{amad}{amad_id};
my $fhemcmd = $decode_json->{amad}{fhemcmd};
my $fhemDevice;
if( defined($decode_json->{payload}{fhemdevice}) and ($decode_json->{payload}{fhemdevice}) ) {
$fhemDevice = $decode_json->{payload}{fhemdevice} if( defined($decode_json->{payload}{fhemdevice}) );
} else {
$fhemDevice = $modules{AMADDevice}{defptr}{$amad_id}->{NAME};
}
if ( $data[0] =~ /currentFlowsetUpdate.xml/ ) {
my $fhempath = $attr{global}{modpath}; my $fhempath = $attr{global}{modpath};
$response = qx(cat $fhempath/FHEM/lib/74_AMADautomagicFlowset_$flowsetversion.xml); $response = qx(cat $fhempath/FHEM/lib/74_AMADautomagicFlowset_$flowsetversion.xml);
@@ -667,7 +645,7 @@ sub AMADCommBridge_ResponseProcessing($$) {
return; return;
} }
elsif ( $data[0] =~ /installFlow_([^.]*.xml)/ ) { elsif ( $data =~ /installFlow_([^.]*.xml)/ ) {
if( defined($1) ){ if( defined($1) ){
$response = qx(cat /tmp/$1); $response = qx(cat /tmp/$1);
@@ -683,8 +661,98 @@ sub AMADCommBridge_ResponseProcessing($$) {
} }
if(defined($hash->{PARTIAL}) and $hash->{PARTIAL}) {
elsif( !defined($amad_id) ) { Log3 $name, 5, "AMADCommBridge ($name) - PARTIAL: " . $hash->{PARTIAL};
$buffer = $hash->{PARTIAL};
} else {
Log3 $name, 4, "AMADCommBridge ($name) - No PARTIAL buffer";
}
Log3 $name, 5, "AMADCommBridge ($name) - Incoming data: " . $json;
$buffer = $buffer . $json;
Log3 $name, 5, "AMADCommBridge ($name) - Current processing buffer (PARTIAL + incoming data): " . $buffer;
my ($correct_json,$tail) = AMADCommBridge_ParseMsg($hash, $buffer);
while($correct_json) {
$hash->{LAST_RECV} = time();
Log3 $name, 5, "AMADCommBridge ($name) - Decoding JSON message. Length: " . length($correct_json) . " Content: " . $correct_json;
Log3 $name, 5, "AMADCommBridge ($name) - Vor Sub: Laenge JSON: " . length($correct_json) . " Content: " . $correct_json . " Tail: " . $tail;
AMADCommBridge_ResponseProcessing($hash,$correct_json)
unless(not defined($tail) and not ($tail));
($correct_json,$tail) = AMADCommBridge_ParseMsg($hash, $tail);
Log3 $name, 5, "AMADCommBridge ($name) - Nach Sub: Laenge JSON: " . length($correct_json) . " Content: " . $correct_json . " Tail: " . $tail;
}
$hash->{PARTIAL} = $tail;
Log3 $name, 4, "AMADCommBridge ($name) - PARTIAL lenght: " . length($tail);
Log3 $name, 5, "AMADCommBridge ($name) - Tail: " . $tail;
Log3 $name, 5, "AMADCommBridge ($name) - PARTIAL: " . $hash->{PARTIAL};
}
sub AMADCommBridge_ResponseProcessing($$) {
my ($hash,$json) = @_;
my $name = $hash->{NAME};
my $bhash = $modules{AMADCommBridge}{defptr}{BRIDGE};
my $bname = $bhash->{NAME};
#### Verarbeitung der Daten welche über die AMADCommBridge kommen ####
Log3 $bname, 4, "AMADCommBridge ($name) - Receive RAW Message in Debugging Mode: $json";
my $response;
my $c;
#my $json = $data[1];
my $decode_json;
$decode_json = eval{decode_json($json)};
if($@){
Log3 $bname, 3, "AMADCommBridge ($name) - ERROR while request: $@";
readingsSingleUpdate($bhash, "JSON info", "JSON ERROR", 1);
$response = "header lines: \r\n AMADCommBridge receive a JSON error\r\n AMADCommBridge to do nothing\r\n";
$c = $hash->{CD};
print $c "HTTP/1.1 200 OK\r\n",
"Content-Type: text/plain\r\n",
"Connection: close\r\n",
"Content-Length: ".