Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

TomLee

Können wir uns darauf verständigen das hier ein "Mini-Player" entstehen soll der ins SVN soll, persönliche Ansichten hinten anstellen.

Ich würde

  • Die Farbe bei dem Rückmelde-Icon rauslassen.
  • für Puffern... ?  eine andere Lösung bevorzugen
  • Aktueller Track/Nächster Track auch auf englisch umstellen weil kürzer
  • die Icons und die Zeilen Aktueller Track/Nächster Track links ausrichten

Bei deinem Beispiel wird das Album-Cover immer angezeigt auch wenn disconnected, gefällt mir nicht, wolltest das so oder nur noch nicht fertig ?
Das mit dem zappeln in der Höhe der DeviceOverview ist jetzt erledigt, aber : Tippel selbst nix am Handy, was denn wenn du einen Button betätigen willst und  in dem Moment ändern sich die Readings zu Artist und Titel dann kanns doch passieren das je nach Länge des Readings vorbei tippst weil in der waagrechten auch gezappelt wird ?

Meine Gedanken dazu: Wir sollten die Breite der Zeilen Aktueller Track/Nächster Track auf die Breite begrenzen die die Icons zusammen haben, das dann aber dann zu wenig Platz um Artist den Titel mit - anzuhängen.
Was dann machen ? Das Album Cover ist klein, gefällt mir, denke aber es ist zu klein, wenn wir das größer machen, ist wieder Platz für eine Neue Zeile für den Titel (evtl. mit Duration ?), wenn wir es noch größer machen noch mehr Platz für den slider (der hoffentlich kommt) der dann über den Icons oder unter den Artist/Titel-Zeilen platziert werden kann.

Ich bleib bei divs, du hast ja jetzt div und table verwendet, das mir zuviel mit den Reihen und Spalten, hab etwas gespielt, ausgerichtet oder irgendwas geändert hab ich nicht nur auf div umgestellt und es so gelöst das kein Album-Cover angezeigt wird wenn disconnected, die border sind nur zum Verständnis da, das viel Code der wieder entfällt:


