From ed378ad815a39ccfdadaac01d5e8f4ee24496118 Mon Sep 17 00:00:00 2001 From: Reinerlein <> Date: Mon, 13 Mar 2017 13:10:43 +0000 Subject: [PATCH] SONOS: Errorhandling for FavouriteName, PlaylistName and RadioName git-svn-id: https://svn.fhem.de/fhem/trunk@13692 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/CHANGED | 3 ++- fhem/FHEM/00_SONOS.pm | 47 +++++++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/fhem/CHANGED b/fhem/CHANGED index 19f521cbc..668f35717 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,7 +1,8 @@ # 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: 00_SONOS: Errorhandling for RadioName etc. - feature: 98_template: new FHEM command template - - feature: 70_MEDIAPORTAL: Plugins can be retreived and changed to + - feature: 70_MEDIAPORTAL: Plugins can be retreived and changed to - update: 00_SONOS: New version, see Wiki- or File-Changelog - update: 88_HMCCU: Code optimized. Fixed Windows process ID bug. - bugfix: 71_YAMAHA_NP: Fixed tuner readings in standby. diff --git a/fhem/FHEM/00_SONOS.pm b/fhem/FHEM/00_SONOS.pm index cf446798e..6d1014f14 100755 --- a/fhem/FHEM/00_SONOS.pm +++ b/fhem/FHEM/00_SONOS.pm @@ -51,6 +51,8 @@ # Changelog (last 4 entries only, see Wiki for complete changelog) # # SVN-History: +# 13.03.2017 +# Saubere Fehlerbehandlung bei der Verarbeitung von currentFavouriteName, currentPlaylistName und currentRadioName. # 12.03.2017 # NotifyFn und NotifyDev werden nun im Define des Moduls festgelegt (anstatt wie vorher im Initialize). Dadurch sollten deutlich weniger Notify-Anfragen beim Modul ankommen. # Es gibt nun einen Set-Befehl "RefreshShareIndex" zum Aktualisieren der Bibliothek und ein Reading "ShareIndexInProgress", welches angibt, ob eine Aktualisierung gerade in Ausführung ist. @@ -1248,36 +1250,51 @@ sub SONOS_Read($) { readingsBeginUpdate($hash); # Wurden für das Device bereits Favoriten geladen? Dann raussuchen, ob gerade ein solcher abgespielt wird... - my %favourites = %{eval(ReadingsVal($hash->{NAME}, 'Favourites', '{}'))}; $current{FavouriteName} = ''; - while (my ($key, $value) = each (%favourites)) { - if (defined($current{EnqueuedTransportURI}) && defined($value->{Ressource})) { - if ($value->{Ressource} eq $current{EnqueuedTransportURI}) { - $current{FavouriteName} = $value->{Title}; + eval { + my %favourites = %{eval(ReadingsVal($hash->{NAME}, 'Favourites', '{}'))}; + while (my ($key, $value) = each (%favourites)) { + if (defined($current{EnqueuedTransportURI}) && defined($value->{Ressource})) { + if ($value->{Ressource} eq $current{EnqueuedTransportURI}) { + $current{FavouriteName} = $value->{Title}; + } } } + }; + if ($@) { + SONOS_Log $hash->{UDN}, 1, "Error during retreiving of FavouriteName: $@"; } # Wurden für das Device bereits Playlisten geladen? Dann raussuchen, ob gerade eine solche abgespielt wird... - my %playlists = %{eval(ReadingsVal($hash->{NAME}, 'Playlists', '{}'))}; $current{PlaylistName} = ''; - while (my ($key, $value) = each (%playlists)) { - if (defined($current{EnqueuedTransportURI}) && defined($value->{Ressource})) { - if ($value->{Ressource} eq $current{EnqueuedTransportURI}) { - $current{PlaylistName} = $value->{Title}; + eval { + my %playlists = %{eval(ReadingsVal($hash->{NAME}, 'Playlists', '{}'))}; + while (my ($key, $value) = each (%playlists)) { + if (defined($current{EnqueuedTransportURI}) && defined($value->{Ressource})) { + if ($value->{Ressource} eq $current{EnqueuedTransportURI}) { + $current{PlaylistName} = $value->{Title}; + } } } + }; + if ($@) { + SONOS_Log $hash->{UDN}, 1, "Error during retreiving of PlaylistName: $@"; } # Wurden für das Device bereits Radios geladen? Dann raussuchen, ob gerade ein solches abgespielt wird... - my %radios = %{eval(ReadingsVal($hash->{NAME}, 'Radios', '{}'))}; $current{RadioName} = ''; - while (my ($key, $value) = each (%radios)) { - if (defined($current{EnqueuedTransportURI}) && defined($value->{Ressource})) { - if ($value->{Ressource} eq $current{EnqueuedTransportURI}) { - $current{RadioName} = $value->{Title}; + eval { + my %radios = %{eval(ReadingsVal($hash->{NAME}, 'Radios', '{}'))}; + while (my ($key, $value) = each (%radios)) { + if (defined($current{EnqueuedTransportURI}) && defined($value->{Ressource})) { + if ($value->{Ressource} eq $current{EnqueuedTransportURI}) { + $current{RadioName} = $value->{Title}; + } } } + }; + if ($@) { + SONOS_Log $hash->{UDN}, 1, "Error during retreiving of RadioName: $@"; } # Dekodierung durchführen