Sonosspeak

Begonnen von omnior, 01 September 2017, 11:47:12

Vorheriges Thema - Nächstes Thema

omnior

ok, ich habs noch ein paarmal probiert und offensichtlich hatte ich beim ersten mal nicht lange genug nach dem disable gewartet ;)
Jetzt kam grad noch eine andere Fehlermeldung, aber es sieht jetzt schon mal viel besser aus und eine Sprachausgabe ist tatsächlich erfolgt.
Super. Schon mal vielen Dank für diese klasse Ersthilfe!

juemuc

Hallo,

bei mir funktioniert SonosSpeak auch nicht richtig. Anstatt zu melden, dass die Waschmaschine fertig ist, hat er nur die Lautstärke bei den 4 Sonosboxen hoch gesetzt und folgende Fehlermeldung im Logfile erzeugt.
ZitatUse of uninitialized value in concatenation (.) or string at ./FHEM/00_SONOS.pm line 5092.
2017.09.02 19:10:13 1: SONOS1: Da keine Endzeit ermittelt werden konnte, wird kein Restoring durchgeführt werden!
Use of uninitialized value in concatenation (.) or string at ./FHEM/00_SONOS.pm line 5092.
2017.09.02 19:10:14 1: SONOS1: Da keine Endzeit ermittelt werden konnte, wird kein Restoring durchgeführt werden!
Use of uninitialized value in concatenation (.) or string at ./FHEM/00_SONOS.pm line 5092.
2017.09.02 19:10:14 1: SONOS1: Da keine Endzeit ermittelt werden konnte, wird kein Restoring durchgeführt werden!
Use of uninitialized value in concatenation (.) or string at ./FHEM/00_SONOS.pm line 5092.
2017.09.02 19:10:14 1: SONOS1: Da keine Endzeit ermittelt werden konnte, wird kein Restoring durchgeführt werden!

Der WAF ist -100  ???

Wenn ich die eine Sprachausgabe direkt über die Befehlseingabe durchführe, besteht die Ausgabe oft nur aus den ersten Worten und hört dann einfach auf.
Hier noch meine Definition:
defmod Sonos SONOS
attr Sonos devStateIcon opened:remotecontrol/black_btn_GREEN disconnected:remotecontrol/black_btn_RED disabled:remotecontrol/black_btn_RED
attr Sonos devStateStyle style="text-align:right"
attr Sonos disable 0
attr Sonos event-on-change-reading .*
attr Sonos getFavouritesListAtNewVersion 1
attr Sonos getListsDirectlyToReadings 1
attr Sonos group Sonos
attr Sonos icon SONOS
attr Sonos ignoredIPs 192.168.70.23
attr Sonos room Sonos,Statuszentrale
attr Sonos sortby 04
attr Sonos targetSpeakDir /mnt/SonosSpeak
attr Sonos targetSpeakFileHashCache 1
attr Sonos targetSpeakFileTimestamp 1
attr Sonos targetSpeakMP3FileDir /mnt/SonosSpeak
attr Sonos targetSpeakURL \\raspberrypi\SonosSpeak
attr Sonos verbose 1

Reinerlein Hilfe  ::)

VG
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Reinerlein

Hi Jürgen,

hmm... da scheint etwas nicht geschrieben werden zu können (?). Da müsstest du mal den Loglevel hochdrehen, um näheres zu erfahren.

Ansonsten ist es im Normalfall nicht logisch, wenn du die Attribute "targetSpeakFileHashCache" und "targetSpeakFileTimestamp" gleichzeitig verwendest.
Der Sinn von "targetSpeakFileTimestamp" ist es, den Cache von Sonos auszutricksen, damit die Datei immer einen neuen Namen hat.
Der Sinn von "targetSpeakFileHashCache" ist es, bei einem gleichen Text keine erneute Anfrage an Google durchführen zu müssen, da der Text als Hashwert an den Dateinamen angehangen wird, und somit wiedergefunden werden kann.

