Update 30_HUEBridge - HTTP/301 handling bei nupnp

Begonnen von moritz, 28 März 2015, 17:11:36

Vorheriges Thema - Nächstes Thema

moritz

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

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

moritz

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?

justme1968

sorry. hatte beim flüchtigen drüber schauen etwas falsches gesehen.

ich hab es eingecheckt.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

justme1968

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
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968