diff --git a/fhem/FHEM/00_SONOS.pm b/fhem/FHEM/00_SONOS.pm index 7be55fc33..798de71e8 100755 --- a/fhem/FHEM/00_SONOS.pm +++ b/fhem/FHEM/00_SONOS.pm @@ -32,8 +32,8 @@ # Changelog # # SVN-History: -# 26.12.2014: -# ReportUnresponsiveDevice hat manchmal versucht, die Mitteilung an "sich selbst" zu senden, was naturgemäß nicht klappen kann. +# 26.12.2014: +# ReportUnresponsiveDevice hat manchmal versucht, die Mitteilung an "sich selbst" zu senden, was naturgemäß nicht klappen kann. # # 2.6: Die Zeichenkodierung bei Datenübernahme vom Zoneplayer kann nun über das Attribut characterDecoding eingestellt werden # Bei Gruppen-/LineIn-/SPDIF-Wiedergabe wird wieder die liefernde Zone angezeigt (als Albumname) @@ -407,6 +407,7 @@ sub SONOS_Initialize ($) { # Normal Defines $hash->{DefFn} = 'SONOS_Define'; $hash->{UndefFn} = 'SONOS_Undef'; + $hash->{DeleteFn} = 'SONOS_Delete'; $hash->{ShutdownFn} = 'SONOS_Shutdown'; $hash->{ReadFn} = "SONOS_Read"; $hash->{ReadyFn} = "SONOS_Ready"; @@ -5682,12 +5683,43 @@ sub SONOS_getSonosPlayerByRoomName($) { ######################################################################################## sub SONOS_Undef ($$) { my ($hash, $name) = @_; - + RemoveInternalTimer($hash); DevIo_SimpleWrite($hash, "disconnect\n", 0); DevIo_CloseDev($hash); - + + return undef; +} + +######################################################################################## +# +# SONOS_Delete - Implements DeleteFn function +# +# Parameter hash = hash of the master, name +# +######################################################################################## +sub SONOS_Delete($$) { + my ($hash, $name) = @_; + + # Erst alle SonosPlayer-Devices löschen + for my $player (SONOS_getAllSonosplayerDevices()) { + CommandDelete(undef, $player->{NAME}); + } + + # Den SubProzess beenden + # Wenn wir einen eigenen UPnP-Server gestartet haben, diesen hier auch wieder beenden, ansonsten nichts tun... + if ($SONOS_StartedOwnUPnPServer) { + # Da die Verbindung bereits durch UndefFn beendet wurde, muss sie hier neu aufgebaut werden, damit ich den Subprozess selbst beenden kann (vorher wurde nur die Verbindung beendet)... + DevIo_OpenDev($hash, 1, undef); + DevIo_SimpleWrite($hash, "shutdown\n", 0); + DevIo_CloseDev($hash); + } + + # Etwas warten... + select(undef, undef, undef, 1); + + # Das Entfernen des Sonos-Devices selbst übernimmt Fhem return undef; } @@ -5713,7 +5745,7 @@ sub SONOS_Shutdown ($$) { DevIo_CloseDev($hash); select(undef, undef, undef, 2); - + return undef; } diff --git a/fhem/FHEM/21_SONOSPLAYER.pm b/fhem/FHEM/21_SONOSPLAYER.pm index d26fec2e3..5a13f9ba0 100755 --- a/fhem/FHEM/21_SONOSPLAYER.pm +++ b/fhem/FHEM/21_SONOSPLAYER.pm @@ -175,6 +175,7 @@ sub SONOSPLAYER_Initialize ($) { $hash->{DefFn} = "SONOSPLAYER_Define"; $hash->{UndefFn} = "SONOSPLAYER_Undef"; + $hash->{DeleteFn} = "SONOSPLAYER_Delete"; $hash->{GetFn} = "SONOSPLAYER_Get"; $hash->{SetFn} = "SONOSPLAYER_Set"; $hash->{StateFn} = "SONOSPLAYER_State"; @@ -725,6 +726,43 @@ sub SONOSPLAYER_Undef ($) { return undef; } +######################################################################################## +# +# SONOSPLAYER_Delete - Implements DeleteFn function +# +# Parameter hash = hash of the master, name +# +######################################################################################## +sub SONOSPLAYER_Delete($$) { + my ($hash, $name) = @_; + + # Alle automatisch erzeugten Komponenten mit entfernen, sofern es sie noch gibt... + SONOSPLAYER_DeleteIfExists($hash->{NAME}.'RC_Notify'); + SONOSPLAYER_DeleteIfExists($hash->{NAME}.'RC_Weblink'); + SONOSPLAYER_DeleteIfExists($hash->{NAME}.'RC'); + + SONOSPLAYER_DeleteIfExists($hash->{NAME}.'RG'); + SONOSPLAYER_DeleteIfExists($hash->{NAME}.'RG_Favourites'); + SONOSPLAYER_DeleteIfExists($hash->{NAME}.'RG_Playlists'); + SONOSPLAYER_DeleteIfExists($hash->{NAME}.'RG_Radios'); + + # Das Entfernen des Sonos-Devices selbst übernimmt Fhem + return undef; +} + +######################################################################################## +# +# SONOSPLAYER_DeleteIfExists - Deletes the Device with the given Name +# +# Parameter hash = hash of the master, name +# +######################################################################################## +sub SONOSPLAYER_DeleteIfExists($) { + my ($name) = @_; + + CommandDelete(undef, $name) if ($main::defs{$name}); +} + ######################################################################################## # # SONOSPLAYER_Log - Log to the normal Log-command with additional Infomations like Thread-ID and the prefix 'SONOSPLAYER'