Sonos steuern

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

Vorheriges Thema - Nächstes Thema

John

Hi Reiner,

das Adresse-Band 192.168.66.??? gibts bei mir gar nicht.

mein Sonosplayer hat folgendes reading
Zitatlocation      http://192.168.178.40:1400/xml/device_description.xml

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

der-Lolo

Hallo John,
ich hatte ein sehr ähnliches phänomen... mittlerweile checke ich nach dem einschalten eines play3 mithilfe eines eigenem presence devices ob die richtige ip vergeben wurde. Falls das nich passiert ist starte ich den betreffenden player neu...
Später fand ich dann einen zusätzlichen DHCP server der in meinem netz aktiv war - nachdem ich den deinstallierte war der spuk vorbei.

John

Hi der-Lolo,
ich habe garantiert nur einen DHCP-Server.

Ich glaube nicht, daß es daran liegen wird.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

justme1968

ich habe auch solche meldungen:
ZitatLoading device description failed with error: 500 Can't connect to 10.0.1.9:49155 at /usr/local/FHEM/share/fhem/FHEM/00_SONOS.pm line 3041 thread 1.
Loading device description failed with error: 500 Can't connect to 10.0.1.9:49155 at /usr/local/FHEM/share/fhem/FHEM/00_SONOS.pm line 3041 thread 1.

die ip gehört zu einer dlan wifi stecker der aber nicht im gleichen wlan ist wie die sonos player.

ich hatte nur einen der player für kurze zeit per kabel am ethernet port des dlan teils betrieben. das ist aber schon eine weile und mehrere neu starts her.

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

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

Loredo

#1519
Hi Reinerlein,


langsam komme ich dem näher, was ich mir vorstelle.


Über ein userReading erzeuge ich jetzt ein zweites state-Reading:



state2 {
  if(ReadingsVal($name,"presence",0) ne "appeared") {
    "disappeared"
 
  } elsif( ReadingsVal(SONOSPLAYER_GetMasterPlayerName($name),"transportState",0) eq "PLAYING") {
     if(ReadingsVal($name,"Mute",0) eq "1") {"mute"} else {"on"}

  } else {
    "off"
  }
}



Das einzige, was jetzt noch fehlt ist, dass im Falle eines Masters dann alle dazugehörigen Slaves getriggert werden und ihre userReadings neu auswerten. Das kriege ich gerade nicht hin (fängt schon bei der Auswertung wie die FHEM-Namen der Slave-Geräte lauten an, da gibts ja leider kein Reading).
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

Reinerlein

Hi Loredo,

ich habe gerade eine neue Hilfsprozedur eingebaut, die als Ergänzung zu "SONOSPLAYER_GetMasterPlayerName()" die Teilnehmer der Gruppe ohne den Master zurückgibt: "SONOSPLAYER_GetSlavePlayerNames()". Damit kannst du dir zumindest schon mal alle Fhem-Devicenamen der restlichen Gruppenteilnehmer liefern lassen:

my $groupMasterName = SONOSPLAYER_GetMasterPlayerName('Sonos_Wohnzimmer');
my @groupMemberNames = SONOSPLAYER_GetSlavePlayerNames('Sonos_Wohnzimmer');


Vielleicht hilft dir das ja einen Schritt weiter...

Und als Tipp für einen Notify-Aufhänger:
Das Reading "ZoneGroupState" des Sonos-Devices wird bei einer Gruppenänderung (mit einem Event) aktualisiert, also auch, wenn ein Player neu auftaucht. Die oben genannten Prozeduren greifen auch auf dieses Reading zurück...

Wie immer ab jetzt im SVN oder ab nachher im Update...

Grüße
Reinerlein

peter0255

Hallo Zusammen,

ich probiere es hier noch einmal, habe ein kleines Problem. Ich habe 2 Play1 Bad und Küche und ein Stereo Paar 2 Play5 im Esszimmer. Die Player werden Nachts abgeschaltet und vorher die Gruppe aufgelöst. Über eine Weckfunktion werden die Player zur eingestellten Zeit eingeschaltet und neu gruppiert. Das Gruppieren von Bad und Küche geht ohne Probleme, aber wenn ich das Stereo Paar mit einbinden will klappt es nicht. Hat jemand eine Idee, oder kann mir jemand sagen wie ich das StereoPaar Sonos_Wohnzimmer mit in die Gruppe bekomme.

