Wecker via Airplay-Lautsprecher

Begonnen von LuckyLuis, 05 Februar 2014, 14:02:47

Vorheriges Thema - Nächstes Thema

LuckyLuis

Hallo,

nachdem ich in den letzten Monaten meine Homematic-Zentrale durch eine Rasp Pi/FHEM-Lösung ersetzt habe (Vielen herzlichen Dank an die vielen Entwickler! Super Arbeit!), kommen jetzt die ersten "like to have"-Themen.
Nachdem ich auch schon ein "WakeUp-Licht" eingerichtet habe, möchte ich gerne nach einer gewissen Zeit meinen Lieblingsradiosender hören. Als Zielausgabegerät soll ein Airplay-Lautsprecher (Standalone) genutzt werden.
Nach einigem Lesen und Probieren (PulseAudio (V1, raop V2 konnte ich auf dem Pi nicht kompilieren), forked-daapd (läuft)) kam ich leider bis jetzt noch zu keiner Lösung, um einen Stream durch FHEM gesteuert auf einem Airplay-Lautsprecher auszugeben.
Es gibt viele Infos, um den Pi als Airplay-Ziel zu nutzen, aber als "Weiterleiter" recht wenig.
Wunschlösung:
- Primär Quelle Webstream, gerne auch zusätzlich lokale Dateien im Verzeichnis ggfs. DLNA
- FHEM sollte Starten, Stoppen und Laut/Leise steuern können
- Auswahl des Zielairplay-Lautsprechers möglich

Für jede Unterstützung/Hinweis auf eine funktionierende Lösung bin ich Dankbar.

PS: Ich möchte dabei gerne ohne einen weiteren Rechner auskommen (z.B. Mac mit iTunes)

Wernieman

Habe es zwar selber noch nicht probiert, aber MPD kann AirPlay ansteuern.
Auf die schnelle gefunden:
http://blog.austinseraphin.com/2012/01/06/how-to-make-mpd-work-with-airplay/

Und für MPD gibt es mittlerweile im Multimedia-Bereich ein Modul .... Da ich selber gerade dabei bin, mich in die "Richtung" zu "entwickeln", wo hast Du die Lautsprecher her?
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

LuckyLuis

Die von Dir angebotene Lösung benötigt einen iTunes-Rechner (was ich nicht möchte). Dabei wird iTunes als Airplay-Verteiler genutzt. Dann wäre auch die FHEM-Lösung (Modul) für die iTunes-Fernsteuerung zu bevorzugen. Das Problem ist hauptsächlich die Audioausgabe des Pi auf den Airplay-Lautsprecher umzulenken.

Airplay-Lautsprecher habe ich Sony SN-310 (o.ä) die ganz gut sind und eine  Philips Fidelio AD7000W. Den kann ich nicht empfehlen (sprich "Finger weg!").

Wernieman

Der Blogschreiber verwendet es so, aber es ist nicht notwendig.

MPD kann WebStreams abspielen
Als "Output" einen WebStream (für AirPlay) definieren
Lautsprecher darauf "binden"

Prinzipiell mit MPD möglich. Eventuell noch mehr Suche bei Google nötig!

iTunes dafür nicht nötig!
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

LuckyLuis

@Wernieman:

Danke für die Info. Da ich unter den genannten Stichworten nicht finden konnte, würde ich mich über eine kleine weitere "Stichwortliste" freuen. Der Webstream zum Airplay-Receiver muss dem dacp-Protokoll entsprechen, d.h. es muss theoretisch eine Umwandlung/Anreicherung des Streams erfolgen. D.h. das reine "Durchreichen" des Audio-Streams dürfte nicht ausreichen.


Wernieman

also ...... mpd kann verdammt viel und ist mit plugins erweiterbar. Da ich selber (noch) keine "WebLautsprecher" habe, kann ich Dir nur Tipsm aber keine weitere Hilfe geben.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

justme1968

schau dir mal den post hier an: http://forum.fhem.de/index.php/topic,19173.msg128659.html#msg128659. ich bin noch nicht dazu gekommen das ins itunes modul mit einzubauen aber wenn dein Lautsprecher wirklich direkt airplay kann dann solltest du hiermit direkt einen internet stream hin schicken können.

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

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

