Sonos2mqtt - vielleicht hat jemand Lust mitzumachen

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

Vorheriges Thema - Nächstes Thema

Otto123

Vielleicht mal wieder ein Zwischenstand:
Ich habe in den letzten Tagen beide Wikiartikel noch etwas überarbeitet, für euch also Zeit für lesen, probieren und Feedback

  • Das Setup habe ich noch etwas gestrafft.
  • Die Erweiterung der Bridge separat gefasst. Dieser Abschnitt sollte so schnell wie möglich ins Template. Dazu muss ich noch etwas nachdenken und testen. Insofern ist der Abschnitt nicht fertig :)
  • Habe Befehle zum Refresh der sonos2mqtt Events eingebaut (beta 3.1.0-beta.1 nötig). Das hilft, falls mal ein Player weg(aus) war
  • Die favoritenListe und der setter dazu ist aus meiner Sicht brauchbar und fertig
  • Das Beispiel zum durchtasten einer Senderliste ohne und mit Ansage habe ich überarbeitet.
  • Die Ansage habe ich nicht über speak sondern direkt über play gemacht, dass spart etwas Zeit. Der Sender wird nach einer Folge von 3 Events gestartet. Da habe ich ne Weile probiert, wäre schön wenn das allgemein zuverlässig funktioniert.
  • Ich habe ein paar Codebestandteile im Detail verändert, aus meiner Sicht verbessert ;) Ich hoffe die Perlspezis lachen sich nicht scheckig.
Für die weitere Arbeit habe ich ein paar Fragen:

  • Ich meine es ist Zeit etwas vom Code in eine Utils Datei auszulagern. Wie würde man die ausliefern und warten?
  • Wenn wir ein 4tes Template (Komfort) für die Player machen, müssen ja dort vor allem setList erweitert werden. Gibt es in AttrTemplate dafür schon etwas? Oder hilft da nur mein (derzeitig vielleicht putziger Raw Def) Code in Abwandlung?   
  • Es ist still um das devStateIcon geworden?

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

HeHe,

wollte gerade schreiben da fehlt noch ein sleep bei dem Code mit Sprachansage  :D

Die Variante aus #459 mit $play:enqueuedMetadata_UpnpClass:.object.item.audioItem.audioBroadcast klappt bei dir nicht ?

Otto123

#527
Hab es gerade durchgespielt und noch etwas korrigiert. Am Ende gibt es dann doch immer noch kleine Fehler  :'(

Die Variante #459 klappt bei mir nicht.
Wenn man mit event-on-change-update .* arbeitet, kommt bei mir der Event gar nicht zu dem Zeitpunkt ;) Wenn man das nicht macht, sind die Eventfolgen ziemlich unübersichtlich.

Im Übrigen alles einreißen und die Basis neu machen:
# sonos2mqtt komplett von vorn
"pm2 stop sonos2mqtt"
delete model=sonos2mqtt_speaker
"rm ./www/images/default/Sonos*.png"
delete FileLog_MQTT2_RINCON_.*
"rm ./log/MQTT2_RINCON_*.log"
sleep SonosBridge:connected:.0; set WEB rereadicons
sleep WEB:rereadicons;delete model=sonos2mqtt_bridge,SonosTTS,SonosSpeakWeb,n_configSonos.,n_pm2_sonos

#sonos2mqtt neu beginnen - separat starten, mqtt2s anpassen!
define SonosBridge MQTT2_DEVICE
attr SonosBridge IODev mqtt2s
attr SonosBridge room MQTT2_DEVICE
defmod n_pm2_sonos notify global:INITIALIZED|n_pm2_sonos:start "pm2 -s start sonos2mqtt"
sleep global:ATTR.SonosBridge.stateFormat.connected;trigger n_pm2_sonos start
set SonosBridge attrTemplate sonos2mqtt_bridge_comfort

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

PatrickR

Hi!
Zitat von: Otto123 am 17 August 2020, 10:52:13
Man müsste den Befehl jetzt irgendwie in der Bridge einbauen.
Wenn jemand die Player on/off betreibt kann so einfach mit gewisser Wartezeit nach dem Wiedereinschalten die Struktur aktualisiert werden.
Da mein Connect indirekt durch Harmony (ich erspare Dir die Details) gesteuert wird, wollte ich bei mir darauf reagieren und check-subscriptions schicken. Notfalls könnte man auch mit presence und ping arbeiten. Aber schön ist das alles nicht.

