From 5ebfbe67c4737d1de99e502560ac2d415624e54d Mon Sep 17 00:00:00 2001 From: rleins <> Date: Thu, 31 Dec 2015 11:29:40 +0000 Subject: [PATCH] SONOS: Bugfix Enlargement of ZoneGroupID, feature seconds as parameter for SnoozeAlarm and SleepTimer git-svn-id: https://svn.fhem.de/fhem/trunk@10316 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/FHEM/00_SONOS.pm | 32 +++++++++--------------------- fhem/FHEM/21_SONOSPLAYER.pm | 27 +++++++++++++------------ fhem/FHEM/lib/UPnP/ControlPoint.pm | 6 ++---- 3 files changed, 25 insertions(+), 40 deletions(-) diff --git a/fhem/FHEM/00_SONOS.pm b/fhem/FHEM/00_SONOS.pm index ea60ace90..d610a2d5e 100755 --- a/fhem/FHEM/00_SONOS.pm +++ b/fhem/FHEM/00_SONOS.pm @@ -49,6 +49,10 @@ # Cover von Amazon funktionieren nicht # # SVN-History: +# 31.12.2015 +# Das Reading ZoneGroupID wurde immer länger (mit ":__"), wenn Gruppierungen anderer Player verändert wurden. +# Bei den Settern von "SleepTimer" und "SnoozeAlarm" kann man jetzt auch eine Zahl als Dauer in Sekunden angeben. Dazu wurde auch die Doku entsprechend angepasst. +# In der ControlPoint.pm wurde eine Fehlermeldung korrigiert # 24.12.2015 # Wenn ein Player ein "ß" (oder auch andere besondere Zeichen, wie Smilies o.ä.) im Namen hatte, funktionierte die Erkennung nicht mehr, und der SubThread verstarb. # Man kann nun mittels dem Setter "Name" auch "ß" und Smilies o.ä. im Playernamen setzen. @@ -67,23 +71,6 @@ # Bei der Verwendung von "set Sonos Groups Reset" tauchte eine Fehlermeldung wegen eines Leerstrings auf. # Es wurde ein neuer Setter "LoadFavourite" eingebaut, der einem StartFavourite mit der Angabe von NoStart entspricht. # Man kann bei LoadSearchList nun auch an das Ende der aktuellen Abspielliste anhängen lassen. Dazu muss man an den Parameter maxElem ein "+" anhängen. -# 07.12.2015 -# Zwei neue Setter "DialogLevel" und "NightMode", die an einer PlayBar ausgeführt werden können. -# "Set Sonos Groups" hat eine neue Option "Reset", mit der alle Gruppen in einem Rutsch aufgelöst werden können. -# ControlPoint.pm: Bei einem Fehler beim Verbindungsaufbau zum Player wurde aus dem "carp" ein "croak" gemacht. Dadurch greifen die Auffangmechanismen. -# Beim Verlieren des Gruppenmaster stand der TransportState bei allen zukünftigen NICHT-Gruppenmastern bis zum nächsten Titelwechsel auf "ERROR". -# Man kann bei einer Speak-Definition nun auch den Parameter %textescaped% verwenden, um den URL-Enkodierten Text einzufügen. -# Die Smartmatch-Fehlermeldung wird nun unterdrückt -# Die Fehlerausgabe bei fehlenden Set- oder Get-Parametern enthält jetzt auch den zulässigen Wertebereich des Parameters (z.B. '(0..100)' für die Lautstärke), sowie die optionalen Parameter -# StartSearchList hat die Wiedergabe immer neu gestartet, obwohl das u.U. gar nicht nötig war. -# Die Attribute für die Lautstärke (minVolume, maxVolume, minVolumeHeadphone und maxVolumeHeadphone) können nun im laufenden Betrieb geändert werden und die neuen Grenzen werden sofort sichergestellt. -# Es gibt einen neuen Setter 'MakeStandaloneGroup', mit dem man einen Player aus seiner Gruppe lösen kann. -# Es wird der Provider Amazon nun mit angezeigt. -# Es gibt nun ein Attribut usedonlyIPs, mit dem man die IP-Adressen der zu verwendenden Player angeben kann. Damit ist man manchmal besser dran, als mit dem Ausschluss von einzelnen Adressen -# Es gibt einen neuen Setter "TruePlay". -# Es gibt ein neues Attribut 'SpeakGoogleURL' für die Definition der zu verwendenden Google-URL für die Sprachausgabe -# Die Standard-Google-URL wurde nach neuen Hinweisen angepasst. -# Es gibt neue Setter "AudioDelayLeftRear" (Abstand hinterer linker Lautsprecher), "AudioDelayRightRear" (Abstand hinterer rechter Lautsprecher) und "SubPolarity" (Sub Aufstellung) bei einem 5.1 Surroundsystem. # ######################################################################################## # @@ -7294,6 +7281,8 @@ sub SONOS_ZoneGroupTopologyCallback($$) { $zoneGroupID = $2; my $member = $3; + $zoneGroupID .= ':__' if ($zoneGroupID !~ m/:/); + my $topoType = ''; # Ist dieser Player in einem ChannelMapSet (also einer Paarung) enthalten? if ($member =~ m/ChannelMapSet=".*?$udnShort:(.*?),(.*?)[;"]/is) { @@ -7324,9 +7313,10 @@ sub SONOS_ZoneGroupTopologyCallback($$) { my $roomName = SONOS_Client_Data_Retreive($udn, 'reading', 'roomName', ''); SONOS_Client_Data_Refresh('ReadingsSingleUpdateIfChanged', $udn, 'roomNameAlias', $roomName.$aliasSuffix); + + SONOS_Client_Data_Refresh('ReadingsSingleUpdateIfChanged', $udn, 'ZoneGroupID', $zoneGroupID); + SONOS_Client_Data_Refresh('ReadingsSingleUpdateIfChanged', $udn, 'fieldType', $fieldType); } - SONOS_Client_Data_Refresh('ReadingsSingleUpdateIfChanged', $udn, 'ZoneGroupID', $zoneGroupID.':__'); - SONOS_Client_Data_Refresh('ReadingsSingleUpdateIfChanged', $udn, 'fieldType', $fieldType); # ZoneGroupName: Welchen Namen hat die aktuelle Gruppe? my $zoneGroupName = SONOS_Client_Data_Retreive($udn, 'reading', 'ZoneGroupName', ''); @@ -8997,7 +8987,6 @@ You can start this client on your own (to let it run instantly and independent f
Sets the current groups on the whole Sonos-System. The format is the same as retreived by getter 'Groups'.
A reserved word is Reset. It can be used to directly extract all players out of their groups. -