{
my $img = ReadingsVal($name,"enqueuedMetadata_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = ReadingsVal($name,"state","unavailable");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0" ? "rot" : ReadingsVal($name,"bridgeConnected","0") eq "1" ? "gelb" : "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY'
: $mystate eq "STOPPED"
? 'rc_PLAY'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY'
: $mystate eq "set_next"
? 'rc_NEXT'
: $mystate eq "set_previous"
? 'rc_PREVIOUS'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN'
: $mystate eq "set_mute"
? 'rc_MUTE'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "error";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","unavailable"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","unavailable"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","unavailable"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = "<div style='float: left;border: 1px solid red;margin-right: 5px;'>".FW_makeImage("10px-kreis-".$amp)."</div> ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {
$show = "<div style='float:left;padding:10px;border: 1px solid blue;'>
<div style='float: left;border: 1px solid red;'>
<div style='float: left;border: 1px solid red;margin-right: 5px;'>".FW_makeImage("10px-kreis-".$amp)."</div>
<img src='$img' style='width:80px;height:80px;'></div>
<div style='float: right;border: 1px solid yellow;padding:5px 20px 0px 0px;'><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>
Aktueller Track: $currentTrack<br>
Nächster Track: $nextTrack</div>
</div></div>";}

else {$show = "<div style='float: left;border: 1px solid red;margin-right: 5px;'>".FW_makeImage("10px-kreis-".$amp)."</div><a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";}
"<div>$show</div>"
}



TomLee

Starte den Dienst auf dem Test-System mit
node node_modules/sonos2mqtt/lib/index.js --log "debug" --mqtt mqtt://user:pwd@192.168.188.67:1884

wenn ich das vom Terminalfenster vom Tablet aus mache und die Wlan-Verbindung verliere weil ein WLAN-Wechsel stattfand, wird auch das Terminalfenster geschlossen.

Kann mir bitte jemand sagen wie der Befehl lautet den Dienst dann zu beenden, wenn ich mich in einem neuen Fenster anmelde ?

87insane

Hab mir einfach einen normalen Service draus gemacht.
So kann ich nach Belieben starten und stoppen. Wenn man den player mal "hart" bedient ist mir aufgefallen, dass der Dienst dann hängt bzw gewisse readings nicht mehr ausspuckt. Weiß leider noch nicht warum.

Zu der Gruppen Thematik schreibe ich Stephan im Laufe der kommenden Woche noch an.

Wenn du im Terminal arbeitest, meinst du sicher putty...da kann man für normal die Session wieder aufbauen.

Otto123

Zitat von: TomLee am 28 Juni 2020, 10:44:55
Starte den Dienst auf dem Test-System mit
node node_modules/sonos2mqtt/lib/index.js --log "debug" --mqtt mqtt://user:pwd@192.168.188.67:1884

wenn ich das vom Terminalfenster vom Tablet aus mache und die Wlan-Verbindung verliere weil ein WLAN-Wechsel stattfand, wird auch das Terminalfenster geschlossen.

Kann mir bitte jemand sagen wie der Befehl lautet den Dienst dann zu beenden, wenn ich mich in einem neuen Fenster anmelde ?
Hi,

oh Mann echt viel zu lesen nach knapp 14 Tagen :)

Meine Empfehlung nach wie vor: Start des sonos2mqtt mittels pm2 wie von mir beschrieben.
Ich habe auch bisher keinen Nachteil gefunden es direkt aus FHEM zu machen.
define n_pm2 notify global:INITIALIZED "pm2 start sonos2mqtt"

Will man den Dienst "per Hand" überprüfen, muss man es als user fhem tun!
sudo -su fhem pm2 list
Oder direkt in FHEM
{qx(pm2 list)}

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

Otto123

Meine Überlegungen zum Speak Befehl:
Es ist immerhin ein komplexer, zeitabhängiger (wenn auch kurzer) Prozess. Es macht aus meiner Sicht keinen Sinn den in ein MQTT2 Device quetschen zu wollen. Es macht aus meiner Sicher gerade Sinn die Modularität von FHEM konsequent zu nutzen.

BTW: Ich bin auch sehr dafür die Templates minimalistisch zum machen. Mir sind ehrlich gesagt viel zu viele kunterbunte Templates vorhanden, die im Zweifelsfall
- nicht gefallen
- nicht mehr funktionieren
- zu speziell auf "eine Zielperson" zugeschnitten sind.

Man kann doch die ganzen "bunten" extra beschreiben und im Wiki ablegen. Der User der beginnt, sollte einfach erstmal etwas schlichtes und funktionales bekommen.

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

Das mit dem pm2 hab ich schon gelesen, nur nicht verstanden wo das herkommt und nicht weiter mit beschäftigt.
Das wohl bei der Installation von Nodejs dabei ?

Einfach so eingeben ohne irgendwas zu installieren ? Probier ich später aus.




Was speak angeht würd ich die verlinkte Polly-Lösung mit SSML gerne mal ausprobieren (wenn ich eh schon einen Amazon-Account hab) ob das klappt, auch wenn ich das bisher mit Alexa (echodevice) gar nicht nutze, interessiert mich aber obs geht und auf der Sonos wär das auch nochmal ein anderes Erlebnis  :D

Ist aber bisher allein schon  daran gescheitert das ich pip nicht auf dem Pi-Zero ( da wird wieder eine andere Version benötigt) installiert bekomme um boto zu installieren.


Otto123

#306
Naja dabei nicht direkt, aber ein nodejs package oder wie immer das genau heisst :)
sudo npm install pm2 -g
Ist sowas wie die Prozesse Steuerung von nodejs.

Ok, ich glaube ich habe das bisher immer vorausgesetzt - muss ich also noch in meine Doku besser einarbeiten. ✅
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