Das Stereo Paar habe ich über die Sonos Software gekoppelt

define Sonos_Kueche_Appeared_Notify notify Sonos_Kueche:presence:.appeared { \
   fhem "set Sonos_Kueche StartRadio SWR3%%20Elchradio" ;; \
   fhem "set Sonos_Kueche Volume 20" ;; \
        fhem "set Sonos Groups [Sonos_Bad, Sonos_Kueche, Sonos_Wohnzimmer]" ;; \
        fhem "set Sonos_Kueche Play" \


Gruß Peter

Reinerlein

Hi Peter,

so, ich konnte bei mir mal ein bißchen testen...

Bei mir hat es normal geklappt. Vielleicht solltest du ein bißchen auf Masterplayer achten.

Was (bei mir) auf jeden Fall ging:
- Stereopaar erzeugen, der Player auf dem man "CreateStereoPair" aufruft, ist der zukünftige Master der Stereogruppe.
- Gruppe mit "AddMember" oder "Groups" erzeugen: Wenn du das Stereopaar mit in die Gruppe nehmen möchtest, dann nur den Master der Stereogruppe hinzufügen, sonst wird die Stereozugehörigkeit u.U. wieder aufgelöst.
- Beim Ablösen, auch nur den Master verwenden.

In deinem geposteten Code stellst du erst die Küche ein (Titel und Lautstärke), und baust dann eine Gruppe, wo die Küche nicht der Master ist. Das bedeutet, dass die Einstellungen der Küche "verloren" sind (zumindest der Titel für die Gruppenkonstellation).
Wenn du möchtest, dass die Gruppe die Dinge deiner Küche abspielt, dann muss die Küche in der SetGroups-Anweisung der erste Player sein:

fhem "set Sonos Groups [Sonos_Kueche, Sonos_Bad, Sonos_Wohnzimmer]" ;; \
Danach ist die Küche der Gruppenmaster, und die Wiedergabe der Küche landet auch im Bad und im Wohnzimmer.

Leider sieht man in deinem Post nicht, wer das Stereopaar ist, wenn wir aber mal anehmen, es gäbe "Sonos_Flur1" und "Sonos_Flur2":

set Sonos_Flur1 CreateStereoPair Sonos_Flur2
Jetzt gibt es ein Stereopaar mit Flur1 und Flur2, Flur1 ist dabei der Stereomaster.

Nun zur Gruppe:

set Sonos Groups [Sonos_Kueche, Sonos_Bad, Sonos_Wohnzimmer, Sonos_Flur1]
Jetzt ist das Stereopaar auch in der großen Gruppe drin, Sonos_Kueche ist der Gruppenmaster.

Auf keinen Fall etwas in der Art von

set Sonos Groups [Sonos_Kueche, Sonos_Bad, Sonos_Wohnzimmer, Sonos_Flur1, Sonos_Flur2]
aufrufen. Das ist logisch inkorrekt, und ich weiß nicht, was die Sonosplayer da so draus machen... Bestimmt nicht das, was du möchtest :)

Grüße
Reinerlein

Loredo

#1523
Hey Reinerlein,

danke dir für die Anpassungen, damit konnte ich mein Vorhaben jetzt umsetzen  :)

Ich beschreibe es hier nochmals vollständig das Setup eines zusätzlichen Readings "state2", welches ich über stateFormat bei mir als definitives STATE für meine Sonos Geräte verwende.

Vielleicht findet es ja noch jemand nützlich.





Die angehängten Screenshots zeigen die minimalistische Darstellung für meine Sonos Geräte. Dabei verhält sich das Icon ähnlich wie der Knopf an den Sonos Geräten mit dem Zusatz, dass bei laufender Musik + mute=on man das Gerät auch unmuten kann über den Button. Das ist besonders hilfreich bei der Nutzung bei der Darstellung auf einem Smallscreen (z.B. Smartphone). Wird gerade nichts abgespielt, ist der Status "off", auch wenn mute ggf. auf "on" ist. Erscheint mir logischer