LuckyLuis

Hallo Andre,

das sieht ja sehr vielversprechend aus. Wäre genau, was ich brauche. Wird wohl heute Abend wieder etwas später.....

Vielen Dank an Alle. Werde berichten, ob es funktioniert....

LuckyLuis

Hallo,

ein wenig getestet, allerdings funktioniert es nicht. Aber neue Erkenntnisse für mich:
- Unterschied zwischen Airplay (Photo/Video) und RAOP/RTSP (Audio)
- Es gibt wohl tatsächlich eine mpd-Version mit raop-output-modul (anscheinend nicht die aktuelle produktive raspian-version)


Weiter gehts ...


nocomment

Halt uns bitte auf dem laufenden!

Interessiere mich auch sehr für das Thema da einige Lautsprecher schon vorhanden sind :)


lg

oliv06

Perheaps xmms2 and xmms2-plugin-airplay is a direction to look at ?
Did not test it but has interesting features (CLI, output to airplay)

LuckyLuis

Hallo,

habe jetzt mal http://hfujita.github.io/pulseaudio-raop2/ ausprobiert. Fertig kompiliert, Ausgabegeräte werden erkannt, kann mit SoX eine Ausgabe starten, dann bricht Pulseaudio mit einem Fehler ab.
Werde mir dann als nächstes XMMS2 anschauen...

Es geht weiter.

nocomment


LuckyLuis

Zwischenstand: XMMS2 unterstützt nur das "alte" Airtunes für alte Airport Express.
Das vielversprechenste ist noch immer pulseaudio mit neustem airplay-plugin. Dazu habe ich noch kein Supportforum gefunden. Muss den Entwickler mal direkt anmailen.

drdownload

Apple airplay verwendet udp, pa raop TCP
CUL 868 Slow-RF (FS20 Aktoren, Sender, FHT8V), CUL 868 (WMBUS-Empfang), Jeelink (PCA301), WS3600 (WH3080 über USB-Basis), Bewässerung mit ESP-Easy und Proplanta, RFXTRX433 Home-Easy Empfang und Senden, Oregon TH, WS001 TH), Blackbean IR, Mopidy-Snapcast MR Audio, Kodi, Forum-LED-Controller,

LuckyLuis

@drdownload:

Die von mir genannte Version von pulseaudio unterstützt dann auch raop/Airtunes via udp. Raop ist wohl nichts anderes als ein verpacktes RTSP. Und  meine Lautsprecher sind wohl nur via udp ansprechbar.

drdownload

ah, sorry am smartphone folge ich nicht allen links.
CUL 868 Slow-RF (FS20 Aktoren, Sender, FHT8V), CUL 868 (WMBUS-Empfang), Jeelink (PCA301), WS3600 (WH3080 über USB-Basis), Bewässerung mit ESP-Easy und Proplanta, RFXTRX433 Home-Easy Empfang und Senden, Oregon TH, WS001 TH), Blackbean IR, Mopidy-Snapcast MR Audio, Kodi, Forum-LED-Controller,

LuckyLuis

So, endlich ein erster Erfolg:

Mit https://www.npmjs.org/package/airtunes konnte ich endlich ein mp3-File auf einem vorgegebenen Airplay-Lautsprecher ausgeben (node play_ffmpeg.js --host 192.168.x.x --port 1195 --volume 30 --ffmpeg "/usr/bin/ffmpeg" --file test.mp3).

Problem ist die dynamische Änderung des Ports meiner Airplay-Lautsprecher. Der voreingestellte Port gilt nur für Apple-TV und Apple Airport Express. Für meine Airplay-LS musste ich via avahi-browser erst mal manuell den Port ermitteln.

Fazit: Damit geht es erst mal weiter. Die Möglichkeiten damit sind für meine Ansprüche mehr als ausreichend und es kann über CLI gesteuert werden.

Nächster Schritt: Ermitteln des aktuellen Ports der jeweiligen Airplay-Lautsprecher.

nocomment

TOP :D

