22 Jan 2021, 21:59
@Qlink
Versuch mal dieses Blockly hier:
<xml xmlns="https://developers.google.com/blockly/xml">
<variables>
<variable id=".B|u{xsz9?}cCF]r.OM`">sonos_id</variable>
<variable id="KE%}R:%v6Ld~bdiR@`-k">sonos_control</variable>
<variable id="Nq2Pt3`hqstb`ou2}[v0">dp_id</variable>
<variable id="q;W8#D?IYE7d:FLChg2B">list_IDs</variable>
<variable id="O,T|%m+5p}}YmB!go2,H">list_controls</variable>
<variable id="nrFiG,Xnh_UyAZg}f1(f">i</variable>
<variable id="!jGlZtV?jYwHr/A6AG8*">j</variable>
<variable id="l(#qc|Y{`S-^$l$6Dv5N">control_value</variable>
</variables>
<block type="procedures_defcustomnoreturn" id="Weu/}3|Y:;dgJg)W/FT}" x="-387" y="-687">
<mutation statements="false">
<arg name="sonos_id" varid=".B|u{xsz9?}cCF]r.OM`"></arg>
<arg name="sonos_control" varid="KE%}R:%v6Ld~bdiR@`-k"></arg>
</mutation>
<field name="NAME">createSonosState</field>
<field name="SCRIPT">bGV0IGRwX25hbWUgPSAnMF91c2VyZGF0YS4wLnNvbm9zLmFwaS4nICsgc29ub3NfaWQgKyAnLicgKyBzb25vc19jb250cm9sOw0KDQppZighZXhpc3RzU3RhdGUoZHBfbmFtZSkpIHsNCiAgICBjcmVhdGVTdGF0ZShkcF9uYW1lLCBmYWxzZSx7dHlwZTogImJvb2xlYW4iLCByb2xlOiAiYnV0dG9uIiwgbmFtZTogc29ub3NfY29udHJvbCwgcmVhZDogZmFsc2UsIHdyaXRlOiB0cnVlfSk7DQp9</field>
<comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
</block>
<block type="procedures_defcustomreturn" id="rjwJo/d!jNn|I[.+,n%1" x="-387" y="-662">
<mutation statements="false">
<arg name="dp_id" varid="Nq2Pt3`hqstb`ou2}[v0"></arg>
</mutation>
<field name="NAME">getSonosControl</field>
<field name="SCRIPT">dmFyIHN0cl9yZXAgPSBkcF9pZDsNCnN0cl9yZXAgPSBzdHJfcmVwLnJlcGxhY2UoJzBfdXNlcmRhdGEuMC5zb25vcy5hcGkuJywnJyk7DQpzdHJfcmVwID0gc3RyX3JlcC5yZXBsYWNlKCcuJywnLycpOw0KcmV0dXJuIHN0cl9yZXA7</field>
<comment pinned="false" h="80" w="160">Beschreibe diese Funktion …</comment>
</block>
<block type="variables_set" id="Z:`6RBmQzDK9/pT(Pu|j" x="-387" y="-637">
<field name="VAR" id="q;W8#D?IYE7d:FLChg2B">list_IDs</field>
<value name="VALUE">
<block type="lists_create_with" id="}x1lvP)yO,~]oSDh*2t|">
<mutation items="3"></mutation>
<value name="ADD0">
<block type="text" id="XtH==`(uXOl)06-vuB$Q">
<field name="TEXT">EZKUGAWC</field>
</block>
</value>
<value name="ADD1">
<block type="text" id="=I3e5hWb9;h,2*%J*)0f">
<field name="TEXT">Garten</field>
</block>
</value>
<value name="ADD2">
<block type="text" id="M.(GhX.Dk8-fJU)0?D_p">
<field name="TEXT">Schlafzimmer</field>
</block>
</value>
</block>
</value>
<next>
<block type="variables_set" id="}r`FNZy8-?[.g/Nxa-Dx">
<field name="VAR" id="O,T|%m+5p}}YmB!go2,H">list_controls</field>
<value name="VALUE">
<block type="lists_create_with" id="a(g/u.it2*OB!lqWDph,">
<mutation items="9"></mutation>
<value name="ADD0">
<block type="text" id="Q_ilI_l%3m%onLTUp-?_">
<field name="TEXT">play</field>
</block>
</value>
<value name="ADD1">
<block type="text" id="8,_*PA:Yjv2l?%5~I;:7">
<field name="TEXT">pause</field>
</block>
</value>
<value name="ADD2">
<block type="text" id="AXO:Lts7cqkzen},a=_W">
<field name="TEXT">playpause</field>
</block>
</value>
<value name="ADD3">
<block type="text" id="rz,T_[QbYQ+?qo78[LsH">
<field name="TEXT">next</field>
</block>
</value>
<value name="ADD4">
<block type="text" id="^GgGG@,(#h..i8E=_`pX">
<field name="TEXT">previous</field>
</block>
</value>
<value name="ADD5">
<block type="text" id="kNw+8MB-5e0y=wZ;3qqa">
<field name="TEXT">mute</field>
</block>
</value>
<value name="ADD6">
<block type="text" id="(fO]mat9;V`)}SKdFF-+">
<field name="TEXT">unmute</field>
</block>
</value>
<value name="ADD7">
<block type="text" id="BJ~u.{7B2%uW+=$EVLCC">
<field name="TEXT">volume/15</field>
</block>
</value>
<value name="ADD8">
<block type="text" id="xE/:2}uY];H$v/EK.Esr">
<field name="TEXT">volume/+1</field>
</block>
</value>
</block>
</value>
<next>
<block type="controls_forEach" id="LyS=xM55-8n2lCLf`xq3">
<field name="VAR" id="nrFiG,Xnh_UyAZg}f1(f">i</field>
<value name="LIST">
<block type="variables_get" id="kZW7QM!cl=]z^d[Nu)8S">
<field name="VAR" id="q;W8#D?IYE7d:FLChg2B">list_IDs</field>
</block>
</value>
<statement name="DO">
<block type="controls_forEach" id="p/[B-{*nxQ!jrHriPfx[">
<field name="VAR" id="!jGlZtV?jYwHr/A6AG8*">j</field>
<value name="LIST">
<block type="variables_get" id="WCX2c:#Eay;sr2HBOCr*">
<field name="VAR" id="O,T|%m+5p}}YmB!go2,H">list_controls</field>
</block>
</value>
<statement name="DO">
<block type="procedures_callcustomnoreturn" id="[sx4AjsY/$solR0arMWS">
<mutation name="createSonosState">
<arg name="sonos_id"></arg>
<arg name="sonos_control"></arg>
</mutation>
<value name="ARG0">
<block type="variables_get" id="aW2v9-ocauu`3[`+ceFo">
<field name="VAR" id="nrFiG,Xnh_UyAZg}f1(f">i</field>
</block>
</value>
<value name="ARG1">
<block type="variables_get" id=",sOaH/s])~dYtUJNla;l">
<field name="VAR" id="!jGlZtV?jYwHr/A6AG8*">j</field>
</block>
</value>
</block>
</statement>
</block>
</statement>
<next>
<block type="on_ext" id="t|X4_Sx;2-A+OvknlN2`">
<mutation xmlns="http://www.w3.org/1999/xhtml" items="1"></mutation>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<value name="OID0">
<shadow type="field_oid" id="oonWc,P,-xZ{v89k4gs0">
<field name="oid">default</field>
</shadow>
<block type="regex" id="A`h%vv1e{=3!@DEteU**">
<field name="TEXT">^0_userdata.0.sonos.api.*</field>
</block>
</value>
<statement name="STATEMENT">
<block type="variables_set" id="UJEqJId7AX:;Ef^toD}t">
<field name="VAR" id="l(#qc|Y{`S-^$l$6Dv5N">control_value</field>
<value name="VALUE">
<block type="procedures_callcustomreturn" id="ul}FkeCB`[UQ((V]m?}m">
<mutation name="getSonosControl">
<arg name="dp_id"></arg>
</mutation>
<value name="ARG0">
<block type="on_source" id="]!c^Q.t0e%a!r[|a^]BG">
<field name="ATTR">id</field>
</block>
</value>
</block>
</value>
<next>
<block type="request" id="ztI=CX)u?8;H*BEQt3(~">
<mutation xmlns="http://www.w3.org/1999/xhtml" with_statement="false"></mutation>
<field name="WITH_STATEMENT">FALSE</field>
<field name="LOG"></field>
<value name="URL">
<shadow type="text" id="@mWtD!5%fUD=v4)@k+yD">
<field name="TEXT"></field>
</shadow>
<block type="text_join" id="bzYQlU#R/@i8HYb*D,GJ">
<mutation items="2"></mutation>
<value name="ADD0">
<block type="text" id="XHOjOtfu09dv9sA{K.iG">
<field name="TEXT">http://192.168.30.90:5005/</field>
</block>
</value>
<value name="ADD1">
<block type="variables_get" id="VN*.SeoReL^L{)I*ukK3">
<field name="VAR" id="l(#qc|Y{`S-^$l$6Dv5N">control_value</field>
</block>
</value>
</block>
</value>
</block>
</next>
</block>
</statement>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</xml>
Komplett kopieren und als neues Blockly Skript importieren, dann das Skript starten.
Die Datenpunkte für folgende IDs werden automatisch angelegt, alles unter '0_userdata.0.sonos.api':

Hier musst du nur deine vier anderen IDs noch ergänzen (auf das blaue Zahnrad bei 'erzeuge Liste mit' klicken und noch vier Elemente per Drag and Drop hinzufügen).
Die Datenpunkte werden als Buttons angelegt. Wenn du diese drückst, sollte die entsprechende Aktion auf dem entsprechenden Lautsprecher über die API ausgeführt werden.
Teste das mal bitte und gib mir kurz Rückmeldung dazu, gerne auch im Chat.