Zusammen ergeben sie keinen sinnvollen Usecase :) Sollten aber auch keine Probleme machen...

Prüf mal, ob der Ordner irgendwelche Beschränkungen enthält. Z.B. Speicher voll, bestehende Dateien können wegen Dateirechten nicht überschrieben werden o.ä...
Vielleicht ergibt sich da schon was.

Grüße
Reiner

P.S.: Das Attribut "event-on-change-reading" ist eigentlich überflüssig, da das Sonos-Modul das sowieso selber stets auf Veränderung prüft...

juemuc

#18
Ich habe nun einmal verbose auf 5 gesetzt. Das Ergebnis im Log habe ich als Datei angehängt. Den Befehl

set Sonos_Buero:FILTER=presence=appeared Speak 25 de         |Die_Waschmaschine_ist_fertig.mp3|

habe ich direkt in der Befehlszeile eingegeben. Zusätzlich habe ich die Attribute targetSpeakFileTimestamp und event-on-change-reading gelöscht. 

Die Rechte sind wie folgt vergeben:
Zitatdrwxrwxrwx 2 root root 4096 Sep  3 13:17 SonosSpeak
-rwxr--r-- 1 nobody nogroup 16896 Jun  3 18:50 Das_Schlafzimmerfenster_ist_offen.mp3
-rwxr--r-- 1 nobody nogroup 16896 Jun  3 19:04 Die_Waschmaschiene_ist_fertig.mp3
-rwxr--r-- 1 nobody nogroup 34294 Mär 17 19:43 Dingdong.mp3
-rwxr--r-- 1 nobody nogroup 13312 Mär 17 19:27 Es_hat_geklingelt.mp3
-rw-r--r-- 1 fhem   dialout  6144 Sep  3 13:17 RINCON_949F3E08E98201400_MR_Speak_a6a89e5dd9ffefb366f2bfca68d47ed8e05a956e.mp3
-rw-r--r-- 1 fhem   dialout 15360 Sep  3 11:34 RINCON_949F3E08E98201400_MR_Speak_b2a4c1f9e1d62464129d04f6d63910cb3ee90c03.mp3

Die Datei "Das_Schlafzimmer_ist_offen.mp3" wird zumindest bis zum "ist" ausgegeben.
VG
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

juemuc

@reinerlein:
Den ersten Fehler habe ich schon gefunden. Ich habe in Fhem "Waschmaschine" richtig und im Dateiname falsch geschrieben  :-[ . Das konnte nicht funktionieren.

Jetzt geht es nur noch darum, warum er den Satz nicht komplett ausgibt.

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Reinerlein

Hi Jürgen,

kannst du mal eine reine Textausgabe machen lassen, mit demselben Text. Durch den Cache sollte das auch nur einmal geholt werden.
Für eine reine Dateiwiedergabe (ohne Google TTS) ist eigentlich der Befehl "PlayURITemp" gedacht. Dieser versucht nämlich auch nicht einen leeren Text mit der Sounddatei zu verbinden.
Vielleicht geht dabei etwas schief...

Ansonsten scheint das resultierende MP3-File, welches durch einfaches hintereinanderkopieren zusammengestellt wird, fehlerhaft zu sein.
Dabei könnte es helfen, nochmal den AVConv drüberzujagen.
Unter https://wiki.fhem.de/wiki/SONOS#Sprachattribute gibt es die Beschreibung des Attributs "targetSpeakMP3FileConverter". Dort gibt es ein Beispiel dafür:

attr Sonos targetSpeakMP3FileConverter /usr/bin/avconv -i %infile% %outfile%


Damit ist die Verzögerung bei dem Wiedergabestart höher (AVConv braucht auch etwas Zeit :) ), aber die MP3-Datei ist dann vollständig Norm-konform...

Grüße
Reiner

juemuc

#21
Leider funktioniert auch die direkt Sprachausgabe nicht korrekt.
Set Sonos_Buero Speak 15 de Die Waschmaschine ist fertig

