Mit dem IKEA Symfonisk Sound Controller E1744 lassen sich eigentlich die IKEA SONOS-Boxen Symfonisk auf einfache Art steuern: Play/Stop, Vorwärts, Rückwärts und Lautstärke regeln.

Wer einen CC2531 oder ein ConBee II zigbee Stick mit ioBroker nutzt, der kann den Symfonisk Sound Controller auch zum Steuern des Smarthomes nutzen. Wir möchten ein Blockly Script zeigen, mit dessen Hilfe man Licht nicht nur ein- und ausschalten, sondern auch dimmen kann.

Der Symfonisk Sound Controller E1744 unterscheidet

  • einfaches Drücken
  • doppeltes Drücken
  • dreifaches Drücken
  • Rechtsdrehung
  • Linksdrehung
  • Drehung Ende

Tipp: Das stabilste Ergebnis für ein zigbee Mesh Netzwerk auf Basis des ioBroker zigbee-Adapters haben wir mit dem ConBee II zigbee Stick erreichen können. Reichweite und Stabilität sind deutlich besser als mit der günsigeren CC2531-Alternative.

Am einfachsten ist es, das Drücken des Controllers zum Steuern des Smarthomes zu benutzen. Das Drücken setzt eines der drei ioBroker Objekte auf true und wir könne mit einem einfachen Blockly-Script dies als Trigger benutzen:

ioBroker Objekte für Symfonisk zigbee

ioBroker Objekte für Symfonisk zigbee

ioBroker Blockly Licht schalten mit Symfonisk

ioBroker Blockly Licht schalten mit Symfonisk

Das Blockly-Script für das einfache Drücken besitzt eine erweiterte Toggle-Logik. Ist bisher im Raum kein Licht eingeschaltet, dann kann eine bestimmte Szene geschaltet werden (ein einfaches Toggle an/aus bei HUE schaltet den letzten Zustand). Ist das Licht im Raum eingeschaltet, wird es mit dem einfachen Drücken ausgeschaltet.

Beim Dimmen wartet eine Überraschung auf uns, zumindest wenn der E1744 mit dem zigbee-Adapter mit ioBroker genutzt wird. Wird in den meisten Fällen ein langes Drücken eines Tasters mit kontinuierlichem TRUE in einem Datenobjekt signalisiert, wird beim Symfonisk Controller das Drehen mit einem stetigem truefalse-Wechsel des Objekts quittiert. Der Wechsel erfolgt in sehr schnellen Abständen, ioBroker kann dies ohne Probleme erfassen und auslesen, lassen wir aber mit jedem true z.B. einen Raum in der Helligkeit ansteigen, wird mit hoher Wahrscheinlichkeit z.B. die HUE Bridge die Anzahl der requests nicht mehr verarbeiten können.

zigbee Mesh mit IKEA Symfonisk

zigbee Mesh mit IKEA Symfonisk

Wir müssen also irgendwie „mitzählen“ und eine künstliche Pause zwischen den Dimm-Befehlen einbauen, während der Controller allerdings immer weiter das Objekt zwischen true und false wechseln lässt. Hierfür legen wir uns einen Datenpunkt an, den wir nur alle X Millisekunden updaten wollen, d.h. mit jedem true, das der Symfonisk Controller sendet, prüfen wir, wieviel Zeit seit dem letzten Aktualisieren unseres Datenpunkts vergangen ist. Wir haben in unserem Fall mit der HUE Bridge und 800ms gute Erfahrungen gemacht. So ist sichergestellt, dass nur alle 800ms ein Befehl zum Dimmen an die HUE Bridge gesendet wird:

ioBroker Blockly Licht dimmen mit Symfonisk

ioBroker Blockly Licht dimmen mit Symfonisk

IKEA Symfonisk in ioBroker einbinden

IKEA Symfonisk in ioBroker einbinden

IKEA Symfonisk E1744 in ioBroker einbinden

IKEA Symfonisk E1744 in ioBroker einbinden

Um den Symfonisk Sound Controller zu pairen, drücken wir 4x auf den Reset-Button, danach wird der Pairing-Modus über eine rote LED signalisiert.

IKEA Symfonisk pairen, 4x reset drücken

IKEA Symfonisk pairen, 4x reset drücken

Blockly Import Code:

