AMADCommBridge weitestgehend abgeschlossen, AMADDevice Modul - automatisches anlegen der AMAD Devices implementiert
This commit is contained in:
parent
ad0a42a9c3
commit
8eb066b919
@ -36,6 +36,13 @@
|
|||||||
#
|
#
|
||||||
# return;
|
# return;
|
||||||
# }
|
# }
|
||||||
|
#
|
||||||
|
#
|
||||||
|
###### Möglicher Aufbau eines JSON Strings für die AMADCommBridge
|
||||||
|
#
|
||||||
|
# {"amad": {"AMADDEVICE": "nexus7-Wohnzimmer","FHEMCMD": "setreading"},"payload": {"reading0": "value0","reading1": "value1","readingX": "valueX"}}
|
||||||
|
#
|
||||||
|
#
|
||||||
##
|
##
|
||||||
##
|
##
|
||||||
|
|
||||||
@ -43,16 +50,18 @@
|
|||||||
|
|
||||||
package main;
|
package main;
|
||||||
|
|
||||||
|
|
||||||
|
my $missingModul = "";
|
||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
use Time::HiRes qw(gettimeofday);
|
|
||||||
|
|
||||||
use HttpUtils;
|
use HttpUtils;
|
||||||
use TcpServerUtils;
|
use TcpServerUtils;
|
||||||
use Encode qw(encode);
|
eval "use JSON;1" or $missingModul .= "JSON ";
|
||||||
|
|
||||||
|
|
||||||
my $modulversion = "3alpha5";
|
my $modulversion = "3alpha9";
|
||||||
my $flowsetversion = "2.6.12";
|
my $flowsetversion = "2.6.12";
|
||||||
|
|
||||||
|
|
||||||
@ -95,7 +104,7 @@ sub AMADCommBridge_Initialize($) {
|
|||||||
$hash->{UndefFn} = "AMADCommBridge_Undef";
|
$hash->{UndefFn} = "AMADCommBridge_Undef";
|
||||||
|
|
||||||
$hash->{AttrFn} = "AMADCommBridge_Attr";
|
$hash->{AttrFn} = "AMADCommBridge_Attr";
|
||||||
$hash->{AttrList} = "expertMode:0,1 ".
|
$hash->{AttrList} = "expertMode:1 ".
|
||||||
"port ".
|
"port ".
|
||||||
"disable:1 ".
|
"disable:1 ".
|
||||||
$readingFnAttributes;
|
$readingFnAttributes;
|
||||||
@ -115,7 +124,8 @@ sub AMADCommBridge_Define($$) {
|
|||||||
my @a = split( "[ \t][ \t]*", $def );
|
my @a = split( "[ \t][ \t]*", $def );
|
||||||
|
|
||||||
|
|
||||||
return "too few parameters: define <name> AMADCommBridge <HOST-IP> '<HOST-PORT>'" if( @a < 2 and @a > 3 );
|
return "too few parameters: define <name> AMADCommBridge'" if( @a != 2);
|
||||||
|
return "Cannot define a HEOS device. Perl modul $missingModul is missing." if ( $missingModul );
|
||||||
|
|
||||||
my $name = $a[0];
|
my $name = $a[0];
|
||||||
my $host = $a[2];
|
my $host = $a[2];
|
||||||
@ -125,7 +135,6 @@ sub AMADCommBridge_Define($$) {
|
|||||||
$port = 8090 if( not defined($port) and (!$port) );
|
$port = 8090 if( not defined($port) and (!$port) );
|
||||||
|
|
||||||
$hash->{BRIDGE} = 1;
|
$hash->{BRIDGE} = 1;
|
||||||
$hash->{HOST} = $host;
|
|
||||||
$hash->{PORT} = $port;
|
$hash->{PORT} = $port;
|
||||||
$hash->{VERSIONMODUL} = $modulversion;
|
$hash->{VERSIONMODUL} = $modulversion;
|
||||||
$hash->{VERSIONFLOWSET} = $flowsetversion;
|
$hash->{VERSIONFLOWSET} = $flowsetversion;
|
||||||
@ -137,7 +146,7 @@ sub AMADCommBridge_Define($$) {
|
|||||||
|
|
||||||
$attr{$name}{room} = "AMAD" if( !defined( $attr{$name}{room} ) );
|
$attr{$name}{room} = "AMAD" if( !defined( $attr{$name}{room} ) );
|
||||||
|
|
||||||
Log3 $name, 3, "AMADCommBridge ($name) - defined AMADCommBridge at $host with Socketport $port";
|
Log3 $name, 3, "AMADCommBridge ($name) - defined AMADCommBridge with Socketport $port";
|
||||||
|
|
||||||
AMADCommBridge_Open( $hash );
|
AMADCommBridge_Open( $hash );
|
||||||
|
|
||||||
@ -399,8 +408,12 @@ sub AMADCommBridge_Set($@) {
|
|||||||
|
|
||||||
AMADCommBridge_Close($hash);
|
AMADCommBridge_Close($hash);
|
||||||
|
|
||||||
|
} elsif( $cmd eq 'fhemServerIP' ) {
|
||||||
|
|
||||||
|
readingsSingleUpdate($hash,$cmd,$arg,1);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
my $list = "open:noArg close:noArg";
|
my $list = "open:noArg close:noArg fhemServerIP";
|
||||||
return "Unknown argument $cmd, choose one of $list";
|
return "Unknown argument $cmd, choose one of $list";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -638,22 +651,30 @@ sub AMADCommBridge_ResponseProcessing($$) {
|
|||||||
my $bhash = $modules{AMADCommBridge}{defptr}{BRIDGE};
|
my $bhash = $modules{AMADCommBridge}{defptr}{BRIDGE};
|
||||||
my $bname = $bhash->{NAME};
|
my $bname = $bhash->{NAME};
|
||||||
|
|
||||||
|
my @data = split( '\R\R', $buf );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#### Verarbeitung der Daten welche über die AMADCommBridge kommen ####
|
#### Verarbeitung der Daten welche über die AMADCommBridge kommen ####
|
||||||
|
|
||||||
Log3 $bname, 5, "AMADCommBridge ($name) - Receive RAW Message in Debugging Mode: $buf";
|
Log3 $bname, 5, "AMADCommBridge ($name) - Receive RAW Message in Debugging Mode: $buf";
|
||||||
|
|
||||||
###
|
|
||||||
## Consume Content
|
|
||||||
###
|
|
||||||
|
|
||||||
my @data = split( '\R\R', $buf );
|
|
||||||
|
|
||||||
my $header = AMADCommBridge_Header2Hash( $data[0] );
|
|
||||||
my $response;
|
my $response;
|
||||||
my $c;
|
my $c;
|
||||||
my $device = $header->{FHEMDEVICE} if(defined($header->{FHEMDEVICE}));
|
my $json = $data[1];
|
||||||
my $fhemcmd = $header->{FHEMCMD} if(defined($header->{FHEMCMD}));
|
my $decode_json;
|
||||||
|
|
||||||
|
$decode_json = eval{decode_json($json)};
|
||||||
|
if($@){
|
||||||
|
Log3 $bname, 3, "AMADCommBridge ($name) - error while request: $@";
|
||||||
|
readingsSingleUpdate($bhash, "state", "error", 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $amadDevice = $decode_json->{amad}{AMADDEVICE};
|
||||||
|
my $fhemcmd = $decode_json->{amad}{FHEMCMD};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -689,7 +710,7 @@ sub AMADCommBridge_ResponseProcessing($$) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
elsif( !defined($device) ) {
|
elsif( !defined($amadDevice) ) {
|
||||||
readingsSingleUpdate( $bhash, "transmitterERROR", $hash->{NAME}." has no device name sends", 1 ) if( AttrVal( $bname, "expertMode", 0 ) eq "1" );
|
readingsSingleUpdate( $bhash, "transmitterERROR", $hash->{NAME}." has no device name sends", 1 ) if( AttrVal( $bname, "expertMode", 0 ) eq "1" );
|
||||||
Log3 $bname, 4, "AMADCommBridge ($name) - ERROR - no device name given. please check your global variable in automagic";
|
Log3 $bname, 4, "AMADCommBridge ($name) - ERROR - no device name given. please check your global variable in automagic";
|
||||||
|
|
||||||
@ -709,13 +730,14 @@ sub AMADCommBridge_ResponseProcessing($$) {
|
|||||||
if( defined($fhemcmd) and ($fhemcmd) ) {
|
if( defined($fhemcmd) and ($fhemcmd) ) {
|
||||||
if ( $fhemcmd =~ /setreading\b/ ) {
|
if ( $fhemcmd =~ /setreading\b/ ) {
|
||||||
my $tv = $data[1];
|
my $tv = $data[1];
|
||||||
return Log3 $bname, 3, "AMADCommBridge ($name) - AMADCommBridge: processing receive no reading values from Device: $device"
|
return Log3 $bname, 3, "AMADCommBridge ($name) - AMADCommBridge: processing receive no reading values from Device: $amadDevice"
|
||||||
unless( defined($tv) and ($tv) );
|
unless( defined($tv) and ($tv) );
|
||||||
|
|
||||||
Log3 $bname, 4, "AMADCommBridge ($name) - AMADCommBridge: processing receive reading values - Device: $device Data: $tv";
|
Log3 $bname, 4, "AMADCommBridge ($name) - AMADCommBridge: processing receive reading values - Device: $amadDevice Data: $tv";
|
||||||
|
|
||||||
# Hier muß dann der Dispatcher aufgerufen werden
|
Dispatch($bhash,$json,undef);
|
||||||
#AMADCommBridge_ResponseProcessing($dhash,$tv);
|
Log3 $name, 4, "AMADCommBridge ($name) - call Dispatcher";
|
||||||
|
readingsSingleUpdate($bhash,'fhemServerIP',$decode_json->{payload}{'DEVICE-IP'},1) if( defined($decode_json->{payload}{'DEVICE-IP'}));
|
||||||
|
|
||||||
$response = "header lines: \r\n AMADCommBridge receive Data complete\r\n FHEM was processes\r\n";
|
$response = "header lines: \r\n AMADCommBridge receive Data complete\r\n FHEM was processes\r\n";
|
||||||
$c = $hash->{CD};
|
$c = $hash->{CD};
|
||||||
@ -751,9 +773,9 @@ sub AMADCommBridge_ResponseProcessing($$) {
|
|||||||
|
|
||||||
readingsBeginUpdate( $bhash);
|
readingsBeginUpdate( $bhash);
|
||||||
readingsBulkUpdate( $bhash, "receiveVoiceCommand", $fhemCmd );
|
readingsBulkUpdate( $bhash, "receiveVoiceCommand", $fhemCmd );
|
||||||
readingsBulkUpdate( $bhash, "receiveVoiceDevice", $device );
|
readingsBulkUpdate( $bhash, "receiveVoiceDevice", $amadDevice );
|
||||||
readingsEndUpdate( $bhash, 1 );
|
readingsEndUpdate( $bhash, 1 );
|
||||||
Log3 $bname, 4, "AMADCommBridge ($name) - AMADCommBridge_CommBridge: set reading receive voice command: $fhemCmd from Device $device";
|
Log3 $bname, 4, "AMADCommBridge ($name) - AMADCommBridge_CommBridge: set reading receive voice command: $fhemCmd from Device $amadDevice";
|
||||||
|
|
||||||
$response = "header lines: \r\n AMADCommBridge receive Data complete\r\n FHEM was processes\r\n";
|
$response = "header lines: \r\n AMADCommBridge receive Data complete\r\n FHEM was processes\r\n";
|
||||||
$c = $hash->{CD};
|
$c = $hash->{CD};
|
||||||
@ -818,21 +840,29 @@ sub AMADCommBridge_ResponseProcessing($$) {
|
|||||||
$response;
|
$response;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub AMADCommBridge_Header2Hash($) {
|
##################
|
||||||
|
### my little helper
|
||||||
|
##################
|
||||||
|
|
||||||
my $string = shift;
|
##### bleibt zu Anschauungszwecken erhalten
|
||||||
my %hash = ();
|
#sub AMADCommBridge_Header2Hash($) {
|
||||||
|
#
|
||||||
|
# my $string = shift;
|
||||||
|
# my %hash = ();
|
||||||
|
#
|
||||||
|
# foreach my $line (split("\r\n", $string)) {
|
||||||
|
# my ($key,$value) = split( ": ", $line );
|
||||||
|
# next if( !$value );
|
||||||
|
#
|
||||||
|
# $value =~ s/^ //;
|
||||||
|
# $hash{$key} = $value;
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# return \%hash;
|
||||||
|
#}
|
||||||
|
|
||||||
foreach my $line (split("\r\n", $string)) {
|
|
||||||
my ($key,$value) = split( ": ", $line );
|
|
||||||
next if( !$value );
|
|
||||||
|
|
||||||
$value =~ s/^ //;
|
|
||||||
$hash{$key} = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
return \%hash;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
1318
74_AMADDevice.pm
Normal file
1318
74_AMADDevice.pm
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user