Man kann die gesamte Sonos-Gruppe von jedem beliebigen Mitglied aus steuern und jedes Mitglied gibt den Status der Gruppe entsprechend wieder. Der Mute-Status wird dabei pro Gerät dargestellt.

Über eine Structure (hier "Sonos System" benannt) werden alle Sonos-Geräte nochmals zusammengefasst und liefern einen konsistenten Status "on" oder "off", damit man dies in einer Anwesenheitssteuerung einfacher verwenden kann.




Was muss man nun tun?

Folgenden Code in 99_myUtils.pm:

sub jpSonosState2($) {
    my ($name) = @_;

    if ( SONOSPLAYER_GetMasterPlayerName($name) eq "$name" ) {
        foreach my $player ( SONOSPLAYER_GetSlavePlayerNames($name) ) {
            Log3 $name, 4,
"SONOSPLAYER $name: Recalculation of reading 'state2' triggered for slave device $player";
            my $newstate = jpSonosState2($player);
            if ( $newstate ne ReadingsVal( $name, "state2", 0 ) ) {
                readingsSingleUpdate( $defs{$player}, "state2", $newstate, 1 );
            }
        }
    }

    Log3 $name, 4, "SONOSPLAYER $name: Recalculating reading 'state2'";

    if ( ReadingsVal( $name, "presence", 0 ) ne "appeared" ) {
        return "disappeared";
    }
    elsif (
        ReadingsVal( SONOSPLAYER_GetMasterPlayerName($name),
            "transportState", 0 ) eq "PLAYING"
      )
    {
        if   ( ReadingsVal( $name, "Mute", 0 ) eq "1" ) { return "mute" }
        else                                            { return "on" }
    }
    else { return "off" }
}


Die Structure sieht folgendermaßen aus (bei mir sind es 4 Sonos Geräte):



define g_APT_Audio structure g_audio Sonos_Bedroom Sonos_Bathroom Sonos_Kitchen Sonos_Living_Room
attr g_APT_Audio alias Sonos System
attr g_APT_Audio clientstate_behavior relative
attr g_APT_Audio clientstate_priority on off
attr g_APT_Audio devStateIcon off:rc_PAUSE .*:rc_PLAY:off
attr g_APT_Audio group Media
attr g_APT_Audio icon audio_volume_mid
attr g_APT_Audio room Sonos
attr g_APT_Audio webCmd mute 0:mute 1


Dann gibt es noch einige entscheidende Attribute in den SONOSPLAYER Devices zu setzen.
Hier beispielhaft die entscheidenden Attribute für einen meiner Player:



define Sonos_Bathroom SONOSPLAYER RINCON_B8E93783CA9801400_MR
attr Sonos_Bathroom userattr g_audio g_audio_map structexclude
attr Sonos_Bathroom alias Sonos Bathroom
attr Sonos_Bathroom devStateIcon on:rc_PLAY.svg:pause off:rc_PAUSE.svg:play mute:rc_MUTE.svg:muteT
attr Sonos_Bathroom eventMap Stop:off Play:on
attr Sonos_Bathroom g_audio g_APT_Audio
attr Sonos_Bathroom g_audio_map state2:on:on state2:mute:on state2:off:off state2:disappeared:off
attr Sonos_Bathroom group Media
attr Sonos_Bathroom stateFormat state2
attr Sonos_Bathroom userReadings state2:(presence|transportState|Mute).* {jpSonosState2($name)}
attr Sonos_Bathroom webCmd Volume:MuteT
Hat meine Arbeit dir geholfen? ⟹ https://paypal.me/pools/c/8gDLrIWrG9

Maintainer:
FHEM-Docker Image, https://github.com/fhem, Astro(Co-Maintainer), ENIGMA2, GEOFANCY, GUEST, HP1000, Installer, LaMetric2, MSG, msgConfig, npmjs, PET, PHTV, Pushover, RESIDENTS, ROOMMATE, search, THINKINGCLEANER

