FHEM Forum

FHEM - Hausautomations-Systeme => Sonstige Systeme => Thema gestartet von: moritz am 28 März 2015, 17:11:36

Titel: Update 30_HUEBridge - HTTP/301 handling bei nupnp
Beitrag von: moritz am 28 März 2015, 17:11:36
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
Titel: Antw:Update 30_HUEBridge - HTTP/301 handling bei nupnp
Beitrag von: justme1968 am 28 März 2015, 17:32:58
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
Titel: Antw:Update 30_HUEBridge - HTTP/301 handling bei nupnp
Beitrag von: moritz am 28 März 2015, 18:21:04
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?
Titel: Antw:Update 30_HUEBridge - HTTP/301 handling bei nupnp
Beitrag von: justme1968 am 28 März 2015, 19:10:06
sorry. hatte beim flüchtigen drüber schauen etwas falsches gesehen.

ich hab es eingecheckt.

gruss
  andre
Titel: Antw:Update 30_HUEBridge - HTTP/301 handling bei nupnp
Beitrag von: justme1968 am 29 März 2015, 14:37:40
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