Nachdem es leider bis heute keine set-Methode zum Restart des SONOS SubProcess gibt, habe ich mir im SONOS-Modul mal angeschaut, was da beim deaktivieren/re-aktivieren mittels
disable Attribut gemacht wird und mir das in eine (bzw. zwei) eigene Funktion(en) in meiner
99_myUtils.pm extrahiert.
Letztendlich auch nur deswegen, weil mich stört, dass nach restart mittels
disable-Attribut, die FHEM-Konfiguration als geändert markiert wird (rotes Fragezeichen).
Wenn man den untern stehenden Code in seine
99_myUtils.pm übernommen hat, kann man den SONOS-SupProcess beispielsweise ganz einfach durch Eingabe von
{mySONOS_RestartSubProcess}
in der FHEM-Kommanndoziele neu starten.
Besser ist natürlich der Aufruf aus einer, wie auch immer gearteten Übewachung!
Vorab noch ein Hinweis:Es ist keine gute Praxis, einfach so irgendwelche modulinternen Mehtoden aufzurufen. Die können sich jederzeit im Namen oder der Signatur ändern. Es kann also jederzeit zu unerwünschten Nebenwirkungen kommen; bis hin zum Komplettabsturz des FHEM-Prozesses!
Die Verwendung der folgenden Funktion(en) erfolgt grundsätzlich
auf eigenes Risiko !Ich leiste auch keinen weiteren Support dazu!
(Stand heute funktioniert das bei mir und fertig!)
sub mySONOS_RestartSubProcess
{
#This was grabbed from SONOS disable-Attribute handling and is relying on the internal
#naming of methods in the SONOS module. -> Use at your own risk!
#get hash of the SONOS main device
my $hash = SONOS_getSonosPlayerByName();
#Initiating Stop-Process if not already disabled...
InternalTimer(gettimeofday() + 1, 'SONOS_StopSubProcess', $hash, 0) if($hash->{STATE} ne 'disabled');
#Wait before trying to start the process again
InternalTimer(gettimeofday() + 10, 'mySonos_StartSubProcess', 'noArg', 0);
}
sub mySonos_StartSubProcess
{
#This was grabbed from SONOS disable-Attribute handling and is relying on the internal
#naming of methods in the SONOS module. -> Use at your own risk!
#get hash of the SONOS main device
my $hash = SONOS_getSonosPlayerByName();
InternalTimer(gettimeofday() + 1, 'SONOS_DelayStart', $hash, 0) if($hash->{STATE} eq 'disabled');
}
Noch kurz zur Implementierung:
- Die Internal-Timer vor den SONOS-internen Funktionsaufrufen habe ich so übernommen. Ich bin mir nicht sicher, ob die hier überhaupt notwendig sind. Im Modul selbst dienen die wahrscheinlich lediglich zum Entkoppeln.
- Die zweite sub für das Starten des SubProcess war notwendig, da diese mit 10 Sekunden Verzögerung aufgerufen wird um sicherzustellen, dass der SubProcess auch genug Zeit hatte, zu beenden.
Leider kann man hier nicht direkt die modulinterne Methode direkt mit entsprechender Verzögerung aufrufen, da SONOS anscheinend beim beenden des SubProcess alle "eigenen" internen Timer löscht. Somit wird der SubProcess nie neu Starten.
Mögliche Fallstricke:
- Sollten die 10 Sekunden Wartezeit zu kurz sein, und der SubProcess länger brauchen, bis er beendet ist, einfach die Wartezeit so lange Schrittweise erhöhen, bis es korrekt funktioniert. Länger als 60 Sekunden sollten das aber eigentlich nie sein!
- Sollte der Restart mal fehlschlagen, kann die sub mySONOS_StartSupProcess natürlich ebenfalls direkt aufgerufen werden
Viel Spaß damit!
gb#