Dann schreibst du noch ein nettes Plugin für FHEM  ? (:

LuckyLuis

#19
Nachdem die Ausgabe via FFMPEG und Airtunes2 (node.js) auf einen ausgewählten Airplay-Lautsprecher läuft, stellen sich zwei Probleme (die ich bis jetzt leider noch nicht lösen konnte):

1. Wie kann ich in FHEM ein Array aus einem Perl-Script (Die Abfrage der im Netzwerk befindlichen Airplay-Speaker geht über AnyEvent. Darüber erhalte ich hosts und Ports.) zur Auswahl stellen und den ausgewählten host und port zwei Dummies zuordnen?
2. FFMPEG kann nicht mit m3u-Listen aus einem http-Stream umgehen. Ich muss diesen Stream aber in ein Airplay-Konformes Format umwandeln (PCM 44,1khz usw). Zu guter letzt benötige ich für das Streamen zu den Airplay-Speakern den umgewandelten Stream in einer Pipe, damit Airtunes2 (node.js) den Stream an die Airplay-Lautsprecher senden kann.

Vielleicht liest hier jemand mit, der Hilfestellung leisten kann.

LuckyLuis

#20
Weiter geht's:

Punkt 2 des obigen Eintrags ist gelöst. Ich nutze jetzt mpg123 -@ http://.../test.m3u -s --stereo -r 44100 -q und leite das über StandartOut an Airtunes2 (node.js). Folgend das play_mpg123.js (angepasste Version eines Beispiels von airtunes2 (play_ffmpeg.js). Node.js ist bei mir unter /opt/node installiert.

var airtunes = require('/opt/node/lib/node_modules/airtunes'),
    spawn = require('child_process').spawn,
    argv = require('/opt/node/lib/node_modules/airtunes/node_modules/optimist')
      .usage('Usage: $0 --host [host] --port [num] --mpg123 [path] --file [path] --volume [num] --password [string]')
      .default('port', 5000)
      .default('volume', 20)
      .default('mpg123', '/usr/bin/mpg123')
      .default('file', 'http://metafiles.gl-systemhaus.de/hr/hr3_2.m3u')
      .demand(['host'])
      .argv;

console.log('adding device: ' + argv.host + ':' + argv.port);
var device = airtunes.add(argv.host, argv);

// when the device is online, spawn mpg123 to transcode the file
device.on('status', function(status) {
  console.log('status: ' + status);

  if(status !== 'ready')
    return;

  var mpg123 = spawn(argv.mpg123, [
    '-@', argv.file,    // Eingabefile/Stream
    '-q',               // Quiet
    '-s',              //StandardOut
    '-r', '44100',              // Sampling 44100 kHz
    '--stereo'          // Stereo
  ]);

  // pipe data to AirTunes
  mpg123.stdout.pipe(airtunes);

  // detect if mpg123 was not spawned correctly
  mpg123.stderr.setEncoding('utf8');
  mpg123.stderr.on('data', function(data) {
    if(/^execvp\(\)/.test(data)) {
      console.log('failed to start ' + argv.mpg123);
      process.exit(1);
    }
  });
});

// monitor buffer events
airtunes.on('buffer', function(status) {
  console.log('buffer ' + status);

  // after the playback ends, give some time to AirTunes devices
  if(status === 'end') {
    console.log('playback ended, waiting for AirTunes devices');
    setTimeout(function() {
      airtunes.stopAll(function() {
        console.log('end');
        process.exit();
      });
    }, 2000);
  }
});


Mit installiertem Perl-Modul AnyEvent erhält man mit folgendem Perlskript alle Airplay-Empfänger im Netzwerk

use AnyEvent::mDNS;

my $cv = AnyEvent->condvar;

AnyEvent::mDNS::discover '_raop._tcp', $cv;

my @services = $cv->recv;

for my $service(@services) {
print "Found $service->{name} ($service->{proto}) running on $service->{host}:$service->{port}\n";
}


Für die Steuerung der Streamausgabe braucht's noch ein paar Wrapper für node.js zur Lautstärkenkontrolle und Stop/Play.

oliv06


LuckyLuis

Hi,

das Thema hat sich für mich zerschlagen, da ich FHEM jetzt auf einem MacMini unter Mac OS X betreibe...

Viele Grüße

LuckyLuis