NEWS

[Anleitung][HowTo] SONOS über Alexa steuern


  • Moinsens,

    ich habe mich mit der Steuerung meiner SONOS Geräte über Alexa beschäftigt und dabei ist dann am Ende ein entsprechendes HowTo herausgekommen.

    Ich spreche immer von SONOS "Geräten", da ich neben den Play1, Play3 usw. auch die SONOS Connect und ConnectAmp einsetze. Da passt dann irgendwie der Begriff "Lautsprecher" nicht mehr so richtig 😎

    Die Steuerung unterscheidet sich bei den Geräten übrigens nicht. Einzig bei dem SONOS Connect schalte ich über einen "BroadLink RM pro" noch zusätzlich meinen AV-Receiver im Wohnzimmer mit an, da der Connect dort an meiner Anlage hängt.

    Folgende SONOS Geräte wurde von mir erfolgreich eingebunden: Play1, Play3, Play5 (2nd), One, Beam, Connect und ConnectAmp

    Folgendes wird im HowTo beschrieben:

    • SONOS Geräte einzeln ein/ausschalten und Lautstärke ändern
    • SONOS Geräte Gruppieren und Gruppierung wieder aufheben (Party-Modus)
    • Musikquelle (Favorit) wechseln

    Ich freue mich über Verbesserungsvorschläge, Hinweise, sofern ich Begriffe falsch verwendet habe und natürlich insbesondere wenn etwas einfacher/besser/deutlicher formuliert werden sollte.

    Da ich über dieses Forum schon viel Unterstützung erhalten habe, kann ich auf diesem Wege womöglich auch einmal etwas zurückgeben und der Eine oder Andere kann sich etwas nützliches aus dem HowTo heraus ziehen?!

    In diesem Sinne, viel Spaß und Erfolg bei der Umsetzung

    und "viel Vergnügen bei der Gewinnung neuer Erkenntnisse (Anne Will ?)" 😉
    SONOS über Alexa steuern.pdf


  • Nachtrag Beispielcodes aus dem HowTo:

    javascript code von Pix um die Stati ("state", "play", "stop", "pause") in Abhängigkeit der Lautsärke (<>1) zu setzen

    ! ````
    /* Alexa_Sonos_schalten
    ! reagiert auf Lautstärkeänderungen
    Alexa Smartname zeigt auf .volume
    Sonos-Adapter Version 1.6.0 voraus!
    ! http://forum.iobroker.net/viewtopic.php?f=37&p=75526#p75526
    ! 15.07.2017 erstellt von pix nach Idee von BBTown
    16.07.2017 Quelle zugefügt
    */
    const logging = true;
    ! // sonos.0.root.XXX_XXX_XXX_XXX.volume
    var regex_vol = /^sonos.[0-9].root.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)_(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).volume$/;
    ! on({
    id: regex_vol,
    change: 'ne'
    }, function(data) {
    var pfad = getIdByName(data.channelName);
    if (logging) log(data.channelName + ' (' + pfad + '.' + data.name + ') Lautstärke auf ' + data.state.val + '% geändert');
    if (data.state.val >= 2) {
    setState(pfad + '.muted', false);
    setState(pfad + '.state', 'play');
    setState(pfad + '.play', true);
    setState(pfad + '.stop', false);
    }
    if (data.state.val < 2) {
    setState(pfad + '.state', 'stop');
    setState(pfad + '.play', false);
    setState(pfad + '.stop', true);
    }
    });

    Als Alternative zum Script von Pix: Blockly-code um die Stati der SONOS Geräte zu wechseln.
    
    Dieses Beispiel berücksichtigt allerdings nur jeweils ein Gerät und muss daher für jedes SONOS Gerät separat angelegt werden.
    
    (Die Empfehlung liegt daher in der Nutzung des generischen Scriptes von Pix)
    
    >! ````
     <xml xmlns="http://www.w3.org/1999/xhtml"><block id="dbjr?Bo*P5BB-X`|8a`)" type="on_ext" x="-412" y="-212"><mutation items="1"></mutation>
        <field name="CONDITION">ne</field>
    
        <value name="OID0"><shadow id="NIZw?^l|a|~Az]6-ODC`" type="field_oid"><field name="oid">sonos.0.root.192_168_178_61.volume</field></shadow></value> 
        <statement name="STATEMENT"><block id="/P]OaJvPo(8t|_b@_DWg" type="controls_if"><value name="IF0"><block id="F}%}QU.H.2ReY*27Vujw" type="logic_compare"><field name="OP">GT</field>
                <value name="A"><block id="2pVgp@S^Gkk4m*FcYp/@" type="get_value"><field name="ATTR">val</field>
                    <field name="OID">sonos.0.root.192_168_178_61.volume</field></block></value> 
                <value name="B"><block id="?*,meW}Ty_jsc#/(d2jk" type="math_number"><field name="NUM">1</field></block></value></block></value> 
            <statement name="DO0"><block id="M7=jamTO`f_Vy3asBWy_" type="control"><mutation delay_input="false"></mutation>
                <field name="OID">sonos.0.root.192_168_178_61.state</field>
                <field name="WITH_DELAY">FALSE</field>
                <value name="VALUE"><block id="Cp/7yeWv1Aei%jeL-SQl" type="text"><field name="TEXT">play</field></block></value> 
                <next><block id="0^SZ=tQeC/|]-Su_(|=k" type="control"><mutation delay_input="false"></mutation>
                    <field name="OID">sonos.0.root.192_168_178_61.play</field>
                    <field name="WITH_DELAY">FALSE</field>
                    <value name="VALUE"><block id=":f1y3j};K,ER@r(@VEc#" type="logic_boolean"><field name="BOOL">TRUE</field></block></value> 
                    <next><block id="]C+RB`OFy[Nq.:xeJFeJ" type="control"><mutation delay_input="false"></mutation>
                        <field name="OID">sonos.0.root.192_168_178_61.stop</field>
                        <field name="WITH_DELAY">FALSE</field>
                        <value name="VALUE"><block id="WGj!w{y;A:*[^G+z?23+" type="logic_boolean"><field name="BOOL">FALSE</field></block></value></block></next></block></next></block></statement> 
            <next><block id="?|=4%gRKMF*SU8f-4qaQ" type="controls_if"><value name="IF0"><block id="eRFu+k!9zXX,SBm`-?Xv" type="logic_compare"><field name="OP">LT</field>
                    <value name="A"><block id="C{^ngt;Ddf@.VWP6Fi83" type="get_value"><field name="ATTR">val</field>
                        <field name="OID">sonos.0.root.192_168_178_61.volume</field></block></value> 
                    <value name="B"><block id="4?Z!^[,Mzgu0uyx!)N48" type="math_number"><field name="NUM">2</field></block></value></block></value> 
                <statement name="DO0"><block id=".GJO4s}Fbo6P/hJxl`@v" type="control"><mutation delay_input="false"></mutation>
                    <field name="OID">sonos.0.root.192_168_178_61.state</field>
                    <field name="WITH_DELAY">FALSE</field>
                    <value name="VALUE"><block id="!-]HLRwr%H%Ts]2~`8a:" type="text"><field name="TEXT">stop</field></block></value> 
                    <next><block id="jS#;~DOdAs]o3D?3W|sf" type="control"><mutation delay_input="false"></mutation>
                        <field name="OID">sonos.0.root.192_168_178_61.stop</field>
                        <field name="WITH_DELAY">FALSE</field>
                        <value name="VALUE"><block id="kzfnxW5)Rze:pthw-ik)" type="logic_boolean"><field name="BOOL">TRUE</field></block></value> 
                        <next><block id="F?~^/4!sN_J]Vp4uOvH@" type="control"><mutation delay_input="false"></mutation>
                            <field name="OID">sonos.0.root.192_168_178_61.play</field>
                            <field name="WITH_DELAY">FALSE</field>
                            <value name="VALUE"><block id="r@4()cyk@FckKsuiGR/q" type="logic_boolean"><field name="BOOL">FALSE</field></block></value></block></next></block></next></block></statement></block></next></block></statement></block></xml> 
    >! ````
    Blockly-code um die Musikquelle zu wechseln. Die Musikquelle wird nur geändert, wenn der "coordinator" das Gerät selbst ist (es sich nicht in einer Gruppe befindet).
    
    Dieses Beispiel berücksichtigt jeweils eine Musikquelle und muss daher für jede Musikquelle separat angelegt werden.
    
    >! ````
     <xml xmlns="http://www.w3.org/1999/xhtml"><block type="comment" id="DDc2(CXiW`i%YbZCOHtn" x="-687" y="-663"><field name="COMMENT">Script zum Umstellen der Musikquelle (Favoriten) der Sonos Geräte</field>
        <next><block type="comment" id="U(ssna#u!#22z2e*CTs~"><field name="COMMENT">Die Musikquelle soll jedoch nur umgestellt werden, wenn das SONOS Gerät sich nicht im "Gruppenmodus" befindet</field>
            <next><block type="comment" id="oWuGUW*?xO,ktJChx3st"><field name="COMMENT">Es wird daher gepürft ob das Gerät sich selbst steuert</field>
                <next><block type="comment" id="gB__Bhl%W:n34..Juzrn"><field name="COMMENT">Die Variable "Favoriten" enthällt die Musikquelle auf die das SONOS Gerät umgestellt werden soll</field>
                    <next><block type="variables_set" id="4Ow@Ij%T@)(5BB~TP}_f"><field name="VAR">Favoriten</field>
                        <value name="VALUE"><block type="text" id="vRmA_},G_f`8m)I6shhl"><field name="TEXT">Metal</field></block></value> 
                        <next><block type="controls_if" id="t_at/+~?]X*R`;{bd8uJ"><value name="IF0"><block type="logic_compare" id="+yi[V.j8DczWgJ{bz9Pv"><field name="OP">EQ</field>
                                <value name="A"><block type="get_value" id="q-Ia(|5ci1tf%h1jpcYM"><field name="ATTR">val</field>
                                    <field name="OID">sonos.0.root.192_168_178_61.coordinator</field></block></value> 
                                <value name="B"><block type="text" id="#]/voG:Je;,8E[l*[dXh"><field name="TEXT">192_168_178_61</field></block></value></block></value> 
                            <statement name="DO0"><block type="control" id="0^SZ=tQeC/|]-Su_(|=k"><mutation delay_input="false"></mutation>
                                <field name="OID">sonos.0.root.192_168_178_61.favorites_set</field>
                                <field name="WITH_DELAY">FALSE</field>
                                <value name="VALUE"><block type="variables_get" id="rn8e^R@=Z;nl41_#/j[i"><field name="VAR">Favoriten</field></block></value></block></statement> 
                            <next><block type="controls_if" id="k(6c3}DW:J1.J%eY1#^%"><value name="IF0"><block type="logic_compare" id="a,k_yEU/wslOv1Ll8R2t"><field name="OP">EQ</field>
                                    <value name="A"><block type="get_value" id="S_(%l8fg=zJwn;bB{km*"><field name="ATTR">val</field>
                                        <field name="OID">sonos.0.root.192_168_178_62.coordinator</field></block></value> 
                                    <value name="B"><block type="text" id="Y5:C%p!O)[PO.~AMzlD@"><field name="TEXT">192_168_178_62</field></block></value></block></value> 
                                <statement name="DO0"><block type="control" id="jl;/+3-Ae7Df{qVjrv5Y"><mutation delay_input="false"></mutation>
                                    <field name="OID">sonos.0.root.192_168_178_62.favorites_set</field>
                                    <field name="WITH_DELAY">FALSE</field>
                                    <value name="VALUE"><block type="variables_get" id="8DSwvGv;SiFAf+bi@N|9"><field name="VAR">Favoriten</field></block></value></block></statement> 
                                <next><block type="controls_if" id="}P;{/oP)9WTDuTx[[O;d"><value name="IF0"><block type="logic_compare" id="@b+}gnFJK(I5BvJn.dF@"><field name="OP">EQ</field>
                                        <value name="A"><block type="get_value" id="mU8pD7hbY~ks,zAH6/2Z"><field name="ATTR">val</field>
                                            <field name="OID">sonos.0.root.192_168_178_63.coordinator</field></block></value> 
                                        <value name="B"><block type="text" id="KOLcM3:eTW=}.(`f~@_f"><field name="TEXT">192_168_178_63</field></block></value></block></value> 
                                    <statement name="DO0"><block type="control" id="Nf!DEt_h=/elg2,p4Jgy"><mutation delay_input="false"></mutation>
                                        <field name="OID">sonos.0.root.192_168_178_63.favorites_set</field>
                                        <field name="WITH_DELAY">FALSE</field>
                                        <value name="VALUE"><block type="variables_get" id=";0G8S23CVVWa8j;9,*k["><field name="VAR">Favoriten</field></block></value></block></statement> 
                                    <next><block type="controls_if" id="Aa9o*W?kC--9f0wcd86V"><value name="IF0"><block type="logic_compare" id="6|!(TtNTAfn`PW1xkx.M"><field name="OP">EQ</field>
                                            <value name="A"><block type="get_value" id="AcAXt(7I],/38S{LWY/w"><field name="ATTR">val</field>
                                                <field name="OID">sonos.0.root.192_168_178_64.coordinator</field></block></value> 
                                            <value name="B"><block type="text" id="-Rx!FC^I*?Krq7RQEba/"><field name="TEXT">192_168_178_64</field></block></value></block></value> 
                                        <statement name="DO0"><block type="control" id="7%NVv[=fP~_`Ce5!DR!7"><mutation delay_input="false"></mutation>
                                            <field name="OID">sonos.0.root.192_168_178_64.favorites_set</field>
                                            <field name="WITH_DELAY">FALSE</field>
                                            <value name="VALUE"><block type="variables_get" id="#N/[%5Q{PC+90E@e#~kj"><field name="VAR">Favoriten</field></block></value></block></statement> 
                                        <next><block type="controls_if" id="-5`LKX3X42N=*)8)k._!"><value name="IF0"><block type="logic_compare" id="[kCcIn5.lw,4a/L+z=~n"><field name="OP">EQ</field>
                                                <value name="A"><block type="get_value" id="PW9+-4e64D7a=NWrCG!^"><field name="ATTR">val</field>
                                                    <field name="OID">sonos.0.root.192_168_178_68.coordinator</field></block></value> 
                                                <value name="B"><block type="text" id="i1[KP`ob[7UxpR+lEKVJ"><field name="TEXT">192_168_178_68</field></block></value></block></value> 
                                            <statement name="DO0"><block type="control" id="SIZl,Mq4xa%xJZ[N_dAh"><mutation delay_input="false"></mutation>
                                                <field name="OID">sonos.0.root.192_168_178_68.favorites_set</field>
                                                <field name="WITH_DELAY">FALSE</field>
                                                <value name="VALUE"><block type="variables_get" id="f7Di|lqGI!N#lKQnP=,y"><field name="VAR">Favoriten</field></block></value></block></statement> 
                                            <next><block type="controls_if" id="RvfHJ{:nI=K7:.HO.re8"><value name="IF0"><block type="logic_compare" id="s5GIlAJ%=P{q;,,}3/!9"><field name="OP">EQ</field>
                                                    <value name="A"><block type="get_value" id="a]2Jn^F5XNfxWZ-nayWv"><field name="ATTR">val</field>
                                                        <field name="OID">sonos.0.root.192_168_178_69.coordinator</field></block></value> 
                                                    <value name="B"><block type="text" id="?PPxZIvV1ksc@0BLywBs"><field name="TEXT">192_168_178_69</field></block></value></block></value> 
                                                <statement name="DO0"><block type="control" id="el]E{g@/Uj.p?5b=]htN"><mutation delay_input="false"></mutation>
                                                    <field name="OID">sonos.0.root.192_168_178_69.favorites_set</field>
                                                    <field name="WITH_DELAY">FALSE</field>
                                                    <value name="VALUE"><block type="variables_get" id="qr7HPu_wppaGbU~q6L!x"><field name="VAR">Favoriten</field></block></value></block></statement></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></xml> 
    >! ````
    [Edit] Ergänzung am 27.07.2017
    
    Beispielcode um per javascript den ****coordinator**** zu adressieren/ändern
    
    (in diesem Beispiel soll das SONOS Gerät ****192_168_178_72**** der Gruppe vom SONOS Gerät ****192_168_178_75**** zugeordnet werden)
    

    setState("sonos.0.root.192_168_178_72.coordinator", '192_168_178_75')


  • Ganz stark! Vielen Dank an beide

    Jetzt kann / muss ich mir mal via Blockly die Javascripte anschauen und sehen, warum ich bislang zu bläd war, über coordinator Gruppen zu erstellen.

  • Forum Testing Most Active Global Moderator Administrators

    @tempestas:

    Vielen Dank an beide `
    Heiko & Heiko :shock:

    Gruß

    Rainer


  • Ich habe Pix da für sein Skript mit einbezogen. Bin ja ein freundlicher Mensch 😉

    Heikos Arbeit habe ich dann zusätzlich noch durch den Daumen hoch geehrt 🙂


  • Ergänzung der http://forum.iobroker.net/viewtopic.php?f=37&t=7395#p77123 um per javascript den coordinator zu adressieren/ändern

    (in diesem Beispiel soll das SONOS Gerät 192_168_178_72 der Gruppe vom SONOS Gerät 192_168_178_75 zugeordnet werden

    setState("sonos.0.root.192_168_178_72.coordinator", '192_168_178_75')
    
  • Starter

    Moin zusammen,

    vielen Dank erstmal für das tolle HowTo.

    Ich bin noch totaler iobroker Newbie.

    Mich interessiert vor allen Dingen die Lautstärke Geschichte.

    Funktionieren tut damit z.B. Alexa stelle Sonos Esszimmer auf 30%

    Was mir jetz noch fehlt:

    Alexa mach Sonos Esszimmer 5% (Werte z.B. von 1-25) lauter (leiser)

    Alexa mach Sonos Esszimmer lauter / leiser (also ohne Prozentangabe - dann sollte es jeweils um z.B. 5% (einstellbar) lauter/leiser werden)

    Toll wäre Alexa mach Sonos Esszimer etwas lauter/leiser (also ohne Prozentangabe - dann sollte es jeweils um z.B. 2% (einstellbar) lauter/leiser werden)

    Die Sonos Lautstärke muss begrenzbar sein (z.B. maximal 70%)

    Weiteres Problem: Im Wohnzimmer habe ich einen Sonos Connect, der hängt an einem Verstärker ohne jegliche Smart Funktionen.

    Ich müsste also im Wohnzimmer z.B. mit dem Befehl Alexa mach Sonos Wohnzimmer lauter z.B. 5 x schnell hintereinander den Volume Up Befehl per Harmony Hub an den Verstärker senden (Den Befehl dafür sehe ich im Harmony Adapter)

    Wäre Klasse wenn so etwas gehen würde.

    Danke im Voraus

    LG Martin


  • Moin Martin,

    das sind aber viele Wünsche auf einmal 8-)

    Für die maximal Lautstärke (in deinem Beispiel 70%) versuche doch mal folgendes:

    In den Eigenschaften des Datenpunktes "volume" des entsprechendes SONOS Gerätes dem "max" Wert von 100 auf 70 stellen. Vielleicht reicht das bereits aus?!

    Bezüglich deines Wunsches der Lautstärkeregelung wirst Du deinen Wunsch wohl eher an Amazon/Alexa richten müssen. 8-) .

    Du könntest versuchen dir ein Script anzulegen, welches den aktuellen Lautstärkewert fix z.B. jedesmal um 5% anhebt oder senkt (Aktueller Wert +5 oder Aktueller Wert -5).

    Aberrrrrrr … wie sprichst Du das Kommando?

    Wenn ich recht weiß, dann kannst Du aktuell einen "level" Datenpunkt mit dem Kommando "setze" oder "stelle" auf einen Wert einstellen. Ansonsten kannst Du nur (ein/aus) "schallten".

    Würdest Du nun also das Script "SONOS Esszimmer lauter" nennen, dann wäre das Kommando:

    "Alexa, schalte SONOS Esszimmer lauter ein" damit das Script ausgeführt wird.

    Das klingt ziemlich unnatürlich, oder?

    Ansonsten wird, so ist zumindest mein Kenntnisstand, "lauter" und "leiser" durch Alexa immer auf sich selbst bezogen.

    Vielleicht hat jemand anderes aber auch schon einmal erfolgreich eine andere Syntax erfolgreich umgesetzt?!


  • @kaiserm:

    Weiteres Problem: Im Wohnzimmer habe ich einen Sonos Connect, der hängt an einem Verstärker ohne jegliche Smart Funktionen.

    Ich müsste also im Wohnzimmer z.B. mit dem Befehl Alexa mach Sonos Wohnzimmer lauter z.B. 5 x schnell hintereinander den Volume Up Befehl per Harmony Hub an den Verstärker senden (Den Befehl dafür sehe ich im Harmony Adapter) ` Das ist exakt auch meine Kombination.

    Yamaha AV-Receiver ohne Smart Funktion

    Steuerung über Broadlink RM pro

    Meine Grundlautstärke des Connect ist bei mir 85%, so dass kaum noch "Reserven" für die Lautstärkeregelung über SONOS vorhanden sind. Absenken der Lautstärke funktioniert auch beim Connect tadellos (gemäß des HowTo`s) nur viel Lauter geht es bei 85% Grundlautstärke dann eben nicht.

    Wenn ich ehrlich bin, dann benötige ich derart selten eine Lautstärkeanpassung bei mir im Wohnzimmer, dass das in der Praxis völlig irrelevant ist. Wenn ich doch einmal deutlich lauter im Wohnzimmer werden will, dann muss ich eben doch die Fernbedienung in die Hand nehmen, dann würde mich Alexa aber wahrscheinlich sowieso kaum noch verstehen 😉

  • Starter

    Moinsen,

    vielen Dank für Deine ausführliche Antwort.

    Das mit der Begrenzung auf 75% werde ich mal probieren.

    Der Connect steht auf fix, so dass ich die Lautstärke mit dem Amp regeln muss.

    Ich denke im Wohnzimmer nehme ich da einfach die Fernbedienung.

    In den anderen Räumen werde ich mal versuchen ob es irgendwie geht mit Alexa Lautstärke plus x% (minus x%) zu steuern.

    Das mit dem mach lauter in Raum x macht ja der Sonos Skill. Aber die derzeitigen 10% Sprünge sind einfach nicht praxisgerecht.)

    LG Martin


  • Hallo zusammen,

    vielen Dank für die ausführliche Beschreibung.

    AAABER: Was ist hier mein Vorteil gegenüber der Einbindung über die Alexa-App?

    Danke und Gruß

    Christian


  • Wenn Du keinen Vorteil siehst, dann kann ich das nicht für dich beantworten :lol:

    Ich weiss ehrlich gesagt gar nicht in wie weit man über die Alexa-App Gruppen bilden kann?!

    Du kannst ja nun beliebige Gruppenkombinationen mit Namen vergeben und diese nun zusammenschalten oder wieder trennen.

    Ich weiss auch nicht in wie weit es möglich ist über die Alexa-App Favoriten anzusteuern?

    Die gleiche Lösung sollte zudem zukünftig auch für GoogleHome funktionieren.

    Weiterhin steuere ich anhand der Einbindung über den Sonos Adapter auch zum Beispiel die Musik im Badezimmer durch einschalten des Lichts.

    Ich für mich habe einige Vorteile gefunden … ohne jedoch zu prüfen ob es auch über die Alexa App gegangen wäre ... meine Steuerung ist ja nunmal ioBroker und nicht Alexa ... Alexa ist nur eine weiteres Steuermedium, aber nicht meine Zentrale


  • Mit v.10.1 der SONOS App können nun auch externe Eingänge zu den Favoriten hinzugefügt und sollten damit nun auch per Alexa angesprochen werden können 👍

Suggested Topics

1.8k
Online

35.2k
Users

41.1k
Topics

565.8k
Posts