Nach "Die Waschmaschine" hört die Wiedergabe auf. Der Sender, der vorher lief, wird nicht wieder gestartet. Im Logfile ist aktuell keine Info zu finden. Danach habe ich verbose auf 5 gesetzt und die Info aus dem Log als Anhang zur Verfügung gestellt. Zusätzlich habe ich auch das dazugehörige mp3-file angehängt.


VG
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

juemuc

Hallo Reinerlein,

ich habe auch bei der Nutzung von set Sonos_Buero PlayURITemp \\raspberrypi\SonosSpeak\Die_Waschmaschine_ist_fertig.mp3 15 das gleiche Problem. Ich vermute das Problem liegt hier
Zitat aus dem Wiki:
ZitatWenn die Länge der Datei nicht ermittelt werden kann (z.B. bei Streams), läuft die Wiedergabe genauso wie bei PlayURI ab, es wird also nichts am Ende (wenn es eines geben sollte) wiederhergestellt.
Dies würde zumindest erklären, warum am Ende der alte Zustand nicht wieder hergestellt wird. Warum die Wiedergabe nicht vollständig erfolgt ist damit aber für mich nicht erklärbar.
Ich hoffe weiter auf eine Lösung von Dir  8)
VG
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Reinerlein

Hi Jürgen,

hmm... irgendwie scheint zwischendurch ein Startfavourite mit dem Parameter "ANTENNE%20BAYERN" und NoStart aufgerufen zu werden. Das bricht dann auch die Wiedergabe der Durchsage ab, und da nix mehr zum Restoren vorhanden ist, passiert da dann auch nichts weiter mehr...

Hast du da irgendeinen Notify oder DoIf auf ein STOPPED-Zustand oder was anderes?

Grüße
Reiner

juemuc

Ich habe folgende doifs bzw. notifys definiert:

Senderwechsel bei laut/leiser
defmod Buero_Favoriten_V_DOIF DOIF ([Sonos_Buero:"UD"]) \
({my @fav = split(/\|/, \
            "[Sonos_Buero:FavouritesListAlias]");;;;\
my $pos = SONOS_posInList("[currentFavouriteName_Buero]",\
   @fav);;;;\
my $anz=$#fav;;;;\
if ($pos < $anz)\
   {$pos=$pos+1}\
else\
   {$pos=0};;;;\
my $next_current_favorit=$fav["$pos"];;;;\
my $ncf = urlEncode($next_current_favorit);;;;\
fhem("set Sonos_Buero StartFavourite $ncf")})
attr Buero_Favoriten_V_DOIF do always


Senderwechsel bei leiser/laut
defmod Buero_Favoriten_Z_DOIF DOIF ([Sonos_Buero:"DU"]) \
({my @fav = split(/\|/, \
            "[Sonos_Buero:FavouritesListAlias]");;;;\
my $pos = SONOS_posInList("[currentFavouriteName_Buero]",\
   @fav);;;;\
my $anz=$#fav;;;;\
if ($pos > 0)\
   {$pos=$pos-1}\
else\
   {$pos=$anz};;;;\
my $next_current_favorit=$fav["$pos"];;;;\
my $ncf = urlEncode($next_current_favorit);;;;\
fhem("set Sonos_Buero StartFavourite $ncf")})
attr Buero_Favoriten_Z_DOIF do always


Sonos-Box mit dem letzten Favoriten "startklar machen" (z.B. nach Stromausfall). Somit kann die Musik auch nach einem Stromausfall direkt wieder an der Box gestartet werden
defmod Sonos_Buero_appeared_DOIF DOIF ([Sonos_Buero:presence] eq "appeared" and\
[Sonos_Buero:currentFavouriteName] eq ""and\
[Sonos_Buero:transportState] ne "PLAYING")\
({ my @fav = split(/\|/, \
              "[Sonos_Buero:FavouritesListAlias]");;;;\
   my $exists = SONOS_isInList\
                ("[currentFavouriteName_Buero]",@fav);;;;\
   if ($exists == 1)\
     {my $sfurl = (urlEncode\
        ("[currentFavouriteName_Buero]"));;;;\
     {fhem("set Sonos_Buero StartFavourite $sfurl \
            NoStart")}}\
   else\
     {my @fav = split(/\|/, \
                "[Sonos_Buero:FavouritesListAlias]");;;;\
      my $next_current_favorit=$fav[0];;;;\
      my $ncf = urlEncode($next_current_favorit);;;;\
      set Sonos_Buero StartFavourite $ncf}})
