Sonos steuern

Begonnen von Will, 05 Januar 2013, 15:51:12

Vorheriges Thema - Nächstes Thema

JoeALLb

Hallo Reiner,

Ich schalte mit Funksteckdosen meine Sonos ein und aus.
Wenn ich in den oberen Stock gehe,  schalte ich die Steckdosen unten im Hausgang über einen Funksteckdosen an.
Wie Steuer ich denn am besten,  dass nach dem Booten direkt etwas abgespielt wird? Kann ich vor dem Booten irgendwie schon irgendwie eine Gruppe zur Bildung definieren? Kann ich den appeared-funktion dafür verwenden?  Am schönsten wäre es,  wenn der Player schon verfügbar wäre und ich ihm schon Befehle übergeben könnte,  die er dann direkt nach dem Booten  übernimmt. Habe ich da einen Denkfehler?

Vielen Dank jedenfalls für alles,  es funktioniert seit dem update Alles bisher getestete bestens!!  Echt tolle Arbeit!

LG Joe
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Christoph

Ja das funktioniert siehe Wiki-Beispiel  ;)


define Sonos_Wohnzimmer_Appeared_Notify notify Sonos_Wohnzimmer:presence:.appeared { \
fhem "set Sonos_Wohnzimmer LoadPlaylist R.%%20Spielliste" ;; \
fhem "set Sonos_Wohnzimmer Volume 15" ;; \
fhem "set Sonos_Wohnzimmer Track random" ;; \
fhem "set Sonos_Wohnzimmer Play" \
}

JoeALLb

Hallo Christoph,

Danke,  das Beispiel kenne ich.  Ich meinte jedoch eher,  ob ich etwas tun kann,  damit eben nicht die einprogrammiert Play Liste abgespielt wird,  sondern etwas,  was ich schon vorher definiert habe.

Ich behelfe mir im Moment über folgenden Weg:
Ich starte in der Küche das (Radio-) Programm,  das ich gerne hätte, und baue in dem "appeared" Script im Badezimmer eine Gruppe mit der Küche auf,  um direkt danach die Küche wieder aus der Gruppe zu entfernen und auszuschalten.
Dann spielt die Musik schon,  bis ich im Bad angekommen bin... 

Gesendet von meinem Xperia Pro mit Tapatalk

FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

Reinerlein

Hi JoeALLb,

du verwirrst uns :-)

Ein Player verliert beim Trennen vom Stromnetz alle Informationen bzgl. seiner Abspielliste und dem aktuellen Titel.
Wenn du also einen bestimmten Zustand nach dem Einschalten haben möchtest, so musst du ihn dir über das oben erwähnte Event erzeugen.
Was du in dem Event machst bleibt ja dir überlassen.

Du schriebst, dass du gerne einen Radiosender starten möchtest. Dann kannst du entweder direkt einen Radiosender programmieren (wie die Playliste in dem Beispiel), oder den aktuell laufenden Titel eines anderen Zoneplayers rüberkopieren und starten...
Das bedeutet aber, dass dieser Quell-Player auch einen aktuellen Titel haben muss (und vor allem auch angeschaltet sein muss). Was soll passieren, wenn das mal nicht der Fall ist? usw. Da muss man u.U. einige Eventualitäten abfangen.

Einfacher ist natürlich das direkte Anstarten eines, zum Programmierzeitpunkt bekannten, Radiosenders.
Auch solltest du beachten, dass das Starten eines Zoneplayers ca. 30 sekunden in Anspruch nimmt. Zzgl. der Zeit, die zum Starten des Radiosenders benötigt wird.

Hat dir das denn jetzt etwas weitergeholfen?

Grüße
Reiner

det.

#604
Hallo Reiner, hallo JoeALLb,
Ich kopiere heute nach Feierabend mal meine Zeilen zum Playerstart mit Schalten über FS20 Steckdose und automatischen Direktstart von Radio Paradise hier rein. Das hat eine Weile gedauert, bis ich begriffen habe das der presence Status des Players da wenig zielführend ist - sondern einfach eine Minute Wartezeit zum Playerstart die Lösung ist. Jetzt funktioniert das dafür aber dauerhaft prima:
define Sonos_Notify notify Medien:on {\
fhem "define SonosStart at +00:01 set Sonos_Wohnzimmer PlayURI aac://stream-tx4.radioparadise.com:80/aac-128";;\
fhem "set Sonos_Wohnzimmer Volume 15";;\
fhem "set Sonos_Wohnzimmer Play";;\
fhem "set Sonos_Wohnzimmer Mute off"\
}
LG
det.

John

Hallo Reiner

