Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

Begonnen von Otto123, 31 Mai 2020, 18:30:55

Vorheriges Thema - Nächstes Thema

TomLee

Klappts bei dir, das war nur ein c&p Fehler hier, das doppelte $$ hatte ich schon selbst bemerkt.

playSoundTest:textField {my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}


2020.12.11 17:10:45 3: MQTT2_DEVICE set Sonos_Wohnzimmer playSoundTest 20 Vibrating
2020.12.11 17:10:45 1: PERL WARNING: Useless use of private variable in void context at (eval 996) line 1.
2020.12.11 17:10:45 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
2020.12.11 17:10:45 1: PERL WARNING: Useless use of concatenation (.) or string in void context at (eval 996) line 1.
2020.12.11 17:10:45 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}


Mitch

Zitat von: TomLee am 11 Dezember 2020, 10:57:21
Nächste Frage.

Wie löst du/ihr das mit der steigenden Anzahl von Dateien in cache ?

In der Doku zu Text2Speech findet man zu TTS_CacheFileDir

TTS_CacheFileDir
Optional: Die per Google geladenen Sprachbausteine werden in diesem Verzeichnis zur Wiedeverwendung abgelegt. Es findet zurZeit keine automatisierte Löschung statt.



War das automatische löschen mal vorgesehen, kommts noch oder gehts vlt. schon und ich übersehe was ?

Bei mir läuft in der nacht ein Script, der u.a. alte Dateien löscht. Ich halte den Cache max. 1 Woche vor.
FHEM im Proxmox Container

Otto123

An der Stelle:
my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : $file.'.mp3';
gibst Du zwar was zurück - aber das verschwindet im Spannungsabfall
Sieht man hier
{my $EVTPART1 = 20;; my $EVTPART2 = 'willi';;my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);;$lf eq ".mp3" ? $file : ($file.'.mp3');;$file}
Wenn Du das Ergebnis wieder zuweist hat man was davon:
{my $EVTPART1 = 20;; my $EVTPART2 = 'willi';;my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);;$file=$lf eq ".mp3" ? $file : ($file.'.mp3');;$file}
Kompletter Test:
{my $EVTPART1 = 20;; my $EVTPART2 = 'willi';;my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);;$file=$lf eq ".mp3" ? $file : ($file.'.mp3');;'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

Sieht zumindest gut aus? Die Fehlermeldung erschließt sich mir noch nicht.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Kurz ausprobiert, kann mich erst später oder morgen wieder mit beschäftigen.

Trotzdem wird nix abgespielt und es bleibt bei der Meldung im Log, sehe den Fehler nicht:

playSoundTest:textField {my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.'.mp3'); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

2020.12.11 19:10:20 3: MQTT2_DEVICE set Sonos_Wohnzimmer playSoundTest 20 Vibrating
2020.12.11 19:10:20 1: PERL WARNING: Useless use of private variable in void context at (eval 9949) line 1.
2020.12.11 19:10:20 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.'.mp3'); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
2020.12.11 19:10:20 1: PERL WARNING: Useless use of concatenation (.) or string in void context at (eval 9949) line 1.
2020.12.11 19:10:20 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.'.mp3'); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

TomLee

Kurz zwischendurch ausprobiert, kann ja nicht anders:

set Sonos_Wohnzimmer playSoundTest 20 Vibrating.mp3

also nicht

set Sonos_Wohnzimmer playSoundTest 20 Vibrating

wird abgespielt, aber trotzdem die Meldung:

2020.12.11 20:04:53 3: MQTT2_DEVICE set Sonos_Wohnzimmer playSoundTest 20 Vibrating.mp3
2020.12.11 20:04:53 1: PERL WARNING: Useless use of private variable in void context at (eval 15321) line 1.
2020.12.11 20:04:53 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.".mp3"); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}
2020.12.11 20:04:53 1: PERL WARNING: Useless use of concatenation (.) or string in void context at (eval 15321) line 1.
2020.12.11 20:04:53 3: eval: my $DEVICETOPIC=   $evalSpecials->{'%DEVICETOPIC'};my $EVENT=   $evalSpecials->{'%EVENT'};my $EVTPART0=   $evalSpecials->{'%EVTPART0'};my $EVTPART1=   $evalSpecials->{'%EVTPART1'};my $EVTPART2=   $evalSpecials->{'%EVTPART2'};my $NAME=   $evalSpecials->{'%NAME'};{my $file = "http://".ReadingsVal("SonosTTS","host","")."/fhem/cache/Toene/".$EVTPART2;my $lf=substr($EVTPART2,length($EVTPART2)-4,4);$lf eq ".mp3" ? $file : ($file.".mp3"); 'sonos/RINCON_000E58F7F67C01400/control {"command":"notify","input":{"trackUri":"'.$file.'","onlyWhenPlaying":false,"timeout":10,"volume":"'.$EVTPART1.'","delayMs":700}}'}

Otto123

Und wenn Du das Beispiel aus dem Wiki nimmst?
https://wiki.fhem.de/wiki/Sonos2mqtt#Spiele_feste_Sounds. Das dann erweitert
playSound:textField {my $tts="SonosTTS";my ($cmd,$vol,$file)=split(' ', $EVENT,3);$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";fhem("set $NAME notify $vol http://[$tts:host]/fhem/[a:$tts:TTS_CacheFileDir]/$file")}
Funktioniert mit und ohne mp3 :) Keine Fehlermeldung. Geht sicher noch kürzer
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

#786
Danke für die Hilfe. funzt.

Ich wär für einen aktualisierten playSound-setter im Wiki. :)

edit:

funzt bei mir nachdem ich dein Beispiel für mich angepasst habe, wegen dem zusätzlichen Ordner Toene (weil ja nur cache in [a:$tts:TTS_CacheFileDir] steht)