<xml xmlns="https://developers.google.com/blockly/xml">
<block type="comment" id="794!Rh_7K,|MlI_yhcLf" x="113" y="-237">
<field name="COMMENT">3x drücken</field>
<next>
<block type="on" id="Ba8q|2kYovC=U@8~M02)">
<field name="OID">zigbee.0.680ae2fffe3df463.button_skip_back</field>
<field name="CONDITION">any</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id="c2b:@su@3dwl|L1!vt2W">
<value name="IF0">
<block type="on_source" id=":;Mdcva~M=In`?q1N2#(">
<field name="ATTR">state.val</field>
</block>
</value>
<statement name="DO0">
<block type="comment" id="5#JmkMarCC$:t];y/-(@">
<field name="COMMENT">Wenn true, dann mache</field>
</block>
</statement>
</block>
</statement>
<next>
<block type="comment" id="!1z(,Tl}B]KnH[_Tv3jQ">
<field name="COMMENT">2x drücken</field>
<next>
<block type="on" id="pAAl4cfE_bQY`t9:n1n[">
<field name="OID">zigbee.0.680ae2fffe3df463.button_skip_foward</field>
<field name="CONDITION">any</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id="fFMK]uQ+!uTft6en:pv?">
<value name="IF0">
<block type="on_source" id="/LFGPhlAJF!hoh{8dM#+">
<field name="ATTR">state.val</field>
</block>
</value>
<statement name="DO0">
<block type="comment" id="R6.Cs29gk@u8.n_m^nYF">
<field name="COMMENT">Wenn true, dann mache</field>
</block>
</statement>
</block>
</statement>
<next>
<block type="comment" id="5UJt0o79mcqeA_~Ni5^+">
<field name="COMMENT">1x drücken</field>
<next>
<block type="on" id="/xl+%P;)vJx^Sb)giPNB">
<field name="OID">zigbee.0.680ae2fffe3df463.button_play_pause</field>
<field name="CONDITION">any</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id="jehd)*o.|q2x8_4Gut@v">
<value name="IF0">
<block type="on_source" id="-}|#SbDFSjX_L6rns@An">
<field name="ATTR">state.val</field>
</block>
</value>
<statement name="DO0">
<block type="comment" id="w2N!5dV25OTK!O=%`u|E">
<field name="COMMENT">Wenn true, dann mache</field>
<next>
<block type="controls_if" id="Z0F^GIpM!$7K85JR|Fa?">
<mutation else="1"></mutation>
<value name="IF0">
<block type="logic_compare" id="iD[8uY/LY8=Fqgo9C`%c">
<field name="OP">EQ</field>
<value name="A">
<block type="get_value" id="bzp{Ki5tm6ds:4C8Y.7Y">
<field name="ATTR">val</field>
<field name="OID">hue.0.München.Küche.on</field>
</block>
</value>
<value name="B">
<block type="logic_boolean" id=")/|hCrJgxxISRWY7n+J~">
<field name="BOOL">TRUE</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="comment" id="[GV`#fP7W{RT?KxIfEAW">
<field name="COMMENT">Wenn HUE Raum bereits eingeschaltet, dann ausschalten</field>
<next>
<block type="control" id="e7ut)*`EF~r71Oq)QG=M">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">hue.0.München.Küche.on</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="logic_boolean" id="ACh:nJR.pgy;d#cg6rB7">
<field name="BOOL">FALSE</field>
</block>
</value>
</block>
</next>
</block>
</statement>
<statement name="ELSE">
<block type="comment" id="FmIpKjl0f1L7a1qV,bEf">
<field name="COMMENT">Noch nicht eingeschaltet, Szene aktivieren</field>
<next>
<block type="control" id="KGFz:3ry)?{$0g=h^RoA">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">hue.0.München.Küche.scene_50</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="logic_boolean" id="U@yCeu;UTj/vGB@Pt)-@">
<field name="BOOL">TRUE</field>
</block>
</value>
</block>
</next>
</block>
</statement>
</block>
</next>
</block>
</statement>
</block>
</statement>
<next>
<block type="comment" id="eF@^odfoJe4F[/KpLj^*">
<field name="COMMENT">Dimmen dunkler</field>
<next>
<block type="create" id=")|CzA)QpN**JKUpdNMSl">
<field name="NAME">BS32.Dimmen.Küche</field>
<value name="VALUE">
<block type="logic_boolean" id="GJ!5?dHG7yj(0($#$NYB">
<field name="BOOL">FALSE</field>
</block>
</value>
<next>
<block type="on" id="7[T3/|{#$^=I4P9]DS!n">
<field name="OID">zigbee.0.680ae2fffe3df463.rotate_left</field>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id="1)D{E4[6*;^Vfq%#fYh}">
<value name="IF0">
<block type="on_source" id="msg~:_O6s`nSCy=AHI1,">
<field name="ATTR">state.val</field>
</block>
</value>
<statement name="DO0">
<block type="comment" id="h[hM)D+q7h(P/ICSgL?7">
<field name="COMMENT">Wenn true, dann</field>
<next>
<block type="controls_if" id="rgjCG1@#}pkQkZNaGuV1">
<value name="IF0">
<block type="logic_compare" id="l-hAZ^NBz86*HQ.73G;{">
<field name="OP">GT</field>
<value name="A">
<block type="math_arithmetic" id="Y#nWT1e}uPPow2glvQLX">
<field name="OP">MINUS</field>
<value name="A">
<shadow type="math_number" id="?LZt$AF5sa4DV}dA_%LE">
<field name="NUM">1</field>
</shadow>
<block type="on_source" id="x,phIp/9C9{oSkNV[qj@">
<field name="ATTR">state.ts</field>
</block>
</value>
<value name="B">
<shadow type="math_number" id="-wrW9p=WbWdjLj`/,$Wg">
<field name="NUM">1</field>
</shadow>
<block type="get_value" id="m/i;ZVUq3+:6|T}0j(J1">
<field name="ATTR">ts</field>
<field name="OID">javascript.0.BS32.Dimmen.Küche</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="math_number" id=":_04)nh`i[$:qO@WJr|5">
<field name="NUM">800</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="comment" id="wx?$swWN)yN}CJ.Tf5w}">
<field name="COMMENT">Wenn mind. 800ms Differenz zum letzten Dimmen</field>
<next>
<block type="comment" id="N(.@Px[Iol}goENb=M*{">
<field name="COMMENT">Datenpunkt für letzte Änderung aktualisieren</field>
<next>
<block type="toggle" id="`y57$[Tb@`h(iWsD#fST">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">javascript.0.BS32.Dimmen.Küche</field>
<field name="WITH_DELAY">FALSE</field>
<next>
<block type="comment" id="@$$A_1Se6N%7wI5k,vHk">
<field name="COMMENT">Level für HUE Raum um 7 verringern</field>
<next>
<block type="control" id="=%o7cos,{,c0?M;GVrR~">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">hue.0.München.Küche.level</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="math_arithmetic" id="G1pn)tES8e~GJs`U/z8R">
<field name="OP">MINUS</field>
<value name="A">
<shadow type="math_number" id="F%hLV=,;{Nq$A]r;HlGi">
<field name="NUM">1</field>
</shadow>
<block type="get_value" id="BnBR*]r3~5GWi^y8;BtF">
<field name="ATTR">val</field>
<field name="OID">hue.0.München.Küche.level</field>
</block>
</value>
<value name="B">
<shadow type="math_number" id=",zn;V_nVxnWe2hY3,nbz">
<field name="NUM">7</field>
</shadow>
</value>
</block>
</value>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</statement>
</block>
</next>
</block>
</statement>
</block>
</statement>
<next>
<block type="comment" id="ZIsRm*x9.5AZT]5)JLD`">
<field name="COMMENT">Dimmen Heller</field>
<next>
<block type="on" id="5;U5TRV-80p0l]cIqG^l">
<field name="OID">zigbee.0.680ae2fffe3df463.rotate_right</field>
<field name="CONDITION">ne</field>
<field name="ACK_CONDITION"></field>
<statement name="STATEMENT">
<block type="controls_if" id="wPc:D?[()#0`.W@Nc4qw">
<value name="IF0">
<block type="on_source" id="ebeV4?:M4Tbir`0_W:s_">
<field name="ATTR">state.val</field>
</block>
</value>
<statement name="DO0">
<block type="controls_if" id="QG|#U}[/R(3qgj=e]6VN">
<value name="IF0">
<block type="logic_compare" id="ie%6;j~MpZLI6_RzLnLx">
<field name="OP">GT</field>
<value name="A">
<block type="math_arithmetic" id=":]lZM4sugJxu^{6$`;Fo">
<field name="OP">MINUS</field>
<value name="A">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
<block type="on_source" id="4dE0!!*uQhUSh]#;.,f)">
<field name="ATTR">state.ts</field>
</block>
</value>
<value name="B">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
<block type="get_value" id="8{!5xMn4ur1xAXfiKvRf">
<field name="ATTR">ts</field>
<field name="OID">javascript.0.BS32.Dimmen.Küche</field>
</block>
</value>
</block>
</value>
<value name="B">
<block type="math_number" id="-=D|uhWDA/uS?0f+Eoqu">
<field name="NUM">800</field>
</block>
</value>
</block>
</value>
<statement name="DO0">
<block type="toggle" id=":u/@8[)xTB(Y~C0QIZ*P">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">javascript.0.BS32.Dimmen.Küche</field>
<field name="WITH_DELAY">FALSE</field>
<next>
<block type="control" id="n*d=CFC_20~l?bKN=?%c">
<mutation xmlns="http://www.w3.org/1999/xhtml" delay_input="false"></mutation>
<field name="OID">hue.0.München.Küche.level</field>
<field name="WITH_DELAY">FALSE</field>
<value name="VALUE">
<block type="math_arithmetic" id="m{x=Gp`Il*AY;7AXY3O#">
<field name="OP">ADD</field>
<value name="A">
<shadow type="math_number">
<field name="NUM">1</field>
</shadow>
<block type="get_value" id="/xaQ($]}Hv@_.IEFx36C">
<field name="ATTR">val</field>
<field name="OID">hue.0.München.Küche.level</field>
</block>
</value>
<value name="B">
<shadow type="math_number" id="ZpI]eOuu6~.a{3dlWvH_">
<field name="NUM">7</field>
</shadow>
</value>
</block>
</value>
</block>
</next>
</block>
</statement>
</block>
</statement>
</block>
</statement>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</next>
</block>
</xml>