Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

Otto123

$NAME ? Einmal Device SonosControl und das andere Mal der Player?

Aus welchem Device rufst Du den Setter auf?
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

Ja $NAME, ist doch korrekt, in dem Test-SonosControl-Device gibts auch einen play setter.

defmod SonosControl MQTT2_DEVICE
attr SonosControl userattr favRadios
attr SonosControl IODev m2s
attr SonosControl comment playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
StartRadio:select {my $rf = ReadingsVal("SonosControl","Reply_Favorites","unknown");;;;",".$rf." bla";;;;}
attr SonosControl favRadios 011.FM-NonStop60s,Deutsche,Antenne Thüringen
attr SonosControl getList Favorites:noArg Reply_Favorites sonos/RINCON_000E58F7F67C01400/control {"command": "adv-command","input": {"cmd": "GetFavorites","reply": "Reply"}}\

attr SonosControl readingList sonos/RINCON_([0-9A-Z]+)/Reply:.* Replykomplett\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,.*_Title,g){push (@a, "$key $value")}};;my @s = sort @a;; my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/.*_Title.//g;;{"Reply_Favorites"=>$g}}\
sonos/RINCON_([0-9A-Z]+)/Reply:.* {my $werte = json2nameValue($EVENT);;my @a;; while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,.*_TrackUri,g){push (@a,"$key $value")}};;my @s = sort @a;;;; my $g =join (',',@s);;$g =~ s/Result_._TrackUri.//g;;{"Reply_TrackUris"=>$g}}
attr SonosControl room MQTT2_DEVICE
attr SonosControl setList playUri:textField {fhem("set $NAME setAVTUri $EVTPART1;; sleep 1;; set $NAME play")}\
setAVTUri:textField sonos/RINCON_000E58F7F67C01400/control { "command": "setavtransporturi",  "input": "$EVTPART1"}\
play:noArg sonos/RINCON_000E58F7F67C01400/control { "command": "play" }\
playFav:select,0,011.FM-NonStop60s,1A.Deutsche.Hits,COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,PsyRadioChillout,die.neue.welle.101.8.(Rock) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar;;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};;my @s = sort @ar;;my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/Result_._Title.//g;;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar2;;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};;my @s2 = sort @ar2;;my $g2 =join (',',@s2);;$g2 =~ s/Result_._TrackUri.//g;;my @a = split(',',$g);; my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;;;my $d = defined $index ? $index : -1;;my @b = split(',',$g2);;my $u = $b[$d];;fhem("set $NAME setAVTUri $u;; sleep 1;; set $NAME play")}\
playFa:select,0,011 FM-NonStop60s,1A Deutsche Hits,COSMO.Chillout,DASDING.92.5.(Euro-Hits),FM.نجوم.100.6.(Arabisch),Hitradio.Ö3.99.9.(Österreichisch),Hörbücher,PsyRadioChillout,die.neue.welle.101.8.(Rock) {my $werte = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar;;while ( my ($key, $value) = each (%$werte)) {if ($key =~ m,Result_._Title,g){push (@ar, "$key $value")}};;my @s = sort @ar;;my $g =join (',',@s);;$g =~ s/ /./g;;$g =~ s/Result_._Title.//g;;my $werte2 = json2nameValue(ReadingsVal("MQTT2_Sonos_Bridge","Reply_Favorites","unknown"));;my @ar2;;while ( my ($key2, $value2) = each (%$werte2)) {if ($key2 =~ m,Result_._TrackUri,g){push (@ar2,"$key2 $value2")}};;my @s2 = sort @ar2;;my $g2 =join (',',@s2);;$g2 =~ s/Result_._TrackUri.//g;;my @a = split(',',$g);; my ($index) = grep { $a[$_] eq $EVTPART1 } (0 .. @a-1);;;;my $d = defined $index ? $index : -1;;my @b = split(',',$g2);;my $u = $b[$d];;fhem("set $NAME setAVTUri $u;; sleep 1;; set $NAME play")}\
togglefavRadios:noArg {my $l = AttrVal($NAME,"favRadios","none");;my $lvwodot = Each($NAME, $l);;{my $uri='';;my $search = (split(' ', $lvwodot,2))[1];;my $jlist = ReadingsVal((devspec2array('model=sonos2mqtt_bridge'))[0],'Favorites','');;my $r=json2nameValue($jlist,'','weissnich','_Title|_TrackUri');;while (my ($key,$value) = each %{$r}) {if ($value =~/$search/) {$key=~s/Title/TrackUri/;;$uri=$r->{$key}}}fhem("set $NAME playUri $uri") if ($uri ne '')}}

Otto123

#467
Ok, aber der der Part mit dem split - was soll der tun?
Der teilt bei Dir Antenne Thüringen - sonst nix. Da ist $search dann leer.
Each liefert doch schon die Elemente der Liste?
{my $l = AttrVal("SonosControl","favRadios","none");;my $lvwodot = Each("SonosControl", $l);;my $search = (split(' ', $lvwodot,2))[1]}

Wenn Du den Schritt einfach übergehst?  Also gleich my $search = Each ...

Und besser Each("SonosControl", $l,',') ok muss nicht sein ($sep = "," if(!$sep);)

Woher kommt Each eigentlich? fhem.pl  8)
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