Ich habe das "Problem" mit den Gruppen noch nicht verstanden. Ich habe allerdings auch die Logik im normalen Sonos Modul nicht verstanden.

In groupName steht doch einfach der Gruppenname plus die Anzahl der Mitglieder. Wenn ich also die Gruppe steuern will frag ich den groupName ab und steuere die? Mit einem split oder regExp ist das doch simpel?

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

87insane

Das Problem ist das der Name in dem Feld immer Master+1 oder +2 oder sonst was ist. Selbst (wie du auch sagst) in der App ist das "merkwürdig".
Wenn du z.B. eine Gruppe aus WZ und K machst, und WZ ist der Master... Dann zeigt dir WZ an was gespielt wird. K zeigt dir dann das er am spielen ist aber nicht was. Da würde ich in diesem Moment gerne etwas mehr Info am Player anzeigen. Zumindest wer hier den Takt angibt.

Das mit dem Templates betrachte ich etwas anders....
Ohne diese ab und an total überflüssigen Dinge in den Templates, wüsste ich von vielen Funktionen nicht. Deswegen finde ich das super, wenn diese auch mehr können als nur on/off.
Hinzu macht es das Plug&Play einfacher. Die Kollegen von anderen Automatisierungssystemen, sind in einigen Dingen "moderner". Egal ob es schlicht ums Design geht oder aber um die Umsetzung von verschiedenen Szenarien. Genau deswegen finde ich die Inspiration durch die Templates genial. Ich schaue ab und an sogar in der Datei nach, wenn ich was probieren will. Gern findet man da auch schon was...

Gruß :)

Wuppi68

noch ein kleines Helferlein um einige Dinge vom S2M auf der Kommandozeile zu testen ;-)

sonos-cli

benutzt die gleiche Library und einfach via npm zu installieren (npm install sonos-cli ...  npm start)
Jetzt auf nem I3 und primär Homematic - kein Support für cfg Editierer

Support heißt nicht wenn die Frau zu Ihrem Mann sagt: Geh mal bitte zum Frauenarzt, ich habe Bauchschmerzen

TomLee

ZitatWenn du z.B. eine Gruppe aus WZ und K machst, und WZ ist der Master... Dann zeigt dir WZ an was gespielt wird. K zeigt dir dann das er am spielen ist aber nicht was. Da würde ich in diesem Moment gerne etwas mehr Info am Player anzeigen.

Kann auch daneben liegen, kanns nicht testen hab nur einen Player, wenn du den --distinct Pfad aktivierst, kommen dann die zusätzlichen Infos zu K die du erwarten würdest ?

Beta-User

Zitat von: Otto123 am 28 Juni 2020, 17:53:23
BTW: Ich bin auch sehr dafür die Templates minimalistisch zum machen. Mir sind ehrlich gesagt viel zu viele kunterbunte Templates vorhanden, die im Zweifelsfall
- nicht gefallen
- nicht mehr funktionieren
- zu speziell auf "eine Zielperson" zugeschnitten sind.
Ist zwar hier OT und wir können das gerne auch woanders mal intensiver beleuchten:
- Wenn was nicht (mehr) funktioniert, wäre ich für eine Rückmeldung dankbar (bzw. @HTTPMOD, wo das tatsächlich ein Problem darstellt und auch im entsprechenden "template-Thread" von meiner Seite aktiv angesprochen wurde: Für konkrete Verbesserungsvorschläge...).

