[...]
+ %SONOS_BookmarkTitleDefinition = ();
+ my $def = $elemValues{$1};
+
+ foreach my $elem (split(/ /, $def)) {
+ # Sicherstellen, das alle Stellen vorhanden sind...
+ $elem .= ':' while (SONOS_CountInString(':', $elem) < 6);
+
+ # Zerlegen
+ if ($elem =~ m/(.*?):(.*?):(.*?):(\d*):(\d*):(.*?):(.*)/) {
+ my $key = $1;
+ $SONOS_BookmarkTitleDefinition{$key}{PlayerDeviceRegEx} = ($2 ne '') ? $2 : '.*';
+ $SONOS_BookmarkTitleDefinition{$key}{TrackURIRegEx} = ($3 ne '') ? $3 : '.*';
+ $SONOS_BookmarkTitleDefinition{$key}{MinTitleLength} = ($4 ne '') ? $4 : 60;
+ $SONOS_BookmarkTitleDefinition{$key}{RemainingLength} = ($5 ne '') ? $5 : 10;
+ $SONOS_BookmarkTitleDefinition{$key}{MaxAge} = ($6 ne '') ? $6 : '28*24*60*60';
+ $SONOS_BookmarkTitleDefinition{$key}{ReadOnly} = 0;
+ $SONOS_BookmarkTitleDefinition{$key}{ReadOnly} = 1 if (lc($7) eq 'readonly');
+ $SONOS_BookmarkTitleDefinition{$key}{Chapter} = 0;
+ $SONOS_BookmarkTitleDefinition{$key}{Chapter} = 1 if (lc($7) eq 'chapter');
+
+ # RegEx prüfen...
+ eval { "" =~ m/$SONOS_BookmarkTitleDefinition{$key}{PlayerDeviceRegEx}/ };
+ if($@) {
+ SONOS_Log undef, 0, 'SetData - bookmarkTitleDefinition: Bad PlayerDeviceRegExp "'.$SONOS_BookmarkTitleDefinition{$key}{PlayerDeviceRegEx}.'": '.$@;
+ delete($SONOS_BookmarkTitleDefinition{$key});
+ next;
+ }
+
+ # RegEx prüfen...
+ eval { "" =~ m/$SONOS_BookmarkTitleDefinition{$key}{TrackURIRegEx}/ };
+ if($@) {
+ SONOS_Log undef, 0, 'SetData - bookmarkTitleDefinition: Bad TrackURIRegEx "'.$SONOS_BookmarkTitleDefinition{$key}{TrackURIRegEx}.'": '.$@;
+ delete($SONOS_BookmarkTitleDefinition{$key});
+ next;
+ }
+
+ # MaxAge berechnen...
+ eval { $SONOS_BookmarkTitleDefinition{$key}{MaxAge} = eval($SONOS_BookmarkTitleDefinition{$key}{MaxAge}); };
+ if($@) {
+ SONOS_Log undef, 0, 'SetData - bookmarkTitleDefinition: Bad MaxAge "'.$SONOS_BookmarkTitleDefinition{$key}{MaxAge}.'": '.$@;
+ delete($SONOS_BookmarkTitleDefinition{$key});
+ next;
+ }
+ }
+ }
+
+ SONOS_Log undef, 4, 'BookmarkTitleDefinition: '.Dumper(\%SONOS_BookmarkTitleDefinition);
+ }
}
}
@@ -8053,6 +8370,29 @@ sub SONOS_Client_ConsumeMessage($$) {
}
}
+########################################################################################
+# SONOS_getBookmarkGroupKeys: Retrieves the approbriate GroupKeys to the given UDN
+########################################################################################
+sub SONOS_getBookmarkGroupKeys($$;$) {
+ my ($type, $udn, $disabled) = @_;
+ $disabled = 0 if (!defined($disabled));
+
+ my $deviceName = SONOS_Client_Data_Retreive($udn, 'def', 'NAME', $udn);
+
+ my @result = ();
+ my $hashList = \%SONOS_BookmarkTitleDefinition;
+ $hashList = \%SONOS_BookmarkQueueDefinition if (lc($type) eq 'queue');
+
+ foreach my $key (keys %{$hashList}) {
+ if ($deviceName =~ m/$hashList->{$key}{PlayerDeviceRegEx}/) {
+ push(@result, $key) if (!$disabled && (!defined($hashList->{$key}{Disabled}) || !$hashList->{$key}{Disabled}));
+ push(@result, $key) if ($disabled && defined($hashList->{$key}{Disabled}) && $hashList->{$key}{Disabled});
+ }
+ }
+
+ return @result;
+}
+
########################################################################################
# SONOS_Client_IsAlive: Checks of the clients are already available
########################################################################################
@@ -8147,7 +8487,7 @@ sub SONOS_Client_IsAlive() {
SONOS
FHEM-Module to communicate with the Sonos-System via UPnP
For more informations have also a closer look at the wiki at http://www.fhemwiki.de/wiki/SONOS
-For correct functioning of this module it is neccessary to have some Perl-Modules installed, which has eventually installed manually:
+For correct functioning of this module it is neccessary to have some Perl-Modules installed, which are eventually installed already manually:
LWP::Simple
LWP::UserAgent
SOAP::Lite
@@ -8206,6 +8546,20 @@ You can start this client on your own (to let it run instantly and independent f
Stop
Alias for StopAll.
+- Bookmark-Commands
- Group-Commands
-
Groups <GroupDefinition>
@@ -8238,6 +8592,14 @@ The order in the sublists are important, because the first entry defines the so-
pingType <string>
One of (none,tcp,udp,icmp,syn). Defines which pingType for alive-Checking has to be used. If set to 'none' no checks will be done.
+- Bookmark Configuration
- Proxy Configuration
generateProxyAlbumArtURLs <int>
One of (0, 1). If defined, all Cover-Links (the readings "currentAlbumArtURL" and "nextAlbumArtURL") are generated as links to the internal Sonos-Module-Proxy. It can be useful if you access Fhem over an external proxy and therefore have no access to the local network (the URLs are direct URLs to the Sonosplayer instead).
@@ -8347,6 +8709,20 @@ Man kann den Server unabhängig von FHEM selbst starten (um ihn dauerhaft und un
Stop
Synonym für StopAll.
+Bookmark-Befehle
Gruppenbefehle
-
Groups <GroupDefinition>
@@ -8379,6 +8755,14 @@ Dabei ist die Reihenfolge innerhalb der Unterlisten wichtig, da der erste Eintra
pingType <string>
Eines von (none,tcp,udp,icmp,syn). Gibt an, welche Methode für die Ping-Überprüfung verwendet werden soll. Wenn 'none' angegeben wird, dann wird keine Überprüfung gestartet.
+Bookmark-Einstellungen
Proxy-Einstellungen
generateProxyAlbumArtURLs <int>
Aus (0, 1). Wenn aktiviert, werden alle Cober-Links als Proxy-Aufrufe an Fhem generiert. Dieser Proxy-Server wird vom Sonos-Modul bereitgestellt. In der Grundeinstellung erfolgt kein Caching der Cover, sondern nur eine Durchreichung der Cover von den Sonosplayern (Damit ist der Zugriff durch einen externen Proxyserver auf Fhem möglich).
diff --git a/fhem/FHEM/21_SONOSPLAYER.pm b/fhem/FHEM/21_SONOSPLAYER.pm
index 141547e23..45d070cd6 100755
--- a/fhem/FHEM/21_SONOSPLAYER.pm
+++ b/fhem/FHEM/21_SONOSPLAYER.pm
@@ -17,47 +17,6 @@
#
# ab 2.2 Changelog nur noch in der Datei 00_SONOS
#
-# 2.1: Neuen Befehl 'CurrentPlaylist' eingeführt
-#
-# 2.0: Neue Konzeptbasis eingebaut
-# Man kann Gruppen auf- und wieder abbauen
-# PlayURI kann nun einen Devicenamen entgegennehmen, und spielt dann den AV-Eingang des angegebenen Raumes ab
-# Alle Steuerbefehle werden automatisch an den jeweiligen Gruppenkoordinator gesendet, sodass die Abspielanweisungen immer korrekt durchgeführt werden
-# Es gibt neue Lautstärke- und Mute-Einstellungen für Gruppen ingesamt
-#
-# 1.12: TrackURI hinzugefügt
-# Alarmbenutzung hinzugefügt
-# Schlummerzeit hinzugefügt (Reading SleepTimer)
-# DailyIndexRefreshTime hinzugefügt
-#
-# 1.11: Shuffle, Repeat und CrossfadeMode können nun gesetzt und abgefragt werden
-#
-# 1.10: LastAction-Readings werden nun nach eigener Konvention am Anfang groß geschrieben. Damit werden 'interne Variablen' von den Informations-Readings durch Groß/Kleinschreibung unterschieden
-# Volume, Balance und HeadphonConnected können nun auch in InfoSummarize und StateVariable verwendet werden. Damit sind dies momentan die einzigen 'interne Variablen', die dort verwendet werden können
-# Attribut 'generateVolumeEvent' eingeführt.
-# Getter und Setter 'Balance' eingeführt.
-# Reading 'HeadphoneConnected' eingeführt.
-# Reading 'Mute' eingeführt.
-# InfoSummarize-Features erweitert: 'instead' und 'emptyval' hinzugefügt
-#
-# 1.9:
-#
-# 1.8: minVolume und maxVolume eingeführt. Damit kann nun der Lautstärkeregelbereich der ZonePlayer festgelegt werden
-#
-# 1.7: Fehlermeldung bei aktivem TempPlaying und damit Abbruch der Anforderung deutlicher geschrieben
-#
-# 1.6: Speak hinzugefügt
-#
-# Versionsnummer zu 00_SONOS angeglichen
-#
-# 1.3: Zusätzliche Befehle hinzugefügt
-#
-# 1.2: Einrückungen im Code korrigiert
-#
-# 1.1: generateInfoAnswerOnSet eingeführt (siehe Doku im Wiki)
-# generateVolumeSlider eingeführt (siehe Doku im Wiki)
-#
-# 1.0: Initial Release
#
########################################################################################
#
@@ -166,10 +125,16 @@ my %sets = (
'Wifi' => 'state',
'Name' => 'roomName',
'RoomIcon' => 'iconName',
+ # 'JumpToChapter' => 'groupname chaptername',
'LoadSearchlist' => 'category categoryElem titleFilter/albumFilter/artistFilter maxElems',
'StartSearchlist' => 'category categoryElem titleFilter/albumFilter/artistFilter maxElems',
'ResetAttributesToDefault' => 'deleteOtherAttributes',
- 'ExportSonosBibliothek' => 'filename'
+ 'ExportSonosBibliothek' => 'filename',
+ 'SurroundEnable' => 'state',
+ 'SurroundLevel' => 'surroundlevel', #-15..15
+ 'SubEnable' => 'state',
+ 'SubGain' => 'gainlevel', #-15..15
+ 'AudioDelay' => 'delaylevel' #0..5
);
my @possibleRoomIcons = qw(bathroom library office foyer dining tvroom hallway garage garden guestroom den bedroom kitchen portable media family pool masterbedroom playroom patio living);
@@ -500,6 +465,31 @@ sub SONOSPLAYER_Set($@) {
SONOS_DoWork($udn, 'setBass', $value);
} elsif (lc($key) eq 'treble') {
SONOS_DoWork($udn, 'setTreble', $value);
+ } elsif (lc($key) eq 'surroundenable') {
+ $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash);
+ $udn = $hash->{UDN};
+
+ SONOS_DoWork($udn, 'setEQ', 'SurroundEnable', SONOS_ConvertWordToNum($value));
+ } elsif (lc($key) eq 'surroundlevel') {
+ $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash);
+ $udn = $hash->{UDN};
+
+ SONOS_DoWork($udn, 'setEQ', 'SurroundLevel', $value);
+ } elsif (lc($key) eq 'subenable') {
+ $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash);
+ $udn = $hash->{UDN};
+
+ SONOS_DoWork($udn, 'setEQ', 'SubEnable', SONOS_ConvertWordToNum($value));
+ } elsif (lc($key) eq 'subgain') {
+ $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash);
+ $udn = $hash->{UDN};
+
+ SONOS_DoWork($udn, 'setEQ', 'SubGain', $value);
+ } elsif (lc($key) eq 'audiodelay') {
+ $hash = SONOSPLAYER_GetRealTargetPlayerHash($hash);
+ $udn = $hash->{UDN};
+
+ SONOS_DoWork($udn, 'setEQ', 'AudioDelay', $value);
} elsif (lc($key) eq 'groupmute') {
$hash = SONOSPLAYER_GetRealTargetPlayerHash($hash);
$udn = $hash->{UDN};
@@ -830,6 +820,8 @@ sub SONOSPLAYER_Set($@) {
} else {
return 'Wrong icon name. Use one of "'.join('", "', @possibleRoomIcons).'".';
}
+ } elsif (lc($key) eq 'JumpToChapter') {
+ SONOS_DoWork($udn, 'JumpToChapter', $value, $value2);
} elsif (lc($key) eq 'resetattributestodefault') {
SONOS_DoWork($udn, 'setResetAttributesToDefault', SONOS_getDeviceDefHash(undef)->{NAME}, $hash->{NAME}, $value);
} else {
@@ -1073,6 +1065,9 @@ sub SONOSPLAYER_Log($$$) {
Sets the track with the given tracknumber as the current title. If the tracknumber is the word Random a random track will be selected.
Playing Settings
+-
+
AudioDelay <Level>
+
Sets the audiodelay of the playbar to the given value. The value can range from 0 to 5. Retrieves the new audiodelay as the result.
-
Balance <BalanceValue>
Sets the balance to the given value. The value can range from -100 (full left) to 100 (full right). Retrieves the new balancevalue as the result.
@@ -1109,6 +1104,18 @@ sub SONOSPLAYER_Log($$$) {
-
SleepTimer <Time>
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".
+-
+
SubEnable <State>
+
Sets the substate for sub-systems. Retrieves the new state as the result.
+-
+
SubGain <Level>
+
Sets the sub-gain for sub-systems. The value can range from -15 to 15. Retrieves the new gainlevel as the result.
+-
+
SurroundEnable <State>
+
Sets the surround-state for surround-systems (like playbars). Retrieves the new state as the result.
+-
+
SurroundLevel <Level>
+
Sets the surround-level for surround-systems (like playbars). The value can range from -15 to 15. Retrieves the new level as the result.
-
Treble <TrebleValue>
Sets the treble to the given value. The value can range from -10 to 10. Retrieves the new treblevalue as the result.
@@ -1378,6 +1385,9 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
Aktiviert den angebenen Titel der aktuellen Abspielliste. Wenn als Tracknummer der Wert Random angegeben wird, dann wird eine zufällige Trackposition ausgewählt.
Einstellungen zum Abspielen
+-
+
AudioDelay <Level>
+
Setzt den AudioDelay der Playbar auf den angegebenen Wert. Der Wert kann zwischen 0 und 5 liegen. Gibt das wirklich eingestellte AudioDelay als Ergebnis zurück.
-
Balance <BalanceValue>
Setzt die Balance auf den angegebenen Wert. Der Wert kann zwischen -100 (voll links) bis 100 (voll rechts) sein. Gibt die wirklich eingestellte Balance als Ergebnis zurück.
@@ -1414,6 +1424,18 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
-
SleepTimer <Time>
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'.
+-
+
SubEnable <State>
+
Legt den Zustand des Sub-Zustands fest. Liefert den aktuell gültigen Sub-Zustand.
+-
+
SubGain <Level>
+
Setzt den SubGain auf den angegebenen Wert. Der Wert kann zwischen -15 und 15 liegen. Gibt den wirklich eingestellten SubGain als Ergebnis zurück.
+-
+
SurroundEnable <State>
+
Legt den Zustand des Surround-Zustands fest. Liefert den aktuell gültigen Surround-Zustand.
+-
+
SurroundLevel <Level>
+
Setzt den Surroundlevel auf den angegebenen Wert. Der Wert kann zwischen -15 und 15 liegen. Gibt den wirklich eingestellten SurroundLevel als Ergebnis zurück.
-
Treble <TrebleValue>
Setzt den Treblelevel auf den angegebenen Wert. Der Wert kann zwischen -10 bis 10 sein. Gibt den wirklich eingestellten Treblelevel als Ergebnis zurück.
diff --git a/fhem/FHEM/lib/UPnP/ControlPoint.pm b/fhem/FHEM/lib/UPnP/ControlPoint.pm
index c71b59659..60e6c42d3 100644
--- a/fhem/FHEM/lib/UPnP/ControlPoint.pm
+++ b/fhem/FHEM/lib/UPnP/ControlPoint.pm
@@ -1005,7 +1005,7 @@ sub renew {
$self->{_startTime} = Time::HiRes::time();
}
else {
- carp("Renewal of subscription failed with error: " .
+ croak("Renewal of subscription failed with error: " .
$response->code . " " . $response->message);
}