diff --git a/fhem/FHEM/71_YAMAHA_MC.pm b/fhem/FHEM/71_YAMAHA_MC.pm index 9c2205498..f30973263 100644 --- a/fhem/FHEM/71_YAMAHA_MC.pm +++ b/fhem/FHEM/71_YAMAHA_MC.pm @@ -114,6 +114,7 @@ my %YAMAHA_MC_setCmdswithoutArgs = ( "selectPlayMenuItem" => "/v1/netusb/setListControl?list_id=main&type=play&index=", "getPlayInfo" => "/v1/netusb/getPlayInfo", "toggleRepeat" => "/v1/netusb/toggleRepeat", + "toggleShuffle" => "/v1/netusb/toggleShuffle", "playback" => "/v1/netusb/setPlayback?playback=", "getMenu" => "/v1/netusb/getListInfo?input=net_radio&index=0&size=8&lang=en", "getMenuItems" => "/v1/netusb/getListInfo?input=net_radio&index=0&size=8&lang=en", @@ -176,6 +177,7 @@ my %YAMAHA_MC_setCmdsWithArgs = ( "selectPlayMenuItem" => "/v1/netusb/setListControl?list_id=main&type=play&selectMenu=", "getPlayInfo:noArg" => "/v1/netusb/getPlayInfo", "toggleRepeat:noArg" => "/v1/netusb/toggleRepeat", + "toggleShuffle:noArg" => "/v1/netusb/toggleShuffle", "playback:play,stop,pause,play_pause,previous,next,fast_reverse_start,fast_reverse_end,fast_forward_start,fast_forward_end" => "/v1/netusb/setPlayback?playback=", "getMenu:noArg" => "/v1/netusb/getListInfo?input=net_radio&index=0&size=8&lang=en", "getMenuItems:noArg" => "/v1/netusb/getListInfo?input=net_radio&index=0&size=8&lang=en", @@ -1727,6 +1729,7 @@ sub YAMAHA_MC_UpdateLists($;$) { ( exists( $hash->{helper}{MENUITEMS} ) ? "selectPlayMenuItem:" . $menuitems_comma . " " : "" ) => "/v1/netusb/setListControl?list_id=main&type=play&selectMenu=", "getPlayInfo:noArg" => "/v1/netusb/getPlayInfo", "toggleRepeat:noArg" => "/v1/netusb/toggleRepeat", + "toggleShuffle:noArg" => "/v1/netusb/toggleShuffle", "playback:play,stop,pause,play_pause,previous,next,fast_reverse_start,fast_reverse_end,fast_forward_start,fast_forward_end" => "/v1/netusb/setPlayback?playback=", "getMenu:noArg" => "/v1/netusb/getListInfo?input=" . $currentInput . "&index=0&size=8&lang=en", "getMenuItems:noArg" => "/v1/netusb/getListInfo?input=" . $currentInput . "&index=0&size=8&lang=en", @@ -1874,7 +1877,7 @@ sub YAMAHA_MC_Set($$@) { my $deviceList_comma = join( ",", @deviceList ); $cmd = "?" unless defined $cmd; - my $usage = "Unknown argument $cmd, choose one of " . "on:noArg " . "off:noArg " . "power:on,standby,toggle " . "toggle:noArg " . "setAutoPowerStandby:true,false " . "volume:slider,0,1,100 " . "volumeStraight " . "volumeUp:noArg " . "volumeDown:noArg " . "mute:toggle,true,false,0,1 " . "setSpeakerA:toggle,true,false " . "setSpeakerB:toggle,true,false " . "setToneBass:slider,-10,1,10 " . "setToneMid:slider,-10,1,10 " . "setToneHigh:slider,-10,1,10 " . ( exists( $hash->{helper}{INPUTS} ) ? "input:" . $inputs_comma . " " : "input " ) . ( exists( $hash->{helper}{INPUTS} ) ? "prepareInputChange:" . $inputs_comma . " " : "prepareInputChange " ) . "getStatus:noArg " . "getFeatures:noArg " . "getFuncStatus:noArg " . "selectMenu " . ( exists( $hash->{helper}{MENUITEMS} ) ? "selectMenuItem:" . $menuitems_comma . " " : "selectMenuItem " ) . "selectPlayMenu " . ( exists( $hash->{helper}{MENUITEMS} ) ? "selectPlayMenuItem:" . $menuitems_comma . " " : "" ) . "getPlayInfo:noArg " . "toggleRepeat:noArg " . "playback:play,stop,pause,play_pause,previous,next,fast_reverse_start,fast_reverse_end,fast_forward_start,fast_forward_end " . "getMenu:noArg " . "getMenuItems:noArg " . "returnMenu:noArg " . "getDeviceInfo:noArg " . "getSoundProgramList:noArg " . ( exists( $hash->{helper}{SOUNDPROGRAMS} ) ? "setSoundProgramList:" . $soundprograms_comma . " " : "" ) . "setFmTunerPreset:slider,0,1,20 " . "setDabTunerPreset:slider,0,1,20 " . "setNetRadioPreset " . "TurnFavNetRadioChannelOn:1,2,3,4,5,6,7,8 " . "TurnFavServerChannelOn:noArg " . "navigateListMenu " . "NetRadioNextFavChannel:noArg " . "NetRadioPrevFavChannel:noArg " . "sleep:uzsuSelectRadio,0,30,60,90,120 " . "getNetworkStatus:noArg " . "getLocationInfo:noArg " . "getDistributionInfo:noArg " . "getBluetoothInfo:noArg " . "enableBluetooth:true,false " . "setGroupName " . "mcLinkTo:multiple," . $deviceList_comma . " " . "speakfile " . "mcUnLink:multiple," . ReadingsVal( $hash->{NAME}, "linkedClients", "" ) . " " . "setServerInfo " . "setClientInfo " . "startDistribution " . "isNewFirmwareAvailable:noArg " . "statusRequest:noArg "; + my $usage = "Unknown argument $cmd, choose one of " . "on:noArg " . "off:noArg " . "power:on,standby,toggle " . "toggle:noArg " . "setAutoPowerStandby:true,false " . "volume:slider,0,1,100 " . "volumeStraight " . "volumeUp:noArg " . "volumeDown:noArg " . "mute:toggle,true,false,0,1 " . "setSpeakerA:toggle,true,false " . "setSpeakerB:toggle,true,false " . "setToneBass:slider,-10,1,10 " . "setToneMid:slider,-10,1,10 " . "setToneHigh:slider,-10,1,10 " . ( exists( $hash->{helper}{INPUTS} ) ? "input:" . $inputs_comma . " " : "input " ) . ( exists( $hash->{helper}{INPUTS} ) ? "prepareInputChange:" . $inputs_comma . " " : "prepareInputChange " ) . "getStatus:noArg " . "getFeatures:noArg " . "getFuncStatus:noArg " . "selectMenu " . ( exists( $hash->{helper}{MENUITEMS} ) ? "selectMenuItem:" . $menuitems_comma . " " : "selectMenuItem " ) . "selectPlayMenu " . ( exists( $hash->{helper}{MENUITEMS} ) ? "selectPlayMenuItem:" . $menuitems_comma . " " : "" ) . "getPlayInfo:noArg " . "toggleRepeat:noArg " . "toggleShuffle:noArg" . "playback:play,stop,pause,play_pause,previous,next,fast_reverse_start,fast_reverse_end,fast_forward_start,fast_forward_end " . "getMenu:noArg " . "getMenuItems:noArg " . "returnMenu:noArg " . "getDeviceInfo:noArg " . "getSoundProgramList:noArg " . ( exists( $hash->{helper}{SOUNDPROGRAMS} ) ? "setSoundProgramList:" . $soundprograms_comma . " " : "" ) . "setFmTunerPreset:slider,0,1,20 " . "setDabTunerPreset:slider,0,1,20 " . "setNetRadioPreset " . "TurnFavNetRadioChannelOn:1,2,3,4,5,6,7,8 " . "TurnFavServerChannelOn:noArg " . "navigateListMenu " . "NetRadioNextFavChannel:noArg " . "NetRadioPrevFavChannel:noArg " . "sleep:uzsuSelectRadio,0,30,60,90,120 " . "getNetworkStatus:noArg " . "getLocationInfo:noArg " . "getDistributionInfo:noArg " . "getBluetoothInfo:noArg " . "enableBluetooth:true,false " . "setGroupName " . "mcLinkTo:multiple," . $deviceList_comma . " " . "speakfile " . "mcUnLink:multiple," . ReadingsVal( $hash->{NAME}, "linkedClients", "" ) . " " . "setServerInfo " . "setClientInfo " . "startDistribution " . "isNewFirmwareAvailable:noArg " . "statusRequest:noArg "; # delay in Seks for next request after turning on device my $powerCmdDelay = AttrVal( $hash->{NAME}, "powerCmdDelay", 3 ); @@ -2549,7 +2552,7 @@ sub YAMAHA_MC_Set($$@) { } # valid "set cmds" are defind in %cmd_hash (see above) - elsif ( $cmd =~ /^(prepareInputChange|getStatus|getFeatures|getFuncStatus|getPlayInfo|toggleRepeat|getDeviceInfo|sleep|getNetworkStatus|getLocationInfo|getDistributionInfo|getSoundProgramList)$/ ) { + elsif ( $cmd =~ /^(prepareInputChange|getStatus|getFeatures|getFuncStatus|getPlayInfo|toggleRepeat|toggleShuffle|getDeviceInfo|sleep|getNetworkStatus|getLocationInfo|getDistributionInfo|getSoundProgramList)$/ ) { # known cmd, is in cmd_hash but no particular handling above # so execute standard url associated @@ -3980,6 +3983,10 @@ sub YAMAHA_MC_httpRequestParse($$$) { my $playback_input = $res{"input"}; my $playback_status = $res{"playback"}; + my $repeat_status = $res{"repeat"}; + my $shuffle_status = $res{"shuffle"}; + my $play_time = $res{"play_time"}; + my $total_time = $res{"total_time"}; my $station_name = $res{"artist"}; my $album_name = $res{"album"}; my $track = $res{"track"}; @@ -4001,12 +4008,41 @@ sub YAMAHA_MC_httpRequestParse($$$) { readingsBulkUpdate( $hash, "track", $track, 1 ); readingsBulkUpdate( $hash, "albumart_url", $albumart_url, undef, 1 ); readingsBulkUpdate( $hash, "albumart_id", $albumart_id, 1 ); + + readingsBulkUpdate( $hash, "repeat_status", $repeat_status, 1 ); + readingsBulkUpdate( $hash, "shuffle_status", $shuffle_status, 1 ); + readingsBulkUpdate( $hash, "play_time", $play_time, 1 ); + readingsBulkUpdate( $hash, "total_time", $total_time, 1 ); + + readingsEndUpdate( $hash, 1 ); } elsif ( $cmd eq "toggleRepeat" ) { - Log3 $name, 4, "$type: $name YAMAHA_MC_httpRequestParse Start Handling for toggleRepeat"; + my $currentRepeat = ReadingsVal( $name, "repeat_status", "off" ); + + Log3 $name, 4, "$type: $name YAMAHA_MC_httpRequestParse toggleRepeat Current=$currentRepeat"; + if ( $currentRepeat eq "off" ) { + readingsSingleUpdate( $hash, "repeat_status", "on", 1 ); + } + else { + readingsSingleUpdate( $hash, "repeat_status", "off", 1 ); + } + } + elsif ( $cmd eq "toggleShuffle" ) { + + Log3 $name, 4, "$type: $name YAMAHA_MC_httpRequestParse Start Handling for toggleShuffle"; + my $currentShuffle = ReadingsVal( $name, "shuffle_status", "off" ); + + Log3 $name, 4, "$type: $name YAMAHA_MC_httpRequestParse toggleShuffle Current=$currentShuffle"; + if ( $currentShuffle eq "off" ) { + readingsSingleUpdate( $hash, "shuffle_status", "on", 1 ); + } + else { + readingsSingleUpdate( $hash, "shuffle_status", "off", 1 ); + } + } elsif ( $cmd eq "volume" ) { Log3 $name, 4, "$type: $name YAMAHA_MC_httpRequestParse Start Handling for volume"; @@ -5124,7 +5160,8 @@ sub YAMAHA_URI_Escape($) {