Was "nicht-gefallen", indiviuelle Vorlieben und die Frage  angeht, wie man "Bausteinchen" am effektivsten bereithält und präsentiert:
- ich wäre auch nicht unglücklich, wenn wir bei Tasmota und Shelly je eine "Classic-line" ins Angebot aufnehmen könnten, die im stateFormat=>devStateIcon ein simples offline/off/on (bzw. incl. der set_on...-Varianten) macht, that's it...
Diese (übrigens nicht nur von Einzelpersonen gewünschten!) Ampel-Sachen sind zwar nett anzuschauen und eher nahe bei dem was vielleicht irgendwelche "moderneren Konkurrenten" im Angebot haben, aber die Stärke von FHEM liegt eigentlich eher auf kleinem Overhead. Vermutlich ist "das bißchen Perl" kein großes Problem, aber "back to basics" würde m.E. teils trotzdem helfen, dass Einsteiger sich da auch zurechtfinden und dann darauf basierend "ihre Lösung" finden können.
Was Tasmota angeht, gab's mal eine Initiative, den Baukasten weiter zu modularisieren. Damit könnte man das m.E. mit überschaubarem Aufwand erreichen. Da man dann beide (oder noch mehr) Varianten abbilden könnte, wäre allen Genüge getan, den "Ampel-Fans" und den "Puristen"  ;) .
Für Shelly würde ich mir wünschen, dass wir denen erst mal noch das unnötige Aktualisieren von Statusreadings (insbes. on/off) abgewöhnen, dann wäre das auch dort ein Thema... (Ich habe zwischenzeitlich auch einen Shelly, aber das Thema ist für mich selbst low prio; im Web-IF habe ich jedenfalls bisher keine Option gefunden, an diesem Verhalten irgendwas zu ändern).

- Das mit dem Wiki kann man ja ergänzend bzw. trotzdem machen... Es hat sich nur bisher kein Freiwilliger gefunden, der das tatsächlich erledigt hätte :P . Und für Rückverweise ins Wiki betr. Alternativen und allg. Vorgehensweisen wäre in desc: immer Raum ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

87insane

Zitat von: TomLee am 29 Juni 2020, 09:24:16
Kann auch daneben liegen, kanns nicht testen hab nur einen Player, wenn du den --distinct Pfad aktivierst, kommen dann die zusätzlichen Infos zu K die du erwarten würdest ?

Müsste ich testen... Ggf. hat aber auch jemand eine andere Idee oder was gesehen, was ich nicht sah.
Eigentlich suche ich nur einen Weg, Gruppen sauber anzeigen zu können bzw zu sehen wer mit wem spielt usw.

Otto123

Das Classic Sonos Modul zeigt auch nicht mehr. Die App bildet lediglich die Gruppe, aber in bestimmten Fällen auch bloß den Masterplayer. Ich denke die Gruppenmitglieder kann man bloß wieder aus "allen" auflösen - also wer spielt nicht mit sich selbst.