Der Code hinter Each ist aus #459 da wars einfach noch: Suchtext ist ein exakter Teil des Titels
Man kann/konnte nur einen Teil des Sender angeben und er wird/wurde abgespielt.

Zitat
Woher kommt Each eigentlich?
https://forum.fhem.de/index.php/topic,40022.msg323002.html#msg323002
Zitat
Wenn Du den Schritt einfach übergehst?  Also gleich my $search = Each ...

Ich versuchs mal.

Otto123

#469
Zitat von: TomLee am 09 August 2020, 15:26:10
Der Code hinter Each ist aus #459 da wars einfach noch: Suchtext ist ein exakter Teil des Titels
Man kann/konnte nur einen Teil des Sender angeben und er wird/wurde abgespielt.
Ja aber dort besteht der $EVENT aus 'playFav Sender Name' und das split dient dazu playFav vom Rest zu trennen. Mit Each hast Du ja schon den 'Sender Name' :)

Deswegen ist es eigentlich besser, playFav so zu lassen wie mein Vorschlag und Du machst einfach einen Aufruf playFav Sender Name.

8)

Ganz ohne setter mit einem Reading anstatt attribute und mit set magic

setreading model=sonos2mqtt_bridge favRadios Deutschlandfunk Kultur,Radio Leipzig

set alias=Arbeitszimmer playFav {(my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;Each($dev,ReadingsVal($dev,'favRadios','')))}
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

Mit dem umständlich denken hab ichs.
Mein Gedanke war irgendwie auch nur Teilstücke des Sendernamen im Attribut zu hinterlegen, aber wozu, man kann doch direkt den Namen so reinschreiben.

Ok, cool, das klappt so wenn man das playFav übergibt.

Also kann man doch nur Teilstücke angeben, aber da gibts noch irgendwo nen Haken, aber das hast du glaub ich auch schon festgestellt.

So hab ich es im Attribut stehen
011.FM-NonStop60s,Deutsche,Antenne Thüringen

So sind die Sendernamen normal:
011.FM-NonStop60s,1A.Deutsche.Hits,Antenne.Thüringen.80er.(80er)

011.FM-NonStop60s und Deutsche werden korrekt aufgerufen, mit Antenne Thüringen wird PsyRadioChillout abgespielt , auch wenn ich es korrekt eintrage (Antenne.Thüringen.80er.(80er)), meinst du das liegt an dem ü ?

Wenn ich irgendeinen anderen Sender an dritter Stelle eintrage klappt es.


Otto123

Ja mit den Umlauten gibt es Ärger. Ich habe auch noch andere Namen mit irgendwelchen Zeichen drin. Da muss ich die "Suche" noch besser machen.  ::)

ich habe oben noch einen anderen Vorschlag editiert :)
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

