Sonos steuern

Begonnen von Will, 05 Januar 2013, 15:51:12

Vorheriges Thema - Nächstes Thema

djhans

#480
Hi,
ok. habe ich geladen. Was brauchst Du? Die xml-Datei?
Werden alle korrekt ausgelesen.

djhans

Reinerlein

Hi Christian,

ist das die Konstellation, wenn Sub und Amp verbunden sind? Sind auch andere noch verbunden?
Kannst du mir das jeweilige Device-XML zusenden (also vier Dateien)?
Werden in deinem Fhem auch diese vier Devices angelegt?
Am Besten per PN...

Viele Fragen:-)
Danke schon mal...

Grüße Reiner

FHEM-Freak

Ich möchte allen Sonos begeisterten meine Anwendung mit hohen WAF nicht vorenthalten und natürlich anregen zu eigenen Ideen.

Mir war wichtig eine einfache Bedienung der Sonos Lautsprecher das diese von der ganzen Familie genutzt werden.  8)
Dazu habe ich Homatic Funk-Wandtaster 2fach HM-PB-2-WM55 in Verwendung.

Hier ein Anwendungsbeispiel.

Schaltung:
Kurzes Drücken oben -> Ansage der Temperatur im Glashaus (Wichtig für die Frau des Hauses)
Kurzes Drücken unten -> Ansage der Temperatur Außen

Langes Drücken oben -> Ansage und Start der Wiedergabe von Radio
Langes Drücken unten -> Beenden der Radiowiedergabe

Tastenbelegung bei Status Play
Kurzes Drücken oben -> Lauter
Kurzes Drücken unten -> Leiser
IN ARBEIT Langes Drücken oben -> Wechsel von Radio zu einer Wiedergabeliste (Funktioniert soweit Playlist spielt aber danach keine Reaktion von FHEM, nur mehr Stecker ziehen möglich. Bin noch am Ursachenforschen hat aber keine Priorität)

Großen Dank an Reiner der das durch sein Modul ermöglicht hat.

fhem.cfg
define Musik_EIN notify SchalterMusik:SchalterMusik_01.* {if ("%"  =~ "3-8440") {Musik_Schalter_Lang_Oben}}
define Musik_AUS notify SchalterMusik:SchalterMusik_02.* {if ("%"  =~ "3-8440") {Musik_Schalter_Lang_Unten}}

define Musik_LAUTER notify SchalterMusik:SchalterMusik_01.Short.* {Musik_Schalter_Kurz_Oben}
define Musik_LEISER notify SchalterMusik:SchalterMusik_02.Short.* {Musik_Schalter_Kurz_Unten}

99_myUtils.pm
######################################################
# Sonos Lang Oben
######################################################
sub
Musik_Schalter_Lang_Oben
{
my $SonosStatus = ReadingsVal("Sonos_Wohnzimmer","transportState","?");

#MUSIK STILL
if ( $SonosStatus eq "STOPPED" ) {
    { fhem ("set Sonos_Wohnzimmer Speak 40 de Radio")};
    sleep(1);
    { fhem ("set Sonos_Wohnzimmer Volume 30")};   
    { fhem ("set Sonos_Wohnzimmer LoadRadio OE3%20Hitradio%2099.9%20(Top%2040%20Hits)")};   
    { fhem ("set Sonos_Wohnzimmer Play")};
}
#MUSIK LÄUFT / TEST FUNKTIONIERT NOCH NICHT
# if ( $SonosStatus eq "PLAYING" ) {
#  my $SonosPlay = ReadingsVal("Sonos_Wohnzimmer","currentSender","?");
  #RADIO
#  if ( $SonosPlay eq "OE3 Hitradio" ) {
#     { fhem ("set Sonos_Wohnzimmer Stop")};
#     { fhem ("set Sonos_Wohnzimmer EmptyPlaylist")};
#     sleep(1);
#     { fhem ("set Sonos_Wohnzimmer Speak 40 de Wechsle zu Musikliste von Kurt")};
#     sleep(1);
#     { fhem ("set Sonos_Wohnzimmer LoadPlaylist Kurt")};
#     sleep(1);
#     { fhem ("set Sonos_Wohnzimmer Play")};
#  }
# }
}
# End Musik_Schalter_Lang_Oben

######################################################
# Sonos Lang Unten
######################################################
sub
Musik_Schalter_Lang_Unten
{
  { fhem ("set Sonos_Wohnzimmer Stop")};
}
# End Musik_Schalter_Lang_Unten

