Sonos steuern

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

Vorheriges Thema - Nächstes Thema

yetiman

Hallo Reinerlein,

ich würde ja gerne irgendwann mal sagen, dass eine Version gut ist...
Nur irgendwie kommt jeden Tag ne neue Version raus ;-)

Ingo

Reinerlein

Hi Ingo,

naja, das bleibt in einer Testphase ja irgendwie nicht aus :)
Aber es ist ja schon ruhiger geworden, da wohl die gröbsten Kinken raus sind...

Grüße
Reinerlein

strauch

Oh hier ist ja einiges passiert. Abstürze hab ich ab und an immer noch aber deutlich seltener als Früher. Mal schauen am Wochenende werde ich mal FHEM ein Update verpassen.

Die letzten sahen im Protokoll so aus:
Starting fhem...
Current: "fhem.pl", gPath: "./FHEM"
Current: "FHEM/00_SONOS.pm", gPath: ""
2014.11.10 17:57:29 1: SONOS0: FHEM/00_SONOS.pm is listening to Port 4711
2014.11.10 17:57:37 1: SONOS0: Connection accepted from localhost:54210
2014.11.10 17:57:39 5: SONOS0: Received: 'SetValues:SONOS:UserID_Napster=SA_RINCON13_email%2540strau.ch|NAME=Sonos|INTERVAL=30'
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
Can't ignore signal CHLD, forcing to default.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
Can't call method "kill" on an undefined value at FHEM/00_SONOS.pm line 5006, <$client> line 3.


Starting fhem...
Current: "fhem.pl", gPath: "./FHEM"
Current: "FHEM/00_SONOS.pm", gPath: ""
2014.11.11 00:21:48 1: SONOS0: FHEM/00_SONOS.pm is listening to Port 4711
2014.11.11 00:21:56 1: SONOS0: Connection accepted from localhost:55032
2014.11.11 00:21:58 5: SONOS0: Received: 'SetValues:SONOS:UserID_Napster=SA_RINCON13_email%2540strau.ch|NAME=Sonos|INTERVAL=30'
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
Can't ignore signal CHLD, forcing to default.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
^* matches null string many times in regex; marked by <-- HERE in m/^* <-- HERE .$/ at fhem.pl line 3607.
Can't call method "kill" on an undefined value at FHEM/00_SONOS.pm line 5006, <$client> line 3.
FHEM 5.6 VMware mit Debian. 1 CUL für FS20 und HMLAN für Homematic, HM-CC-RT-DN, HM-LC_Sw1PBU-FM, HM-LC-Bl1PBU-FM,  HM-SEC-SC, HM-SEC-SC-2, HM-LC-Sw1-Pl2, HM-Sec-RHS, ASH2200, FHT80B, S20KSE, Sonos, XBMC, FB_Callmonitor, SMLUSB, Arduino Firmata, uvm.

Reinerlein

Hi strauch,

das ist auf jeden Fall noch eine ältere Version. In der aktuellen wird bei Verbose-Level 5 nämlich an der von dir gezeigten Stelle noch etwas mehr ausgegeben...

Bitte erst auf die neuste Dev-Version updaten, und dann nochmal schauen :-)
Es hat sich wirklich signifkant viel geändert.

Danke schon mal...

Grüße
Reinerlein

rapster

#1189
Hi Reinerlein,

ist es eigentlich normal dass man kein Speak mit einem , (Komma) im Text machen kann?
Ein Punkt zumindest funktioniert :-)

Bin allerdings schon öfters in das Problem reingelaufen..

Gruß Claudiu

EDIT:
Oder gibt es eine andere Möglichkeit eine Sprechpause einzufügen?

Reinerlein

Hi Claudiu,

das muss schon ziemlich lange so da drin sein :) Auf jeden Fall habe ich es korrigiert.
Das das noch keinem aufgefallen ist... komisch...