Ja, ohne setter ist am coolsten, klappt, gefällt mir jetzt am besten, Danke für die Idee.
Aber wer baut sich das wenn er nicht zufällig über unsere Beiträge stolpert ?
Nicht das ich ihn will, mit setter könnts halt jeder der das Template anwendet auch direkt nutzen.
Ok, die Attribute müsst er noch setzen, aber dazu würde auch wieder eine Doku im Device fehlen das sie gesetzt werden müssen.

Zitat
Da muss ich die "Suche" noch besser machen.
FM.نجوم.100.6.(Arabisch) geht auch nicht, denk dran  ;D

Otto123

Naja ich denke es wird eh ein Baukasten, wir haben ja jede Woche wieder Ideen. ;D
Ich finde: die Basis ist fertig.
Es gibt schon ein paar Komfortfunktionen (noch in Entwicklung) zum nachrüsten, die kommen vielleicht auch (teilweise) einfach mal in die Basis.
Die Komfortfunktionen gibt es als Doku im Wiki, die kann man doch immer wieder ergänzen.

Ich fange nächste Woche mal an mit dem Wiki.
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

Noch eine Idee zu Radio mit Ansage (Thread von Kurt) für die Kommandozeile ;)
{my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $play = (devspec2array('alias=Arbeitszimmer'))[0];;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;fhem("set $play speak 15 Es folgt $r");;fhem("sleep $play:volume:.20;;set $play playFav $r")}

Vielleicht lässt sich noch ein besserer Sleep Event finden :)

Muss ich mir nochmal mit dem normalen Sonos Modul anschauen, geht dort sicher auch?
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

#475
Klar geht das :

{my $sondev = "Dein_Player";;\
my $l = "011.FM.-.Non.Stop.60s,1LIVE.diggi..Top.40.Pop.,DASDING.92.5..Euro-Hits.";;\
my $lvwodot  = Each($sondev, $l);;\
my $lv = $lvwodot."/";;\
$lvwodot =~ s/[.]/ /g;;\
fhem ("set $sondev speak 15 de es wird $lvwodot abgespielt");;\
return fhem("sleep $sondev:currentAlbum:.;;set $sondev StartRadio /".$lv);;}


Das aber die Regulärer-Ausdruck-Schreibweise aus dem Reading RadiosList, das muss vorhanden sein sonst gehts nicht, also vorher aktivieren.

Habs auch mit den Url-encodeden Sendern versucht, das macht aber irgendwie schon mit dem nomalen setter Probleme, mal gehts, mal nicht einen Sender abzuspielen:

{my $sondev = "Dein_Player";;\
my $l = "NDR%202,1A%20Deutsche%20Hits,PsyRadioChillout";;\
my $lvwodot  = Each($sondev, $l);;\
my $lv = $lvwodot;;\
$lvwodot =~ s/\%20/ /g;;\
fhem ("set $sondev speak 15 de es wird $lvwodot abgespielt");;\
return fhem("sleep $sondev:currentAlbum:.;;set $sondev StartRadio $lv");;}


edit:

letzte Frage falsch verstanden

Otto123

Moin,

ich habe den speak Befehl mal noch etwas mit meinem neuen Wissen der letzten Tage überarbeitet  8) und dabei gleich mit dem Wiki begonnen: https://wiki.fhem.de/wiki/Sonos2mqtt#Speak_Befehl
Wie geplant steht die Grundlage hier https://wiki.fhem.de/wiki/MQTT2-Module_-_Praxisbeispiele#Sonos2Mqtt und im eigenen Artikel die Erweiterung und aktuelle Entwicklung.

Vielleicht findet ihr Zeit zum drüberschauen und kritisieren. ;)

Gruß Otto
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

Bin zu doof um den speak-Befehl ans laufen zu bekommen  :P

Die mp3 Files werden erstellt.
Die muss man wohl irgendwann manuell löschen, die Doku sagt wie ich es verstanden habe ja ?


defmod SonosTTS Text2Speech none
attr SonosTTS TTS_CacheFileDir cache
attr SonosTTS TTS_UseMP3Wrap 1
attr SonosTTS userReadings httpName:lastFilename.* {'http://'.ReadingsVal($name,'host','set host:port first').'/fhem/'.ReadingsVal($name,'lastFilename','')}