######################################################
# Sonos Kurz Oben
######################################################
sub
Musik_Schalter_Kurz_Oben
{
my $SonosStatus = ReadingsVal("Sonos_Wohnzimmer","transportState","?");

if ( $SonosStatus eq "STOPPED" ) {
my $Glashaustmp = ReadingsVal("Glashaus","temperature","?");
$Glashaustmp = "Im Glashaus hat es ". $Glashaustmp . " Grad";
sleep(1);
{ fhem ("set Sonos_Wohnzimmer Speak 40 de $Glashaustmp")};
}
if ( $SonosStatus eq "PLAYING" ) {
  { fhem ("set Sonos_Wohnzimmer VolumeU")};
}
}
# End Musik_Schalter_Kurz_Oben

######################################################
# Sonos Kurz Unten
######################################################
sub
Musik_Schalter_Kurz_Unten
{
my $SonosStatus = ReadingsVal("Sonos_Wohnzimmer","transportState","?");

if ( $SonosStatus eq "STOPPED" ) {
my $Aussentmp = ReadingsVal("Aussen","temperature","?");
$Aussentmp = "Aussen hat es ". $Aussentmp . " Grad";
sleep(1);
{ fhem ("set Sonos_Wohnzimmer Speak 40 de $Aussentmp")};
}
if ( $SonosStatus eq "PLAYING" ) {
  { fhem ("set Sonos_Wohnzimmer VolumeD")};
}
}
# End Musik_Schalter_Kurz_Unten
Banana Pi
HMLAN
3 x HM-CC-TC + HM-CC-VC
1 x HM-PB-2-WM55, 1 x HM-WDS10-TH-O
1 x HM-WDS30-T-O, 1 x HM-WDS40-TH-I

Reinerlein

Hi Fhem-Freak,

das ist ja klasse :-)
Schön, was man alles machen kann :-))

In meiner jetzigen Entwicklungsversion habe ich auch schon die Sache für den eigenen/lokalen Sprachsynthesizer drin. Da hast du dann vielleicht eine kürzere Latenzzeit bei der Ansage.
Ich bin nur noch auf der Suche nach dem Durchsage-Lautstärken-Phänomen bei Gruppen. Das entzieht sich mir noch irgendwie...

Als kleinen Tip für das Erkennen, ob ein Radiosender oder ein normaler Titel läuft: Du kannst die beiden Readings "currentNormalAudio" und "currentStreamAudio" auslesen, die auf "1" stehen, wenn der jeweilige Zustand zutrifft. Vielleicht hilft dir das bei deinem offenen Punkt...
Außerdem kannst du dir eigentlich die Sleep-Anweisungen sparen. Das Sonos-Modul (besser: der entfernte Server, der in seinem eigenen Prozess läuft) hat eine eigene Warteschlange für die Verarbeitung der Anweisungen. Das bedeutet für dich, dass dein Fhem erstmal sofort wieder frei ist (das kann ja wichtig werden für die Verarbeitung von anderen Nachrichten, z.B. die von Homematic).

Grüße
Reiner

FHEM-Freak

Danke Reiner,  werde deine Tipps berücksichtigen und testen.

Gruß Kurt
Banana Pi
HMLAN
3 x HM-CC-TC + HM-CC-VC
1 x HM-PB-2-WM55, 1 x HM-WDS10-TH-O
1 x HM-WDS30-T-O, 1 x HM-WDS40-TH-I

djhans

Hallo,
ich brech´mir gerade die Finger mit den Attributen targetSpeakDir und targetSpeakURL
Zumindest kachelt fhem bei meinen Versuchen so dermaßen ab, daß selbst ein reboot mit root-Rechten verweigert wird.

attr targetSpeakDir:
wo muss der Pfad hinzeigen? Auf den lokalen fhem-Server?
dann sollte die Anweisung doch so aussehen, oder?
attr targetSpeakDir /opt/fhem/

attr targetSpeakUR:
hier gebe ich das Verzeichnis an, von dem aus der Zoneplayer die mp3 spielt.
Wie sieht das mit den Zugriffen aus? Soll heißen, wie legt fhem die mp3 Datei dort ab?  Dazu brauchen doch fhem und der Zoneplayer Zugriff auf das Verzeichniss, oder regelt das Dein Modul indem es die zu spielende Date an den Zoneplayer schickt?
djhans

Reinerlein

Hi djhans,

der Parameter "...Dir" beschreibt das Verzeichnis, unter dem der Fhem-Prozess (also das Sonos-Modul) die Datei schreiben kann/darf. Das kann eine direkte Pfadangabe wie "/tmp/Sonos/" sein, aber auch eine Angabe der Form "\\WindowsPC\Freigabe".

