Squeezebox Modul - erste Version

Begonnen von bugster_de, 17 Dezember 2013, 22:12:10

Vorheriges Thema - Nächstes Thema

siggi85

Zitat von: marvin78 am 26 Juni 2014, 15:23:14
Ich habe mir dafür eine Funktion in der myUtils hinterlegt:


sub squeezeSync($$;$) {
  my ($slaves,$art,$master)=@_;
  my @dvs=();
  my $dev="";
  my $command="";
  my $i=0;
  @dvs=split(",",$slaves);
  if ($art eq "connect" && defined($master)) {
  foreach (@dvs) {
       $i++;
           $dev=$_;
       fhem("set $dev:FILTER=STATE!=on on");
           fhem("set $master cliraw sync $dev");
           Log 1,"Squeezebox: $dev synced to $master";
  }
      fhem("set $master play");
      return 1;
  }
  elsif ($art eq "disconnect") {
  foreach (@dvs) {
      $dev=$_;
      fhem("set $dev cliraw sync -;sleep 1;set $dev:FILTER=STATE!=off off");
          Log 1,"Squeezebox: $dev unsynced";
        }
    return 1;
  }
  else{return 0};
}


Aufruf:

squeezeSync(slave1[,slave2,slave..],connect|disconnect,master)

master kann beim disconnect weg gelassen werden.

Beispiele:

2 Squeezeboxen miteinander verbinden (SB1 spielt etwas):


squeezeSync("SB2","connect","SB1")


3 Squeezeboxen miteinander verbinden (SB1 spielt etwas):


squeezeSync("SB2,SB3","connect","SB1")


Eine Squeezebox aus der Gruppe lösen:


squeezeSync("SB2","disconnect")



usw.

Vorausetzung ist hier, dass alle Player im Media Server den gleichen Namen haben, wie in FHEM!!!

Ich wollte mich noch mal für diese Subroutine bedanken. Da ich jetzt auch drei Player habe und ein vierter demnächst dazu kommt, hatte ich nun auch Bedarf für sowas.
Funktioniert einwandfrei!!! Ein Must-Have für alle die mind. 3 Squeezeplayer betreiben.  :)

bugster_de

@siggi85: nur als Hinweis: die neue Version der beiden Module, die im Contrib steht kann jetzt auch direkt syncen. Wie das geht steht im ersten Eintrag dieses Posts

karl0123

Ich habe bei der neuen Version immer noch das Problem (eben noch einmal probiert), dass das Abspielen unter nicht reproduzierbaren Umständen nach ein paar Sekunden abbricht (Wurde oben schon berichtet). Fast immer passiert das, wenn man die Quelle umstellt (bspw. über eine Readingsgroup) und dabei von externem Stream auf interne Quelle oder umgekehrt umgestellt wird. Deshalb verwende ich die alte Version und bin auch dankbar um die sub oben.

bugster_de

Zitatdass das Abspielen unter nicht reproduzierbaren Umständen
nicht reproduzierbar ist schon mal schlecht ....

Dem Post entnehme ich, dass es mit einer Vorgängerversion dieses Moduls funktioniert hat und mit der neueren version geht es nicht mehr?
Welche ältere Version funktioniert denn (bitte mal hier anhängen oder PM an mich)?
Wenn du den gleichen Vorgang via Squeezebox Webinterface machst geht es? Nur pre FHEM geht es nicht?
Zitatbspw. über eine Readingsgroup
verstehe ich jetzt nicht. Hast Du ein eigenes Perl Skript ausrum gebaut? Funktioniert dieses einwandfrei?

karl0123

#319
Das ist die Version von bevor du das sync eingebaut hast. Hängt an.

Ich habe mich falsch ausgedrückt. Die Readingsgroup nutze ich nur, um das ganze zu vereinfachen. Es werden die gewöhnlichen Modul-Befehle benutzt, keine eigenen PERL-Funktionen. Das beschrieben Fehlverhalten tritt auch auf, wenn ich es im Squeezebox-Device direkt steuere.


bugster_de

@Karl0123: ich kann das Problem hier leider echt nicht nachvollziehen.

- steuer den Player mal bitte auch über das Squeezebox Webinterface (also nicht FHEM). Tritt das dann auch auf?
- was passiert wenn das Abspielen abbricht? Geht der Player dann in FHEM auf off?

Stell mal für den fraglichen Player das Attribut verbose auf 5, erzeuge den Fehler und stelle mir mal die Logfiles ein.

karl0123

Das Steuern über das Webinterface funktioniert einwandfrei. Dort bricht nichts ab. Es muss einen Unterschied zwischen der alten und der neuen Version geben, denn mit der genannten alten funktioniert alles über FHEM einwandfrei.

Wenn es Abbricht, geht der Player auf off.

Fehlermeldungen kann ich frühestens heute Abend überprüfen. Ich habe aktuell kein Testsystem und möchte nicht von der Arbeit aus in meinem Produktivsystem rumpfuschen.

bugster_de