setstate SonosTTS 2020-08-09 19:01:49 Player MQTT2_RINCON_000E58F7F67C01400
setstate SonosTTS 2020-08-13 12:08:59 host 192.168.188.67:8083
setstate SonosTTS 2020-08-13 15:57:39 httpName http://192.168.188.67:8083/fhem/cache/4ee34d8b9472a513fc8eed96cb3ab001.mp3
setstate SonosTTS 2020-08-13 15:57:39 lastFilename cache/4ee34d8b9472a513fc8eed96cb3ab001.mp3
setstate SonosTTS 2020-08-13 15:57:39 playing 0
setstate SonosTTS 2020-08-09 19:01:49 volume hallo



Wenn ich im Menü SonosSpeakWeb aufrufe öffnet sich ein neuer Tab mit dem Inhalt
File not found: cache/index.html
Warum index.html, woher soll die kommen, erstellt die SonosSpeakWeb, bei mir gibts nur die mp3-Dateien ?
Sollte ich hier nicht im Verzeichnis cache landen und die mp3-Files angezeigt bekommen ?
Warum im define zweimal cache, müsste an erste Stelle nich sowas wie http://hostname:8083/fhem ?
Was mach ich noch falsch das das mit dem HTTP Server nicht klappt ?

defmod SonosSpeakWeb HTTPSRV cache cache SonosSpeakWeb

setstate SonosSpeakWeb SonosSpeakWeb


Man muss doch den Ordner auch in der App unter Musikbibliothek einrichten hinterlegen oder nicht ?
Egal wie ich es eintrage, ich kann am Ende in der IOS-App nicht auf weiter tippen ?

Die zusätzlichen Pakete muss ich sicher nicht doch installieren ?

Gruß

Thomas

PatrickR

Hallo zusammen,

es tut sich was bei der Problematik, dass unter bestimmten Umständen keine Events mehr kommen. Der Entwickler hat das Refreshen der Verbindung getunt und es gibt einen mqtt-Command, mit dem man den Refresh forcieren kann.

https://github.com/svrooij/sonos2mqtt/issues/112

Patrick
lepresenced - Tracking von Bluetooth-LE-Tags (Gigaset G-Tag) mittels PRESENCE

"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rich Cook

Otto123

#479
Hallo Thomas,

ich denke Dein Problem ist simpel?
ZitatWas mach ich noch falsch das das mit dem HTTP Server nicht klappt ?
Ich denke Du hast volume vergessen  ;D

setstate SonosTTS 2020-08-09 19:01:49 volume hallo

Der Speak Befehl set Player speak <volume> text also set alias=Wohnzimmer speak 20 Hallo

Wegen HTTPSRV schaust Du hier: https://fhem.de/commandref.html#HTTPSRV

Du kannst <infix> auch willi nennen, dann wird es nur schwieriger mit dem Namen. Das erste cache steht für http://192.168.188.67:8083/fhem/cache/4ee34d8b9472a513fc8eed96cb3ab001.mp3
Das zweite cache steht für /opt/fhem/cache

Als Musik Bibliothek musst Du nichts einrichten, das muss so gehen. Genau wie sowas:

set m2s publish sonos/RINCON_xxxxxxxxxx1400/control {
  "command": "notify",
  "input": {
    "trackUri": "https://cdn.smartersoft-group.com/various/pull-bell-short.mp3",
    "onlyWhenPlaying": false,
    "timeout": 10,
    "volume": 15,
    "delayMs": 700
  }
}


Das mit File not found: cache/index.html ist noch ein Schönheitsfehler, kann man irgendwie vielleicht mit einer Hilfeseite belegen. Das ist ein Nebeneffekt von HTTPSRV - ich weiß nicht wie man das verhindern kann. Brauchen tue ich den Link im Menu nicht.

Hast Du den alten speak setter noch aktiv? - neu machen
Hast Du das alte notify noch aktiv? -> deaktivieren

Gruß Otto
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