Für Sprechpausen ist das Text2Speech selbst zuständig. In diesem Fall ja Google. Die können das mit den Kommata auch, allerdings ist dieser Parameter auf dem langen Weg zu Google verstümmelt worden, und die sind dort gar nicht angekommen...

Grüße
Reinerlein

P.S.: Und wieder eine neue Version mit weniger Fehlern :D

rapster

Hi Reinerlein,

Danke dir! Funktioniert  :D

und ja, zumindest für mich ist das schon immer so gewesen ;D

Was auch schon so lange her ist:
wenn ich ein "set SonosPlayer Speak 13 de test 1 2 3 test" mache, funktioniert das und er stellt den alten Eingang wieder her.
bei einem "set SonosPlayer Speak 13 de test" wird der alte Eingang nicht wiederhergestellt und ich erhalte:
2014.11.27 00:05:30.903 3: SONOS1: SleepTimer berechnet die Laufzeit des Titels selber, da keine Wartezeit uebermittelt wurde!
2014.11.27 00:05:30.903 1: SONOS1: Da keine Endzeit ermittelt werden konnte, wird kein Restoring durchgef▒hrt werden!

Liegt das an google oder an dem Sonos-Modul?


Und dann hätte ich noch ein Feature Request ;D
Eine (evtl. konfigurierbare über attr, z.B. maxChar?) Funktion welche einen Speak-String bei Überschreitung einer gewissen Länge automatisch auf mehrere Speak bzw. google-Requests aufteilt.

Momentan löse ich sowas indem ich fhem("set Player Speak de Teilstring1 ; set Player Speak de Teilstring2 ; ..."); aufrufe.
Das Problem ist nur, in manchen Speaks wird der Text dynamisch erzeugt, und da hat man natürlich nicht wirklich die Kontrolle drüber wie lang der Text nun wirklich ist  :-\


Danke und Gruß Claudiu

Reinerlein

Hi Claudiu,

also... das mit den kurzen Texten war der übliche Fehler mit der Variablen-Vorhandensein-Prüfung. Das habe ich korrigiert :)

Des Weiteren habe ich die Google-Abfrage mal umgebaut, sodass ein zu langer Text (hier habe ich erstmal eine Grenze von 15 Worten angenommen) in mehrere Anfragen aufgeteilt werden, und am Ende zusammengefügt werden.
Damit erhält man auch Texte die sehr lang sind.

Allerdings gibt es ein Manko:
Ich trenne auf Wortgrenzen, damit die Sprachausgabe nicht halbe Worte aufsagen muss. Allerdings passt die Betonung u.U. nicht mehr so ganz. Google baut eine Satzmelodie ein, die hier dann nicht mehr richtig passt :-\

Alternativ kannst du dir ein lokales Text2Speech-Programm einrichten. Im Wiki gibt es dazu ein Beispiel für "espeak". Damit gibt es nach meinen Tests keinerlei Begrenzungen in der Textlänge. Allerdings fand ich die Sprachqualität nicht so berauschend, aber vielleicht gibt es ja auch noch andere Tools, die man sich einrichten kann (du kannst bis zu vier verschiedene Programme im Modul definieren)...

Grüße
Reinerlein

rapster

#1193
Hi Reinerlein,

danke schonmal für die bugfixe! :-)

Das mit dem Trennen bei Wortgrenzen ist schon auf jedenfall ganz gut, allerdings denke ich sollte nicht die Berechnung der Textlänge hierauf basieren.
Da es vorkommen kann das einzelne Wörter evtl. länger als erwartet sind (z.B. gibt mir eine Funktion beim gotoSleep-Status alle noch geöffneten Fenster, bzw. Fenster die im Unknown-State sind zurück, und hier kommt es wieder darauf an wie günstig der Aliasname gewählt wurde ;) )

Schöner wäre es evtl. den Textstring beim Whitespace zu spliten, und anschließend die Länge aller Wortblöcke zu prüfen bis eine Anzahl X von Zeichen erreicht ist, und diese dann als ersten google-Request abzusenden, anschließend mit den nächsten Wortblöcken genauso weiter verfahren, usw..

