Hallo,
ich habe mich gefragt, ob schon mal jemand das Thema UPnP Integration angedacht hat. Nachdem ja einige AV-Player und Devices hier diskutiert wurden, läge das eigentlich nahe. UPnP beitet schließlich eine (weitestgehend) herstellerunabhängige Steuerschnittstelle für eine große Vielzahl von Geräten. Man könnte die universelle Fernbedienung in FHEM integrieren und einen Teil der Ansteuerung eben automatisieren.
Leider bin ich jetzt kein Perl-Experte (der Satz stand hier vermutlich schon häufig...) jedoch habe ich unter
http://search.cpan.org/~skonno/Net-UPnP-1.2.1/ (//search.cpan.org/~skonno/Net-UPnP-1.2.1/)
und
http://perlupnp.sourceforge.net/ (//perlupnp.sourceforge.net/)
oder auch unter
http://perl-upnp.soft112.com/download.html (//perl-upnp.soft112.com/download.html)
eine UPnP-Controlpoint Implementierung in Perl gefunden. Wie schwierig wäre es / kann es sein, das einzubinden? Idealerweise kann man hinterher in FHEM ein
define <Media-Control> UPnP-ControlPoint
definieren, der dann alle UPnP-Devices findet und das Mediastreaming von Server A auf Renderer B steuern kann. Abspielsteuerung, Lautstärke Interface sollten alles schon standardisiert und implementiert sein.
Meinungen? Interessenten?
Viele Grüße
Hiho,
interessante Idee.
Für mich fallen leider beide Varianten aus, da ich fhem auf ner Fritzbox betreibe, auf der man keine Perl-Module nachinstallieren kann.
http://search.cpan.org/~skonno/Net-UPnP-1.2.1/ (//search.cpan.org/~skonno/Net-UPnP-1.2.1/) -> Net::UPnP -> krieg ich also nicht drauf
http://perl-upnp.soft112.com/download.html (//perl-upnp.soft112.com/download.html) -> benötigt LWP::UserAgent (auf FB7390 vorhanden), HTTP::Daemon (ebenfalls vorhanden), SOAP::Lite (NICHT vorhanden).
Es lässt sich also keine der beiden Lösungen "mal eben" in ein fhem-Modul verpacken - zumindest nicht zur Nutzung auf ner FB. Auf RPi usw kann man Perl-Module nachladen, da mag's gehen.
V.a. der erste Ansatz sollte leicht sein, da eigentlich in fhem nix geändert werden müsste. Es sollte dann reichen, nen dummy zu definieren, dessen Kommandos die Befehle aus Net::UPnP aufrufen.
Vielleicht findet sich ja jemand der das installieren und austesten kann.
Gruß, Uli
Ich halte UPnP, genau wie Landhausstil und Laminatfußboden, für einen Irrweg. Ich werde mich mit der Frage trotzdem mal beschäftigen. Was mich allerdings irritiert: an dem Net::UPnP ist seit 4 Jahren nix mehr passiert.
Und die Fritzbox ist für mich ganz sicher nicht das Maß aller Dinge :)
Nachtrag: das verlinkte Perl Modul bei CPAN läßt sich bei mir nichtmal manuell installieren, geschweige denn automatisch...
Die sourceforge Lösung ist von 2004 - da habe ich noch weniger Hoffnung, etwas sinnvolles rauszubekommen.
---
Hallo,
danke für die schnelle und begeisterte Rückmeldung!
Also das mit dem Nachinstallieren der Perl Module für die FB würde ich ggf. mal mit dem AVM Support verfolgen, sobald klar ist, welche Perl Module da zusätzlich benötigt würden. Ich denke nicht, dass die sich nachhaltig sträuben, da sich auch denen neue Möglichkeiten eröffnen und die ja voll auf den FHEM Zug aufgesprungen sind. In einer Laborversion dürfte das schon mal drin sein.
@betateilchen: über Geschmack lässt sich bekanntlich ja nicht streiten und zu Laminat und Landhaus kann (und will) ich auch nichts sagen, aber was spricht gegen UPnP? Aus meiner Sicht nimmt Dir das genau die Guideline Diskussion, die ich in einem anderen Multimedia Thread verfolgt hab ab, oder? Und du sprichst auf Anhieb eine Großzahl an Geräten an, wenn auch nur mit einem subset der Möglichkeiten? Bin aber offen, wenn es da Blocker gibt...
Das mit dem Alter der Implementierungen ist mir schon auch aufgefallen. Aus anderer Ecke habe ich immer wieder erlebt, dass UPnP zu Anfang nur unzureichend von den HW Herstellern unterstützt wurde. Inzwischen kann es aber fast jedes AV Gerät, selbst Windows-Rechner können ein bisschen UPnP. Vielleicht könnt ihr ja aus den Code/Modul-Schnipseln etwas herausholen. Sind die Module komplett selbstgeschnitzt?
Ich habe inzwischen ganz zufriedenstellend einen MediaTomb Server laufen, der die Inhalte von einem Linux-Server (war bis vor kurzem noch Windows SMB-Freigabe) katalogisiert und per UPnP bereitstellt. Meine clients u.a. Philips Streamium NP-2900 und XBMC (auf Windows-Rechner) können auf diese UPnP Freigabe zugreifen. Es fehlt der zentrale ControlPoint, wofür sich FHEM einfach anbietet, weil es dann alle Fernbedienungen ersetzt.
Viele Grüße
Thorsten
Das Problem am UPnP-"Standard" ist, dass jeder Hersteller seinen eigenen Standard daraus abgeleitet hat. Das fängt schon bei den Zeichensätzen an. Ich habe auch angeblich UPnP fähige Geräte unterschiedlichster Hersteller bei mir zu Hause, aber ich habe den Versuch, die wirklich darüber zu nutzen, schon lange aufgegeben. Sonst hätte ich vermutlich die meisten von denen inzwischen verschrottet.
-----
Hallo,
bin gerade auf diese Diskussion gestiegen und muss mein heftiges Interesse anmelden.
Habe eine Reihe von UPNP - Fähigen Geräten, wie Sonos und SamsungTVs. Die würde ich zumindest im Zuge der Hausautomatisierung dazu nutzen wollen, um aakustische Meldungen auszugeben (z.B. Alarmanlage oder andere Dinge).
Zur Fritzbox: Die bietet ja selber eine UPNP-Schnittstelle an. Zumindest kann man ganz leidlich z.B. mit einem Nokia N86 die dortigen Quellen wie Musik, Bilder oder Filme auf beliebige andere Geräte im Netzwerk zuweisen und auch die Lautstärke regeln.
Somit hätte man ja schon mal für fhem-Zwecke ein paar sinnvolle Funktionen.
Es gibt ja hier im Forum das sonos - Beispiel (ev. nutzt das ja auch schon UPNP). Leider läuft es wg. mangelndem Multitasking der perl-Installation auf der FB nicht, zumindest sagt das der Autor.
Wenn jemand herausfindet, welche UPNP-Module (perl) geeignet sind auch auf eine FB zu übernehmen, dann würde ich auch den Support von AVM etwas nerven. Je mehr sich da melden, desto eher sind die wohl auch bereit, auf Vorschläge einzugehen.
Übrigens: zu Laminat und Landhausstil -> TCP/IP ist ja noch älter als UPNP und auch ziemlich verkorkst. Denke aber, dass alle AVR-Hersteller zumindest auch in Zukunft einen subset von Befehlen anbieten werden.
Das Thema sollte aus meiner Sicht unbedingt weiterverfolgt werden. Leider bin ich mit perl noch nicht so weit, dass ich so ein Modul zerlegen und anpassen kann.... Kommt ev. noch.
Elektrolurch
Hallo,
Zitatmit dem Nachinstallieren der Perl Module für die FB würde ich ggf. mal mit dem AVM Support verfolgen,
Da bin ich aber mal auf die Rückmeldung von AVM gespannt - und Rudi sicher auch ;-)
Grüße
define upnp UPNP
Ergebnis:
(http://up.picr.de/15525027ba.png)
get upnp list
Ergebnis:
(http://up.picr.de/15525100rp.png)
Die Logik der Discover-Auswertung funktioniert noch nicht ganz, das gleiche Device darf natürlich nicht dreimal aufgelistet werden.
Moin,
ömm - hast Du da jetzt mal schnel ein Modeul gezaubert oder was?
=8-)
ja.
Schönes Wochenende :)
Währe das nicht auch interessant, wenn dein UPNP Modul AV-Geräte findet, zu denen es in FHEM ein Modul gibt, diese dann entsprechend via autocreate anzulegen?
Gruß
Markus
sicher.
Aber lasst mich doch das Modul erstmal soweit bauen, dass es Geräte überhaupt korrekt findet.
Keine Hektik ;-)
Zitat von: betateilchen schrieb am Do, 15 August 2013 09:54Ich halte UPnP, genau wie Landhausstil und Laminatfußboden, für einen Irrweg.
daran hat sich grade nix geändert. Von 5 verschiedenen uPnP Netzwerkgeräten hier im lokalen Netz werden exakt zwei gefunden. Soviel zum Thema "Standard"
Oh man, betateilchen! Du bist der Hammer!
Ich würde dein Modul ebenfalls gern in der Erkennung meiner Gerät testen. Was muss ich tun? Hast Du das schon eingecheckt? Kann ich das Modul so irgendwie laden? Braucht es irgendwelche Perl Module, die evtl. Auf der FB nicht drauf sind?
Fragen über Fragen... :-)
IN JEDEM FALL SCHON MAL EIN FETTES DANKE!
Zitat von: crazystone schrieb am Sa, 17 August 2013 12:24Was muss ich tun?
Geduld haben.
Zitat von: crazystone schrieb am Sa, 17 August 2013 12:24Hast Du das schon eingecheckt?
Nein. Wenn ich das Modul in seinem derzeitigen Zustand einchecken würde, würde mir Rudi vermutlich die Entwicklerberechtigung - völlig zurecht - entziehen.
Im Moment ist das Ganze in der Phase "Machbarkeitsstudie"
Zitat von: crazystone schrieb am Sa, 17 August 2013 12:24Kann ich das Modul so irgendwie laden?
Nein.
Und die Fritzbox ist für mich nicht das Maß der Dinge. Die interessiert mich prinzipiell noch weniger als der berühmte in China umkippende Sack Reis.
Ja, ich bin bekennender Fritzbox-Hasser, das ist seit dem Markteintritt dieser Hardware vor vielen Jahren so und daran wird sich auch nichts mehr ändern. Ich stehe uneingeschränkt zu dieser Meinung.
Fritzbox: Nichts desto trotz -> da gibt es ganz viele Leute, auch hier im Forum, die so ein Teil zu Hause haben und nicht vielleicht auch noch die Geduld, sich einen RP zurechtzumachen, bevor sie mit fhem beginnen können.
Ich hätte da statt einer Fritzbox noch ein Rechenzentrum anzubieten....
Also mal Ernst bei der Sache: Ich finde, man sollte die (zahlreichen) FB-Nutzer nicht gleich so vor den Kopf schlagen.
Elektrolurch
Bitte lasst uns das Thema nicht zerreden! Ich bin betateilchen extrem dankbar, dass er sich trotz Landhausallergie an das UPnP Thema gemacht hat, auch wenn ich FB-Owner bin. Wenn mal Module stehen, die Geräte vernünftig erkennen und steuern können, wird es immer Wege geben, das auch auf eine FB zu bekommen.
Jeder hat das Recht auf seine Meinung und Vorlieben und betateilchen hat niemanden angegriffen oder vor den Kopf gestossen nur seine geäußert!
Es ist extrem bemerkenswert, was hier durch dieses Forum trotz teilweise sehr unterschiedlicher Interessen und Plattformen an Gemeinschaftswerk geschaffen wird!
Viele Grüße, vielen Dank und weiter so!
@betateilchen: ...in Geduld übe ich mich noch, vielleicht lerne ich es ja eines Tages. Keep us posted please!
Zitat von: Elektrolurch schrieb am Sa, 17 August 2013 22:53Also mal Ernst bei der Sache: Ich finde, man sollte die (zahlreichen) FB-Nutzer nicht gleich so vor den Kopf schlagen.
Das ist kein "vor den Kopf schlagen".
Aber ich nehme bei der Entwicklung keine Rücksicht im Vorfeld darauf, ob das hinterher auf einer Fritzbox läuft oder nicht. Und das hauptsächlich aus folgenden Gründen:
1.) eine Entwicklung muss in einem generellen "Standard"-System funktionieren, auf dem ein reguläres Perl installiert ist. Ggf müssen Module nachinstalliert werden, was aber auch wieder mehr oder weniger Standard bei Perl ist.
2.) ich entwickle, je nach Arbeitsort, entweder auf MacOS oder auf Linux oder auf Windows7 und weiß dadurch, dass meine Module auf diesen PC-Betriebssystemen funktioniert.
3.) ich habe keine Fritzbox für solche Zwecke.
4.) die Fritzbox hat einfach zu viele Ecken und Kanten, bei denen sie sich eben NICHT an diese allgemeingültigen Installationsvoraussetzungen hält.
Wenn nach der Fertigstellung eines Moduls Probleme beim Einsatz auf Fritzbox auftreten, und mir jemand eindeutig und verständlich beschreibt, was die Probleme sind, werde ich mein möglichstes tun, diese Probleme zu beseitigen. Das sollte an der einen oder anderen Stelle hier im Forum bereits aufgefallen sein.
Zitat von: Elektrolurch schrieb am Sa, 17 August 2013 22:53und nicht vielleicht auch noch die Geduld, sich einen RP zurechtzumachen
Einen RP aufzusetzen und mit fhem zum Laufen zu bringen, dürfte erheblich weniger Geduld erfordern und sehr viel streßfreier funktionieren als auf einer Fritzbox.
Hallo betateilchen,
im Thread
http://forum.fhem.de/index.php?t=msg&th=10033&prevloaded=1&rid=2104&start=0 (//forum.fhem.de/index.php?t=msg&th=10033&prevloaded=1&rid=2104&start=0)
hat Reinerle schon mal einen SONOS per UPnP Steuerung implementiert. In wie weit könnte Dir das helfen? Kennst Du den Thread bzw. die Module? Will nicht ungeduldig sein, nur Doppelarbeit vermeiden.
Viele Grüße
Thorsten
Es wäre natürlich schön, wenn es auf einer Fritzbox laufen würde, aber wenn ich mein Raumfeld Multiroom System damit einigermaßen steuern könnte, würde ich auch den RasPi kaufen, obwohl die Fritzbox für meine DUMMY/Laien Anwendungen optimal ist :-)
Gruß,
Martin
Ich will den Namen Fritzbox hier im Thread nicht mehr lesen. Diese sinnlose FB-Diskussion hat mir nämlich schon ziemlich die Lust zum Weitermachen verhagelt.
Zitat von: crazystone schrieb am Mo, 19 August 2013 21:00hat Reinerle schon mal einen SONOS per UPnP Steuerung implementiert. In wie weit könnte Dir das helfen?
Es ist grundsätzlich ein großer Unterschied, ob man einen einzelnen, bestimmten Gerätetyp steuern möchte und dafür eine Lösung baut, oder ob man eine Lösung bauen will, die einfach gar nichts von den möglichen Geräten weiß und deshalb auf alles (auch unbekannte) korrekt reagieren muss.
Da gebe ich Dir völlig recht! Aus meiner Sicht liegt daher auch die Lösung in der Umsetzung eines Standards als dem kleinsten gemeinsamen Nenner. Was dann darüber nicht geht, muss ggf. durch gerätespezifische Zusatzmodule abgefangen werden.
Wie schon in dem anderen Thread geschrieben, spiele ich gerade mit dem Intel Device Spy, um zu sehen, was überhaupt Standard-konform mit den Geräten geht (unter der Annahme, dass Intel den Standard sauber umgesetzt hat). Die Tool-Suite bietet auch jede Menge Referenz-Gegenstellen (also z.B einen Media-Renderer, einen Media-Server und einen Control Point). Wenn Steuerbefehle mal funktionieren scheint mir auch der Sniffer ganz hilfreich. Das Reverse Engineering für den nicht Standard- konformen Teil stelle ich mir schwierig vor....
Viele Grüße
Das Intel Tool nützt mir nix, da ich mit Windows genausowenig am Hut habe wie mit Fritzboxen... Einzige Ausnahme: Der Firmenrechner im Büro, wo ich aber zur Zeit nicht bin. Und wenn, gibts dort keine uPnP Geräte.
@betateilchen:
Klasse - weiter so!
Ich bin auch auf der Suche nach einer Möglichkeit mit fhem UPNP/DLNA Geräte anzusteuern:
Hier (//github.com/amgorb/simple-DLNA-remote-controller) habe ich ein Perl-Script gefunden das auf NET::UPNP basiert.
Leider habe ich noch keine Zeit gefunden das einmal zu testen.
Aber ich will das einmal versuchen.
Das Skript kenn ich. Aber eine Universallösung ist das auch nicht. Zumal die Sache mit der Endlosschleife, die mit CTRL-C abgebrochen werden muss, in fhem nicht umsetzbar sein wird.
Ich wollte mal vorsichtig fragen, ob es hiermit mal weiterging, oder, wenn nicht, mal weiter gehen könnte?
Von meiner Seite ist derzeit keine Weiterentwicklung geplant.
Schade.
Wenn du deine Meinung mal ändern solltest, würde ich mich freuen.
Hi Betateilchen,
ich bin mal so unverschämt un falle mit der Tür ins Haus.
Bin gerade über diesen Thread gestolpert und über dein Beispiel deines UPNP-Moduls
Leider gabs keinen Link wo man das Ding runterladen könnte.
Ich weiß, dass es nicht fertig ist - jedoch könne es mir als Anker dienen um weiter zu entwickeln.
Ich will eigentlich nur mein Streamium per FHEM ein und ausschalten - von daher brauche ich keinen großen Funktionsumfang. Leider kenne ich mich mit UPNP nicht wirklich gut aus, da ich vor 4 Jahren als das Thema mal heiß war nur Enttäuschen erlebte und mich deshalb nicht weiter damit beschäftigen wollte.
Könntest du mir das Modul vlt. einfach schicken?
Viele Grüße
Markus
Jepp, da wäre ich auch interessiert dran, gleiche Zielsetzung: Player remote starten und womöglich gleich füttern.
Grüße,
Kevin
Zitat von: Mauwges am 09 Januar 2014, 21:59:32Könntest du mir das Modul vlt. einfach schicken?
Hab ich leider nicht mehr.
OK, ich hab mal angefangen, mich damit zu beschäftigen. Auf Basis von https://github.com/amgorb/simple-DLNA-remote-controller (https://github.com/amgorb/simple-DLNA-remote-controller) hab ich den DLNA-Teil soweit am laufen und kann meinem Player eine URL zum Abspielen übergeben (und den Player damit implizit einschalten). Habe dafür den ganzen Endlos-Loop etc. rausgeworfen, brauchen wir dafür ja nicht.
Jetzt müsste ich das ganze noch in ein Modul-Gerüst für FHEM verpacken, sodass am Ende ein "set DLNAClient http://mein.server/meine_musik.mp3" ausreicht, um den Player zu starten und Musik abzuspielen. Gibt da schon irgendwo eine Art Dummy-Modul, dass die FHEM-Konventionen implementiert?
Grüße,
Kevin
Hi ich weiß zwar nicht über was das ganze jetzt läuft allerings ist das einfachste einfach ein fertiges Modul, z.b. STV zu verwenden und alles was man nicht braucht rauszuschmeissen. Die wichtigen sachen im Zusammenhang mit FHEM ist im Forum unter Devolopment verlinkt, ich suchs dir gleich raus, wenn ich Zuhause bin, bin sehr interessiert daran :)
EDIT: So bittesehr das ist ganz gut für den Anfang :) http://www.fhemwiki.de/wiki/DevelopmentModuleIntro (http://www.fhemwiki.de/wiki/DevelopmentModuleIntro)
Danke Kuzl, ich hab mich in der Zwischenzeit am dummy-Modul orientiert. Hier ist der aktuelle Stand, das ist noch weit weg von einsatzbar, schon allein weil es FHEM blockiert, während es nach DLNA-Renderern sucht, aber es funktioniert. Wie gesagt, dreckig von https://github.com/amgorb/simple-DLNA-remote-controller (https://github.com/amgorb/simple-DLNA-remote-controller) übernommen.
Womöglich findet sich ja jemand mit mehr FHEM-Modul-Erfahrung und geht da nochmal drüber. Ich bin mir z.B. nicht wirklich klar darüber, wann welche readingsSingleUpdate-Aufrufe gemacht werden müssen, etc.
##############################################
# $Id: 98_DLNAClient.pm 3738 2014-01-27 14:13:59Z hokascha $
package main;
use strict;
use warnings;
use Net::UPnP::ControlPoint;
use Net::UPnP::AV::MediaRenderer;
use Net::UPnP::ActionResponse;
use Net::UPnP::AV::MediaServer;
sub
DLNAClient_Initialize($)
{
my ($hash) = @_;
$hash->{SetFn} = "dlna_Set";
$hash->{DefFn} = "dlna_Define";
$hash->{AttrList} = "server file";
}
###################################
sub
dlna_Set($@)
{
my ($hash, @a) = @_;
my $TVname = shift @a;
my $stopbeforeplay=0;
return "no set value specified" if(int(@a) < 1);
my $v = join(" ", @a);
Log3 $hash, 3, "DLNAClient set $TVname $v";
$TVname = $hash->{CLIENTNAME};
my $obj = Net::UPnP::ControlPoint->new();
my @dev_list = ();
my $retry_cnt = 0;
while (@dev_list <= 0 ) {
Log3 $hash, 3, "Searching for renderers.. @dev_list";
@dev_list = $obj->search(st =>'urn:schemas-upnp-org:device:MediaRenderer:1', mx => 5);
$retry_cnt++;
if ($retry_cnt >= 5) {
Log3 $hash, 3, "[!] No renderers found. Releasing semaphore, exiting.";
return undef;
}
}
Log3 $hash, 3, "Found $#dev_list renderers\n";
my $devNum= 0;
my $dev;
foreach $dev (@dev_list) {
my $device_type = $dev->getdevicetype();
if ($device_type ne 'urn:schemas-upnp-org:device:MediaRenderer:1') {
next;
}
$devNum++;
my $friendlyname = $dev->getfriendlyname();
Log3 $hash, 3, "found [$devNum] : device name: [" . $friendlyname . "] " ;
if ($friendlyname !~ /$TVname/) { Log3 $hash, 3, "skipping this device.";next;}
my $renderer = Net::UPnP::AV::MediaRenderer->new();
$renderer->setdevice($dev);
my $condir_service = $dev->getservicebyname('urn:schemas-upnp-org:service:AVTransport:1');
my %action_in_arg = (
'ObjectID' => 0,
'InstanceID' => '0'
);
my $action_res = $condir_service->postcontrol('GetTransportInfo', \%action_in_arg);
my $actrion_out_arg = $action_res->getargumentlist();
my $x = $actrion_out_arg->{'CurrentTransportState'};
Log3 $hash, 3, "Device current state is <<$x>>. ";
if ( ($x !~ /PLAY/) || ($stopbeforeplay == 1) ) {
if ($stopbeforeplay == 1) {
Log3 $hash, 3, "First run, force stop-start ";
} else { Log3 $hash, 3, "Device is in bad state, starting up! "; }
} else {
#Log3 $hash, 3, "This is ok, skipping.";
#next;
}
my $file = $v;
my $meta = <<EOF;
<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/"><item id="2\$8\$1B" parentID="2\$15" restricted="true"> <dc:title>final_movie</dc:title> <upnp:class>object.item.videoItem</upnp:class> <res protocolInfo="http-get:*:video/x-msvideo:*" size="138332664" duration="2:35:27.079" resolution="1366x768" bitrate="6002933" sampleFrequency="44100" nrAudioChannels="1">$file</res></item></DIDL-Lite>
EOF
my $id = 0;
#$renderer->setAVTransportURI(InstanceID => $id, CurrentURI => $file, CurrentURIMetaData => $meta);
$renderer->setAVTransportURI(CurrentURI => $file);
if ($stopbeforeplay == 1) {
Log3 $hash, 3, "device [$devNum] pid $$ command: [stop] \n";
$renderer->stop();
$stopbeforeplay = 0;
}
#Log3 $hash, 3, "device [$devNum] pid $$ command: [play] $fileid $file";sleep 1;
$renderer->play();
$devNum++;
readingsSingleUpdate($hash,"state",$v,1);
return undef;
} #for each devices
readingsSingleUpdate($hash,"state",$v,1);
return undef;
}
sub
dlna_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "Wrong syntax: use define <name> DLNAClient <Name>" if(int(@a) != 3);
my $name = shift @a;
my $type = shift @a;
my $clientName = shift @a;
$hash->{CLIENTNAME} = $clientName;
return undef;
}
1;
=pod
=begin html
<a name="DLNAClient"></a>
<h3>DLNAClient</h3>
<ul>
Define a DLNA client. A DLNA client can take an URL to play via <a href="#set">set</a>.
<br><br>
<a name="DLNAClientdefine"></a>
<b>Define</b>
<ul>
<code>define <name> DLNAClient <regex></code>
<br><br>
Example:
<ul>
<code>define MyPlayer DLNAClient NP2500</code><br>
Here, NP2500 is part of the name of the player as it announces itself to the network.<br/>
<code>set MyPlayer http://link-to-my/file.mp3</code><br>
</ul>
</ul>
<br>
<a name="DLNAClientset"></a>
<b>Set</b>
<ul>
<code>set <name> <value></code><br>
Set any URL to play.
</ul>
<br>
<a name="DLNAClientget"></a>
<b>Get</b> <ul>N/A</ul><br>
<a name="DLNAClientattr"></a>
<b>Attributes</b>
<ul>
<li>server<br>
NOT YET IMPLEMENTED - Name of DLNA Server library to search for given filename
</li>
</ul>
<br>
</ul>
=end html
=cut
Ein Beispiel:
define MyPlayer DLNAClient NP2500
set MyPlayer http://link-to-my/file.mp3
Grüße,
Kevin
Das ging ja fix :D
Könnte man die Suche nach einem DLNA-Renderer nicht einfach ins Define packen und dann abspeichern und beim set nur einfach dort hinschicken? Bin in der Hintergrundtechnik von DLNA leider nicht so informiert, kann auch sein, dass erst vor jedem Abspielen gesucht werden muss. Aber wenn nicht, lässt sich die FHEM-Blockade auf das define reduzieren, und das wäre ja hinnehmbar :)
Weißt du zufällig ob das auch auf einer Fritzbox läuft? ich bezweifle ehrlich gesagt, dass Net::UPnP vorhanden ist :D wäre aber sehr cool :)
Und noch eine Frage: heißt dass, dass die Datei gar nicht auf einem DLNA-Server sein muss, sondern nur über FTP-erreichbar sein muss? wenn ja, wo wird das gepuffert?
Viele Grüße
Kuzl
EDIT: Grad getestet, wird leider nicht gefunden :( gibts eine möglichkeit, das nachträglich einzubinden? mit Crosscompiler oder so
ZitatKönnte man die Suche nach einem DLNA-Renderer nicht einfach ins Define packen und dann abspeichern und beim set nur einfach dort hinschicken? Bin in der Hintergrundtechnik von DLNA leider nicht so informiert, kann auch sein, dass erst vor jedem Abspielen gesucht werden muss. Aber wenn nicht, lässt sich die FHEM-Blockade auf das define reduzieren, und das wäre ja hinnehmbar :)
Ja, das ist denkbar. Solange sich die IP des Renderers nicht ändert, müsste das funktionieren.
ZitatWeißt du zufällig ob das auch auf einer Fritzbox läuft? ich bezweifle ehrlich gesagt, dass Net::UPnP vorhanden ist :D wäre aber sehr cool :)
Nein, kein Plan, ich betreibe FHEM nicht auf der Fritzbox.
ZitatUnd noch eine Frage: heißt dass, dass die Datei gar nicht auf einem DLNA-Server sein muss, sondern nur über FTP-erreichbar sein muss? wenn ja, wo wird das gepuffert?
Die Datei oder der Stream muss per HTTP oder was auch immer Dein Renderer (also Dein Fernseher oder WLAN-Radio, etc.) kann, erreichbar sein. Bei mir ist das einfach der PC, kann freilich auch ein NAS oder sonstwas sein. Gepuffert wird da gar nichts, der Renderer bekommt nur die URL zum Medium mitgeteilt und holt es sich dann selbständig von dort ab. FHEM spielt also nur Controller.
Grüße,
Kevin
ZitatJa, das ist denkbar. Solange sich die IP des Renderers nicht ändert, müsste das funktionieren.
Ok dann könntest du das so machen, denn das wird bei fast allen FHEM-Modulen vorrausgesetzt und sollte auch nicht so tragisch sein :D
Ah okay das ist natürlich gut, dann ist man unabhängig von DLNA-Servern und kann beliebig abspielen lassen was man will :)
Leider ist mein FHEM zur zeit auf einer Fritzbox, sollte eigendlich auch so bleiben. Allerdings ist dann das wieder ein Grund, das ganze mal auf ein "vollwertiges" System zu setzen :D mal sehen irgendwie muss das schon gehen :)
Danke für die Erklärung, mir war bis heute nie ganz klar, ob jetzt der Renderer direkt auf die Datei zugreift, oder diese vom Controller zugespielt bekommt :D
Bin gespannt was da noch draus wird :)
Viele Grüße
Kuzl
So, jetzt das Suchen nach den Renderern in die Define-Methode verschoben und neben on, off noch play und stop als mögliche set-Befehle dazugefügt.
##############################################
# 2014-01-28 hokascha $
#
# DLNA Module to play given URLs on a DLNA Renderer
#
##############################################
package main;
use strict;
use warnings;
use Net::UPnP::ControlPoint;
use Net::UPnP::AV::MediaRenderer;
use Net::UPnP::ActionResponse;
use Net::UPnP::AV::MediaServer;
use Data::Dumper;
sub
DLNAClient_Initialize($)
{
my ($hash) = @_;
$hash->{SetFn} = "dlna_Set";
$hash->{DefFn} = "dlna_Define";
$hash->{AttrList} = "server file";
}
###################################
sub
dlna_Set($@)
{
my ($hash, @a) = @_;
my $TVname = shift @a;
my $stopbeforeplay=0;
return "no set value specified" if(int(@a) < 1);
return "Unknown argument, choose one of on off play stop <url>" if($a[0] eq "?");
my $v = join(" ", @a);
Log3 $hash, 3, "DLNAClient set $TVname $v";
$TVname = $hash->{CLIENTNAME};
my $dev = $hash->{DEV};
my $renderer = Net::UPnP::AV::MediaRenderer->new();
$renderer->setdevice($dev);
my $condir_service = $dev->getservicebyname('urn:schemas-upnp-org:service:AVTransport:1');
my %action_in_arg = (
'ObjectID' => 0,
'InstanceID' => '0'
);
my $action_res = $condir_service->postcontrol('GetTransportInfo', \%action_in_arg);
my $actrion_out_arg = $action_res->getargumentlist();
#Log3 $hash, 3, "DLNAClient: ".Dumper($actrion_out_arg);
my $x = $actrion_out_arg->{'CurrentTransportState'};
Log3 $hash, 3, "DLNAClient: Device current state is <<$x>>. ";
if ( ($x !~ /PLAY/) || ($stopbeforeplay == 1) ) {
if ($stopbeforeplay == 1) {
Log3 $hash, 3, "DLNAClient: First run, force stop-start ";
$renderer->stop();
} else {
Log3 $hash, 3, "DLNAClient: Device is in bad state, starting up! ";
}
} else {
#Log3 $hash, 3, "This is ok, skipping.";
#next;
}
if($a[0] eq "off" || $a[0] eq "stop" ){
$renderer->stop();
readingsSingleUpdate($hash,"state",$v,1);
return undef;
}
if($a[0] eq "on" || $a[0] eq "play"){
$renderer->play();
readingsSingleUpdate($hash,"state",$v,1);
return undef;
}
my $file = $v;
# my $meta = <<EOF;
#<DIDL-Lite xmlns="urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/"><item id="2\$8\$1B" parentID="2\$15" restricted="true"> <dc:title>final_movie</dc:title> <upnp:class>object.item.videoItem</upnp:class> <res protocolInfo="http-get:*:video/x-msvideo:*" size="138332664" duration="2:35:27.079" resolution="1366x768" bitrate="6002933" sampleFrequency="44100" nrAudioChannels="1">$file</res></item></DIDL-Lite>
#EOF
my $id = 0;
#$renderer->setAVTransportURI(InstanceID => $id, CurrentURI => $file, CurrentURIMetaData => $meta);
$renderer->setAVTransportURI(CurrentURI => $file);
if ($stopbeforeplay == 1) {
$renderer->stop();
$stopbeforeplay = 0;
}
$renderer->play();
readingsSingleUpdate($hash,"state",$v,1);
return undef;
}
sub
dlna_Define($$)
{
my ($hash, $def) = @_;
my @a = split("[ \t][ \t]*", $def);
return "Wrong syntax: use define <name> DLNAClient <Name>" if(int(@a) != 3);
my $name = shift @a;
my $type = shift @a;
my $clientName = shift @a;
$hash->{CLIENTNAME} = $clientName;
my $obj = Net::UPnP::ControlPoint->new();
my @dev_list = ();
my $retry_cnt = 0;
while (@dev_list <= 0 ) {
Log3 $hash, 3, "DLNAClient: Searching for renderers... @dev_list";
@dev_list = $obj->search(st =>'urn:schemas-upnp-org:device:MediaRenderer:1', mx => 5);
$retry_cnt++;
if ($retry_cnt >= 5) {
Log3 $hash, 3, "DLNAClient: [!] No renderers found. Exiting.";
return undef;
}
}
my $devNum= 0;
my $dev;
foreach $dev (@dev_list) {
my $device_type = $dev->getdevicetype();
if ($device_type ne 'urn:schemas-upnp-org:device:MediaRenderer:1') {
next;
}
$devNum++;
my $friendlyname = $dev->getfriendlyname();
Log3 $hash, 3, "DLNAClient: found [$devNum] : device name: [" . $friendlyname . "] " ;
if ($friendlyname !~ /$clientName/) { Log3 $hash, 3, "DLNAClient: skipping this device.";next;}
$hash->{DEV} = $dev;
}
return undef;
}
1;
=pod
=begin html
<a name="DLNAClient"></a>
<h3>DLNAClient</h3>
<ul>
Define a DLNA client. A DLNA client can take an URL to play via <a href="#set">set</a>.
<br><br>
<a name="DLNAClientdefine"></a>
<b>Define</b>
<ul>
<code>define <name> DLNAClient <regex></code>
<br><br>
Example:
<ul>
<code>define MyPlayer DLNAClient NP2500</code><br>
Here, NP2500 is part of the name of the player as it announces itself to the network.<br/>
<code>set MyPlayer http://link-to-my/file.mp3</code><br>
</ul>
</ul>
<br>
<a name="DLNAClientset"></a>
<b>Set</b>
<ul>
<code>set <name> <value></code><br>
Set any URL to play.
</ul>
<br>
<a name="DLNAClientget"></a>
<b>Get</b> <ul>N/A</ul><br>
<a name="DLNAClientattr"></a>
<b>Attributes</b>
<ul>
<li>server<br>
NOT YET IMPLEMENTED - Name of DLNA Server library to search for given filename
</li>
</ul>
<br>
</ul>
=end html
=cut
Ein Beispiel:
define MyPlayer DLNAClient NP2500
set MyPlayer http://link-to-my/file.mp3
Grüße,
Kevin
Hallo,
ich wollte es gerne mal auf einem Raspberry probieren,allerdings weiß ich Newbie wieder zu wenig wie die Library NET::UPNP installiert wird.
Kann mir jemand helfen?
Dankeschön,
Martin
Wenn du CPAN schon installiert hast,
sudo cpan NET::UPNP
In einer ssh Sitzung, nicht in fhem eingeben ;)
Zitat von: Rince am 01 Februar 2014, 15:42:45
Wenn du CPAN schon installiert hast,
sudo cpan NET::UPNP
In einer ssh Sitzung, nicht in fhem eingeben ;)
Dankeschön, dann brauche ich nur noch cpan, werde ich mal suchen
Martin
apt-get install libnet-upnp-perl
viel einfacher und zuverlässiger :)
Zitat von: betateilchen am 03 Februar 2014, 11:01:07
apt-get install libnet-upnp-perl
viel einfacher und zuverlässiger :)
Dankeschön, das schaffe ich dann als Dummy noch eher ;D
mal ne doofe frage ich hab auf meinem NAS ein passwort wie kann man das inplemetieren?
Naja aber so weit komm ich gar nicht egal was ich machen will.... FHEM schmiert ab :/
Beim Hochfahren steht im Log immer, dass der Renderer gefunden wurde.
Allerdings kann ich nichts machen, da bei jedem set FHEM abstürzt
Danke für 98_DLNAClient.pm, ist genau das was ich gesucht habe.
Ich schaffe es auf meiner Synology DS209 leider nicht mit cpan das net::upnp Modul zu installieren.
Ich kann zwar zugehörige Module listen aber nicht installieren.
cpan[7]> i /upnp/
Distribution JPAVLICK/Apache-UpnpImgBrowser-0.01.tar.gz
Distribution SKONNO/Net-UPnP-1.4.2.tar.gz
Module Apache::UpnpImgBrowser (JPAVLICK/Apache-UpnpImgBrowser-0.01.tar.gz)
Module Device::Hue::UPnP (ZUMMO/Device-Hue-0.4.tar.gz)
Module Net::UPnP::AV::Container (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::AV::Content (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::AV::Item (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::AV::MediaRenderer (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::AV::MediaServer (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::ActionResponse (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::ControlPoint (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::Device (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::GW::Gateway (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::HTTP (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::HTTPResponse (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::QueryResponse (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Net::UPnP::Service (SKONNO/Net-UPnP-1.4.2.tar.gz)
Module Power::Outlet::Common::IP::HTTP::UPnP (MRDVT/Power-Outlet-0.12.tar.gz)
18 items found
cpan[8]> install Net::UPnP
Warning: Cannot install Net::UPnP, don't know what it is.
Was mache ich falsch?
Hat jemand dieses Modul tatsächlich erfolgreich im Einsatz?
Ich habe es mit drei verschiedenen UPnP-Clients getestet.
Prinzipiell funktioniert es wohl, aber ich konnte bei keinem der Geräte übergeben, WAS gespielt werden soll.
Wenn man vorher mit einem anderen UPnP-Contolpoint eine Quelle ausgewählt hat, dann kann man die Wiedergabe hiermit anhalten und fortsetzen (deshalb "Prinzipiell funktioniert es...").
Aber die Übergabe einer MP3-Datei, eine m3u-Playliste oder eines Internetradiolinks scheint mir überhaupt nicht zu klappen.
Im Log gibt es diverse Meldungen a la "DLNAClient: Device is in bad state, starting up!"
Aber das hilft irgendwie auch nicht weiter...
hatte es mal probiert, allerdings ist dann FHEM immer abgeschmiert und dann hab ich es gleich wieder rausgeschmissen und nicht weiter nachgebohrt :D aber es wär schon was, wenn das irgendwann mal funktionieren würde :)
Hi,
bin gerade dabei, mir das Streamium Protokoll anzuschauen. Es scheint relativ einfach gestrickt zu sein.
Auf dem Streamium scheint ein http server zu laufen. Über einen Browser kommt man auf das Gerät über Port 8889. http://[streamium-ip]:8889/index
Das Ein/Ausschalten geht recht einfach durch:
http://[streamium-ip]:8889/CTRL$STANDBY
Lautstärke:
http://[streamium-ip]:8889/VOLUME$VAL$[Wert]
Mute/Unmute
http://[streamium-ip]:8889/VOLUME$MUTE
http://[streamium-ip]:8889/VOLUME$UNMUTE
Darüber hinaus kann man sich über die Menüs durchklickern z.B.:
http://[streamium-ip]:8889/nav$03$01$001$0
Das ins FHEM Modul einzupflegen scheint mir machbar.
Gibt es einen Freiwilligen? Sonst würde ich nach dem 71_YAMAHA_NP Modul mich auf dieses stürzen.
Gruß
ra666ack
Hallo hokasha,
erstmal danke für das tolle DLNAClient Modul. Funktioniert 1A.
Ich versuche gerade das Modul um die Lautstärkensteuerung zu erweitern. Um zu testen, möchte ich nur mal den aktuellen Volume Wert auslesen:
my $render_service = $dev->getservicebyname('urn:schemas-upnp-org:service:RenderingControl:1');
my %action_service_args = (
'InstanceID' => 0,
'Channel' => 'master'
);
my $volume_out = $render_service->postcontrol('GetVolume', \%action_service_args);
my $volume_out_arg = $volume_out->getargumentlist();
Log3 $hash, 3, "DLNAClient Volume: ".Dumper($volume_out_arg);
Leider bekomme ich im Log nur: $VAR1 = {};
Hast du eine Idee was ich hier falsch mache? Mit dem UPnPTester Client bekomme ich die richtigen Werte angezeigt..
Gruß
dominik
Habe hier einen neuen Thread für die Weiterentwicklung eröffnet:
http://forum.fhem.de/index.php/topic,39706.0.html