gibt es zum Beitrag #557 schon eine Lösung ?
http://forum.fhem.de/index.php/topic,10033.msg118474.html#msg118474

Ich habe inzwischen die neueste Version installiert. (#  Version 2.4 - December, 2013)

Der Fehler ist nach wie vor vorhanden mit der schon in #557 beschriebenen Meldung.
Wenn ich die Datei aus dem Verzeichnis lösche, erkennt dies das Modul und reagiert mit einer stimmigen Fehlermeldung.

Die Zugriffsrechte sehen wie folgt aus:

drwxrwxr-x 2 fhem dialout    4096 Jan  2 16:15 .
drwxr-xr-x 3 root root       4096 Jan  1 14:12 ..
-rw-rw---- 1 fhem dialout 3330319 Jan  1 14:46 05 - Titel 5.ogg
-rw-rw-r-- 1 fhem dialout     749 Jan  1 16:56 john.m3u
-rw-r--r-- 1 pi   pi        20480 Jan  2 16:05 RINCON_000E58CBFB7C01400_MR_Speak.mp3


User pi ist Mitglied der Gruppe dialout.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Reinerlein

Hi John,

ich hatte mal nach der Meldung "Unpassender IOCTL (I/O-Control) für das Gerät" gegoogled, und kein hilfreichen Lösungs-Informationen gefunden. Es sieht nach einer Meldung aus, die aus einer sehr tiefen Perl-Schicht kommt, auf die man nur wenig bis gar keinen Einfluss hat.

Kannst du mal ein kleines Test-Perl Skript für das Fhem-Gerät schreiben, womit du einfach versuchst die Datei zu öffnen.
z.B.:

open(FILE, '<john.m3u');
if ($!) {
  print "Fehler beim Öffnen der Datei: $!";
  return;
};

binmode(FILE, ':encoding(utf-8)');
while (<FILE>) {
  print $_;
}
close FILE;

Das öffnet die Datei (Pfad noch mit angeben, aber das Kleiner-Zeichen stehen lassen) zum Lesen, und gibt sie zeilenweise aus. Das entspricht ungefähr meinem Code. Der Fehler tritt aber ja bereits beim open auf..
Dann könntest du schon mal den Fhem-Overhead ausschließen...

Ansonsten könntest du auch versuchen dein Perl zu aktualisieren...

Grüße
Reiner

JoeALLb

Grüß euch,

Wollte natürlich nicht verwirren.  Ich möchte eben keinen starr programmierten Sender beim starten einschalten,  sondern noch die Möglichkeit haben,  es während dem Booten festzulegen.
Genau aus diesem Grund schalte ich derzeit in der Küche das Programm ein,  das ich im Bad gerne hätte, und kopiere dieses über das hinzufügen des Bades zur Gruppe Küche,  wenn appeared ausgelöst wird.  Funktioniert soweit auch,  ich wollte nur fragen,  ob es vielleicht einen einfacheren weg gibt...  Bsp.  Konnte der Player des Bades direkt nach dem starten angezeigt werden,  bevor er tatsächlich erscheint!?!?!
FHEM-Server auf IntelAtom+Debian (8.1 Watt), KNX,
RasPi-2 Sonos-FHEM per FHEM2FHEM,RasPi-3 Versuchs-RasPi für WLAN-Tests
Gateways: DuoFern Stick, CUL866 PCA301, CUL HM, HMLan, JeeLink, LaCrosse,VCO2
Synology. Ardurino UNO für 1-Wire Tests, FB7270

John

#608
Hallo Reiner,
zu deinem Vorschlag in Beitrag #606 habe ich folgende funktionierende Lösung gefunden:

open(FILE, '<john.m3u')  or die "Fehler beim Öffnen: $!\n";
binmode(FILE, ':encoding(utf-8)');
while (<FILE>) {
  print $_;
}
close FILE;


Problem war:
Die Spezial-Variable $! darf nur abgefragt werden, nachdem ein Fehler aufgetreten ist.
Wenn keiner auftritt, kommt es genau durch die Abfrage von $! zur besagten Fehlermeldung.

Werde das noch im Sonos-Code testen.

Ergebnis:
Zitat
LoadPlaylist: Queue successfully emptied. Added 5 entries from file "/mnt/SonosSpeak/john.m3u". There are now 5 entries in Queue. Startlist: Success!.

Code:

if (!open(FILE, '<'.$1))  # john
       {
  SONOS_MakeSigHandlerReturnValue($udn, 'LastActionResult', ucfirst($workType).': Error during opening file "'.$1.'": '.$!);
return;
      };



John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Reinerlein

Hi John,

na das ist ja mal lustig. Auf allen möglichen Plattformen bei mir und anderen lief das normal durch.
Da muss man erstmal drauf kommen, dass man das nicht tun darf...
Wobei diese Fehler-Meldung auch durchaus zielführender sein dürfte, oder?

Danke für die Hilfe, ich habe es in den Code übernommen.

Grüße
Reiner

PumpkinEater

Hallo Reiner,
mit der neuen Version sind die von mir berichteten Fehlermeldungen (#519, "Fehlerhafter Aufruf von ...") nun verschwunden. Alles läuft prima. Herzlichen Dank für die super Arbeit.

Noch eine Frage:
Ich möchte vor Durchsagen einen Ton, Dreiklang oder ähnliches abspielen (als mp3-Datei), damit bei der Durchsage meine Familie nicht vor Schreck vom Stuhl fällt  ;). Wie mache ich das am besten?  Erste Idee wäre, einen "PlayURITemp"-Aufruf zu senden, gefolgt von dem eigentlichen Speak-Befehl. Aber vielleicht geht das ja auch noch einfacher (?).

Gruß
Peter

herman

Hallo Reiner,

seid dem letzten Update habe ich keine Abstürze mehr. Das Modul ist wirklich ein riesen Mehrwert für mich.

Ich habe noch ein seltsames Phänomen: Nach StopAll, Neugruppieren, at +3sek Bedenkzeit und  anschließendem StartFavourite hatte ich mehrfach die Situation, dass zwar alle Befehle erfolgreich waren und auch der Controller auf dem IPAD die Gruppe korrekt angezeigt hat, jedoch ein oder mehrere Memberplayer nicht gespielt haben. Erst nach einem Entfernen und Neuhinzufügen in die Gruppe kamen Töne aus dem Lautsprecher. Ist jemandem das Verhalten bekannt?

Viele Grüße,
Merhan

chregu

Da ich wie schon gesagt ab und zu "fatal" errors im XML Parsing bei den Controlpoints habe (besonders wenn ich in einem ungünstigen Moment die Sonos Kisten ausschalte), hab ich mir das mal genauer angeschaut. Grundsätzlich scheint ein eval {} rund um $SONOS_Controlpoint->handle; (Zeile 1969) zu helfen, die errors abzufangen. Natürlich muss dann der Controlpoint neu gestartet werden. Ein voller Patch liegt hier

https://github.com/chregu/fhem-sonos/commit/1fe7f228aaa35d25afaad454f026a4b406f82fb2

Ich hab das bei mir am laufen und es scheint prinzipiell zu funktionieren (im Normalbetrieb passiert es jedoch selten), ich bin mir aber nicht sicher, ob's dadurch nicht irgendwelche Memory Leaks gibt. Ich hatte ein paar unerklärliche "Out of Memory", auch wenn der FHEM perl prozess normalerweise bei ca. 32MB liegt. Und da die Out of Memory situationen schlecht reproduzierbar sind, weiss ich auch nicht, ob's einen direkten Zusammenhang hat mit meinem Ansatz. Im Normalfall tut er jedenfalls und der Thread stürzt nicht mehr ab, wenn "schlechtes" XML kommt.

Vielleicht hat jemand mit mehr Kenntnissen des Systems auch eine bessere Idee, wie man damit umgehen kann.

Gruss

Reinerlein

Hi Christian,

OK, das klingt gut.
Ich würde deine Umsetzung nur gerne kürzer und direkter fassen, damit man später besser durchschaut, was da eigentlich passiert.

Ich habe mal die Developer-Version entsprechend angepasst.

Bzgl. der Memory-Meldung habe ich hier im Sonos-Thread auch schon das eine oder andere mal darüber gelesen. Leider kann man das, wie du schon schriebst, nicht reproduzieren oder gar beheben oder eingrenzen. Ich persönlich hatte die Meldung noch nie...

In der Dev-Version ist außerdem eine testweise Umstellung meiner Info-Fhem-Anfragen über Telnet drin.
Achtung: Das bedeutet momentan, das die Developer-Version einen eingerichteten Fhem-Telnet-Port benötigt (Standard-Host: localhost, Standard-Port: 7072, wenn notwendig kann die Variable $SONOS_UseTelnetForQuestionsHost oder $SONOS_UseTelnetForQuestionsPort entsprechend angepasst werden).
Das muss mal beobachtet werden, ob es besser läuft oder nicht...

Außerdem ist nun ein Standard-Layout für das RemoteControl-Modul eingebaut, vielleicht kann es ja jemand gebrauchen...

Grüße
Reiner

chregu

Danke für die prompte Antwort und das sauberere Umschreiben.

Ich beobachte das jetzt mal mit deinem Patch, aber ich seh da prinzipiell keinen Unterschied zu meiner Version.

Gruss

christian