Hab hier mal eine  quick & dirty Funktion wie ich mir das vorstelle als Beispiel gebaut:
my $text = "Das hier ist ein Testtext der eindeutig zu lang fuer das Sonos Speak ist und nicht funktionieren wuerde.";
my $maxChar = 40;
my $count = 0;
my $newtext = '';
my $tmptext = '';
my @array = split(/ /,$text);

foreach (@array) {
$count += length;
$tmptext = " $_";
if ($count > $maxChar || $_ eq $array[-1] ) {
$newtext .= $tmptext if ($_ eq $array[-1]);
print $newtext.'|';                                                 #SEND REQUEST TO GOOGLE
$newtext = '';
$count = length;
}
$newtext .= $tmptext;
}
stdout:  Das hier ist ein Testtext der eindeutig zu lang| fuer das Sonos Speak ist und nicht| funktionieren wuerde.|


Was hälst du von der Idee? Bzw. sogar $maxChar konfigurierbar als attr oder so?

Gruß Claudiu

EDIT: Achso das lokale espeak aus dem Wiki hatte ich mal ausprobiert, da ist ja die Sprachqualität ganz grausam  ;D  Hab mich aber noch nicht weiter damit befasst ob das evtl. verbessert werden kann.

EDIT2: Seh grad hab vergessen die Whitespaces in der Längenberechnung mit einzuschließen :-)
so z.B.
$count += length($_)+1;
Ändert das stdout dann auch auf das hier ab:
stdout:  Das hier ist ein Testtext der eindeutig| zu lang fuer das Sonos Speak ist und| nicht funktionieren wuerde.|

Reinerlein

Hi Claudiu,

zu der Textlänge:
ich hatte überlegt, was besser wäre. In meinen Tests war das ganze nicht von der Anzahl der Zeichen abhängig, sondern eher von der Länge des gesprochenen Textes.
Es fühlt sich so an, als würde der Google-Generator einfach nur bis zu einer gewünschten Dateigröße generieren, und dann einfach abbrechen, und das Ding nicht zurückliefern...

Der Vorteil von der Anzahl der Worte ist, dass es nur ein regulärer Ausdruck ist:

my @textList = ($text =~ m/(?:\b(?:[^ ]+)\W*){0,$SONOS_GOOGLETRANSLATOR_CHUNKSIZE}/g);
Da konnte man sich mal wieder austoben, ist aber natürlich kein Grund :)

Ich würde das jetzt mal beobachten (vielleicht kannst du mal deine Fensternachricht erzeugen, um mal zu schauen, wie groß da der Puffer ist).
Umstellen können wir das ja immer noch...

Außerdem habe ich noch etwas Spielkram eingebaut: Wem das Fhem-Logo im Sonos-Controller bei Sprachdurchsagen zu langweilig ist, kann jetzt ein beliebiges Bild (JPG oder PNG) mittels des Attributs "SpeakCover" konfigurieren :)

Grüße
Reinerlein

rapster

Hi Reinerlein,

ich habe jetzt einfach mal den goodState (open statt closed) in meinerFenster-Check funktion gedreht, so das jetzt alle geschlossenen Fenster eine Sonos-Fehler-Benachrichtigung auslösen.
Hier gibts. dann z.B. ein 404

2014.11.27 20:12:50.493 1: CheckContacts: Found 5 devices, open: 0 closed: 5 unknown: 0
2014.11.27 20:12:50.494 1: Die Kontakte 'Dachfenster Tuer, Dachfenster Hinten, Badezimmer Fenster, Esszimmer Fenster, Schlafzimmer Fenster' befinden sich nicht im goodState

