diff --git a/fhem/FHEM/00_SONOS.pm b/fhem/FHEM/00_SONOS.pm index 765b7f459..998767cf8 100755 --- a/fhem/FHEM/00_SONOS.pm +++ b/fhem/FHEM/00_SONOS.pm @@ -48,6 +48,8 @@ # # SVN-History: # 06.02.2015 +# Der Getter "EthernetPortStatus" hat jetzt auch die Portnummern 2 und 3 zur Auswahl. +# Es gibt ein neues Reading "OutputFixed" sowie ein zugehöriger Setter zum Setzen des Wertes. # Es wurde im Standard-RemoteControl-Design ein :blank zwischen den Steuerbefehlen und den drei Umschaltbefehlen ("MuteT", "ShuffleT" und "RepeatT") eingefügt. # Es gibt ein neues Reading "roomNameAlias", das den Namen enthält, der für das Attribut "alias" beim Erkennen des Players verwendet werden würde (z.B. "Wohnzimmer - Rechts"). Wird zu Laufzeit mit aktualisiert. # Es gibt zwei neue Setter-Befehle "LoadSearchlist" und "StartSearchlist". Mit diesen kann eine dynamisch erzeugte Playliste mit Titeln aus der Sonos-Bibliothek geladen werden. Nähere Informationen dazu im Wiki. @@ -402,7 +404,7 @@ my %sets = ( my @SONOS_PossibleDefinitions = qw(NAME INTERVAL); my @SONOS_PossibleAttributes = qw(targetSpeakFileHashCache targetSpeakFileTimestamp targetSpeakDir targetSpeakURL Speak0 Speak1 Speak2 Speak3 Speak4 SpeakCover Speak1Cover Speak2Cover Speak3Cover Speak4Cover minVolume maxVolume minVolumeHeadphone maxVolumeHeadphone getAlarms disable generateVolumeEvent buttonEvents characterDecoding generateProxyAlbumArtURLs proxyCacheTime); -my @SONOS_PossibleReadings = qw(AlarmList AlarmListIDs UserID_Spotify UserID_Napster location SleepTimerVersion Mute HeadphoneConnected Balance Volume Loudness Bass Treble AlarmListVersion ZonePlayerUUIDsInGroup ZoneGroupID fieldType ZoneGroupName roomName roomNameAlias roomIcon LineInConnected currentAlbum currentArtist currentTitle); +my @SONOS_PossibleReadings = qw(AlarmList AlarmListIDs UserID_Spotify UserID_Napster location SleepTimerVersion Mute OutputFixed HeadphoneConnected Balance Volume Loudness Bass Treble AlarmListVersion ZonePlayerUUIDsInGroup ZoneGroupID fieldType ZoneGroupName roomName roomNameAlias roomIcon LineInConnected currentAlbum currentArtist currentTitle); # Obsolete Einstellungen... my $SONOS_UseTelnetForQuestions = 1; @@ -2351,6 +2353,15 @@ sub SONOS_Discover() { # Wert wieder abholen, um das wahre Ergebnis anzeigen zu können SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_ConvertNumToWord($SONOS_RenderingControlProxy{$udn}->GetMute(0, 'Master')->getValue('CurrentMute'))); } + } elsif ($workType eq 'setOutputFixed') { + my $value1 = $params[0]; + + if (SONOS_CheckProxyObject($udn, $SONOS_RenderingControlProxy{$udn})) { + $SONOS_RenderingControlProxy{$udn}->SetOutputFixed(0, SONOS_ConvertWordToNum($value1)); + + # Wert wieder abholen, um das wahre Ergebnis anzeigen zu können + SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': '.SONOS_ConvertNumToWord($SONOS_RenderingControlProxy{$udn}->GetOutputFixed(0)->getValue('CurrentFixed'))); + } } elsif ($workType eq 'setMuteT') { my $value1 = 'off'; if (SONOS_CheckProxyObject($udn, $SONOS_RenderingControlProxy{$udn})) { @@ -5135,6 +5146,7 @@ sub SONOS_GetReadingsToCurrentHash($$) { # Insert Variables scanned during Device Detection or other events (for simple Replacing-Option of InfoSummarize) $current{Volume} = ReadingsVal($name, 'Volume', 0); $current{Mute} = ReadingsVal($name, 'Mute', 0); + $current{OutputFixed} = ReadingsVal($name, 'OutputFixed', 0); $current{Balance} = ReadingsVal($name, 'Balance', 0); $current{HeadphoneConnected} = ReadingsVal($name, 'HeadphoneConnected', 0); $current{SleepTimer} = ReadingsVal($name, 'SleepTimer', ''); @@ -5575,6 +5587,17 @@ sub SONOS_RenderingCallback($$) { } } + # OutputFixed? + my $outputFixed = SONOS_Client_Data_Retreive($udn, 'reading', 'OutputFixed', 0); + if ($properties{LastChangeDecoded} =~ m//i) { + $outputFixed = $1; + if ($generateVolumeEvent) { + SONOS_Client_Data_Refresh('ReadingsSingleUpdateIfChanged', $udn, 'OutputFixed', $outputFixed); + } else { + SONOS_Client_Data_Refresh('ReadingsSingleUpdateIfChangedNoTrigger', $udn, 'OutputFixed', $outputFixed); + } + } + SONOS_Log $udn, 4, "Rendering-Event: Current Values for '$name' ~ Volume: $currentVolume, HeadphoneConnected: $headphoneConnected, Bass: $bass, Treble: $treble, Balance: $balance, Loudness: $loudness, Mute: $mute"; diff --git a/fhem/FHEM/21_SONOSPLAYER.pm b/fhem/FHEM/21_SONOSPLAYER.pm index b870bd6c7..6af7d7f5a 100755 --- a/fhem/FHEM/21_SONOSPLAYER.pm +++ b/fhem/FHEM/21_SONOSPLAYER.pm @@ -128,6 +128,7 @@ my %sets = ( 'PlayURITemp' => 'songURI', 'AddURIToQueue' => 'songURI', 'Speak' => 'volume language text', + 'OutputFixed' => 'state', 'Mute' => 'state', 'Shuffle' => 'state', 'Repeat' => 'state', @@ -185,7 +186,7 @@ sub SONOSPLAYER_Initialize ($) { $hash->{StateFn} = "SONOSPLAYER_State"; $hash->{NotifyFn} = 'SONOSPLAYER_Notify'; - $hash->{AttrList}= "disable:1,0 generateVolumeSlider:1,0 generateVolumeEvent:1,0 generateSomethingChangedEvent:1,0 generateInfoSummarize1 generateInfoSummarize2 generateInfoSummarize3 generateInfoSummarize4 stateVariable:TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,Shuffle,Repeat,CrossfadeMode,Balance,HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,InfoSummarize2,InfoSummarize3,InfoSummarize4 model minVolume maxVolume minVolumeHeadphone maxVolumeHeadphone VolumeStep getAlarms:1,0 buttonEvents ".$readingFnAttributes; + $hash->{AttrList}= "disable:1,0 generateVolumeSlider:1,0 generateVolumeEvent:1,0 generateSomethingChangedEvent:1,0 generateInfoSummarize1 generateInfoSummarize2 generateInfoSummarize3 generateInfoSummarize4 stateVariable:TransportState,NumberOfTracks,Track,TrackURI,TrackDuration,Title,Artist,Album,OriginalTrackNumber,AlbumArtist,Sender,SenderCurrent,SenderInfo,StreamAudio,NormalAudio,AlbumArtURI,nextTrackDuration,nextTrackURI,nextAlbumArtURI,nextTitle,nextArtist,nextAlbum,nextAlbumArtist,nextOriginalTrackNumber,Volume,Mute,OutputFixed,Shuffle,Repeat,CrossfadeMode,Balance,HeadphoneConnected,SleepTimer,Presence,RoomName,SaveRoomName,PlayerType,Location,SoftwareRevision,SerialNum,InfoSummarize1,InfoSummarize2,InfoSummarize3,InfoSummarize4 model minVolume maxVolume minVolumeHeadphone maxVolumeHeadphone VolumeStep getAlarms:1,0 buttonEvents ".$readingFnAttributes; return undef; } @@ -290,7 +291,7 @@ sub SONOSPLAYER_Get($@) { for my $elem (sort keys %gets) { my $newElem = $elem.(($gets{$elem} eq '') ? ':noArg' : ''); - $newElem = $elem.':0,1' if (lc($elem) eq 'ethernetportstatus'); + $newElem = $elem.':0,1,2,3' if (lc($elem) eq 'ethernetportstatus'); push @newGets, $newElem; } @@ -384,7 +385,7 @@ sub SONOSPLAYER_Set($@) { } # On/Off einsetzen; Da das jeweilige Reading dazu 0,1 enthalten wird, auch mit 0,1 arbeiten, damit die Vorauswahl passt - $key = $key.':0,1' if ((lc($key) eq 'crossfademode') || (lc($key) eq 'groupmute') || (lc($key) eq 'ledstate') || (lc($key) eq 'loudness') || (lc($key) eq 'mute') || (lc($key) eq 'repeat') || (lc($key) eq 'shuffle')); + $key = $key.':0,1' if ((lc($key) eq 'crossfademode') || (lc($key) eq 'groupmute') || (lc($key) eq 'ledstate') || (lc($key) eq 'loudness') || (lc($key) eq 'mute') || (lc($key) eq 'outputfixed') || (lc($key) eq 'repeat') || (lc($key) eq 'shuffle')); # Iconauswahl einsetzen if (lc($key) eq 'roomicon') { @@ -497,6 +498,8 @@ sub SONOSPLAYER_Set($@) { $udn = $hash->{UDN}; SONOS_DoWork($udn, 'setGroupMute', $value); + } elsif (lc($key) eq 'outputfixed') { + SONOS_DoWork($udn, 'setOutputFixed', $value); } elsif (lc($key) eq 'mute') { SONOS_DoWork($udn, 'setMute', $value); } elsif (lc($key) eq 'mutet') { @@ -979,6 +982,9 @@ sub SONOSPLAYER_Log($$$) {
  • Name <Zonename>
    Sets the Name for this Zone
  • +
  • +OutputFixed <State> +
    Sets the outputfixed-state. Retrieves the new state as the result.
  • Reboot
    Initiates a reboot on the Zoneplayer.
  • @@ -1269,6 +1275,9 @@ Here an event is defined, where in time of 2 seconds the Mute-Button has to be p
  • Name <Zonename>
    Legt den Namen der Zone fest.
  • +
  • +OutputFixed <State> +
    Setzt den angegebenen OutputFixed-Zustand. Liefert den aktuell gültigen OutputFixed-Zustand.
  • Reboot
    Führt für den Zoneplayer einen Neustart durch.