#322
ZitatWenn es Abbricht, geht der Player auf off
da würde ich mal sagen, it's not a bug it's a feature: wen die Verbindung von FHEM zum Squeezeserver abbricht, dann wird es in FHEM auf OFF gestellt. Dieses Verhalten kannst Du mit dem Attribut "doalivecheck" am SB_SERVER Modul einstellen. Stelle dieses Attribut auf false.
Warum er allerdings dann auch den Player auf Stop stellt kann ich nicht nachvollziehen. Der Status in FHEM ON oder OFF ist eine reine Anzeige und es werden keine Kommandos an die SB gesendet. Ich kann mir nur vorstellen, dass es mit den Code Änderungen zusammenhängt, die oliv06 im Frühjahr in das Modul eingebaut hat, um die Sprachausgabe zu verbesseren. Diese Code Stücke blicke ich nicht so richtig und oliv06 konnte mir auch nicht mehr erklären, was er da so gemacht hat. Werde ich wohl wieder ausbauen müssen.

Wie gesagt: stelle mal bitte beim SB_SERVER und bei einem SB_PLAYER das attribut verbose auf 5 und schicke die Logfiles von einem Zeitpunkt wo das Problem auftritt.

Ansonsten wäre es klasse, wenn Du die angehängten Module am Post unten wieder löscht, sonst verbreitet sich diese alte Version. Danke !

karl0123

Nun, die Version ist ja fehlerfreier ;) aber ich entferne sie. Logs bringe ich, sobald ich wieder ein Testsystem habe.

Es gibt noch ein weiteres Problem (auch in der alten Version). Ist der Server (auf dem Logitech Media Server installiert ist) nicht erreichbar, nimmt sich FHEM jede Minute 3-4 Sekunden Auszeit (über perfmon und apptime analysiert). Ist es möglich, den Modulen ein disable Attribut zu verpassen und/oder das ganze nicht blockend zu machen?

TTS kann die oben genannte alte Version übrigens auch schon (wenn auch  nicht gut).

siggi85

Zitat von: karl0123 am 07 August 2014, 09:19:40
TTS kann die oben genannte alte Version übrigens auch schon (wenn auch  nicht gut).
TTS konnte das Modul auch schon vorher, aber oliv hatte Änderungen eingebaut, welche es möglich machten TTS Ausgaben auszugeben während Musik läuft. Dadurch wurde die Wiedergabeliste gespeichert, das TTS ausgegeben, die Wiedergabeliste wieder geladen und beim gleichen Titel fortgesetzt (Titel startet aber von vorne).

bugster_de

ZitatNun, die Version ist ja fehlerfreier
richtig, aber wenn alle möglichen Versionen im Umlauf sind, dann werde ich beim supporten irre. Ich möchte den Bug dann schon auf der neuesten Version fixen.

Zitataber oliv hatte Änderungen eingebaut, welche es möglich machten TTS Ausgaben auszugeben während Musik läuft
richtig. Oliv hat es (versucht) so einzubauen, dass die Musik stoppt, TTS ausgegeben wird und dann die Musik wieder weiter läuft. Hier geht es aber im Code an allen möglichen Stellen mit Play& Pause hin und her. Oliv konnte mir das vor 4 Wochen auch nicht mehr erklären und er selbst ist jetzt wohl erstmal beruflich für die nächsten Monate gebunden ...

marvin78

Zitat von: karl0123 am 07 August 2014, 09:19:40Es gibt noch ein weiteres Problem (auch in der alten Version). Ist der Server (auf dem Logitech Media Server installiert ist) nicht erreichbar, nimmt sich FHEM jede Minute 3-4 Sekunden Auszeit (über perfmon und apptime analysiert). Ist es möglich, den Modulen ein disable Attribut zu verpassen und/oder das ganze nicht blockend zu machen?

Hattest du das gelesen?

Das TTS Thema sehe ich im Übrigen gegenüber solchen Problemen als zweitrangig an.

bugster_de

ZitatHattest du das gelesen?
vermutlich. Aber auch wohl wieder aktiv verdrängt....

Problem lässt sich aber in erster Näherung mal wie folgt eingrenzen:
- doalivecheck auf false stellen  --> wenn dann der Effekt nicht mehr auftritt liegt es am Ping Mechanismus
- mal das Attribut alivetimer verstellen. Per default steht es auf 120 Sekunden

Hintergrund: alle x Sekunden (mit x = alivetimer) wird der Squeezebox angepingt. Timeout da auf 2 Sekunden (sprich Antwort muß innert zwei Sekunden da sein). Wenn auf dem Squeeze Server das RCC Modul installiert ist, wird auch dessen Status mit abgefragt. Und es wird alle x Sekunden die Anfrage "alivecheck ?" and den Squeeze-Server geschickt. der hat nämlich die nette Eigenschaft, dass er alle Kommandos, die er nicht kennt einfach wieder zurück schickt. Wenn also das Kommando zurück kommt, dann ist der SqueezeServer noch lebendig.
Den Klapparatismus kann man man mit doalivecheck ein / ausschalten.

