diff --git a/fhem/CHANGED b/fhem/CHANGED index 9593fac37..e0909ceb5 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - bugfix: 71_PHILIPS_AUDIO: fhem.pl crash while server shutdown - feature: 33_readingsGroup: allow "set magic" reding pre- and suffixes - bugfix: 71_PHILIPS_AUDIO: Corrected gavorites behaviour if more than 16 - chnage: 17_EGPM2LAN.pm: Password handling changed; removed from config diff --git a/fhem/FHEM/71_PHILIPS_AUDIO.pm b/fhem/FHEM/71_PHILIPS_AUDIO.pm index 3982382c4..0c3cad43b 100755 --- a/fhem/FHEM/71_PHILIPS_AUDIO.pm +++ b/fhem/FHEM/71_PHILIPS_AUDIO.pm @@ -130,8 +130,8 @@ sub PHILIPS_AUDIO_GetStatus # Check for Presets availability if ( - (not defined($hash->{READINGS}{"totalPresets"})) and - (ReadingsVal($name, "presence", "no") eq "present") and + (not defined($hash->{READINGS}{"totalPresets"})) and + (ReadingsVal($name, "presence", "no") eq "present") and (AttrVal($name, "autoGetPresets", "0") eq "1") ) { @@ -146,8 +146,8 @@ sub PHILIPS_AUDIO_GetStatus # Check for Favorites availability if ( - (not defined($hash->{READINGS}{"totalFavorites"})) and - (ReadingsVal($name, "presence", "no") eq "present") and + (not defined($hash->{READINGS}{"totalFavorites"})) and + (ReadingsVal($name, "presence", "no") eq "present") and (AttrVal($name, "autoGetFavorites", "0") eq "1") ) { @@ -159,17 +159,6 @@ sub PHILIPS_AUDIO_GetStatus return; } - # Don't interfere with manual operation. Will cause wrong responses from device. - #if - #( - # (ReadingsVal($name, "playerListStatus", "ready") eq "ready") and - # ($hash->{helper}{manualOperation} == 0) and - # ($hash->{helper}{playerState} eq "home") - #) - #{ - # #PHILIPS_AUDIO_SendCommand($hash, "/nowplay", "","nowplay", "noArg"); - #} - PHILIPS_AUDIO_ResetTimer($hash) if(not ($local == 1)); # getStatus return; } @@ -269,38 +258,50 @@ sub PHILIPS_AUDIO_Set my @favoriteList; my @favoriteNumber; + foreach my $readings (keys % {$hash->{READINGS}}) { - push @favoriteList,$1."_".substr($hash->{READINGS}{$readings}{VAL}, 0, 25) if($readings =~ m/^.inetRadioFavorite_(..)$/); - push @favoriteNumber, $1 if($readings =~ m/^.inetRadioFavorite_(..)/); + # $1 $2 + if($readings =~ m/(.inetRadioFavorite_)(..)$/) + { + push @favoriteList, $2."_".substr($hash->{READINGS}{$readings}{VAL}, 0, 25); + push @favoriteNumber, $2; + } } (s/\*/\[asterisk\]/g) for @favoriteList; # '*' not shown correctly (s/#/\[hash\]/g) for @favoriteList; # '#' not shown correctly - (s/[ :;,'.\\]/_/g) for @favoriteList; # Replace not allowed characters + (s/[\\]//g) for @favoriteList; # Replace \ + (s/[ :;,']/_/g) for @favoriteList; # Replace not allowed characters my @presetList; my @presetNumber; + foreach my $readings (keys % {$hash->{READINGS}}) { - push @presetList, $1."_".substr($hash->{READINGS}{$readings}{VAL}, 0, 25) if($readings =~ m/^.inetRadioPreset_(..)/); - push @presetNumber, $1 if($readings =~ m/^.inetRadioPreset_(..)/); + # $1 $2 + if($readings =~ m/(.inetRadioPreset_)(..)$/) + { + push @presetList, $2."_".substr($hash->{READINGS}{$readings}{VAL}, 0, 25); + push @presetNumber, $2; + } } (s/\*/\[asterisk\]/g) for @presetList; # '*' not shown correctly (s/#/\[hash\]/g) for @presetList; # '#' not shown correctly - (s/[ :;,'.\\]/_/g) for @presetList; # Replace not allowed characters + (s/[\\]//g) for @presetList; # Replace \ + (s/[ :;,']/_/g) for @presetList; # Replace not allowed characters - $usage .= "selectFavorite:" .join(",",("---",(sort @favoriteList))) . " "; - $usage .= "selectPreset:" .join(",",("---",(sort @presetList))) . " "; - $usage .= "selectPresetByNumber:" .join(",",("---",(sort @presetNumber))) . " "; - $usage .= "selectFavoriteByNumber:".join(",",("---",(sort @favoriteNumber))) . " "; + $usage .= "selectFavorite:" .join(",",("---",(sort @favoriteList))) . " "; + $usage .= "selectPreset:" .join(",",("---",(sort @presetList))) . " "; + $usage .= "selectPresetByNumber:" .join(",",("---",(sort @presetNumber))) . " "; + $usage .= "selectFavoriteByNumber:".join(",",("---",(sort @favoriteNumber))). " "; # Direct stream selection if any - - my @selectStream; - for(my $lvl = 1; $lvl < int(ReadingsVal($name, ".listDepthLevel", "1") - 1); $lvl++) + my @selectStream; + + for(my $lvl = 1; $lvl < int(ReadingsVal($name, ".listDepthLevel", "1") - 1); $lvl++) { my $listLevelName = $hash->{READINGS}{".lvl_".$lvl."_name"}; push @selectStream, "lvl_".$lvl."_".$listLevelName; @@ -308,14 +309,16 @@ sub PHILIPS_AUDIO_Set foreach my $readings (keys % {$hash->{READINGS}}) { - push @selectStream,$1."_".substr($hash->{READINGS}{$readings}{VAL}, 0, 25) if($readings =~ m/^listItem_(.*)/); + # $1 $2 + push @selectStream, $2."_".substr($hash->{READINGS}{$readings}{VAL}, 0, 25) if($readings =~ m/(listItem_)(...)$/); } - - @selectStream = sort map{s/\*/\[asterisk\]/g;$_;} grep/._..*$/,@selectStream; # Replace * - @selectStream = sort map{s/#/\[hash\]/g;$_;} grep/._..*$/,@selectStream; # Replace # - @selectStream = sort map{s/[ :;,'.\\]/_/g;$_;} grep/._..*$/,@selectStream; # Replace not allowed characters - - $usage .= "selectStream:".join(",",("---",(sort @selectStream))) . " "; + + (s/\*/\[asterisk\]/g) for @selectStream; # '*' not shown correctly + (s/#/\[hash\]/g) for @selectStream; # '#' not shown correctly + (s/[\\]//g) for @selectStream; # Replace \ + (s/[ :;,']/_/g) for @selectStream; # Replace not allowed characters + + $usage .= "selectStream:".join(",",("---",(sort @selectStream))) . " "; Log3 $name, 5, "PHILIPS_AUDIO ($name) - set ".join(" ", @a); @@ -795,21 +798,6 @@ sub PHILIPS_AUDIO_Define return; } -sub PHILIPS_AUDIO_Notify -{ - my ($hash, $dev) = @_; - my $name = $hash->{NAME}; - return "" if ($dev->{NAME} ne "global"); - - my $events = deviceEvents($dev, AttrVal($name, "addStateEvent", 0)); - - return if(!$events); # Some previous notify deleted the array. - # - # Code to be executed on notify - # - return; -} - sub PHILIPS_AUDIO_Attr { my ($cmd, $name, $attrName, $attrVal) = @_; @@ -1717,15 +1705,15 @@ sub PHILIPS_AUDIO_ParseResponse my $address = $hash->{IP_ADDRESS}; my $port = ""; - if ($hash->{MODEL} eq "NP3700") + if (uc($hash->{MODEL}) eq "NP3700") { $port = 7123; } - elsif($hash->{MODEL} eq "NP3900") + elsif(uc($hash->{MODEL}) eq "NP3900") { $port = 49153; } - elsif($hash->{MODEL} eq "AW9000") + elsif(uc($hash->{MODEL}) eq "AW9000") { $port = ""; } @@ -1789,22 +1777,16 @@ sub PHILIPS_AUDIO_ParseResponse #Log3 $name, 5, "ListedItems: $listedItems"; } - #if ($data =~ /'totalitems':(.+),/) - #{ - # $listedItems = $1; - #} - $data =~ s/\R//g; # Remove new lines while ($data =~ /{'title':'(.+?)',/g) { $presetName = $1; - + if($data =~ /'id':(.+?),/g) { $presetID = $1; - #Log3 $name, 5, "PresetIDLoop: $presetID"; } if ($presetID ne "" and $presetName ne "") { @@ -1812,8 +1794,6 @@ sub PHILIPS_AUDIO_ParseResponse } } - #Log3 $name, 5, "PresetIDNachLoop: $presetID"; - if($presetID < ($hash->{helper}{TOTALINETRADIOPRESETS})) # Maximum listed items = 8. Get the next items by sending the nextreqURL { # External Command. Not from buffer timer. @@ -1878,25 +1858,17 @@ sub PHILIPS_AUDIO_ParseResponse { $hash->{helper}{TOTALINETRADIOFAVORITES} = $1; readingsBulkUpdate($hash, "totalFavorites", $1); - #Log3 $name, 5, "ListedItems: $listedItems"; } - #if ($data =~ /'totalitems':(.+),/) - #{ - # $listedItems = $1; - #} - $data =~ s/\R//g; # Remove new lines while($data =~ /{'title':'(.+?)',/g) { $favoriteName = $1; - #Log3 $name, 5, "FavoriteName: $favoriteName"; if($data =~ /'id':(.+?),/g) { $favoriteID = $1; - #Log3 $name, 5, "FavoriteIDLoop: $favoriteID"; } if ($favoriteID ne "" and $favoriteName ne "") { @@ -1926,7 +1898,6 @@ sub PHILIPS_AUDIO_ParseResponse } elsif($cmd =~ /input|selectStream/) { - $data =~ s/\R//g; # Remove new lines for regex if($arg eq "---") @@ -1963,8 +1934,6 @@ sub PHILIPS_AUDIO_ParseResponse { $errorMessage = $1; } - - #Log3 $name, 3, "PHILIPS_AUDIO ($name) - Player response: Media Library change not successful ($errorMessage)."; # Delete old readings delete $hash->{READINGS}{$_} foreach (grep /listItem_...$/, keys %{$hash->{READINGS}}); delete $hash->{READINGS}{$_} foreach (grep /.listItemTarget_...$/, keys %{$hash->{READINGS}}); @@ -2298,15 +2267,19 @@ sub PHILIPS_AUDIO_getMediaRendererDesc my $url = ""; my $port = ""; - if ($hash->{MODEL} eq "NP3500") + if(uc($hash->{MODEL}) eq "NP3500") { # TBD } - elsif($hash->{MODEL} eq "NP3700") + elsif(uc($hash->{MODEL}) eq "NP3700") { $url = "http://$hash->{IP_ADDRESS}:7123/DeviceDescription.xml"; } - elsif(($hash->{MODEL} eq "NP3900") or ($hash->{MODEL} eq "AW9000")) + elsif + ( + (uc($hash->{MODEL}) eq "NP3900") or + (uc($hash->{MODEL}) eq "AW9000") + ) { $url = "http://$hash->{IP_ADDRESS}:49153/nmrDescription.xml"; } @@ -2403,7 +2376,7 @@ sub PHILIPS_AUDIO_getMediaRendererDesc