Get

-

Attributes

'''Attention'''
The most of the attributes can only be used after a restart of fhem, because it must be initially transfered to the subprocess. @@ -9167,7 +9155,6 @@ Man kann den Server unabhängig von FHEM selbst starten (um ihn dauerhaft und un
Setzt die aktuelle Gruppierungskonfiguration der Sonos-Systemlandschaft. Das Format ist jenes, welches auch von dem Get-Befehl 'Groups' geliefert wird.
Hier kann als GroupDefinition das Wort Reset verwendet werden, um alle Player aus ihren Gruppen zu entfernen. -

Get

-

Attribute

'''Hinweis'''
Die Attribute werden erst bei einem Neustart von Fhem verwendet, da diese dem SubProzess initial zur Verfügung gestellt werden müssen. diff --git a/fhem/FHEM/21_SONOSPLAYER.pm b/fhem/FHEM/21_SONOSPLAYER.pm index 47d231bdd..66d54c318 100755 --- a/fhem/FHEM/21_SONOSPLAYER.pm +++ b/fhem/FHEM/21_SONOSPLAYER.pm @@ -46,6 +46,7 @@ use warnings; use URI::Escape; use Thread::Queue; use Encode; +use Scalar::Util qw(reftype looks_like_number); # SmartMatch-Fehlermeldung unterdrücken... no if $] >= 5.017011, warnings => 'experimental::smartmatch'; @@ -122,9 +123,9 @@ my %sets = ( 'Track' => 'tracknumber|Random', 'currentTrack' => 'tracknumber', 'Alarm' => 'create|update|delete ID valueHash', - 'SnoozeAlarm' => 'time', - 'DailyIndexRefreshTime' => 'time', - 'SleepTimer' => 'time', + 'SnoozeAlarm' => 'timestring|seconds', + 'DailyIndexRefreshTime' => 'timestring', + 'SleepTimer' => 'timestring|seconds', 'AddMember' => 'member_devicename', 'RemoveMember' => 'member_devicename', 'MakeStandaloneGroup' => '', @@ -802,6 +803,8 @@ sub SONOSPLAYER_Set($@) { $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); $udn = $hash->{UDN}; + $value = SONOS_ConvertSecondsToTime($value) if (looks_like_number($value)); + SONOS_DoWork($udn, 'setSnoozeAlarm', $value); } elsif (lc($key) eq 'dailyindexrefreshtime') { SONOS_DoWork($udn, 'setDailyIndexRefreshTime', $value); @@ -809,6 +812,8 @@ sub SONOSPLAYER_Set($@) { $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); $udn = $hash->{UDN}; + $value = SONOS_ConvertSecondsToTime($value) if (looks_like_number($value)); + SONOS_DoWork($udn, 'setSleepTimer', $value); } elsif (lc($key) eq 'addmember') { $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash); @@ -1115,7 +1120,7 @@ sub SONOSPLAYER_Log($$$) { AudioDelayRightRear <Level>
Sets the audiodelayrightrear of the player to the given value. The value can range from 0 to 2. The values has the following meanings: 0: >3m, 1: >0.6m und <3m, 2: <0.6m
  • -DailyIndexRefreshTime <time> +DailyIndexRefreshTime <Timestring>
    Sets the current DailyIndexRefreshTime for the whole bunch of Zoneplayers.
  • DialogLevel <State> @@ -1142,7 +1147,7 @@ sub SONOSPLAYER_Log($$$) { RoomIcon <Iconname>
    Sets the Icon for this Zone
  • -SnoozeAlarm <Time> +SnoozeAlarm <Timestring|Seconds>
    Snoozes a currently playing alarm for the given time
  • SubEnable <State> @@ -1251,7 +1256,7 @@ sub SONOSPLAYER_Log($$$) { ShuffleT
    Toggles the shuffle-state. Retrieves the new state as the result.
  • -SleepTimer <Time> +SleepTimer <Timestring|Seconds>
    Sets the Sleeptimer to the given Time. It must be in the full format of "HH:MM:SS". Deactivate with "00:00:00" or "off".
  • Treble <TrebleValue> @@ -1337,7 +1342,6 @@ sub SONOSPLAYER_Log($$$) {
    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".
  • -

    Get

    -

    Attributes

    '''Attention'''
    The attributes can only be used after a restart of fhem, because it must be initially transfered to the subprocess. @@ -1477,7 +1480,7 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p AudioDelayRightRear <Level>
    Setzt den AudioDelayRightRear des Players auf den angegebenen Wert. Der Wert kann zwischen 0 und 2 liegen. Wobei die Werte folgende Bedeutung haben: 0: >3m, 1: >0.6m und <3m, 2: <0.6m
  • -DailyIndexRefreshTime <time> +DailyIndexRefreshTime <Timestring>
    Setzt die aktuell gültige DailyIndexRefreshTime für alle Zoneplayer.
  • DialogLevel <State> @@ -1504,7 +1507,7 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p RoomIcon <Iconname>
    Legt das Icon für die Zone fest
  • -SnoozeAlarm <Time> +SnoozeAlarm <Timestring|Seconds>
    Unterbricht eine laufende Alarmwiedergabe für den übergebenen Zeitraum.
  • SubEnable <State> @@ -1613,7 +1616,7 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p ShuffleT
    Schaltet den Zustand des Shuffle-Zustands um. Liefert den aktuell gültigen Shuffle-Zustand.
  • -SleepTimer <Time> +SleepTimer <Timestring|Seconds>
    Legt den aktuellen SleepTimer fest. Der Wert muss ein kompletter Zeitstempel sein (HH:MM:SS). Zum Deaktivieren darf der Zeitstempel nur Nullen enthalten oder das Wort 'off'.
  • Treble <TrebleValue> @@ -1699,7 +1702,6 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
    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.
  • -

    Get

    -

    Attribute

    '''Hinweis'''
    Die Attribute werden erst bei einem Neustart von Fhem verwendet, da diese dem SubProzess initial zur Verfügung gestellt werden müssen. diff --git a/fhem/FHEM/lib/UPnP/ControlPoint.pm b/fhem/FHEM/lib/UPnP/ControlPoint.pm index e3a1b23ba..eb4dc06aa 100644 --- a/fhem/FHEM/lib/UPnP/ControlPoint.pm +++ b/fhem/FHEM/lib/UPnP/ControlPoint.pm @@ -279,10 +279,8 @@ sub _createDevice { ($device, $base) = $self->parseDeviceDescription($response->content, {Location => $location}, {ControlPoint => $self}); - } - else { - carp("Loading device description failed with error: " . - $response->code . " " . $response->message); + } else { + carp("Loading device description failed with error: " . $response->code . " " . $response->message) if ($response->code != 200); } pop(@LWP::Protocol::http::EXTRA_SOCK_OPTS);