Hi,
die nupnp-Seite macht inzwischen ein Redirect, was einen Fehler erzeugt.
Ich habe die 30_HUEBridge.pm mal angepasst, und zusätzlich ein re-discover bei reconnect eingebaut (damit die HUEBridge erkannt wird, wenn z.b. diese per DHCP eine neue IP hat).
Index: FHEM/30_HUEBridge.pm
===================================================================
--- FHEM/30_HUEBridge.pm (revision 8310)
+++ FHEM/30_HUEBridge.pm (working copy)
@@ -57,6 +57,38 @@
}
sub
+HUEBridge_Detect($)
+{
+ my ($hash) = @_;
+ my $name = $hash->{NAME};
+ Log3 $name, 3, "HUEBridge_Detect";
+ my ($err,$ret) = HttpUtils_BlockingGet({
+ url => "http://www.meethue.com/api/nupnp",
+ method => "GET",
+ });
+ if( defined($err) && $err ) {
+ Log3 $name, 3, "HUEBridge_Detect: error detecting bridge: ".$err;
+ return;
+ }
+ my $host = '';
+ if( defined($ret) && $ret ne '' && $ret =~ m/^[\[{].*[\]}]$/ ) {
+ my $obj = from_json($ret);
+
+ if( defined($obj->[0])
+ && defined($obj->[0]->{'internalipaddress'}) ) {
+ $host = $obj->[0]->{'internalipaddress'};
+ }
+ }
+ if( !defined($host) || $host eq '' ) {
+ Log3 $name, 3, 'HUEBridge_Detect: error detecting bridge.';
+ return;
+ }
+ Log3 $name, 3, "HUEBridge_Detect: ${host}";
+ $hash->{Host} = $host;
+ return $host;
+}
+
+sub
HUEBridge_Define($$)
{
my ($hash, $def) = @_;
@@ -68,23 +100,8 @@
my ($name, $type, $host, $interval) = @args;
if( !defined($host) ) {
- my $ret = HUEBridge_HTTP_Request(0,"http://www.meethue.com/api/nupnp","GET",undef,undef,undef);
-
- if( defined($ret) && $ret ne '' && $ret =~ m/^[\[{].*[\]}]$/ )
- {
- my $obj = from_json($ret);
-
- if( defined($obj->[0])
- && defined($obj->[0]->{'internalipaddress'}) ) {
- }
- $host = $obj->[0]->{'internalipaddress'};
- }
-
- if( !defined($host) ) {
- return 'error detecting bridge.';
- }
-
- $hash->{DEF} = $host;
+ $hash->{NUPNP} = 1;
+ HUEBridge_Detect($hash);
}
$interval= 300 unless defined($interval);
@@ -139,6 +156,11 @@
{
my ($hash) = @_;
+ if( defined($hash->{NUPNP}) )
+ {
+ HUEBridge_Detect($hash);
+ }
+
my $result = HUEBridge_Call($hash, undef, 'config', undef);
if( !defined($result) ) {
return undef;
@@ -529,11 +551,23 @@
my $json = undef;
$json = encode_json($obj) if $obj;
- if( !defined($attr{$name}{httpUtils}) ) {
- return HUEBridge_HTTP_Call($hash,$path,$json,$method);
- } else {
- return HUEBridge_HTTP_Call2($hash,$chash,$path,$json,$method);
+ # @TODO: repeat twice?
+
+ for (my $attempt=0; $attempt<2; $attempt++) {
+ my $res = undef;
+ if( !defined($attr{$name}{httpUtils}) ) {
+ $res = HUEBridge_HTTP_Call($hash,$path,$json,$method);
+ } else {
+ $res = HUEBridge_HTTP_Call2($hash,$chash,$path,$json,$method);
+ }
+ if( defined($res) ) {
+ return $res;
+ }
+ Log3 $name, 3, "HUEBridge_Call: failed, retrying";
+ HUEBridge_Detect($hash);
}
+ Log3 $name, 3, "HUEBridge_Call: failed";
+ return undef;
}
#JSON RPC over HTTP
die HttpUtils version müsste eigentlich das redirect auch intern behandeln können.
dazu sollte es reichen im aufruf von HttpUtils_BlockingGet redirects => 1 zu setzen
kannst du das mal bitte einbauen und versuchen ?
gruss
andre
Zitat von: justme1968 am 28 März 2015, 17:32:58
die HttpUtils version müsste eigentlich das redirect auch intern behandeln können.
Moin,
macht HttpUtils per default - das lief nur vorher per HUEBridge_HTTP_Request, und die nutzt direkt IO::Socket.
Habe oben in dem diff noch nen bug gefixt gerade, vielleicht kannst du das übernehmen?
sorry. hatte beim flüchtigen drüber schauen etwas falsches gesehen.
ich hab es eingecheckt.
gruss
andre
dein patch hatte den nonblocking fall (httpUtils = 1) noch nicht berücksichtigt und dann in einer endlos schleife landet. ich habe eben eine version eingecheckt bei der die endlosschleife vermieden wird. allerdings ist die bridge erkennung für den non blocking fall komplett abgeschaltet.
kannst du bitte das neu erkennen der bridge auch für den nonblocking fall einbauen da ich mittelfristig HUEBridge_HTTP_Call komplett entfernen und httpUtils = 1 zum default machen möchte.
danke
andre