Der Paramet "...URL" beschreibt die URL, die der Zoneplayer verwenden muss, um dasselbe Verzeichnis zu erreichen (zu lesen). Das ist üblicherweise in der Form "\\WindowsPC\Freigabe", da Sonos nur auf Windows/SMB-Freigaben zugreifen kann.

Das Modul überträgt nichts an die Player (ausser der Anweisung, was abgespielt werden soll). Der Player holt sich das von dem angegebenen Ort selber, und braucht dementsprechend dort Leserechte...

Im Wiki gibt es ein Beispiel für die lokale Enrichtung eines Samba-Servers auf dem Raspberry, sofern nicht schon einer läuft (und du einen brauchst).
Du kannst aber auch die Adresse eines bestehenden NAS-Servers angeben, dann sind die beiden Parameter vermutlich gleich, da sowohl dein Pi als auch deine Zoneplayer die NAS über denselben UNC-Pfad erreichen können...

Grüße Reiner

djhans

Hi,
ok. Muss denn im Sonos Controller die Bibliothek gesetzt werden? Als Samba-Share habe ich das freigegeben.

Die Anleitung verstehe ich auch so, dass man die Attribute mit attr in die fhem.cfg einträgt. Aber fhem möchte, dass die Variablen vorher definiert werden..
Also muss ich das vorher noch irgendwie definieren? Junge, Junge, das ist alles nicht so wirklich meine Welt...

attr targetSpeakDir /mnt/SonosSpeak/
attr targetSpeakURL /mnt/SonosSpeak/


djhans

Reinerlein

Hi djhans,

am Besten du setzt diese Attribute über die Web-Oberfläche. Du hast im unteren Bereich einer Komponente (in diesem Fall die SONOS-Komponente) einen Bereich, wo die ganzen Attribute aufgelistet sind.
Darüber besteht die Möglichkeit einer Eingabe.
Dazu einfach in der Klappbox das gewünschte Attribut auswählen (z.B. "targetSpeakDir") und im Eingabefeld dahinter den gewünschten Wert eintragen (z.B. "/mnt/SonosSpeak"). Dann nur noch den Button "attr" drücken fertig.

Damit passt du (wie immer in Fhem) erstmal nur die Konfiguration im Speicher an. Um das ganze Dauerhaft zu speichern, musst du noch den "Save"-Button betätigen, oder in das Eingabefeld "save" eingeben und <Enter> drücken.

Bei deiner Anweisung hattest du auch nur die Komponente vergessen, für die das Attribut angelegt werden soll.
Korrekterweise hätte es also
attr Sonos targetSpeakDir /mnt/SonosSpeak
lauten müssen.

Allerdings würde wohl der URL-Parameter so nicht funktionieren, da aus Sicht deines Zoneplayers dieser Pfad so nicht erreichbar ist (zumindest nicht unter diesem Namen).
Da muss sowas stehen wie
\\IPADRESSE_VOM_PI\SonosSpeak

Grüße Reiner

djhans

Hi,
nun ja! Du erklärst mich wahrscheinlich für völlig bescheuert, aber die Attribute gibt es im Dropdown nicht. Sorry, wenn ich Dich zur Verzweiflung bringe, aber die sind definitiv nicht da!
Habe dann genau das hier in die fhem.cfg geschrieben:

attr Sonos targetSpeakDir /mnt/SonosSpeak/
attr Sonos targetSpeakURL \\192.168.1.7\SonosSpeak\


Wenn ich die Attribute ganz weglasse, wird zumindest im fhem Verzeichnis die mp3 erstellt. die kann ich mit einem mp3 Player auch abspielen. Im SonosSpeak-Verzeichnis kommt nix an.

Meine smb.comf:
[Global]
workgroup = SCHETTNER
netbios name = Enterprise
security = User
getwd cache = yes

[Fhem]
comment = Hausautomation
path = /opt/fhem/     
valid users = @users root
read only = No
create mask = 0777
directory mask = 0777


[SonosSpeak]
    comment = Audio-Files for SonosPlayer to Speak
path = /mnt/SonosSpeak
read only = No
create mask = 0777
directory mask = 0777
guest ok


djhans

Reinerlein

Hi djhans,

nana, hier wird niemand für bescheuert erklärt :-)
Ich stochere mal mit ein paar breitgestreuten Hinweisen und Fragen...

Kann es sein, dass du an einem SONOSPLAYER guckst? Da müsstest du dann z.B. so Attribute wie "minVolume" und "maxVolume" haben...

