auto statusRequest beim NUKIDevice, alive Check beim NUKIBridge. Mit HttpUtils vom 11.12.2016 sauberes /list und mehr

This commit is contained in:
Marko Oldenburg 2016-12-10 18:47:56 +01:00
parent cdd57888f7
commit 6d34166c97
2 changed files with 98 additions and 42 deletions

View File

@ -46,7 +46,7 @@ use JSON;
use HttpUtils; use HttpUtils;
my $version = "0.3.25"; my $version = "0.3.30";
@ -178,7 +178,8 @@ sub NUKIBridge_Attr(@) {
} }
} }
# webhook* ######################
#### webhook #########
if ( $attrName =~ /^webhook.*/ ) { if ( $attrName =~ /^webhook.*/ ) {
my $webhookHttpHostname = ( my $webhookHttpHostname = (
$attrName eq "webhookHttpHostname" $attrName eq "webhookHttpHostname"
@ -192,7 +193,7 @@ sub NUKIBridge_Attr(@) {
); );
$hash->{WEBHOOK_URI} = "/" $hash->{WEBHOOK_URI} = "/"
. AttrVal( $webhookFWinstance, "webname", "fhem" ) . AttrVal( $webhookFWinstance, "webname", "fhem" )
. "/THINKINGCLEANER"; . "/NUKISMARTLOCK";
$hash->{WEBHOOK_PORT} = ( $hash->{WEBHOOK_PORT} = (
$attrName eq "webhookPort" $attrName eq "webhookPort"
? $attrVal ? $attrVal
@ -237,7 +238,7 @@ sub NUKIBridge_Set($@) {
if($cmd eq 'autocreate') { if($cmd eq 'autocreate') {
return "usage: autocreate" if( @args != 0 ); return "usage: autocreate" if( @args != 0 );
NUKIBridge_firstRun($hash); NUKIBridge_Call($hash,$hash,"list",undef,undef) if( !IsDisabled($name) );
return undef; return undef;
@ -291,14 +292,31 @@ sub NUKIBridge_Get($@) {
} }
sub NUKIBridge_firstRun($) { sub NUKIBridge_GetCheckBridgeAlive($) {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
RemoveInternalTimer($hash); RemoveInternalTimer($hash);
if( !IsDisabled($name) ) {
NUKIBridge_Call($hash,$hash,"alive",undef,undef);
InternalTimer( gettimeofday()+17+int(rand(12)), "NUKIBridge_GetCheckBridgeAlive", $hash, 1 );
Log3 $name, 4, "NUKIBridge ($name) - Call InternalTimer for NUKIBridge_GetCheckBridgeAlive";
}
}
sub NUKIBridge_firstRun($) {
my ($hash) = @_;
my $name = $hash->{NAME};
RemoveInternalTimer($hash);
NUKIBridge_Call($hash,$hash,"list",undef,undef) if( !IsDisabled($name) ); NUKIBridge_Call($hash,$hash,"list",undef,undef) if( !IsDisabled($name) );
NUKIBridge_GetCheckBridgeAlive($hash);
return undef; return undef;
} }
@ -312,7 +330,7 @@ sub NUKIBridge_Call($$$$$) {
my $port = $hash->{PORT}; my $port = $hash->{PORT};
my $token = $hash->{TOKEN}; my $token = $hash->{TOKEN};
return "Only single call to Bridge, please try again later" if( $hash->{helper}{BRIDGE_CALL} );
my $uri = "http://" . $hash->{HOST} . ":" . $port; my $uri = "http://" . $hash->{HOST} . ":" . $port;
$uri .= "/" . $path if( defined $path); $uri .= "/" . $path if( defined $path);
@ -320,11 +338,12 @@ sub NUKIBridge_Call($$$$$) {
$uri .= "&action=" . $lockActions{$lockAction} if( defined($lockAction) ); $uri .= "&action=" . $lockActions{$lockAction} if( defined($lockAction) );
$uri .= "&nukiId=" . $nukiId if( defined($nukiId) ); $uri .= "&nukiId=" . $nukiId if( defined($nukiId) );
$hash->{helper}{BRIDGE_CALL} = 1;
HttpUtils_NonblockingGet( HttpUtils_NonblockingGet(
{ {
url => $uri, url => $uri,
timeout => 60, timeout => 30,
hash => $hash, hash => $hash,
chash => $chash, chash => $chash,
endpoint => $path, endpoint => $path,
@ -344,34 +363,37 @@ sub NUKIBridge_Distribution($$$) {
my $doTrigger = $param->{doTrigger}; my $doTrigger = $param->{doTrigger};
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $host = $hash->{HOST}; my $host = $hash->{HOST};
Log3 $name, 3, "NUKIBridge ($name) - Param Alive: $param->{alive}";
Log3 $name, 3, "NUKIBridge ($name) - Param Code: $param->{code}";
Log3 $name, 3, "NUKIBridge ($name) - Error: $err";
Log3 $name, 3, "NUKIBridge ($name) - PATH: $param->{path}";
Log3 $name, 3, "NUKIBridge ($name) - httpheader: $param->{httpheader}";
delete $hash->{helper}{BRIDGE_CALL};
readingsBeginUpdate($hash); readingsBeginUpdate($hash);
if( defined( $err ) ) { if( defined( $err ) ) {
if ( $err ne "" ) { if ( $err ne "" ) {
if ($param->{endpoint} eq "alive") {
readingsBulkUpdate( $hash, "lastError", $err ); readingsBulkUpdate( $hash, "state", "not connected");
Log3 $name, 4, "NUKIBridge ($name) - error while requesting: $err"; }
readingsBulkUpdate( $hash, "lastError", $err ) if( ReadingsVal($name,"state","not connected") eq "not connected" );
Log3 $name, 3, "NUKIBridge ($name) - error while requesting: $err";
readingsEndUpdate( $hash, 1 ); readingsEndUpdate( $hash, 1 );
return $err; return $err;
} }
} }
if( $json eq "" and exists( $param->{code} ) && $param->{code} ne 200 ) { if( $json eq "" and exists( $param->{code} ) && $param->{code} ne 200 ) {
if( $param->{endpoint} eq "alive") {
readingsBulkUpdate( $hash, "state", "connected" );
Log3 $name, 5, "NUKIBridge ($name) - Bridge ist online";
readingsEndUpdate( $hash, 1 );
return;
}
readingsBulkUpdate( $hash, "lastError", "Internal error, " .$param->{code} ); readingsBulkUpdate( $hash, "lastError", "Internal error, " .$param->{code} );
Log3 $name, 4, "NUKIBridge ($name) - received http code " .$param->{code}." without any data after requesting"; Log3 $name, 3, "NUKIBridge ($name) - received http code " .$param->{code}." without any data after requesting";
readingsEndUpdate( $hash, 1 ); readingsEndUpdate( $hash, 1 );
return "received http code ".$param->{code}." without any data after requesting"; return "received http code ".$param->{code}." without any data after requesting";
@ -384,13 +406,13 @@ sub NUKIBridge_Distribution($$$) {
###### Fehler bei Antwort auf Anfrage eines logischen Devices ###### ###### Fehler bei Antwort auf Anfrage eines logischen Devices ######
NUKIDevice_Parse($param->{chash},$param->{code},undef) if( $param->{code} eq 404 ); NUKIDevice_Parse($param->{chash},$param->{code}) if( $param->{code} eq 404 );
NUKIDevice_Parse($param->{chash},$param->{code},undef) if( $param->{code} eq 400 and $hash != $param->{chash} ); NUKIDevice_Parse($param->{chash},$param->{code}) if( $param->{code} eq 400 and $hash != $param->{chash} );
Log3 $name, 4, "NUKIBridge ($name) - invalid API token" if( $param->{code} eq 401 ); Log3 $name, 3, "NUKIBridge ($name) - invalid API token" if( $param->{code} eq 401 );
Log3 $name, 4, "NUKIBridge ($name) - nukiId is not known" if( $param->{code} eq 404 ); Log3 $name, 3, "NUKIBridge ($name) - nukiId is not known" if( $param->{code} eq 404 );
Log3 $name, 4, "NUKIBridge ($name) - action is undefined" if( $param->{code} eq 400 and $hash == $param->{chash} ); Log3 $name, 3, "NUKIBridge ($name) - action is undefined" if( $param->{code} eq 400 and $hash == $param->{chash} );
######### Zum testen da ich kein Nuki Smartlock habe ############ ######### Zum testen da ich kein Nuki Smartlock habe ############
@ -437,6 +459,7 @@ sub NUKIBridge_ResponseProcessing($$$) {
if( ref($decode_json) eq "ARRAY" and scalar(@{$decode_json}) > 0 and $path eq "list" ) { if( ref($decode_json) eq "ARRAY" and scalar(@{$decode_json}) > 0 and $path eq "list" ) {
NUKIBridge_Autocreate($hash,$decode_json); NUKIBridge_Autocreate($hash,$decode_json);
NUKIBridge_Call($hash,$hash,"info",undef,undef) if( !IsDisabled($name) );
} }
elsif( $path eq "info" ) { elsif( $path eq "info" ) {
@ -477,17 +500,17 @@ sub NUKIBridge_Autocreate($$;$) {
my $code = $name ."-".$nukiId; my $code = $name ."-".$nukiId;
if( defined($modules{NUKIDevice}{defptr}{$code}) ) { if( defined($modules{NUKIDevice}{defptr}{$code}) ) {
Log3 $name, 5, "NUKIDevice ($name) - NukiId '$nukiId' already defined as '$modules{NUKIDevice}{defptr}{$code}->{NAME}'"; Log3 $name, 3, "NUKIDevice ($name) - NukiId '$nukiId' already defined as '$modules{NUKIDevice}{defptr}{$code}->{NAME}'";
next; next;
} }
my $devname = "NUKIDevice" . $nukiId; my $devname = "NUKIDevice" . $nukiId;
my $define= "$devname NUKIDevice $nukiId IODev=$name"; my $define= "$devname NUKIDevice $nukiId IODev=$name";
Log3 $name, 5, "NUKIDevice ($name) - create new device '$devname' for address '$nukiId'"; Log3 $name, 3, "NUKIDevice ($name) - create new device '$devname' for address '$nukiId'";
my $cmdret= CommandDefine(undef,$define); my $cmdret= CommandDefine(undef,$define);
if($cmdret) { if($cmdret) {
Log3 $name, 1, "NUKIDevice ($name) - Autocreate: An error occurred while creating device for nukiId '$nukiId': $cmdret"; Log3 $name, 3, "NUKIDevice ($name) - Autocreate: An error occurred while creating device for nukiId '$nukiId': $cmdret";
} else { } else {
$cmdret= CommandAttr(undef,"$devname alias $nukiName"); $cmdret= CommandAttr(undef,"$devname alias $nukiName");
$cmdret= CommandAttr(undef,"$devname room NUKI"); $cmdret= CommandAttr(undef,"$devname room NUKI");
@ -547,11 +570,11 @@ sub NUKIBridge_getLogfile($) {
my $decode_json = NUKIBridge_CallBlocking($hash,"log",undef); my $decode_json = NUKIBridge_CallBlocking($hash,"log",undef);
Log3 $name, 3, "NUKIBridge ($name) - Kurz vor der Bedingung nach decode_json ARRAY"; Log3 $name, 4, "NUKIBridge ($name) - Log Daten werden geholt und aufbereitet";
if( ref($decode_json) eq "ARRAY" and scalar(@{$decode_json}) > 0 ) { if( ref($decode_json) eq "ARRAY" and scalar(@{$decode_json}) > 0 ) {
Log3 $name, 3, "NUKIBridge ($name) - Innerhalb der ARRAY Bedingung"; Log3 $name, 4, "NUKIBridge ($name) - Tabelle mit Logdaten wird aufgebaut";
my $ret = '<html><table width=100%><tr><td>'; my $ret = '<html><table width=100%><tr><td>';
@ -559,12 +582,14 @@ sub NUKIBridge_getLogfile($) {
$ret .= '<tr class="odd">'; $ret .= '<tr class="odd">';
$ret .= "<td><b>Timestamp</b></td>"; $ret .= "<td><b>Timestamp</b></td>";
$ret .= "<td> </td>";
$ret .= "<td><b>Type</b></td>"; $ret .= "<td><b>Type</b></td>";
$ret .= '</tr>'; $ret .= '</tr>';
foreach my $logs (@{$decode_json}) { foreach my $logs (@{$decode_json}) {
$ret .= "<td>$logs->{timestamp}</td>"; $ret .= "<td>$logs->{timestamp}</td>";
$ret .= "<td> </td>";
$ret .= "<td>$logs->{type}</td>"; $ret .= "<td>$logs->{type}</td>";
$ret .= '</tr>'; $ret .= '</tr>';
} }
@ -584,17 +609,22 @@ sub NUKIBridge_CallBlocking($$$) {
my $port = $hash->{PORT}; my $port = $hash->{PORT};
my $token = $hash->{TOKEN}; my $token = $hash->{TOKEN};
return "Only single call to Bridge, please try again later" if( $hash->{helper}{BRIDGE_CALL} );
my $url = "http://" . $hash->{HOST} . ":" . $port; my $url = "http://" . $hash->{HOST} . ":" . $port;
$url .= "/" . $path if( defined $path); $url .= "/" . $path if( defined $path);
$url .= "?token=" . $token if( defined($token) ); $url .= "?token=" . $token if( defined($token) );
$hash->{helper}{BRIDGE_CALL} = 1;
my($err,$data) = HttpUtils_BlockingGet({ my($err,$data) = HttpUtils_BlockingGet({
url => $url, url => $url,
timeout => 5, timeout => 3,
method => "GET", method => "GET",
header => "Content-Type: application/json", header => "Content-Type: application/json",
}); });
delete $hash->{helper}{BRIDGE_CALL};
if( !$data ) { if( !$data ) {
Log3 $name, 3, "NUKIDevice ($name) - empty answer received for $url"; Log3 $name, 3, "NUKIDevice ($name) - empty answer received for $url";
@ -602,9 +632,9 @@ sub NUKIBridge_CallBlocking($$$) {
} elsif( $data =~ m'HTTP/1.1 200 OK' ) { } elsif( $data =~ m'HTTP/1.1 200 OK' ) {
Log3 $name, 4, "NUKIDevice ($name) - empty answer received for $url"; Log3 $name, 4, "NUKIDevice ($name) - empty answer received for $url";
return undef; return undef;
} elsif( $data !~ m/^[\[{].*[\]}]$/ ) { #} elsif( $data !~ m/^[\[{].*[}\]]$/ ) {
Log3 $name, 3, "NUKIDevice ($name) - invalid json detected for $url: $data"; # Log3 $name, 3, "NUKIDevice ($name) - invalid json detected for $url: $data";
return undef; # return "NUKIDevice ($name) - invalid json detected for $url: $data";
} }
@ -612,7 +642,7 @@ sub NUKIBridge_CallBlocking($$$) {
return undef if( !$decode_json ); return undef if( !$decode_json );
Log3 $name, 3, "NUKIBridge ($name) - Blocking HTTP Abfrage beendet"; Log3 $name, 4, "NUKIBridge ($name) - Blocking HTTP Abfrage beendet";
return ($decode_json); return ($decode_json);
} }
@ -782,4 +812,4 @@ sub NUKIBridge_CGI() {
</ul> </ul>
=end html_DE =end html_DE
=cut =cut

View File

@ -33,7 +33,7 @@ use warnings;
use JSON; use JSON;
#use Time::HiRes qw(gettimeofday); #use Time::HiRes qw(gettimeofday);
my $version = "0.3.25"; my $version = "0.3.30";
@ -114,6 +114,12 @@ sub NUKIDevice_Define($$) {
Log3 $name, 3, "NUKIDevice ($name) - defined with Code: $code"; Log3 $name, 3, "NUKIDevice ($name) - defined with Code: $code";
$attr{$name}{room} = "NUKI" if( !defined( $attr{$name}{room} ) ); $attr{$name}{room} = "NUKI" if( !defined( $attr{$name}{room} ) );
if( $init_done ) {
InternalTimer( gettimeofday()+int(rand(5)), "NUKIDevice_GetUpdateTimer", $hash, 0 );
} else {
InternalTimer( gettimeofday()+15+int(rand(5)), "NUKIDevice_GetUpdateTimer", $hash, 0 );
}
return undef; return undef;
} }
@ -131,7 +137,7 @@ sub NUKIDevice_Undef($$) {
my $code = $hash->{NUKIID}; my $code = $hash->{NUKIID};
$code = $hash->{IODev}->{NAME} ."-". $code if( defined($hash->{IODev}->{NAME}) ); $code = $hash->{IODev}->{NAME} ."-". $code if( defined($hash->{IODev}->{NAME}) );
Log3 $name, 3, "NUKIDevice ($name) - undefined with Code: $code"; Log3 $name, 3, "NUKIDevice ($name) - undefined with Code: $code";
delete($modules{HUEDevice}{defptr}{$code}); delete($modules{NUKIDevice}{defptr}{$code});
return undef; return undef;
} }
@ -207,14 +213,31 @@ sub NUKIDevice_Set($$@) {
return undef; return undef;
} }
sub NUKIDevice_GetUpdateTimer($) {
my ($hash) = @_;
my $name = $hash->{NAME};
RemoveInternalTimer($hash);
if( !IsDisabled($name) ) {
NUKIDevice_ReadFromNUKIBridge($hash, "lockState", undef, $hash->{NUKIID} );
Log3 $name, 5, "NUKIDevice ($name) - NUKIDevice_GetUpdate Call NUKIDevice_ReadFromNUKIBridge";
InternalTimer( gettimeofday()+12+int(rand(12)), "NUKIDevice_GetUpdateTimer", $hash, 1 );
}
return undef;
}
sub NUKIDevice_GetUpdate($) { sub NUKIDevice_GetUpdate($) {
my ($hash) = @_; my ($hash) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
NUKIDevice_ReadFromNUKIBridge($hash, "lockState", undef, $hash->{NUKIID} ); NUKIDevice_ReadFromNUKIBridge($hash, "lockState", undef, $hash->{NUKIID} ) if( !IsDisabled($name) );
Log3 $name, 5, "NUKIDevice ($name) - NUKIDevice_GetUpdate Call NUKIDevice_ReadFromNUKIBridge"; Log3 $name, 5, "NUKIDevice ($name) - NUKIDevice_GetUpdate Call NUKIDevice_ReadFromNUKIBridge" if( !IsDisabled($name) );
return undef; return undef;
} }
@ -224,6 +247,9 @@ sub NUKIDevice_ReadFromNUKIBridge($@) {
my ($hash,@a) = @_; my ($hash,@a) = @_;
my $name = $hash->{NAME}; my $name = $hash->{NAME};
return "IODev $hash->{IODev} is not connected" if( ReadingsVal($hash->{IODev},"state","not connected") eq "not connected" );
no strict "refs"; no strict "refs";
my $ret; my $ret;
unshift(@a,$name); unshift(@a,$name);
@ -469,4 +495,4 @@ sub NUKIDevice_WriteReadings($$) {
</ul> </ul>
=end html_DE =end html_DE
=cut =cut