Diverse JSON Strings hinzugefügt, Codeanpassungen und Bugfixes
This commit is contained in:
@@ -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: ". |