Autor Thema: Sonos steuern  (Gelesen 748580 mal)

Offline funclass

  • Full Member
  • ***
  • Beiträge: 101
Antw:Sonos steuern
« Antwort #3255 am: 04 Januar 2019, 18:23:26 »
Hallo und gesundes Neues an alle Mitlesen,

nehmt es mir bitte nicht übel, wenn ich den 200-seiten Thread nicht komplett durchforstet habe, aber die Suche hat auf meine Frage leider keine passende Antwort geliefert.

Vor einigen Tagen ist mein Sonos-Setup um eine Beam erweitert worden, nun habe ich mit wiedermal ein wenig mit dem sehr ausführlichen FHEM-Modul befasst. Gibt es eine Möglichkeit (ggf. ein Reading was ich noch nicht gefunden habe) das Eingangssignal der Beam zu checken? Konkret geht es mir darum künftig zu visualisieren, dass gerade 5.1 DolbyDigital abgespielt wird, indem ich z.B. die Status-LED an der Beam aktiviere.
Ich habe mir in myUtils schon eine kleine Funktion erstellt, die aus dem Reading "currentTrackHandle" den Wert <r:streamInfo>xy</r:streamInfo> extrahiert, da dort scheinbar zu erkennen ist wie viele Kanäle der Stream enthält. Ich will aber ungern für diese "Spielerei" unnötige Events erzeugen. Vielleicht lässt sich ja auch ein neues Reading implementieren, welches gleich die korrekte Bezeichnung mappt.

sub mySonosStreamType {

my $xmltext = ReadingsVal("Sonos_Wohnzimmer", "currentTrackHandle", "");
my $begin = index($xmltext, "<r:streamInfo>");
my $end = index($xmltext, "</r:streamInfo>");
my $type = substr($xmltext,$begin+14,$end-$begin-14);
my $text = "unbekannt";

# 0 = kein Stream
# 2 = Stereo
# 7 = 2.0 DD
# 18 = 5.1 DD

if ($type == 0) {
    $text = "Aus";
} elsif ($type == 2) {
    $text = "Stereo";
} elsif ($type == 7) {
    $text = "Dolby Digital 2.0";
} elsif ($type == 18) {
    $text = "Dolby Digital 5.1";
}
fhem("setreading Sonos_Wohnzimmer myStreamType $text");
return;
}

Ein notify reagiert aktuell auf Änderungen des currentTrackHandle und schreib mein Reading. Dieses habe ich im StateFormat ergänzt, damit sehe ich direkt womit die Beam grad "befeuert" wird.
« Letzte Änderung: 04 Januar 2019, 22:58:13 von funclass »

Offline Reinerlein

  • Developer
  • Hero Member
  • ****
  • Beiträge: 2028
Antw:Sonos steuern
« Antwort #3256 am: 05 Januar 2019, 01:14:55 »
Hallo funclass,

wenn du dir ein Notify sparen möchtest und alles übersichtlich an einem Device haben möchtest, dann mach doch ein UserReading:
attr Sonos_Wohnzimmer userReadings myStreamType:currentTrackHandle.* { return mySonosStreamType(ReadingsVal($name, "currentTrackHandle", "")); }

Und deine Sub baust du so um, dass sie das Reading übergeben bekommt, und als Ergebnis deinen StreamType liefert:
sub mySonosStreamType($) {
        my ($xmltext) = @_;
my $begin = index($xmltext, "<r:streamInfo>");
my $end = index($xmltext, "</r:streamInfo>");
my $type = substr($xmltext,$begin+14,$end-$begin-14);

# 0 = kein Stream
# 2 = Stereo
# 7 = 2.0 DD
# 18 = 5.1 DD

if ($type == 0) {
      return 'Aus';
} elsif ($type == 2) {
      return 'Stereo';
} elsif ($type == 7) {
      return 'Dolby Digital 2.0';
} elsif ($type == 18) {
      return 'Dolby Digital 5.1';
}

return 'unbekannt';
}

Etwas kürzer mit einem regulären Ausdruck (ungetestet :) ):
sub mySonosStreamType($) {
  my ($xmltext) = @_;

  if ($xmltext =~ m/<r:streamInfo>(\d+)<\/r:streamInfo>/i) {
    if ($1 == 0) {
      return 'Aus';
    } elsif ($1 == 2) {
      return 'Stereo';
    } elsif ($1 == 7) {
      return 'Dolby Digital 2.0';
    } elsif ($1 == 18) {
      return 'Dolby Digital 5.1';
    } else {
      return 'Unbekannt: ' + $1;
    }
  } else {
    return 'Keine Angabe';
  }
}

