From 320d4e43b71b1c9ce24cdf18526c9f763aabcfc0 Mon Sep 17 00:00:00 2001 From: rleins <> Date: Wed, 31 Dec 2014 13:35:22 +0000 Subject: [PATCH] Sonos: Add new Features 'CreateStereoPair' and 'SeparateStereoPair' git-svn-id: https://svn.fhem.de/fhem/trunk@7379 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_SONOS.pm | 22 +++++++++++++---- fhem/FHEM/21_SONOSPLAYER.pm | 47 ++++++++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 8 deletions(-) diff --git a/fhem/FHEM/00_SONOS.pm b/fhem/FHEM/00_SONOS.pm index 53418f57c..6d61aff8a 100755 --- a/fhem/FHEM/00_SONOS.pm +++ b/fhem/FHEM/00_SONOS.pm @@ -1,6 +1,6 @@ ######################################################################################## # -# SONOS.pm (c) by Reiner Leins, 2014 +# SONOS.pm (c) by Reiner Leins, December 2014 # rleins at lmsoft dot de # # $Id$ @@ -8,7 +8,7 @@ # FHEM module to commmunicate with a Sonos-System via UPnP # # !WARNING! -# This Module needs UPnP-Library +# This Module needs additional Perl-Libraries. # Installation: # * LWP::Simple # * HTML::Entities @@ -18,8 +18,6 @@ # * threads # * Thread::Queue # -# Internal Version 2.6 - December, 2014 -# # define SONOS [[[interval] waittime] delaytime] # # where may be replaced by any name string @@ -32,6 +30,8 @@ # Changelog # # SVN-History: +# 31.12.2014 +# Das Bilden von Stereopaaren wird nun unterstützt. Dafür gibt es die Anweisungen 'CreateStereoPair' und 'SeparateStereoPair' an einem Playerdevice. # 28.12.2014 # Umlaute: Die Erkennung von Umlauten war wegen der Quelltextumstellung auf UTF8 fehlerhaft. Das betraf nur die Zonennamenumwandlung, wo z.B. aus 'Küche' ein 'Kueche' gemacht wird. # Sonos-Coverlieferung: Es waren noch ein paar Return-Anweisungen zuviel drin. @@ -2552,6 +2552,18 @@ sub SONOS_Discover() { if (SONOS_CheckProxyObject($udn, $SONOS_AVTransportControlProxy{$udn})) { SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_UPnPAnswerMessage($SONOS_AVTransportControlProxy{$udn}->BecomeCoordinatorOfStandaloneGroup(0))); } + } elsif ($workType eq 'createStereoPair') { + my $pairString = uri_unescape($params[0]); + + if (SONOS_CheckProxyObject($udn, $SONOS_DevicePropertiesProxy{$udn})) { + SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_UPnPAnswerMessage($SONOS_DevicePropertiesProxy{$udn}->CreateStereoPair($pairString))); + } + } elsif ($workType eq 'separateStereoPair') { + my $pairString = uri_unescape($params[0]); + + if (SONOS_CheckProxyObject($udn, $SONOS_DevicePropertiesProxy{$udn})) { + SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_UPnPAnswerMessage($SONOS_DevicePropertiesProxy{$udn}->SeparateStereoPair($pairString))); + } } elsif ($workType eq 'emptyPlaylist') { if (SONOS_CheckProxyObject($udn, $SONOS_AVTransportControlProxy{$udn})) { SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_UPnPAnswerMessage($SONOS_AVTransportControlProxy{$udn}->RemoveAllTracksFromQueue())); @@ -2560,7 +2572,7 @@ sub SONOS_Discover() { my $playlistName = $params[0]; my $playlistType = $params[1]; - $playlistName =~s/ $//g; + $playlistName =~ s/ $//g; if (SONOS_CheckProxyObject($udn, $SONOS_AVTransportControlProxy{$udn})) { if ($playlistType eq ':m3ufile:') { diff --git a/fhem/FHEM/21_SONOSPLAYER.pm b/fhem/FHEM/21_SONOSPLAYER.pm index 5a13f9ba0..d08c3a21b 100755 --- a/fhem/FHEM/21_SONOSPLAYER.pm +++ b/fhem/FHEM/21_SONOSPLAYER.pm @@ -1,14 +1,12 @@ ######################################################################################## # -# SONOSPLAYER.pm (c) by Reiner Leins, 2014 +# SONOSPLAYER.pm (c) by Reiner Leins, December 2014 # rleins at lmsoft dot de # # $Id$ # # FHEM module to work with Sonos-Zoneplayers # -# Internal Version 2.6 - December, 2014 -# # define SONOSPLAYER # # where may be replaced by any name string @@ -155,6 +153,8 @@ my %sets = ( 'GroupVolume' => 'volumelevel', 'SnapshotGroupVolume' => '', 'GroupMute' => 'state', + 'CreateStereoPair' => 'RightPlayer', + 'SeparateStereoPair' => '', 'Reboot' => '', 'Wifi' => 'state', 'Name' => 'roomName', @@ -641,6 +641,35 @@ sub SONOSPLAYER_Set($@) { return undef; } + } elsif (lc($key) eq 'createstereopair') { + my $rightPlayer = InternalVal($value, 'UDN', ''); + return 'RightPlayer not found!' if (!$rightPlayer); + + # UDN korrigieren + my $leftPlayerShort = $1 if ($udn =~ m/(.*)_MR/); + my $rightPlayerShort = $1 if ($rightPlayer =~ m/(.*)_MR/); + + # Anweisung an den neuen linken Lautsprecher absetzen + SONOS_DoWork($udn, 'createStereoPair', uri_escape($leftPlayerShort.':LF,LF;'.$rightPlayerShort.':RF,RF')); + } elsif (lc($key) eq 'separatestereopair') { + $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); + $udn = $hash->{UDN}; + + # UDN korrigieren + my $leftPlayerShort = $1 if ($udn =~ m/(.*)_MR/); + + # StereoPartner herausfinden + my $rightPlayer = ''; + foreach my $dev (SONOS_getAllSonosplayerDevices()) { + $rightPlayer = $dev->{UDN} if ((ReadingsVal($dev->{NAME}, 'ZoneGroupID', '') =~ m/^$leftPlayerShort:/) && ($dev->{UDN} !~ m/^${leftPlayerShort}_MR/)); + } + return 'RightPlayer not found!' if (!$rightPlayer); + + # UDN korrigieren + my $rightPlayerShort = $1 if ($rightPlayer =~ m/(.*)_MR/); + + # Anweisung an den alten linken Lautsprecher absetzen + SONOS_DoWork($udn, 'separateStereoPair', uri_escape($leftPlayerShort.':LF,LF;'.$rightPlayerShort.':RF,RF')); } elsif (lc($key) eq 'reboot') { readingsSingleUpdate($hash, 'LastActionResult', 'Reboot properly initiated', 1); @@ -934,6 +963,9 @@ sub SONOSPLAYER_Log($$$) {
  • set <name> AddMember <devicename>
    Adds the given devicename to the current device as a groupmember. The current playing of the current device goes on and will be transfered to the given device (the new member).
  • +
  • +set <name> CreateStereoPair <rightPlayerDevicename> +
    Adds the given devicename to the current device as the right speaker of a stereopair. The current playing of the current device goes on (as left-side speaker) and will be transfered to the given device (as right-side speaker).
  • set <name> GroupMute <State>
    Sets the mute state of the complete group in one step. The value can be on or off.
  • @@ -943,6 +975,9 @@ sub SONOSPLAYER_Log($$$) {
  • set <name> RemoveMember <devicename>
    Removes the given device, so that they both are not longer a group. The current playing of the current device goes on normally. The cutted device stops his playing and has no current playlist anymore (since Sonos Version 4.2 the old playlist will be restored).
  • +
  • +set <name> SeparateStereoPair +
    Divides the stereo-pair into two independant devices.
  • set <name> SnapshotGroupVolume
    Save the current volume-relation of all players of the same group. It's neccessary for the use of "GroupVolume" and is stored until the next call of "SnapshotGroupVolume".
  • @@ -1207,6 +1242,9 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
  • set <name> AddMember <devicename>
    Fügt dem Device das übergebene Device als Gruppenmitglied hinzu. Die Wiedergabe des aktuellen Devices bleibt erhalten, und wird auf das angegebene Device mit übertragen.
  • +
  • +set <name> CreateStereoPair <rightPlayerDevicename> +
    Fügt dem Device das übergebene Device als rechtes Stereopaar-Element hinzu. Die Wiedergabe des aktuellen Devices bleibt erhalten (als linker Lautsprecher), und wird auf das angegebene Device mit übertragen (als rechter Lautsprecher).
  • set <name> GroupMute <State>
    Setzt den Mute-Zustand für die komplette Gruppe in einem Schritt. Der Wert kann on oder off sein.
  • @@ -1216,6 +1254,9 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
  • set <name> RemoveMember <devicename>
    Entfernt dem Device das übergebene Device, sodass die beiden keine Gruppe mehr bilden. Die Wiedergabe des aktuellen Devices läuft normal weiter. Das abgetrennte Device stoppt seine Wiedergabe, und hat keine aktuelle Abspielliste mehr (seit Sonos Version 4.2 hat der Player wieder die Playliste von vorher aktiv).
  • +
  • +set <name> SeparateStereoPair +
    Trennt das Stereopaar wieder auf.
  • set <name> SnapshotGroupVolume
    Legt das Lautstärkeverhältnis der aktuellen Player der Gruppe für folgende '''GroupVolume'''-Aufrufe fest. Dieses festgelegte Verhältnis wird bis zum nächsten Aufruf von '''SnapshotGroupVolume''' beibehalten.