Die Speak-Einstellungen sind aber zentral, und somit am Sonos-Device abgelegt (also an dem Ding, das du selber angelegt hast, und welches dir wiederrum alle Player automatisch angelegt hat).
Aber so wie du die dann manuell angelegt hast, sollte es funktionieren. Hast du nach dem Anpassen der fhem.cfg auch Fhem neugestartet?

Gibt es das Verzeichnis "/mnt/SonosSpeak" auf dem Pi auch? Die Samba Freigabe prüft nicht, ob es das Verzeichnis auch gibt. Hier auch Schreibrechte beachten...

Läuft der Samba-Daemon auch, kannst du also z.B. von einem anderen (Windows-)Rechner auf die Freigabe zugreifen. Wenn nicht, dann den Dienst mal starten, oder auch den ganzen Pi neustarten...

Vielleicht ist ja was hilfreiches dabei.

Grüße
Reiner

djhans

Hi Reiner,
ja, Du hast recht.  die Gruppe Sonos kennt die Befehle...

Ich habe die Attribute noch einmal definiert.
Samba ist korrekt eingerichtet. Ich kann auf einem Windows-Rechner ein Verzeichnis erstellen und auf dem Pi taucht es auch unter /mnt/SonosSpeak auf.
Schreibweise habe ich noch mal geprüft. Scheint ok zu sein.
Habe die smb.conf mal abgespeckt und nur die Section SonosSpeak dringelassen. Bringt auch nichts....

Habe dann den Pfad auf /opt/fhem gesetzt und dafür einen Samba-Share eingerichtet und dann geht es. Die Datei wird erzeugt und abgespielt.
Ich nehme an das fhem nicht auf /mnt/SonosSpeak schreiben darf. Man muss den fhem Benutzer offenbar das REcht dafür geben. Ich denke ich richte das "Speak"- Verzeichnis einfach unter fhem ein.

djhans

Reinerlein

Hi Christian,

schön, das es jetzt klappt. Ich würde dir nur nicht empfehlen, das Speak-Verzeichnis unterhalb von Fhem abzulegen.
Das wird mit der Zeit etwas wachsen (besonders, wenn du die Sache mit den Timestamps aktivierst oder das Hashing), und du musst da u.U. mal ein Auge wegen der Füllmenge draufhaben.

Du kannst auch einfach mittels
chmod go+rw /mnt/SonosSpeak
die Rechte für den Ordner anpassen... Das läßt Schreibrechte für alle Benutzer (auf deinem Pi) zu.

Grüße Reiner

djhans

Hallo,
ich möchte noch einmal berichten, was mir im Zusammenhang mit dem Sonos-Modul auffällt:
Ich habe das Sonos Modul in einer separaten Datei ausgelagert und binde es in die fhem cfg mit "Include Sonos.cfg" ein.

Der Fhem-Server läuft jetzt seit einigen Tagen ohne Neustart.  In der Sonos cfg. steht zu Anfang folgenden Zeile:
define Sonos SONOS localhost:4711 30
danach die Konfiguration der Geräte, die bei der ersten Einrichtung mit "save" gespeichert wurde.

Nun kommt es vor, dass meine Kids sich abends meinen Schlafzimmer-Sonos klauen und ihre eigene Mucke abspielen. Dazu trennen Sie das Gerät vom Netz. Ich hole mir dann das Gerät später wieder zurück.

Heute habe ich dann versucht, den Schlafzimmer_Sonos anzusteuern, aber das fhem Modul ignoriert die Befehle. Es scheint, als würde fhem den Sonos nicht mehr kennen. Über den Sonos-Controller läuft alles perfekt.

Ein Reboot von fhem löst das Problem....was läuft da schief? Ist es das Trennen der Sonos-Komponenten vom Stromnetz?

Christian.




JR

Hallo Reiner,

seit ein paar Wochen versuche ich, mein neues Sonos-System mit Deinem Modul anzusteuern, hatte aber leider von Anfang an ein ähnliches Problem wie peter79 (Thread stürzt ab). Heute habe ich dann diese Diskussion entdeckt. Der letzte Eintrag, den ich dazu finden konnte, war dieser:

Zitat von: Reinerlein am 18 Oktober 2013, 02:22:13
Das bedeutet, daß dein IPMI auf eine solche Suchanfrage reagiert, und in meiner Callback-Methode landet. Im Prinzip ist es wurscht, warum genau. Das muss ich auf jeden Fall abfangen :-)

Gibt's dazu inzwischen was Neues? Dein Modul sieht echt interessant aus, ich würde das sehr gerne verwenden, komme aber leider über die ersten 30 Sekunden nach dem Serverstart nicht hinaus...

Gruß
  Jens