2014.11.27 20:12:51.238 0: SONOS1: Chunks: ['Achtung die Fenster Dachfenster Tuer, Dachfenster Hinten, Badezimmer Fenster, Esszimmer Fenster, Schlafzimmer Fenster sind noch ', 'geöffnet.']
2014.11.27 20:12:51.238 3: SONOS1: Load Google generated MP3 (1 Element) from "http://translate.google.com/translate_tts?tl=de&q=Achtung%20die%20Fenster%20Dachfenster%20Tuer%2C%20Dachfenster%20Hinten%2C%20Badezimmer%20Fenster%2C%20Esszimmer%20Fenster%2C%20Schlafzimmer%20Fenster%20sind%20noch%20" to "/opt/fhem/SonosSpeak/RINCON_000E58B7AF1401400_MR_Speak_7c0ab71e733a8270df6f641554b9013b192fd8f3.mp31"
Odd number of elements in hash assignment at /usr/share/perl5/IO/Socket/IP.pm line 352.
2014.11.27 20:12:51.340 1: SONOS1: MP3 Download-Error: 404 Not Found


Ganz schlimm wirds natürlich wenn z.B. Gerät dabei wären wo kein Alias definiert ist, also z.B. der komplette Device Name ausgegeben werden soll (og.ez.fensterkontakt.hinten.links oder so)...

Danke dir, Gruß Claudiu

Reinerlein

Hi Claudiu,

ist ja schon gut... ich habe mich von dem regulären Ausdruck verabschiedet, da die andere Funktionalität als Regex nicht in meinen Kopf passt :)

Also, ich habe das jetzt umgebaut, und habe als Obergrenze nun 95 Zeichen festgelegt. Da ja immer das letzte Wort dann nicht mehr reinkommt, ist das resultierende also sicher kleiner als 95. Und mit 95 hat es bei mir noch gepasst...

Außerdem habe ich noch eine Kodierungsumwandlung eingebaut, damit Umlaute auch sauber im MP3Tag landen (und auch korrekt an die Google-Maschine gehen)...

Bitte mal testen :D

Grüße
Reinerlein

rapster

Hi Reinerlein,

hihi, hab mir schon gedacht das mit dem "geöffnet" ist ein gutes Beispiel, vll. fällt dir da noch was zu Umlauten auf, und so wars  ;)

Der Rest schaut allerdings hervorragend aus!, hab mal den filter etwas großzügiger gewählt und ein Sonos-Speak über 15 devices  (5 combined chunks) hat super funktioniert!

...jetzt muss ich erstmal die ganzen mehrfachen Speak aus den ganzen Dummys wieder rauswerfen....

Und nich traurig sein wegen der Regexp, hat ja alles seine Vor und Nachteile  ;)


Vielen Dank nochmal für den super schnellen Einbau des Features, und hoffe Ingo haut mich jetzt nicht gleich dass schon wieder eine neue Sonos Version da ist ;D  :P

Reinerlein

Hi Claudiu,

schön, das du mich schon so gut einschätzen kannst :)

Ingo wird wohl nix dagegen haben, dass hier immer weniger Fehler drin sind. Das sind halt alles Features, die ich selber nicht nutze, und dementsprechend auch nicht mitbekomme, wenn da was nicht so richtig funktioniert...

Auf jeden Fall fühlt sich jede Version besser an, weil man weiß, dass wieder ein Thema vom Tisch ist :D

Grüße
Reinerlein

rapster

Hi Reinerlein,

ja das stimmt, jetzt sind zumindest alle Sachen die mir so einfallen (auch die Probleme die man bisher mit irgendeinem Workaround umgangen hat) erstmal vom Tisch.

Naja, das mit Ingo sagst du  ;D  Da er ja den großteil des Tages in meiner Hörreichweite am 'maulen' ist, werde ich das spätestens Morgen erfahren  ;)

Zu den von dir nicht genutzten FUnktionen, die Speak Funktion finde ich zumindest das Killer-Feature schlechthin an dem Sonos-Modul!
...natürlich lassen sich mit manch anderen Funktionen auch richtig nette Sachen bauen ;)

P.S. Reminder: Nicht vergessen den Header-Kommentar anzupassen ;-)


Gruß Claudiu