Ermitteln der URL von FHEM

Begonnen von tupol, 07 Juli 2015, 08:29:49

Vorheriges Thema - Nächstes Thema

tupol

Hallo FHEM-Entwickler,

Ich möchte im FHEM Verzeichnis eine m3u-Datei ablegen und benötige dann deren URL, um sie einem anderen Gerät mitzuteilen.

Kann mir vielleicht einer weiterhelfen, wie ich diese URL bestimmen kann? (über perl, also ohne Benutzereingabe)

Gibt es einen bestimmten Ordner, der für solche Ablage gedacht ist?

Dank und Gruß

tupol

rudolfkoenig

Wenn die Seite schon einmal aufgerufen wurde, dann kann man das mit etwas Glueck aus dem HTTP Header rausfischen. Bei FHEMWEB wird der Header in %FW_httpheader/@FW_httpheader abgelegt, schau mal die Ausgabe von { join("\n", @FW_httpheader) } in FHEMWEB(!) an.

Ohne HTTP-Header ist das nicht moeglich, da man nicht weiss, auf welchen Weg (direkt/Proxy/VPN/etc) der Benutzer FHEM erreicht.
Selbst mit Header ist nicht garantiert, dass der Proxy den Original-Aufrufer korrekt weitergibt, oder dass fuer diesen Zweck immer X-Forwarded-Host verwendet wird.

Das Problem ist nicht FHEM spezifisch, vermutlich existieren im Web Rezepte dafuer.
Berichte bitte, wenn du Erfahrungen gesammelt hast.

Dr. Boris Neubert

Vielleicht meinst Du das, was das HTTPSRV-Modul leistet?
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

tupol

Zitat von: Dr. Boris Neubert am 07 Juli 2015, 12:06:19
Vielleicht meinst Du das, was das HTTPSRV-Modul leistet?
Ich glaube nicht. Wenn ich es richtig verstehe, ist das ja ein eigener HTTP-Server.

Aber vielleicht habe ich mich falsch ausgedrückt. Das Ganze ist für das Internetradio des FritzFons gedacht. Ich möchte über den HTTP-Server von FHEM auf eine m3u-Datei zugreifen. Das funktioniert prinzipiell auch. Ich kann auf die Datei über den Webbrowser zugreifen bzw. die Datei am Fritzfon abspielen.

Allerdings muss FHEM die Fritzbox dafür konfigurieren.  Ich hatte deshalb gehofft, dass das web-Modul von FHEM auch selber weiss, wie es aus dem Netz erreichbar ist.
Also das ich den Inhalt von http://$myIP:$myPort/$myPath ermitteln kann. $myPort bekomme ich ja wahrscheinlich über das Web-Modul. Aber woher bekomme ich den Rest?

rudolfkoenig

Selbst $myPort kriegst du nur ueber den HTTP-header raus, bei mir konvertiert Apache den aussen sichtbaren Port zu einem ganz anderen FHEMWEB-Port. Mit dem Hostnamen verhaelt es sich aus so. Aber die vom client angesprochene Adresse ist in X-Forwarded-Host zu sehen.

Verstehe ich es richtig, du willst ueber FHEMWEB streamen? Das geht doch gar nicht...
Wir hatten kuerzlich eine aehnliche Diskussion fuer wegen einer Kamera. Mein Ratschlag: entweder beide Ports freischalten, oder Apache vorschalten. FHEM ist nicht fuers streamen da, es sei denn, jemand baut ein Modul dafuer.

Dr. Boris Neubert

Zitat von: tupol am 07 Juli 2015, 12:23:55
Ich glaube nicht. Wenn ich es richtig verstehe, ist das ja ein eigener HTTP-Server.

Um genau zu sein: es bietet Dir die Möglichkeit, Dateien an einem von Dir definierten Ort über FHEMWEB ausliefern zu lassen. Meinem Verständnis ist es das, was Du mit der Auslieferung einer .m3u-Datei über eine URL auf Deinem FHEM-Server willst.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

tupol

Zitat von: rudolfkoenig am 07 Juli 2015, 12:59:15
Verstehe ich es richtig, du willst ueber FHEMWEB streamen? Das geht doch gar nicht...
Wir hatten kuerzlich eine aehnliche Diskussion fuer wegen einer Kamera. Mein Ratschlag: entweder beide Ports freischalten, oder Apache vorschalten. FHEM ist nicht fuers streamen da, es sei denn, jemand baut ein Modul dafuer.

Nein. m3u wird nicht gestreamt. Da stehen nur die Streaming-URL drin. Ich habe es auch schon getestet.

In welchem Verzeichnis kann ich denn die Datei am besten ablegen?

rudolfkoenig

Das kannst du aussuchen. /opt/fhem/www/XXX ist als http://fhemhost:fhemport/fhem/XXX erreichbar.

tupol

#8
Ich habe es jetzt wie unten gelöst. Das setzt mir default-Werte, die ich versuche in einem geforkten Prozess über lwp::useragent aufzurufen. Wenn es missglückt, muss der User ein Attribut füllen.
Vielleicht hat jemand eine bessere Idee?



         # Getting IP of FHEM host
            my $host = AttrVal( $name, "fritzBoxIP", "fritz.box" );
            my $socket = IO::Socket::INET->new( Proto => 'tcp', PeerAddr => $host, PeerPort    => 'http(80)' );
            my $ip = $socket->sockhost; #A side-effect of making a socket connection is that our IP address is available from the 'sockhost' method

         # Get a web port
            my $port;
            foreach( keys %defs ) {
            if ( $defs{$_}->{TYPE} eq "FHEMWEB" && defined $defs{$_}->{PORT} ) {
                  $port = $defs{$_}->{PORT};
                  last;
               }
            }