Vielleicht macht man das mit einem Extra Teil zur Gruppen Anzeige? "ReadingsDINGSBUMS" als ReadingsGroup oder Proxy oder sowas? Ich kann damit leider nicht viel.  :-[
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

87insane

#314
Hey,

anbei mal ein Player (devstateicon) mit Gruppen-Logik. Er zeigt an wer Master ist und schaltet Tasten ab, die in dem Moment nur der Master macht.
Man sieht also wer gerade die Hoheit hat usw. Zudem ist das so aufgebaut, das auch bei mehreren Gruppen eine Unterteilung sauber statt findet.

{
my $vol = ReadingsVal($name,"volume","");
my $img = ReadingsVal($name,"currentTrack_AlbumArtUri","");
my $trim30 = sub { return length($_[0]) < 29 ? $_[0] : substr($_[0],0,25).'...'; };
my $mystate = ReadingsVal($name,"state","FEHLER");
my $amp = ReadingsVal($name,"bridgeConnected","0") eq "0"
? "rot"
: ReadingsVal($name,"bridgeConnected","0") eq "1"
? "gelb"
: "gruen";
my $playpic = $mystate eq "PLAYING"
? 'rc_PAUSE@red'
: $mystate eq "PAUSED_PLAYBACK"
? 'rc_PLAY@green'
: $mystate eq "STOPPED"
? 'rc_PLAY@green'
: $mystate eq "TRANSITIONING"
? 'rc_PLAY@blue'
: $mystate eq "set_next"
? 'rc_NEXT@blue'
: $mystate eq "set_previous"
? 'rc_PREVIOUS@blue'
: $mystate eq "set_volumeUp"
? 'rc_VOLUP@blue'
: $mystate eq "set_volumeDown"
? 'rc_VOLDOWN@blue'
: $mystate eq "set_mute"
? 'rc_MUTE@blue'
: $mystate;
my $mutecmd = ReadingsVal($name,"mute","0") eq "false"
? "true"
: "false";
my $mutepic = ReadingsVal($name,"mute","0") eq "false"
? 'rc_MUTE'
: 'rc_VOLUP';
my $show = "FEHLER";
my $currentTrack = $mystate eq "TRANSITIONING"
? "Puffern..."
: $trim30->(ReadingsVal($name,"currentTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"currentTrack_Title","FEHLER"));
my $nextTrack = $trim30->(ReadingsVal($name,"nextTrack_Artist","FEHLER"))." - ".$trim30->(ReadingsVal($name,"nextTrack_Title","FEHLER"));
my $previouspic = 'rc_PREVIOUS';
my $nextpic = 'rc_NEXT';
my $voldownpic = 'rc_VOLDOWN';
my $voluppic = 'rc_VOLUP';
my $groupname = ReadingsVal($name,"groupName","0");
my $sgroupname = (split(" ",ReadingsVal($name,"groupName","")))[0];

if (ReadingsVal($name,"bridgeConnected","0") ne "2") {
$show = " ".FW_makeImage("rc_BLANK")." ";}

elsif (($mystate eq "PLAYING")
|| ($mystate eq "TRANSITIONING" )
|| ($mystate eq "set_next" )
|| ($mystate eq "set_previous" )
|| ($mystate eq "set_volumeUp" )
|| ($mystate eq "set_volumeDown" )
|| ($mystate eq "set_mute" )) {

my $shownp = ReadingsVal($name,"name","0") eq $sgroupname ? "<a href=\"/fhem?cmd.dummy=set $name previous&XHR=1\">".FW_makeImage($previouspic)."</a>
<a href=\"/fhem?cmd.dummy=set $name next&XHR=1\">".FW_makeImage($nextpic)."</a>" : "";

$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>
<a href=\"/fhem?cmd.dummy=set $name volumeDown&XHR=1\">".FW_makeImage($voldownpic)."</a>
$shownp
<a href=\"/fhem?cmd.dummy=set $name volumeUp&XHR=1\">".FW_makeImage($voluppic)."</a>
&nbsp;&nbsp;&nbsp;&nbsp;
<a href=\"/fhem?cmd.dummy=set $name mute $mutecmd&XHR=1\">".FW_makeImage($mutepic)."</a><br>";

if (ReadingsVal($name,"name","0") eq $sgroupname) {
$show = "$show
Aktueller Track: $currentTrack<br>
Nächster Track: $nextTrack";}

elsif (ReadingsVal($name,"name","0") ne $groupname) {
$show = "$show
Master: $sgroupname<br>";}
}
else {$show = "<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($playpic)."</a>";}

"<div>
<table>
  <tr>
    <td><div style='display: inline-block; margin-right: 5px; border: 1px solid lightgray; height: 4.00em; width: 4.00em; background-image: url($img);background-size: contain;'></div>
</td>
    <td>".FW_makeImage("10px-kreis-".$amp)."
$show</td>
   </tr>
</table>
</div>"
}


Ich habe jetzt aber nicht die DIVs getauscht... Geht mir gerade erstmal um die Logik.

Was ich noch nicht weiß... Wenn man eine Gruppe erstellt, sendet nur noch der Master einer Gruppe via MQTT Infos. Die Slaves sind in dem Moment komplett still.
Somit stimmt State bei diesen nicht sauber. Nun müsste ich im Gruppen Modus OHNE notify und co die Daten des Masters auslesen. Ich habe aber noch keine Idee...

EDIT: Denke das gehört eher ins Modul. Habe Stephan angeschrieben: https://github.com/svrooij/sonos2mqtt/issues/110

Was sagt ihr denn erstmal zum Player? :)