Modul StreamRadio Einrichtungshilfe: Unterschied zwischen den Versionen

Aus FHEMWiki
(Die Seite wurde neu angelegt: „'''(in Bearbeitung!)Modul StreamRadio zum hören von Webradiostreams über FHEM und Linux ''' Dieser Eintrag basiert auf diesem Post: [http://forum.fhem.de/in…“)
 
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
'''(in Bearbeitung!)Modul StreamRadio zum hören von Webradiostreams über FHEM und Linux '''
'''(in Bearbeitung!)Modul StreamRadio zum hören von Webradiostreams über FHEM und Linux '''


Dieser Eintrag basiert auf diesem Post: [http://forum.fhem.de/index.php/topic,19378.msg131637.html#msg131637]<br>   
Dieser Eintrag basiert auf diesem Thread: [http://forum.fhem.de/index.php/topic,18531.0.html]<br>   
Ein transparentes Icon für den Dummy: [http://www.fhemwiki.de/wiki/Datei:Transparent.png]<br>  
StreamRadio- Modul mit Radiotext (Fehlerbehaftet aber funktionsfähig): [http://forum.fhem.de/index.php?action=dlattach;topic=18531.0;attach=11882]<br>
StreamRadio- Modul ohne Radiotext: [http://forum.fhem.de/index.php?action=dlattach;topic=18531.0;attach=17949]<br>


== Aufgabenstellung ==
Mit dieser Anleitung soll der unübersichtliche Inhalt des o.g. Ursprungsthreads zusammengefasst werden.


== Aufgabenstellung ==
== Was kann das Modul? ==
Auf einem Tablet mit Floorplan, Dashboard oder FHEM "pur" soll bei auflaufen eines Events (Anruf, Bewegungsmelder, Türklingel usw.) automatisch auf eine andere Webseite umgeschaltet werden. Möglich sein soll dabei das Umleiten auf andere Floorplan-, FHEM-, oder sogar externe Webseiten. Absolute, sowie relative Links sollen genutzt werden können.
Es handelt sich um ein Device, welches das Abspielen von WebStreams auf dem Raspberry ermöglicht.
Das Modul kann beliebige WebStreams per MPlayer abspielen und auch deren Metadaten, z.B. aktuell laufender Titel anzeigen.
Das ganze wird direkt in der Raumübersicht angezeigt, ohne weblink o.ä.
Siehe Screenshots :-)


== Anwendungsbeispiele ==
== Anwendungsbeispiele ==
So kann entsprechend des Events z.B. der Anrufer oder auch eine Seite mit dem Kamerabild des Besuchers angezeigt werden. Solange wir uns innerhalb von FHEM befinden, soll auch ein automatisches Zurück- oder Weiterschalten möglich sein. Dadurch kann z.B. eine "rotierende" Anzeige verschiedener FHEM- Seiten realisiert werden. Oder nach einer Idee des Forenmitglieds Rince, bei Alarm ein "Sperrbildschirm" aufgerufen werden, der das Bedienen des Tablets vorläufig unmöglich macht.


== Voraussetzungen ==
Voraussetzung ist ein aktuelles, upgedatetes FHEM. In der WEB- Instanz, mit der die Funktion genutzt werden soll, muss "Longpoll" aktiv sein. Dadurch wird erreicht, dass der Wert des Dummy sofort bei setzen des Seitenlinks aktualisiert wird. Auf Clientseite (Tablet) muss der genutzte Browser Javascript unterstützen, sowie auch aktiviert haben.


== Lösung ==
== Voraussetzungen Betriebssystem ==
Wir erstellen eine js- Datei mit dem Namen "fhemweb_pageswap.js" und kopieren sie einfach in den Ordner fhem/www/pgm2/. Dazu kann eine vorhandene js- Datei kopiert, umbenannt und der Inhalt ersetzt werden. Sie startet nach einem Refresh der Webseite oder "shutdown restart" von selbst:  
Installation des mplayer, falls nicht bereits vorhanden:
<nowiki>
sudo apt-get install mplayer
</nowiki>
Berechtigungen für Benutzer fhem unter Linux vorbereiten.
Diese Schritte sind generell (nicht nur für das Radio) notwendig, wenn FHEM auf Linux- Shellbefehle zugreifen können soll:
 
Benutzer fhem zu den Gruppen "dialout", "audio", "mail" und "sudoers" hinzufügen:
<nowiki>
addgroup fhem dialout
addgroup fhem mail
addgroup fhem audio
gpasswd -a fhem sudo
</nowiki>


fhemweb_pageswap.js :
Bearbeiten der sudo- Konfiguration:
<nowiki>
visudo
</nowiki>
Im nun geöffneten Editorfenster unter den ggf. bereits vorhandenen Einträgen folgende Zeile einfügen:
  <nowiki>
  <nowiki>
// Datei: fhemweb_pageswap.js
fhem    ALL=NOPASSWD: ALL
// Von FHEM aus initiiertes Wechseln der angezeigten Seite:
</nowiki>
Datei nun speichern und den Rechner neu starten.
'''Achtung:''' Mit diesem Eintrag in die sudo- Konfigdatei werden dem Benutzer fhem weitreichende Befugnisse eingeräumt. Diese können später sinnvoll eingeschränkt werden, indem man den Vollzugriff nur für bestimmte Befehle/Anwendungen freigibt.
 


function
FW_pageswapUpdateLine(d){


var id = d[0];                                  // id der Objekte auf der Seite
var val = d[1];                                // Wert der Objekte auf der Seite


  if (id == "Dum_pageswap_D" && val != "none"){
    window.location.href = ""+val              // wenn Dummy Wert enthaelt, wechseln zu neuer Seite
                                                // Variable "val" wird nicht geprueft und muss sinnvollen Wert enthalten
  }


}




FW_widgets['pageswap'] = {
  updateLine:FW_pageswapUpdateLine
};
</nowiki>


Weiterhin legen wir in der fhem.cfg einen Dummy und ein Notify an. Zum Dummy gehört noch ein transparentes Icon, mit dessen Hilfe wir den Dummy völlig unsichtbar auf Floorplanseiten unterbringen können. Der Link zum Icon befindet sich ganz oben im  Beitrag. Es wird in den Ordner /images/default/ kopiert.


In die cfg:
<nowiki>
# Bei Event FHEM- Seite umschalten;
# longpoll muss aktiv sein
# Benutzung: "set Dum_pageswap_D <Seitenlink>"
# Beispiel: "set Dum_pageswap_D /fhem/floorplan/mein_floorplan_1"
# Beispiel: "set Dum_pageswap_D http://192.168.0.1:8085/fhem/floorplan/mein_floorplan_1"
# Beispiel: "set Dum_pageswap_D www.google.de"


# Dummy für pageswap:
== Definition unter FHEM ==
define Dum_pageswap_D dummy
attr Dum_pageswap_D devStateIcon .*:Transparent


# Notify für pageswap:
define Func_pageswap_N notify Dum_pageswap_D { \
\
  my $ps_Val = (Value("Dum_pageswap_D"));;\
\
  if ($ps_Val ne "none") { \
      fhem("define reset_pageswap at +00:00:01 set Dum_pageswap_D none");;\
  }\
}


# Bei Systemstart Dummy auf "none" initialisieren:
define Func_Start_Init_N notify global:INITIALIZED.* { \
\
fhem("set Dum_pageswap_D none");;\
}
</nowiki>


== Verwendung ==
== Verwendung ==


Die Namen aus den Beispieldateien sollten zunächst einmal nicht geändert werden, da entsprechende Abhängigkeiten bestehen. Hat man das Zusammenspiel verstanden kann umbenannt, geändert und nach Bedarf erweitert werden.


Der Dummy muss bei Systemstart auf "none" initialisiert werden. Eine entsprechende Funktion ist im Beispiel enthalten.


Ist alles eingerichtet, geht man auf eine FHEM- Seite, auf der der Dummy definiert wurde und setzt z.B. per FS20- Taster und einem weiteren Notify einen set- Befehl mit einem Link ab, der zu einer anderen Seite des eigenen Systems passt. Dann sollte die Seite dort hin wechseln. Auch externe Webseiten sind möglich mit der Einschränkung, dass man von dort per Hand zu FHEM zurücknavigieren muss. Innerhalb FHEM hingegen, springt man einfach zwischen verschiedenen Seiten hin und her, indem man auf jeder dieser Seiten den "pageswap-" Dummy definiert. Bei meinen Tests mit Floorplan hat es ausgereicht den Dummy auf nur einer Floorplanseite zu definieren, um zwischen allen FP.- Seiten hin und her zu springen. Scheinbar hält Floorplan im Hintergrund alle Objekte aller FP.-Seiten vor.  
== Beschreibung der Funktion ==
 
 
== Temporär: Bearbeitungsquellen aus Thread ==
* Das angehängte Script "74_StreamRadio" ins Modul Verzeichnis kopieren, also wahrscheinlich nach /opt/fhem/FHEM
* irgendwo eine Datei mit den WebStreams anlegen. Diese Datei sollte pro Zeile immer den Namen des Streams gefolgt von "|" und dann die URL enthalten.
  also z.B.
Code: [Auswählen]
 
testradio|http://bla.com/34.m3u
 
. Eine Sample Datei ist ebenfalls dabei
 
Define
Code: [Auswählen]


Einige Beispielbefehle stehen direkt oben bei der Definition des Dummys.
define streamradio StreamRadio /opt/fhem/log/WebStreams.txt


== Beschreibung der Funktion ==
unter der Vorraussetzung, dass ihr die WebStreams.txt dort abgelegt habt.


*Allgemeine Funktionsweise:<br>
Attribute
Die js- Datei scannt beim Aufruf, Refresh, oder der Änderung eines, oder mehrerer Objekte auf der Seite, alle Objekte der Seite, bzw. des Raums. Dabei wird geprüft ob der Wert des Dummy von "none" abweicht. Trifft dies zu, wird dieser Wert an den Browser als neue Adresse für das aktuell angezeigte Fenster übergeben. Wird hier kein gültiger Link übergeben, zeigt der Browser eine leere Seite, oder eine Fehlermeldung an.<br>
volume_command <= das shell kommando, um die Lautstärke einzustellen. Es kann die Platzhalter von sprintf verwendet werden. Für den raspi z.B. "amixer cset numid=1 -- %s%%". Dies ist der Default, nach einem neuen define
Damit beim Aufbau der neuen Seite (sofern sie ebenfalls den Dummy enthält) der Browser nicht sofort zurück springt, oder in Endlosschleife neu läd, setzt das Notify den Dummy nach einer Sekunde wieder auf "none". Nun kann das Spiel auf der neuen Seite bei Bedarf von vorn beginnen.<br>
telnetport <= Der lokale telnetport für FHEM. Achtung: Es darf keine Authentifizierung eingerichtet sein
aodevice <= -ao Parameter für mplayer, um das output device anzugeben


*Funktionsweise "fhemweb_xyz.js" und "UpdateLine"/"FW_widgets":<br>  
Commands
Diese Beschreibung beruht z.T. auf meinen persönlich gemachten Erfahrungen und nicht auf genauen Kenntnissen!<br>  
set <name> PLAY <StreamURL/Stationname aus Playlist>
set <name> STOP
set <name> VOLUME <Lautstärke in %>


Eine Datei mit Namen "fhemweb_xyz.js" (wobei "xyz" für einen frei wählbaren Namen steht) im Ordner "fhem/www/pgm2/" wird von FHEM automatisch in die Webseite eingbunden und abgearbeitet.<br>


Die Funktion "UpdateLine"/"FW_widgets" besteht aus einem "Rahmen" der den darin enthaltenen Code jeweils ein Mal ausführt, bei: Aufruf und Refresh der Seite, Änderung eines, oder mehrerer Objekte auf der Seite, bzw. im Raum. <br>
Aktuelle Version
(Update erfolgt immer hier im ersten Posting)


Der Rahmen braucht mindestens folgenden Code:
V0.5
  <nowiki>
* Reading für "state" funktioniert wieder
function
* Die Playlist wird nach Namen sortiert angezeigt
FW_xyzUpdateLine(d){
* set PLAY kann jetzt auch der Stationname anstelle der URL angegeben werden
* Die Lautstärke veränderung in % sollte jetzt proportional erfolgen


// eigenen js- Code hier einfügen
- V.04 Neues Attribut "aodev", um das aodevice für mplayer festzulegen
// "xyz" steht für frei wählbare, aber einheitliche Bezeichnung
- V0.3 Neuer Befehl "VOLUME", Mehr Metadaten, Das MPlayer log wird nicht mehr geparsed sondern direkt STDOUT. Das dürfte deutlich performanter sein
- V0.2 Umbau auf Benutzung von BlockingCall
- V0.1 (initiale Version


}
Das war es auch schon. Als Attribut kann man noch das Logfile für den MPlayer festlegen, welches für die Ermittlung der Metadaten verwendet wird.


FW_widgets['xyz'] = {
Noch offene Punkte
  updateLine:FW_xyzUpdateLine
- Da der MPlayer seinerseits auch noch weitere MPlayer Prozesse forked, hat ein Kill direkt auf die PID nicht funktioniert. Derzeit klappt es nur sauber mit killall
};
- Telnetport der von Blocking.pm erstellt wird ermitteln. Das hat bisher leider noch nicht geklappt.
</nowiki>


Es werden dann jeweils ein Mal alle Objekte der Seite, bzw. des Raums abgefragt und ihre Daten (ID, Wert usw.) nacheinander im Array "d" zur Verfügung gestellt. Gesteuert wird dieses Verhalten aus der Datei "fhemweb.js".<br>


[[Kategorie:HOWTOS]]
[[Kategorie:HOWTOS]]

Version vom 29. Dezember 2014, 10:43 Uhr

(in Bearbeitung!)Modul StreamRadio zum hören von Webradiostreams über FHEM und Linux

Dieser Eintrag basiert auf diesem Thread: [1]
StreamRadio- Modul mit Radiotext (Fehlerbehaftet aber funktionsfähig): [2]
StreamRadio- Modul ohne Radiotext: [3]

Aufgabenstellung

Mit dieser Anleitung soll der unübersichtliche Inhalt des o.g. Ursprungsthreads zusammengefasst werden.

Was kann das Modul?

Es handelt sich um ein Device, welches das Abspielen von WebStreams auf dem Raspberry ermöglicht. Das Modul kann beliebige WebStreams per MPlayer abspielen und auch deren Metadaten, z.B. aktuell laufender Titel anzeigen. Das ganze wird direkt in der Raumübersicht angezeigt, ohne weblink o.ä. Siehe Screenshots :-)

Anwendungsbeispiele

Voraussetzungen Betriebssystem

Installation des mplayer, falls nicht bereits vorhanden:

sudo apt-get install mplayer
 

Berechtigungen für Benutzer fhem unter Linux vorbereiten. Diese Schritte sind generell (nicht nur für das Radio) notwendig, wenn FHEM auf Linux- Shellbefehle zugreifen können soll:

Benutzer fhem zu den Gruppen "dialout", "audio", "mail" und "sudoers" hinzufügen:

addgroup fhem dialout 
addgroup fhem mail
addgroup fhem audio
gpasswd -a fhem sudo
 

Bearbeiten der sudo- Konfiguration:

visudo
 

Im nun geöffneten Editorfenster unter den ggf. bereits vorhandenen Einträgen folgende Zeile einfügen:

fhem    ALL=NOPASSWD: ALL
 

Datei nun speichern und den Rechner neu starten. Achtung: Mit diesem Eintrag in die sudo- Konfigdatei werden dem Benutzer fhem weitreichende Befugnisse eingeräumt. Diese können später sinnvoll eingeschränkt werden, indem man den Vollzugriff nur für bestimmte Befehle/Anwendungen freigibt.






Definition unter FHEM

Verwendung

Beschreibung der Funktion

Temporär: Bearbeitungsquellen aus Thread

  • Das angehängte Script "74_StreamRadio" ins Modul Verzeichnis kopieren, also wahrscheinlich nach /opt/fhem/FHEM
  • irgendwo eine Datei mit den WebStreams anlegen. Diese Datei sollte pro Zeile immer den Namen des Streams gefolgt von "|" und dann die URL enthalten.
  also z.B.

Code: [Auswählen]

testradio|http://bla.com/34.m3u

. Eine Sample Datei ist ebenfalls dabei

Define Code: [Auswählen]

define streamradio StreamRadio /opt/fhem/log/WebStreams.txt

unter der Vorraussetzung, dass ihr die WebStreams.txt dort abgelegt habt.

Attribute volume_command <= das shell kommando, um die Lautstärke einzustellen. Es kann die Platzhalter von sprintf verwendet werden. Für den raspi z.B. "amixer cset numid=1 -- %s%%". Dies ist der Default, nach einem neuen define telnetport <= Der lokale telnetport für FHEM. Achtung: Es darf keine Authentifizierung eingerichtet sein aodevice <= -ao Parameter für mplayer, um das output device anzugeben

Commands set <name> PLAY <StreamURL/Stationname aus Playlist> set <name> STOP set <name> VOLUME <Lautstärke in %>


Aktuelle Version (Update erfolgt immer hier im ersten Posting)

V0.5

  • Reading für "state" funktioniert wieder
  • Die Playlist wird nach Namen sortiert angezeigt
  • set PLAY kann jetzt auch der Stationname anstelle der URL angegeben werden
  • Die Lautstärke veränderung in % sollte jetzt proportional erfolgen

- V.04 Neues Attribut "aodev", um das aodevice für mplayer festzulegen - V0.3 Neuer Befehl "VOLUME", Mehr Metadaten, Das MPlayer log wird nicht mehr geparsed sondern direkt STDOUT. Das dürfte deutlich performanter sein - V0.2 Umbau auf Benutzung von BlockingCall - V0.1 (initiale Version

Das war es auch schon. Als Attribut kann man noch das Logfile für den MPlayer festlegen, welches für die Ermittlung der Metadaten verwendet wird.

Noch offene Punkte - Da der MPlayer seinerseits auch noch weitere MPlayer Prozesse forked, hat ein Kill direkt auf die PID nicht funktioniert. Derzeit klappt es nur sauber mit killall - Telnetport der von Blocking.pm erstellt wird ermitteln. Das hat bisher leider noch nicht geklappt.