Nebenbemerkungen
Der Ping hat einen Timeout von 2 Sekunden --> wie passt das zu den 3-4 Sekunden?
Der Alivetimer hat einen Default von 120 Sekunden --> passt nicht zu der einen Minute
Ich habe das Modul an allen möglichen Stellen mit Logfileeinträgen versehen. Die Struktur ist dabei wie folgt:
Prio 1: ein Fehler, den der User kennen muß, weil er z.B. bei der Config etwas falsch angegeben hat
Prio 2: nicht belegt
Prio 3: Warnings, die den User interessieren könnten. Z.B. falsche Argument beim set Befehl aus einem Perl Skript
Prio 4: Ausgabe, wann eine bestimmt Routine des Moduls aufgerufen wurde (Call-Stack)
Prio 5: alle möglichen Kleinigkeiten und sonstige Infos
Deshalb: bei Fehlern bitte das Attribut verbose auf 5 stellen und Logfiles hier einstellen. Danach das Attribut wieder zurück auf 0, oder 1 sonst ist euer logfile Ruck-Zuck voll

@Karl0123: im Prinzip lassen sich alle diese Fehler darauf zurück führen, dass FHEM die Verbindung zur Squeezebox verliert. Wir müssen nun rausfinden woran das liegt, denn meine Module handeln jeweils nur nach den Symptomen, aber die Ursache müssen wir noch finden. Die alte Version hatte die Verbindung etwas relaxter überprüft, deshalb scheint es da zu gehen. Nachteil war halt, dass sie nicht wirklich zuverlässig mitbekommt, wann der Server An oder Aus ist. Aber gerade diese Funktionalität ist mir wichtig :-)
Ist dein Netzwerk soweit stabil? Also keine WLAN Verbindung über 400 Meter oder so was zwischen den beiden Geräten?

Zitatdas ganze nicht blockend zu machen
möglich schon, das Modul hat aber aktuell schon deshalb eine brauchbar große Komplexität, weil bestimmte Dinge quasi parallel läufig zwischen den beiden Servern abgehandelt werden. Wenn ich jetzt noch den nonblocking Mechanismus inklusive seinem lustigen Datenrückgabeverfahren einbaue ... Naja, das hilft dann der Wartbarkeit und auch der Rechenzeit nicht unbedingt.

karl0123

#328
Das mit doalivecheck und alivetimer habe ich alles schon in mehreren Varianten probiert. Es gibt zwar einen Fehler von dem Squeezebox-Modul im Log (Use of uninitialized value $args[0] in string eq at ./FHEM/98_SB_PLAYER.pm line 403.), der aber mit den Verzögerungen nichts zu tun hat. Es ist deutlich zu erkennen, dass es die Verzögerungen auslöst, wenn der LMS nicht im Netz ist. Ich habe ein sehr gut funktionierendes und gut konfiguriertes Netzwerk. Es ist kein WLAN sondern eine LAN Verbindung mit maximaler Leitungslänge von 12 Metern. Ich habe das ganze sogar schon mit einer leeren FHEM-Konfig und einen jungfräulichen Squeezebox-Server ausprobiert. Es trat das gleiche Problem auf. Wenn doalivecheck irgendeine Wirkung hätte oder es ein disable Attribut gäbe, wäre ja schon viel gewonnen. Dass dieses Attribut automatisch gesetzt wird, wenn der Server nicht erreichbar ist, ist über ein notify die leichteste Übung.

Ein Verbose auf 5 bringt bei Abwesendem Server nur folgendes:

2014.08.07 19:22:36.515 1: Perfmon: possible freeze starting at 19:22:34, delay is 2.514
2014.08.07 19:22:33.512 4: SB_SERVER_Ready: called
2014.08.07 19:22:33.001 4: SB_SERVER_Ready: called
2014.08.07 19:22:32.769 4: SB_SERVER_Ready: called
2014.08.07 19:22:32.505 4: SB_SERVER_Ready: called

...

(von hinten nach vorne zu lesen)

Das ist nicht sehr spannend uns aussagekräftig.

Ach und das mit den 3-4 Sekunden war falsch von mir. Das betrifft ein anderes Problem mit hmland. Bei Squeezeserver sind es immer 2-2,5 Sekunden Auszeit.

patlabor

Hallo zusammen,

wollte mir gerade mal die Module einbinden.

leider bekomme ich dabei nur angezeigt:

Cannot load module SB_SERVER

Im Log habe ich folgendes stehen:
2014.08.09 16:39:40 1: reload: Error:Modul 97_SB_SERVER deactivated:
Unrecognized character \xC2; marked by <-- HERE after at master <-- HERE near column 50 at ./FHEM/97_SB_SERVER.pm line 14.

2014.08.09 16:39:40 0: Unrecognized character \xC2; marked by <-- HERE after at master <-- HERE near column 50 at ./FHEM/97_SB_SERVER.pm line 14.


das modul habe ich direkt von github per wget auf den fhem rechner geladen.

jemand eine Idee was hier falsch laufen könnte?