Zitat von: Otto123 am 17 August 2020, 10:52:13
Nachtrag: Heute wurde das MQTT2 Gerät ca. 5 min nach dem Einschalten wieder mit Events versorgt. Also scheint auch der neu eingebaute Aktualisierungsmechanismus zu greifen.👍
Prinzipiell überleben die offiziellen Sonos-Apps die Topologieänderungen auch, d. h. es muss irgendeine Möglichkeit geben, defekte Subscriptions zu erkennen. Was mir noch unklar ist, ist das von svrooij sehr lange gewählte Default-Intervall von 10 Minuten. Das spricht ja dafür, dass das periodische Prüfen der Subscriptions entweder sehr aufwendig ist oder Nebenwirkungen hat.

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

TomLee

Spricht denn irgendwas dagegen für set alias=Büro notify 25 {('http://[SonosTTS:host]/fhem/cache/KlingelTon.mp3')}
einen neuen setter-Namen zu finden und den dann wie in #490 vorgeschlagen umzusetzen (mit oder ohne Dateiendung) ?

Genauso für den "toggleRadio"-setter
{my $dev = (devspec2array('model=sonos2mqtt_bridge'))[0];;my $r=Each($dev,ReadingsVal($dev,'favRadios',''));;my $play = (devspec2array('alias=Büro'))[0];;my $tts="SonosTTS";;fhem("set $tts tts Es folgt $r;;sleep $tts:playing:.0;;set $play playUri [$tts:httpName];;sleep $play:play;;sleep $play:PLAYING;;sleep $play:STOPPED;;set $play playFav $r")}

Otto123

Hallo Patrick,

zum einen habe ich im Wiki den Befehl in die SonosBridge eingebaut. Das funktioniert. Also wenn Du einschaltest (Harmony) warten und dann den Befehl absetzen sollte gut gehen.

Keine Ahnung was die App macht, aber die braucht auch eine Weile bis zur "Erkenntnis".  Du kannst ja das Interval verkürzen und schauen was passiert:
define a_sonoscheck +*00:05 set SonosBridge CheckSubscription

Es gibt aus meiner Sicht auch ERROR Meldungen - hab ich noch nicht untersucht.
PRESENCE und Ping - bloß nicht! Ich finde das läuft gruselig!

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

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

Zitat von: Otto123 am 18 August 2020, 18:03:24
Ich denke nicht, kann man doch machen... :)

Ich mein ins Template einbauen, nicht als Option die sich jeder selbst erweitern kann.

PatrickR

#533
Mahlzeit!

Nachdem die Subscriptions nun funktionieren habe ich mich an die weitere Einrichtung gemacht.

Ich verwende für TTS den nativen sonos2mqtt-Weg über einen sonos-tts-polly-Container.

Dafür habe ich die setList wie folgt erweitert:

speak:textField { my (undef, $lang, $voice, $volume, @text) = split(/ /, $EVENT); sprintf('house/general/sonos/RINCON_949F3E14224A01400/control {"command":"speak","input":{"lang": "%s", "name":"%s", "volume":%s, "text": "%s","delayMs":700}}', $lang, $voice, $volume, join(" ", @text))}

Mit

set EG.KU.Sonos speak de-DE Vicki 25 Test

funktioniert das einwandfrei und klingt sogar noch gut.

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

Zitat von: TomLee am 18 August 2020, 18:07:30
Ich mein ins Template einbauen, nicht als Option die sich jeder selbst erweitern kann.
Zur Vorbereitung habe ich die Setter playSound und toggleRadio umgesetzt und mit ins Wiki aufgenommen.  8) Schau Dirs mal an und teste.
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

Klappt beides auf Anhieb bei mir.

Wozu ist $cmd im playSound-setter ?

Wozu im toggleRadios-setter den Namen des tts-Device in einer Variable ablegen, wenn man ihn nur einmal braucht ?
Macht man das wegen der Übersichtlichkeit so ?

Ähnlich gelagerte Frage beim devstateIcon, die Variable my $wpix wird zwei Mal verwendet, spart aber kein Zeichen Code, macht ihn sogar länger, die Variable hat genauso 5 Zeichen wie die 250px ?

Der Übersichtlichkeit wegen, wäre es evtl. angebracht die Sprachdateien nicht in cache sondern in einem Unterordner anzugeben ?
Auf dem Hauptsystem läuft bei mir echodevice, das hat einen Unterordner alexa-cookie erstellt.
Fänd das glaub ich besser, sowas wie cache/s2m/speakfiles und für die Soundfiles etwa cache/s2m/sounds

TomLee

Mit getrennten Ordnern Sprachdateien/Sounds könnte man sich die Dateinamen der Soundfiles wieder (wers braucht) in einen setter holen.

Otto123

