2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-21 14:04:15 +00:00

71_PHILIPS_AUDIO: fixed crash of fhem server while shutdown/restart

git-svn-id: https://svn.fhem.de/fhem/trunk@14027 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
ra666ack 2017-04-18 16:57:05 +00:00
parent fb6cc58b2c
commit 1c6e7339ca
2 changed files with 53 additions and 78 deletions

View File

@ -1,5 +1,6 @@
# Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # 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. # 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 - feature: 33_readingsGroup: allow "set magic" reding pre- and suffixes
- bugfix: 71_PHILIPS_AUDIO: Corrected gavorites behaviour if more than 16 - bugfix: 71_PHILIPS_AUDIO: Corrected gavorites behaviour if more than 16
- chnage: 17_EGPM2LAN.pm: Password handling changed; removed from config - chnage: 17_EGPM2LAN.pm: Password handling changed; removed from config

View File

@ -130,8 +130,8 @@ sub PHILIPS_AUDIO_GetStatus
# Check for Presets availability # Check for Presets availability
if if
( (
(not defined($hash->{READINGS}{"totalPresets"})) and (not defined($hash->{READINGS}{"totalPresets"})) and
(ReadingsVal($name, "presence", "no") eq "present") and (ReadingsVal($name, "presence", "no") eq "present") and
(AttrVal($name, "autoGetPresets", "0") eq "1") (AttrVal($name, "autoGetPresets", "0") eq "1")
) )
{ {
@ -146,8 +146,8 @@ sub PHILIPS_AUDIO_GetStatus
# Check for Favorites availability # Check for Favorites availability
if if
( (
(not defined($hash->{READINGS}{"totalFavorites"})) and (not defined($hash->{READINGS}{"totalFavorites"})) and
(ReadingsVal($name, "presence", "no") eq "present") and (ReadingsVal($name, "presence", "no") eq "present") and
(AttrVal($name, "autoGetFavorites", "0") eq "1") (AttrVal($name, "autoGetFavorites", "0") eq "1")
) )
{ {
@ -159,17 +159,6 @@ sub PHILIPS_AUDIO_GetStatus
return; 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 PHILIPS_AUDIO_ResetTimer($hash) if(not ($local == 1)); # getStatus
return; return;
} }
@ -269,38 +258,50 @@ sub PHILIPS_AUDIO_Set
my @favoriteList; my @favoriteList;
my @favoriteNumber; my @favoriteNumber;
foreach my $readings (keys % {$hash->{READINGS}}) foreach my $readings (keys % {$hash->{READINGS}})
{ {
push @favoriteList,$1."_".substr($hash->{READINGS}{$readings}{VAL}, 0, 25) if($readings =~ m/^.inetRadioFavorite_(..)$/); # $1 $2
push @favoriteNumber, $1 if($readings =~ m/^.inetRadioFavorite_(..)/); 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/\*/\[asterisk\]/g) for @favoriteList; # '*' not shown correctly
(s/#/\[hash\]/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 @presetList;
my @presetNumber; my @presetNumber;
foreach my $readings (keys % {$hash->{READINGS}}) foreach my $readings (keys % {$hash->{READINGS}})
{ {
push @presetList, $1."_".substr($hash->{READINGS}{$readings}{VAL}, 0, 25) if($readings =~ m/^.inetRadioPreset_(..)/); # $1 $2
push @presetNumber, $1 if($readings =~ m/^.inetRadioPreset_(..)/); 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/\*/\[asterisk\]/g) for @presetList; # '*' not shown correctly
(s/#/\[hash\]/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 .= "selectFavorite:" .join(",",("---",(sort @favoriteList))) . " ";
$usage .= "selectPreset:" .join(",",("---",(sort @presetList))) . " "; $usage .= "selectPreset:" .join(",",("---",(sort @presetList))) . " ";
$usage .= "selectPresetByNumber:" .join(",",("---",(sort @presetNumber))) . " "; $usage .= "selectPresetByNumber:" .join(",",("---",(sort @presetNumber))) . " ";
$usage .= "selectFavoriteByNumber:".join(",",("---",(sort @favoriteNumber))) . " "; $usage .= "selectFavoriteByNumber:".join(",",("---",(sort @favoriteNumber))). " ";
# Direct stream selection if any # Direct stream selection if any
my @selectStream; my @selectStream;
for(my $lvl = 1; $lvl < int(ReadingsVal($name, ".listDepthLevel", "1") - 1); $lvl++) for(my $lvl = 1; $lvl < int(ReadingsVal($name, ".listDepthLevel", "1") - 1); $lvl++)
{ {
my $listLevelName = $hash->{READINGS}{".lvl_".$lvl."_name"}; my $listLevelName = $hash->{READINGS}{".lvl_".$lvl."_name"};
push @selectStream, "lvl_".$lvl."_".$listLevelName; push @selectStream, "lvl_".$lvl."_".$listLevelName;
@ -308,14 +309,16 @@ sub PHILIPS_AUDIO_Set
foreach my $readings (keys % {$hash->{READINGS}}) 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 * (s/\*/\[asterisk\]/g) for @selectStream; # '*' not shown correctly
@selectStream = sort map{s/#/\[hash\]/g;$_;} grep/._..*$/,@selectStream; # Replace # (s/#/\[hash\]/g) for @selectStream; # '#' not shown correctly
@selectStream = sort map{s/[ :;,'.\\]/_/g;$_;} grep/._..*$/,@selectStream; # Replace not allowed characters (s/[\\]//g) for @selectStream; # Replace \
(s/[ :;,']/_/g) for @selectStream; # Replace not allowed characters
$usage .= "selectStream:".join(",",("---",(sort @selectStream))) . " "; $usage .= "selectStream:".join(",",("---",(sort @selectStream))) . " ";
Log3 $name, 5, "PHILIPS_AUDIO ($name) - set ".join(" ", @a); Log3 $name, 5, "PHILIPS_AUDIO ($name) - set ".join(" ", @a);
@ -795,21 +798,6 @@ sub PHILIPS_AUDIO_Define
return; 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 sub PHILIPS_AUDIO_Attr
{ {
my ($cmd, $name, $attrName, $attrVal) = @_; my ($cmd, $name, $attrName, $attrVal) = @_;
@ -1717,15 +1705,15 @@ sub PHILIPS_AUDIO_ParseResponse
my $address = $hash->{IP_ADDRESS}; my $address = $hash->{IP_ADDRESS};
my $port = ""; my $port = "";
if ($hash->{MODEL} eq "NP3700") if (uc($hash->{MODEL}) eq "NP3700")
{ {
$port = 7123; $port = 7123;
} }
elsif($hash->{MODEL} eq "NP3900") elsif(uc($hash->{MODEL}) eq "NP3900")
{ {
$port = 49153; $port = 49153;
} }
elsif($hash->{MODEL} eq "AW9000") elsif(uc($hash->{MODEL}) eq "AW9000")
{ {
$port = ""; $port = "";
} }
@ -1789,11 +1777,6 @@ sub PHILIPS_AUDIO_ParseResponse
#Log3 $name, 5, "ListedItems: $listedItems"; #Log3 $name, 5, "ListedItems: $listedItems";
} }
#if ($data =~ /'totalitems':(.+),/)
#{
# $listedItems = $1;
#}
$data =~ s/\R//g; # Remove new lines $data =~ s/\R//g; # Remove new lines
while ($data =~ /{'title':'(.+?)',/g) while ($data =~ /{'title':'(.+?)',/g)
@ -1804,7 +1787,6 @@ sub PHILIPS_AUDIO_ParseResponse
if($data =~ /'id':(.+?),/g) if($data =~ /'id':(.+?),/g)
{ {
$presetID = $1; $presetID = $1;
#Log3 $name, 5, "PresetIDLoop: $presetID";
} }
if ($presetID ne "" and $presetName ne "") 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 if($presetID < ($hash->{helper}{TOTALINETRADIOPRESETS})) # Maximum listed items = 8. Get the next items by sending the nextreqURL
{ {
# External Command. Not from buffer timer. # External Command. Not from buffer timer.
@ -1878,25 +1858,17 @@ sub PHILIPS_AUDIO_ParseResponse
{ {
$hash->{helper}{TOTALINETRADIOFAVORITES} = $1; $hash->{helper}{TOTALINETRADIOFAVORITES} = $1;
readingsBulkUpdate($hash, "totalFavorites", $1); readingsBulkUpdate($hash, "totalFavorites", $1);
#Log3 $name, 5, "ListedItems: $listedItems";
} }
#if ($data =~ /'totalitems':(.+),/)
#{
# $listedItems = $1;
#}
$data =~ s/\R//g; # Remove new lines $data =~ s/\R//g; # Remove new lines
while($data =~ /{'title':'(.+?)',/g) while($data =~ /{'title':'(.+?)',/g)
{ {
$favoriteName = $1; $favoriteName = $1;
#Log3 $name, 5, "FavoriteName: $favoriteName";
if($data =~ /'id':(.+?),/g) if($data =~ /'id':(.+?),/g)
{ {
$favoriteID = $1; $favoriteID = $1;
#Log3 $name, 5, "FavoriteIDLoop: $favoriteID";
} }
if ($favoriteID ne "" and $favoriteName ne "") if ($favoriteID ne "" and $favoriteName ne "")
{ {
@ -1926,7 +1898,6 @@ sub PHILIPS_AUDIO_ParseResponse
} }
elsif($cmd =~ /input|selectStream/) elsif($cmd =~ /input|selectStream/)
{ {
$data =~ s/\R//g; # Remove new lines for regex $data =~ s/\R//g; # Remove new lines for regex
if($arg eq "---") if($arg eq "---")
@ -1963,8 +1934,6 @@ sub PHILIPS_AUDIO_ParseResponse
{ {
$errorMessage = $1; $errorMessage = $1;
} }
#Log3 $name, 3, "PHILIPS_AUDIO ($name) - Player response: Media Library change not successful ($errorMessage).";
# Delete old readings # Delete old readings
delete $hash->{READINGS}{$_} foreach (grep /listItem_...$/, keys %{$hash->{READINGS}}); delete $hash->{READINGS}{$_} foreach (grep /listItem_...$/, keys %{$hash->{READINGS}});
delete $hash->{READINGS}{$_} foreach (grep /.listItemTarget_...$/, keys %{$hash->{READINGS}}); delete $hash->{READINGS}{$_} foreach (grep /.listItemTarget_...$/, keys %{$hash->{READINGS}});
@ -2298,15 +2267,19 @@ sub PHILIPS_AUDIO_getMediaRendererDesc
my $url = ""; my $url = "";
my $port = ""; my $port = "";
if ($hash->{MODEL} eq "NP3500") if(uc($hash->{MODEL}) eq "NP3500")
{ {
# TBD # TBD
} }
elsif($hash->{MODEL} eq "NP3700") elsif(uc($hash->{MODEL}) eq "NP3700")
{ {
$url = "http://$hash->{IP_ADDRESS}:7123/DeviceDescription.xml"; $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"; $url = "http://$hash->{IP_ADDRESS}:49153/nmrDescription.xml";
} }
@ -2403,7 +2376,7 @@ sub PHILIPS_AUDIO_getMediaRendererDesc
<li><b>selectFavoriteByNumber [ number ]</b> &ndash; Selects a favorite by its number. Empty if no favorites found. (see also getFavorites)</li> <li><b>selectFavoriteByNumber [ number ]</b> &ndash; Selects a favorite by its number. Empty if no favorites found. (see also getFavorites)</li>
<li><b>selectPreset [ name ]</b> &ndash; Selects a preset. Empty if no presets found. (see also getPresets)</li> <li><b>selectPreset [ name ]</b> &ndash; Selects a preset. Empty if no presets found. (see also getPresets)</li>
<li><b>selectPresetByNumber [ number ]</b> &ndash; Selects a preset by its number. Empty if no presets found. (see also getPresets)</li> <li><b>selectPresetByNumber [ number ]</b> &ndash; Selects a preset by its number. Empty if no presets found. (see also getPresets)</li>
<li><b>selectStream [ name ]</b> &ndash; Context-sensitive. Selects a stream depending on the current input and player list content</li> <li><b>selectStream [ name ]</b> &ndash; Context-sensitive. Selects a stream depending on the current input and player list content. A 'c'-prefix represents a 'container' (directory). An 'i'-prefix represents an 'item' (audio stream).</li>
<li><b>shuffle [ on | off ]</b> &ndash; Sets the shuffle mode</li> <li><b>shuffle [ on | off ]</b> &ndash; Sets the shuffle mode</li>
<li><b>standbyButton</b> &ndash; Emulates the standby button. Toggles between standby and power on</li> <li><b>standbyButton</b> &ndash; Emulates the standby button. Toggles between standby and power on</li>
<li><b>volume</b> &ndash; Sets the relative volume 0...100%</li> <li><b>volume</b> &ndash; Sets the relative volume 0...100%</li>
@ -2544,7 +2517,7 @@ sub PHILIPS_AUDIO_getMediaRendererDesc
<li><b>selectFavoriteByNumber [ number ]</b> &ndash; W&auml;hlt einen Favoriten anhand seiner Speichernummer. Leer falls keine Favoriten vorhanden (s. getFavorites)</li> <li><b>selectFavoriteByNumber [ number ]</b> &ndash; W&auml;hlt einen Favoriten anhand seiner Speichernummer. Leer falls keine Favoriten vorhanden (s. getFavorites)</li>
<li><b>selectPreset [ name ]</b> &ndash; W&auml;hlt einen Preset. Leer falls keine Presets vorhanden (s. getPresets)</li> <li><b>selectPreset [ name ]</b> &ndash; W&auml;hlt einen Preset. Leer falls keine Presets vorhanden (s. getPresets)</li>
<li><b>selectPresetByNumber [ number ]</b> &ndash; W&auml;hlt einen Preset anhand seiner Speichernummer. Leer falls keine Presets vorhanden (see also getPresets)</li> <li><b>selectPresetByNumber [ number ]</b> &ndash; W&auml;hlt einen Preset anhand seiner Speichernummer. Leer falls keine Presets vorhanden (see also getPresets)</li>
<li><b>selectStream [ name ]</b> &ndash; Context-sensitive. W&auml;hlt einen Audiostream. H&auml;ngt vom aktuellen Inhalt der Playerlist ab.</li> <li><b>selectStream [ name ]</b> &ndash; Context-sensitive. W&auml;hlt einen Audiostream. H&auml;ngt vom aktuellen Inhalt der Playerlist ab. Ein 'c'-Pr&auml;fix repr&auml;sentiert einen 'Container' (Directory). ein 'i'-Pr&auml;fix repr&auml;sentiert ein 'Item' (audio stream).</li></li>
<li><b>shuffle [ on | off ]</b> &ndash; W&auml;hlt den gew&uuml;nschten Shuffle Modus</li> <li><b>shuffle [ on | off ]</b> &ndash; W&auml;hlt den gew&uuml;nschten Shuffle Modus</li>
<li><b>standbyButton</b> &ndash; Emuliert den standby-Knopf. Toggelt zwischen standby und power on</li> <li><b>standbyButton</b> &ndash; Emuliert den standby-Knopf. Toggelt zwischen standby und power on</li>
<li><b>volume</b> &ndash; Setzt die relative Lautst&auml;rke 0...100%</li> <li><b>volume</b> &ndash; Setzt die relative Lautst&auml;rke 0...100%</li>
@ -2614,3 +2587,4 @@ sub PHILIPS_AUDIO_getMediaRendererDesc
=end html_DE =end html_DE
=cut =cut