playSound:textField {my $tts="SonosTTS";my ($cmd,$vol,$file)=split(' ', $EVENT,3);$file=($file=~m/.*\.mp3$/)?"$file":"$file.mp3";fhem("set $NAME notify $vol http://[$tts:host]/fhem/cache/Toene/$file")}

edit2:

hab wirklich nicht viel Sprachansagen definiert, durch die Umstellung von PlayURITemp auf playSound (ohne Dateiendung) ist meine fhem.cfg um 1728 Zeichen kleiner geworden

TomLee

Kann man den Status der Bridge (also den JSON) zu sonos/connected:.* connected mit einem Kommando nochmal anfordern ?

Hintergrund ist der das ich mich jetzt ja zum Start mit pm2 im System entschieden habe (weil ich das dazu zusätzlich (un)nötige notify nicht mag) und jetzt nach einem restart von FHEM angeblich offline ist.

Hab zwar noch keine bessere Idee wie das Kommando (wenn es eins gibt) periodisch (periodicCmd) abzusetzen, aber Hauptsache ich brauch nicht zusätzlich das notify  :P


Hat zwar nichts mit periodisch zu tun, cool wäre wenn man in periodicCmd auf Events reagieren könnte.

TomLee

Nochmal darüber Gedanken gemacht und ich hab ein Verständnisproblem.

https://svrooij.io/sonos2mqtt/topics.html#connect-messages
ZitatThis bridge uses the sonos/connected topic to send retained connection messages. Use this topic to check your sonos bridge is still running.

Müsste der Status nicht auch nach einem restart erhalten bleiben ?
MQTT2_Server sich diese retain message merken bis was anderes geschickt wurde ?

Otto123

steht bei mir auch drin: "sonos/connected":"2"

aber eine Idee dazu hab ich erstmal nicht.

Aber mal ehrlich
Zitat(weil ich das dazu zusätzlich (un)nötige notify nicht mag)
Dafür jetzt ein extra Dienst, der unter einem anderen User läuft und sich (auch) deswegen aus FHEM heraus nicht einfach steuern lässt.  ;D
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Zitatsteht bei mir auch drin: "sonos/connected":"2"

Weil dein notify beim Neustart ein pm2 start ... ausführt.
Ob start oder restart macht keinen Unterschied, s2m schickt also wieder den Status.
Deaktivier mal dein notify und mach dann einen restart von Fhem, hast dann immer noch die 2 drin ?
Denke nicht, der Dienst ist doch aber noch am laufen, MQTT2-Server hat aber den Status vergessen.




ZitatDafür jetzt ein extra Dienst, der unter einem anderen User läuft und sich (auch) deswegen aus FHEM heraus nicht einfach steuern lässt.  ;D

Wsl. hab ich da auch ein Verständnisproblem, vlt dämmert da schon leicht was das es von Vorteil sein kann den Dienst aus FHEM zu steuern (bspw. beim testen), aber nur um den korrekten Status zu erhalten bin ich der Meinung ist MQTT zuständig und ich muss dazu nicht extra den Dienst neu starten.
Wozu muss ich denn den Dienst steuern können ?
Der wird doch einmal bei Systemstart gestartet und läuft doch.

Otto123

Naja wenn ich das notify deaktiviere  wird pm2 start nicht ausgeführt - richtig. Aber da alles in der fhem.save gesichert ist, ist nach dem Start alles beim Alten. ;)
Also ich weiß nicht wie man dieses "Problem" jetzt beheben könnte. Ich hatte damit noch nie eins. Ich wusste auch noch nie warum man auf diesen Status der Bridge schauen muss.
Auch ein unnötiger Neustart von pm2 beim Neustart von FHEM leistet keinen Beitrag zu Nichts.

Seit dem ich mich mit diesem Thema beschäftige, war einmal die Steuerung von Sonos weg (daran merkt man es sofort) - da war es simpel pm2 neu zu starten und in kürzester Zeit lief alles wieder.
Ich habe in der Zeit einmal die Sonos Landschaft erweitert, da hat ein checkSubscription nicht geholfen, wenn ich mich richtig erinnere. Auch da tat es ein Neustart pm2. :)
Ich habe Testweise immer mal einen Player aus. Wenn der wieder an ist, braucht es ein checkSubscription. Das macht der sonos2mqtt ja auch von selbst :) wenn man es nicht eilig hat.

Ansonsten musst ich noch nie das beinahe tägliche disable/enable des konventionellen Sonos Moduls machen - es läuft einfach.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

ZitatAber da alles in der fhem.save gesichert ist, ist nach dem Start alles beim Alten.
Ja so dacht ich auch, nach einem restart von FHEM ist aber bei mir wie geschildert der Eintrag "sonos/connected":"2" im RETAIN-Reading des MQTT2-Server auf 0, obwohl der Dienst doch in der Zeit ganz normal weiterläuft.

Und auf den Status der Bridge schau ich auch nicht ständig , habs nur gern einheitlich aufgebaut, siehe Bild.

Otto123

Bei mir steht immer noch ,"sonos/connected":"2"} am Ende im retain - welches aktualisiert wurde.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Otto123

@TomLee vergiss was ich oben gesagt habe. Da ich den pm2 in FHEM starte, wird der konsequenterweise auch korrekt beendet wenn ich FHEM korrekt beende.
Wenn ich also das notify deaktiviere, wird pm2 auch nicht wieder gestartet. Sonos sieht zwar gut aus - funktioniert aber nicht. Habe ich vorhin nicht geprüft.

Eigentlich spricht auch das genau dafür, es so zu tun? Es sei denn man braucht den PM2 Prozess wo anders.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz