Wecker via Airplay-Lautsprecher

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

Vorheriges Thema - Nächstes Thema

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