#537
Wozu ist $cmd im playSound-setter ? zum Wegwerfen :) kann man auch anders machen, aber ich fand es elegant
my ($cmd,$vol,$file)=split(' ', $EVENT,3)
erzeugt 3 Teile aus dem $EVENT, den Ersten brauch ich nicht, der Zweite ist VOL und der Dritte ist der komplette Rest und kann mit dem Konstrukt auch noch Leerzeichen enthalten. Ist auch einfach "Einheitlich"  ;)

Wozu im toggleRadios-setter den Namen des tts-Device in einer Variable ablegen, wenn man ihn nur einmal braucht ?
Macht man das wegen der Übersichtlichkeit so ?
Copy & Paste - man weiß ja nie. Ja kann man in dem Fall weglassen. Wird doch aber 3 mal gebraucht?!

Ähnlich gelagerte Frage beim devstateIcon, die Variable my $wpix wird zwei Mal verwendet, spart aber kein Zeichen Code, macht ihn sogar länger, die Variable hat genauso 5 Zeichen wie die 250px ?
Da wollte ich einfach die Konfigurierbarkeit am Anfang des Codes. Damit muss man nicht hinten oder mittendrin suchen. Ich habe das gern in den ersten Zeilen des Codes. Quasi sowas wie "Parameter Teil".
Ich habe beim Versuch mit der Laufschrift mit der Breite und Postion etwas gespielt. Da wollte ich schnell ändern.

Ja Unterpfade kann man natürlich machen. Mal etwas spielen und dann schauen wie es sich so macht. ;)
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

australien

Hallo Otto123

ich hab das MQTT2SONOS genau so aufgesetzt wie du es hier im Forum bzw im Wiki beschreibst.
Leider komme ich auf keinen grünen Zweig.

Ich bekomme im fhem log folgende Meldung:
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)


und die bridge verbindet sich nicht.

wenn ich am RPi eingebe:
pm2 status
bekomme ich folgende Meldung
pi@raspberrypi-fhem:~ $ pm2 status
┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name      │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
[PM2][WARN] Current process list running is not in sync with saved list. sonos2mqtt differs. Type 'pm2 save' to synchronize.



Wenn ich dann bei fhem in der Kommandozeile eingebe
"pm2 -s start sonos2mqtt"

kommt ins log
[PM2][Initialization] Environment variable HOME (Linux) or HOMEPATH (Windows) are not set!
[PM2][Initialization] Defaulting to /etc/.pm2
fs.js:119
    throw err;
    ^

Error: ENOENT: no such file or directory, open '/etc/.pm2/pm2.log'
    at Object.openSync (fs.js:448:3)
    at module.exports.Client.launchDaemon (/usr/lib/node_modules/pm2/lib/Client.js:228:12)
    at /usr/lib/node_modules/pm2/lib/Client.js:104:10
    at /usr/lib/node_modules/pm2/lib/Client.js:320:14
    at processTicksAndRejections (internal/process/task_queues.js:79:9)


Wenn ich am RPi eingebe
pm2 start sonos2mqtt

kommt
[PM2] Starting /usr/bin/sonos2mqtt in fork_mode (1 instance)
[PM2] Done.
┌─────┬───────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id  │ name          │ namespace   │ version │ mode    │ pid      │ uptime │ ↺    │ status    │ cpu      │ mem      │ user     │ watching │
├─────┼───────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0   │ sonos2mqtt    │ default     │ N/A     │ fork    │ 1849     │ 0s     │ 0    │ online    │ 0%       │ 22.0mb   │ pi       │ disabled │
└─────┴───────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘


und alles funktioniert.

Nach einem reboot ist aber wieder der pm2 aus und die bridge ist "tod".

Was übersehe ich?
raspberry pi3
signalduino, Shelly1, Shelly2, Sonos, Unifi
Amazon Fire Tablet 7 | Noname Android Tablet 10"

Otto123

Hallo australien,

auf den ersten Blick vermute ich Du hast nodejs / pm2 / sonso2mqtt "falsch" installiert:
ZitatVoraussetzung: nodejs und pm2 ist installiert und für alle Benutzer verfügbar. Je nach Entwicklungsstand sind auch Betaversionen verfügbar. Für aktuelle Beta einfach anstatt sonos2mqtt -> sonosmqtt@3.1.0-beta.1 beim Setup verwenden.

sudo npm install -g sonos2mqtt
Hast Du sowohl pm2 als auch sonos2mqtt mit sudo (root) und mit der Option -g installiert?

In meiner Anleitung (kann man anders machen) läuft das ganze dann als User fhem.
Wenn man auf Systemebene "schauen" will muss man es auch als User fhem tun!
sudo -su fhem 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