justme1968

hast du vielleicht noch eine idee wegen den Loading device description failed with error: 500 Can't connect to 10.0.1.9:49155 at /usr/local/FHEM/share/fhem/FHEM/00_SONOS.pm line 3232 thread 1.meldungen?

ich habe das gefühl das das sie alles ziemlich verzögern weil der hintergrund prozess jedes mal erst in einen timeout läuft bevor es weiter geht.

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

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

Reinerlein

Hi Andre,

leider habe ich da auch keine richtige Idee. Du könntest als Versuch mal im Code von 00_SONOS.pm in der Zeile 335 die IP "10.0.1.9" als String in das Array eintragen.

Aber dieses Feature ist noch gar nicht getestet und auch nur angefangen, da es damals dann gar keinen Grund mehr gab :)

Wenn das eine Lösung (oder besser ein Workaround) sein sollte, würde ich das noch weiterbauen, sodass man das als Fhem-Attribut angeben kann... aber erstmal schauen...

Da es eine Codeänderung ist, solltest du Fhem nach der Änderung auf jeden Fall neustarten...

Grüße
Reinerlein

Reinerlein

Hi Andre,

ich sehe gerade, dass es der Einfachheit halber ein Hash ist.
Dann solltest du folgendes schreiben:

my %IgnoreIPs = ('10.0.1.9' => 1);


Grüße
Reinerlein

peter0255

Hi Reinerlein,

vielen Dank für Deine schnelle Hilfe, aber ich habe immer noch Probleme mit dem bilden von dem Stereo Paar. Wo packst Du das " set ... CreateStereoPair ... " hin. Muß ich da ein neues define anlegen

define Sonos_Wohnzimmer_stereo set Sonos_Wohnzimmer CreateStereoPair Sonos_Wohnzimmer2

oder wie muß das aussehen?

Entschuldigung das ich so blöde bin

Gruß
Peter

justme1968

die meldungen sind weg und bis jetzt funktioniert alles...

ich verfolge das mal weiter.

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

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

MarioS1969

Hallo Reinerlein,
mein Problem besteht immer noch. Ich kann einfach keine mp3 mit dem Sonos abspielen. Radiosender funktionieren.
Rufe ich speak auf wird die mp3 datei abgelegt, aber nicht abgespielt. Auch andere mp3s können nicht abgespielt werden. Die Recht in diesem Verzeichnis stehten auf 777.

Im Logfile erscheint die folgende Fehlermeldung:

2015.01.21 22:41:00 5: SONOS0: Received from UPnP-Server: 'DoWorkAnswer:RINCON_B8E9373ACB7401400_MR:LastActionResult:PlayURITemp: Error! UPnP-Fault-Fields: Code: "s:Client", String: "UPnPError", Actor: "-", Detail: "{UPnPError => {errorCode => 701}}"'

2015.01.21 22:41:00 4: SONOS0: DoWorkAnswer arrived for Sonos_Wohnzimmer->LastActionResult: 'PlayURITemp: Error! UPnP-Fault-Fields: Code: "s:Client", String: "UPnPError", Actor: "-", Detail: "{UPnPError => {errorCode => 701}}"'


Kann es daran liegen, dass das folgende Verzeichnis nicht existiert?
Dodurch dies angelegt?

find /usr/share/fhem/FHEM/lib/UPnP


Ich versuche es seit ca. 2 Wochen und komme, trotz deiner super Beschreibung im FHEMWiki einfach nicht weiter. Die Installation habe ich nach deiner Beschreibung durchgeführt.

Hast du noch eine Idee?

Vielen Dank und ein schönes Wochenende
Mario
PI 2, PI4,  RFXtrx433, IT-1500, CMR-1000, ITM 100, TFA Temperatursensor, IR-Sensor, FB 7590, LIRC mit Logitech Harmony, FI9821W, Sonos, Twilight, Benzinpreismonitor, HMLAN, HM-Sen-DB-PCB, HM-LC-Bl1PBU-FM, HM-SEC-SC-2, GPIO4 mit fhem2fhem, Shelly