Damit wird dieses Reading "myStreamType" immer dann mit aktualisiert, wenn "currentTrackHandle" aktualisiert wird.

Grüße
Reinerlein
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline funclass

  • Full Member
  • ***
  • Beiträge: 101
Antw:Sonos steuern
« Antwort #3257 am: 05 Januar 2019, 11:48:40 »
Hallo Reinerlein,

vielen Dank für die Infos. Hatte es erst mit nem zusätzlichem Userreading versucht und bin gescheitert. Nun weiß ich auch warum, ich hab den Trigger vergessen.  ::)

Deine verkürzte Variante mit dem RegEx funktioniert super. Ich hab noch ne Prüfung eingebaut, ob der SPDIF-Eingang aktiv ist da die Ausgabe ja nur dann Sinn macht. Ggf. kann das im Wiki ergänzt werden (oder kann ich das selbst?). Hatte vorher am AV-Receiver immer eine kleine Anzeige im Display, das fand ich ganz nett. Mit dieser Lösung bin ich nun wieder glücklich  ;D

attr Sonos_Wohnzimmer userReadings myStreamType:currentTrackHandle.* { if(ReadingsVal($name, "currentTitle", "") eq "SPDIF-Wiedergabe") {return mySonosStreamType(ReadingsVal($name, "currentTrackHandle", "")); } else { return ""; } }

VG Christian
« Letzte Änderung: 05 Januar 2019, 13:06:00 von funclass »

Offline willib

  • Full Member
  • ***
  • Beiträge: 187
Antw:Sonos steuern
« Antwort #3258 am: 13 Januar 2019, 19:54:45 »
Hallo Zusammen.
Ich habe ein Problem mit Speak. Nach Jedem Speak erhalte ich folgende Meldung:

SONOS1: Da keine Endzeit ermittelt werden konnte, wird kein Restoring durchgeführt werden!
Es sollte ein Radiosender aus meinen Favoriten laufen. Ich höre aber wenn ich die Playtaste drücke natürlich immer nur die letzte FHEM Durchsage.
Der Sender ist im Moment der Durchsage normalerweise gestoppt.

siehe auch mein separater Thread:
https://forum.fhem.de/index.php/topic,95402.msg882307.html#msg882307

Edit:
Es liegt anscheinend an der MP3 die als Gong vor der Durchsage ausgebe. Laut Wiki müssen die Formate übereinstimmen:
Achtung!: Die Verkettung der diversen MP3-Dateien erfolgt durch einfaches hintereinanderschreiben. Bei verschiedenen Formaten (Mono oder Stereo, 16kHz oder 22kHz, usw.) funktioniert zwar die Wiedergabe auf dem Sonos-System fehlerfrei, allerdings werden die Zeitinformationen nicht korrekt dargestellt. Um das zu korrigieren, kann man noch nachträglich einen lokal installierten Konverter (z.B. avconv) drüberlaufen lassen. Diesen kann man mit dem Sonos-Device-Attribut targetSpeakMP3FileConverter einstellen (z.B. mit /usr/bin/avconv -i %infile% %outfile%). Dabei ist zu beachten, dass dieser Zeit benötigt und somit die Verzögerung der Durchsage vergrößert.
Wie bringe ich jetzt meine Gong MP3 mit der Google MP3 in Übereinstimmung wenn ich den lokalen converter nicht nutzen möchte?

Vielen Dank.
« Letzte Änderung: 14 Januar 2019, 12:25:21 von willib »
Raspberry P1 3B, Homematic, Hue, Intertechno, Jeelink, Harmony Hub, VU+ Uno 4K

Offline Hotbird

  • Full Member
  • ***
  • Beiträge: 123
Antw:Sonos steuern
« Antwort #3259 am: 22 Januar 2019, 10:43:36 »
ich hab seit gestern den SonosSub. Hab auch gleich die IP Adresse unter usedonlyIPs mit reingenommen, trotzdem wird der nicht über das autocreate erstellt. Liegt es daran, dass ich ihn zusammen mit der Beam laufen lasse? In meinem WLAN ist er bisher auch erst einmal aufgetaucht. Besteht da eine andere Verbindung mit dem Sub ( also nicht wie die anderen über das normale WLAN)?


// Lösung
Hab den Sub gestern nochmal aus der Raumaufteilung rausgenommen, da wurde er dann auch wieder im WLAN angezeigt. Danach ging die Einbindung in FHEM. 
« Letzte Änderung: 23 Januar 2019, 10:56:59 von Hotbird »

 

decade-submarginal