attr Sonos_Buero_appeared_DOIF do always


aktuellen Sender ermitteln
defmod currentFavouriteName_Buero_DOIF DOIF ([Sonos_Buero:currentFavouriteName] ne \
             [currentFavouriteName_Buero])\
(IF ([Sonos_Buero:currentFavouriteName] ne "")\
   (set currentFavouriteName_Buero \
       [Sonos_Buero:currentFavouriteName])\
ELSE \
   (IF ([currentFavouriteName_Buero] eq "")\
      ({my @fav = split(/\|/, \
                  "[Sonos_Buero:FavouritesListAlias]");;;;\
      my $next_current_favorit=$fav[0];;;;\
      my $ncf = urlEncode($next_current_favorit);;;;\
      fhem("set Sonos_Buero StartFavourite $ncf")})))
attr currentFavouriteName_Buero_DOIF do always
attr currentFavouriteName_Buero_DOIF event-on-change-reading .*


Favoriten aktualisieren
defmod Sonos_Favoritenupdate_Bu notify Sonos_Buero:FavouritesVersion:.* \
get Sonos_Buero Favourites


Favoriten aktualisieren
defmod refreshFavouritesSonos_Buero notify Sonos_Buero:presence:.appeared\
get Sonos_Buero Favourites


VG
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).

Reinerlein

Hi Jürgen,

der DoIf für dein StartFavourite greift natürlich genau in der Sequenz einer Durchsage.
Deaktiviere den mal, dann wird deine Durchsage wieder gehen...

Vermutlich wird es schwierig, eine passende Bedingung zu finden, die nur greift, wenn der Player wiedergekommen ist. Es geht aber in die Richtung, dass du nur auf den Wechsel des Presence-Readings von disappeared -> appeared reagierst... alle weiteren Bedingungen sorgen nur dafür, dass dein DoIf ständig triggern kann...
Deine Zielbedingung darf kein statischer Zustand sein, sondern eben genau ein bestimmter Zustandswechsel...

Grüße
Reiner

juemuc

Zitat von: Reinerlein am 07 September 2017, 22:56:06
Hi Jürgen,

der DoIf für dein StartFavourite greift natürlich genau in der Sequenz einer Durchsage.
Deaktiviere den mal, dann wird deine Durchsage wieder gehen...

Vermutlich wird es schwierig, eine passende Bedingung zu finden, die nur greift, wenn der Player wiedergekommen ist. Es geht aber in die Richtung, dass du nur auf den Wechsel des Presence-Readings von disappeared -> appeared reagierst... alle weiteren Bedingungen sorgen nur dafür, dass dein DoIf ständig triggern kann...
Deine Zielbedingung darf kein statischer Zustand sein, sondern eben genau ein bestimmter Zustandswechsel...

Grüße
Reiner
Danke!!!!
Nachdem ich die DOIFs deaktiviert hatte, funktioniert es. Jetzt muss ich die DOIFs noch umbauen  ;D

Viele Grüße
Jürgen
3x Sonos Play 1, 1x Sonos Arc + Sub, 1 Sonos-One, 1x Sonos Playbar
FB6690 + FB7490 mit 4x Dect 200 und 3 Dect-ULE-Thermostate,  raspberry3B+, HM Funkmodul HM-MOD-RPI-PCB, HM Klingelsensor HM-Sen-DB-PCB, HM (IP) Fensterkontakte und  Amazon Echo Dot,  piVCCU, pi OS (bookworm).