<snapdata remixID="13605400"><project name="Geometry blocks" app="Snap! 10, https://snap.berkeley.edu" version="2"><notes>Click button &apos;see blocks&apos;</notes><thumbnail>data:image/png;base64,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</thumbnail><scenes select="1"><scene name="Geometry blocks"><notes>Click button &apos;see blocks&apos;</notes><palette><category name="Geometry" color="255,245,97,1"/></palette><hidden></hidden><headers></headers><code></code><blocks><block-definition s="Draw triangle size: %&apos;size&apos; x: %&apos;x&apos; y: %&apos;y&apos; rotate: %&apos;rotate&apos;" type="command" category="Geometry"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input></inputs><script><block s="setHeading"><block var="rotate"/></block><block s="up"></block><block s="gotoXY"><block var="x"/><block s="reportVariadicSum"><list><block var="y"/><l>55</l></list></block></block><block s="down"></block><block s="turn"><l>120</l></block><block s="forward"><block s="reportQuotient"><block var="size"/><l>2</l></block></block><block s="doRepeat"><l>3</l><script><block s="turn"><l>120</l></block><block s="forward"><block var="size"/></block></script></block></script></block-definition><block-definition s="Draw square size %&apos;size&apos; x: %&apos;x&apos; y: %&apos;y&apos; rotate: %&apos;rotate&apos;" type="command" category="Geometry"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input></inputs><script><block s="up"></block><block s="gotoXY"><block s="reportDifference"><block var="x"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block><block s="reportDifference"><block var="y"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block></block><block s="setHeading"><block var="rotate"/></block><block s="down"></block><block s="doRepeat"><l>4</l><script><block s="forward"><block var="size"/></block><block s="turn"><l>90</l></block></script></block></script></block-definition><block-definition s="Draw pentagon size %&apos;size&apos; x: %&apos;x&apos; y: %&apos;y&apos; rotate: %&apos;rotate&apos;" type="command" category="Geometry"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input></inputs><script><block s="up"></block><block s="gotoXY"><block s="reportDifference"><block var="x"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block><block s="reportDifference"><block var="y"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block></block><block s="setHeading"><block var="rotate"/></block><block s="down"></block><block s="doRepeat"><l>5</l><script><block s="forward"><block var="size"/></block><block s="turn"><l>72</l></block></script></block></script></block-definition><block-definition s="Draw hexagon size %&apos;size&apos; x: %&apos;x&apos; y: %&apos;y&apos; rotate: %&apos;rotate&apos;" type="command" category="Geometry"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input></inputs><script><block s="doWarp"><script><block s="up"></block><block s="gotoXY"><block s="reportDifference"><block var="x"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block><block s="reportDifference"><block var="y"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block></block><block s="setHeading"><block var="rotate"/></block><block s="down"></block><block s="doRepeat"><l>6</l><script><block s="forward"><block var="size"/></block><block s="turn"><l>60</l></block></script></block></script></block></script></block-definition><block-definition s="Draw heptagon size %&apos;size&apos; x: %&apos;x&apos; y: %&apos;y&apos; rotate: %&apos;rotate&apos;" type="command" category="Geometry"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input></inputs><script><block s="doWarp"><script><block s="up"></block><block s="gotoXY"><block s="reportDifference"><block var="x"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block><block s="reportDifference"><block var="y"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block></block><block s="setHeading"><block var="rotate"/></block><block s="down"></block><block s="doRepeat"><l>7</l><script><block s="forward"><block var="size"/></block><block s="turn"><block s="reportQuotient"><l>360</l><l>7</l></block></block></script></block></script></block></script></block-definition><block-definition s="Draw octagon size %&apos;size&apos; x: %&apos;x&apos; y: %&apos;y&apos; rotate: %&apos;rotate&apos;" type="command" category="Geometry"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input></inputs><script><block s="doWarp"><script><block s="up"></block><block s="gotoXY"><block s="reportDifference"><block var="x"/><block s="reportVariadicSum"><list><block var="size"/><l>25</l></list></block></block><block s="reportDifference"><block var="y"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block></block><block s="setHeading"><block var="rotate"/></block><block s="down"></block><block s="doRepeat"><l>8</l><script><block s="forward"><block var="size"/></block><block s="turn"><l>45</l></block></script></block></script></block></script></block-definition><block-definition s="Draw your geometry x: %&apos;x&apos; y: %&apos;y&apos; angles: %&apos;angles&apos; size: %&apos;size&apos;" type="command" category="Geometry"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input></inputs><script><block s="up"></block><block s="gotoXY"><block s="reportDifference"><block var="x"/><block s="reportQuotient"><block var="size"/><l>2</l></block></block><block s="reportVariadicSum"><list><block var="y"/><block s="reportQuotient"><block var="size"/><l>2</l></block></list></block></block><block s="doWarp"><script><block s="down"></block><block s="doRepeat"><block var="angles"/><script><block s="turn"><block s="reportQuotient"><l>360</l><block var="angles"/></block></block><block s="forward"><block s="reportQuotient"><block var="size"/><block s="reportQuotient"><block var="angles"/><l>5</l></block></block></block></script></block></script></block></script></block-definition><block-definition s="Draw circle diameter: %&apos;diameter&apos; x: %&apos;x&apos; y: %&apos;y&apos;" type="command" category="Geometry"><header></header><code></code><translations></translations><inputs><input type="%n" initial="1"></input><input type="%n" initial="1"></input><input type="%n" initial="1"></input></inputs><script><block s="doWarp"><script><block s="up"></block><block s="gotoXY"><block var="x"/><block s="reportVariadicSum"><list><block var="y"/><block s="reportQuotient"><block var="diameter"/><l>2</l></block></list></block></block><block s="setHeading"><l>90</l></block><block s="down"></block><block s="doRepeat"><block s="reportVariadicProduct"><list><block var="diameter"/><l>2</l></list></block><script><block s="turn"><block s="reportQuotient"><block var="diameter"/><l>45</l></block></block><block s="forward"><block s="reportQuotient"><block var="diameter"/><l>22.5</l></block></block></script></block></script></block></script></block-definition><block-definition s="clear scene" type="command" category="other" helper="true"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doApplyExtension"><l>bb_clear()</l><list></list></block></script></block-definition><block-definition s="%&apos;which&apos; scale" type="reporter" category="other" helper="true"><header></header><code></code><translations></translations><inputs><input type="%s" readonly="true" initial="1">shape<options>shape&#xD;movement</options></input></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>bb_scale(which)</l><list><block var="which"/></list></block></block></script></block-definition><block-definition s="push position" type="command" category="other" helper="true" space="true"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doAddToList"><block s="reportNewList"><list><l></l><l></l></list></block><custom-block s="stack"></custom-block></block></script></block-definition><block-definition s="pop position" type="command" category="other" helper="true"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doWarp"><script><block s="doIf"><block s="reportNot"><block s="reportListIsEmpty"><custom-block s="stack"></custom-block></block></block><script><block s="doDeclareVariables"><list><l>record</l></list></block><block s="doSetVar"><l>record</l><block s="reportListItem"><l><option>last</option></l><custom-block s="stack"></custom-block></block></block><block s="doApplyExtension"><l>bb_goto(x, y, z)</l><block s="reportListItem"><l>1</l><block var="record"/></block></block><block s="doApplyExtension"><l>bb_setrot(x, y, z)</l><block s="reportListItem"><l>2</l><block var="record"/></block></block><block s="doDeleteFromList"><l><option>last</option></l><custom-block s="stack"></custom-block></block></script><list></list></block></script></block></script></block-definition><block-definition s="stack" type="reporter" category="other" helper="true"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doIf"><block s="reportNot"><block s="reportListContainsItem"><block s="reportApplyExtension"><l>var_names(scope)</l><list><l>global</l></list></block><l>bb_stack</l></block></block><script><block s="doApplyExtension"><l>var_declare(scope, name)</l><list><l>global</l><l>bb_stack</l></list></block><block s="doApplyExtension"><l>var_hide(name)</l><list><l>bb_stack</l></list></block><block s="doApplyExtension"><l>var_set(name, val)</l><list><l>bb_stack</l><block s="reportNewList"><list></list></block></list></block></script><list></list></block><block s="doReport"><block s="reportApplyExtension"><l>var_get(name)</l><list><l>bb_stack</l></list></block></block></script></block-definition><block-definition s="init module" type="command" category="other" helper="true"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doSetVar"><l>__module__beetle__</l><l>libraries/beetle/init.js</l></block></script><scripts><script x="59.50413223140495" y="111.4280991735537"><block s="doSetVar"><l>__module__beetle__</l><l>libraries/beetle/init.js</l></block></script></scripts></block-definition><block-definition s="beetle view" type="reporter" category="other" helper="true" space="true"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportApplyExtension"><l>bb_beetleView()</l><list></list></block></block></script></block-definition><block-definition s="$cloudOutline MQTT connect to %&apos;broker&apos; %&apos;options&apos;" type="command" category="other" helper="true"><comment x="0" y="0" w="455" collapsed="false">Connect to a broker&#xD;&#xD;The options are not required but can be filled if needed&#xD;&#xD;1. username (some brokers need this)&#xD;2. password (some brokers need this)&#xD;3. keepalive (default time is 60 seconds but some brokers need a shorter time)&#xD;4. connection callback (ringed set of scripts to be run when connection is made or remade)&#xD;&#xD;ADVANCED: The brokers offered in the menu are accessed using default ports and  basepaths (if needed).  If accessing other brokers, the complete urls should be formed like this:&#xD;&#xD;siteURL:port/basepath &#xD;e.g mqtt.eclipseprojects.io:443/mqtt&#xD;&#xD;It is possible to have more than one connection to the same broker, for instance, using two different user/pass accounts simultaneously. To do this, add a connection id at the end of the broker:&#xD;&#xD;e.g mqtt.eclipseprojects.io:443/mqtt|1&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%mult%s" expand="username&#xD;password&#xD;keepalive&#xD;connection callback" max="4">​&#xD;​&#xD;60</input></inputs></block-definition><block-definition s="$cloudOutline MQTT subscribe to %&apos;broker&apos; topic %&apos;topic&apos; $nl on each message run %&apos;callback&apos; %&apos;options&apos;" type="command" category="other" helper="true"><comment x="0" y="0" w="306.99999999999943" collapsed="false">Subscribe to a topic on a broker&#xD;&#xD;Make sure you have already run an MQTT connect block before using this one&#xD;&#xD;You should add a script to be run inside he grey ring.&#xD;&#xD;It will be run each time a message is received&#xD;&#xD;If you click on the arrow on the grey ring twice, you can use #1 and #2 inside your script.&#xD;&#xD;#1 will contain the received payload&#xD;&#xD;#2 will contain the received topic name&#xD;&#xD;The options are not required but can be filled if needed&#xD;&#xD;1. Subscribed QoS (0,1 or 2)  Note this will be downgraded if it exceeds the QoS of the stored message held on the broker &#xD;&#xD;2. Binary mode (boolean) Default (false) - payload is returned as text&#xD;&#xD;If true, payload returned as single column list of values in the range of 0 to 255..  </comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input><input type="%cmdRing"></input><input type="%mult%s" expand="QoS&#xD;binary mode" max="2">0&#xD;false</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><l></l><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><block s="doSetVar"><l>options</l><block s="reportListAttribute"><l><option>json</option></l><block s="reportNewList"><list><block s="reportNewList"><list><l>qos</l><block s="reportListItem"><l>1</l><block var="options"/></block></list></block><block s="reportNewList"><list><l>mode</l><block s="reportListItem"><l>2</l><block var="options"/></block></list></block></list></block></block></block><block s="doApplyExtension"><l>mqt_sub(broker,topic,callback,options)</l><list><block var="broker"/><block var="topic"/><block var="callback"/><block var="options"/></list></block></script></block-definition><block-definition s="$cloudOutline MQTT publish to %&apos;broker&apos; topic %&apos;topic&apos; payload %&apos;payload&apos; %&apos;options&apos;" type="command" category="other" helper="true"><comment x="0" y="0" w="455" collapsed="false">Publish a message to an MQTT broker&#xD;&#xD;The options are not required but can be filled if needed&#xD;&#xD;1. QoS (quality of service 0,1 or 2 - see  https://www.emqx.com/en/blog/introduction-to-mqtt-qos)&#xD;&#xD;2. Retain flag (boolean)&#xD;&#xD;3. Binary mode (boolean).    Default (false) - the payload is published as text&#xD;&#xD;If set to true then payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes.&#xD;&#xD;Note:  If the payload is a list and you don&apos;t set the buffer mode option, it will be automatically be converted into JSON and sent as text.&#xD;&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input><input type="%mlt">hello</input><input type="%mult%s" expand="QoS&#xD;retain flag&#xD;binary mode" max="3">0&#xD;false&#xD;false</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><l></l><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><block s="doSetVar"><l>options</l><block s="reportListAttribute"><l><option>json</option></l><block s="reportNewList"><list><block s="reportNewList"><list><l>qos</l><block s="reportListItem"><l>1</l><block var="options"/></block></list></block><block s="reportNewList"><list><l>retain</l><block s="reportListItem"><l>2</l><block var="options"/></block></list></block><block s="reportNewList"><list><l>mode</l><block s="reportListItem"><l>3</l><block var="options"/></block></list></block></list></block></block></block><block s="doIf"><block s="reportNot"><block s="reportListItem"><l>2</l><block s="reportListItem"><l>3</l><block s="reportTextSplit"><block var="options"/><l><option>json</option></l></block></block></block></block><script><block s="doIf"><block s="reportIsA"><block var="payload"/><l><option>list</option></l></block><script><block s="doSetVar"><l>payload</l><block s="reportListAttribute"><l><option>json</option></l><block var="payload"/></block></block></script><list></list></block><block s="doIf"><block s="reportIsA"><block var="payload"/><l><option>number</option></l></block><script><block s="doSetVar"><l>payload</l><block s="reportJoinWords"><list><block var="payload"/></list></block></block></script><list></list></block></script><list></list></block><block s="doApplyExtension"><l>mqt_pub(broker,topic,payload,options)</l><list><block var="broker"/><block var="topic"/><block var="payload"/><block var="options"/></list></block></script></block-definition><block-definition s="$cloudOutline MQTT unsubscribe from %&apos;broker&apos; topic %&apos;topic&apos;" type="command" category="other" helper="true"><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doApplyExtension"><l>mqt_unsub(broker,topic)</l><list><block var="broker"/><block var="topic"/></list></block></script></block-definition><block-definition s="$cloudOutline MQTT disconnect from %&apos;broker&apos;" type="command" category="other" helper="true"><header></header><code></code><translations></translations><inputs><input type="%s">all<options>all&#xD;broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input></inputs><script><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqtt.js</l></list></block><block s="doApplyExtension"><l>src_load(url)</l><list><l>libraries/mqttExtension.js</l></list></block><block s="doApplyExtension"><l>mqt_disconnect(broker)</l><list><block var="broker"/></list></block></script></block-definition><block-definition s="$cloudOutline MQTT response %&apos;broker&apos; topic %&apos;topic&apos; $nl reply %&apos;reply&apos; %&apos;options&apos;" type="command" category="other" helper="true"><comment x="0" y="0" w="292.22207031250036" collapsed="false">Options:&#xD;&#xD;1. Sub binary mode (boolean) Default (false) - received payload is returned as text. &#xD;&#xD;If true then subscribed, received payload is returned as single column list of values in the range of 0 to 255..  Default (false) - it is returned as text&#xD;&#xD;2.  Pub binary mode (boolean).  Default (false) - the payload is published as text.&#xD;&#xD;If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes.&#xD;&#xD;Note:  If the payload is a list and you don&apos;t set the buffer mode option, it will be automatically be converted into JSON and sent as text&#xD;&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name/#</input><input type="%repRing"></input><input type="%mult%s" expand="sub binary mode&#xD;pub binary mode" max="2">false&#xD;false</input></inputs><script><block s="doDeclareVariables"><list><l>resp</l><l>callbackTopic</l><l>error</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><block var="broker"/><block var="topic"/><block s="reifyScript"><script><block s="doIf"><block s="reportVariadicGreaterThan"><list><block s="reportApplyExtension"><l>txt_indexof(sub, txt)</l><list><l>/@</l><block var="received topic"/></list></block><l>0</l></list></block><script><block s="doApplyExtension"><l>err_try(cmd, catch, err)</l><list><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block s="evaluate"><block var="reply"/><list><block var="received payload"/><block var="received topic"/></list></block></block></script><list></list></block><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block s="evaluate"><block var="reply"/><list></list></block></block></script><list></list></block><block var="error"/></list></block><block s="doApplyExtension"><l>err_reset</l><list></list></block><block s="doSetVar"><l>callbackTopic</l><block s="reportListItem"><l><option>last</option></l><block s="reportTextSplit"><block var="received topic"/><l>@</l></block></block></block><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><block var="broker"/><block var="callbackTopic"/><block var="resp"/><list><l></l><l></l><block s="reportListItem"><l>2</l><block var="options"/></block></list></custom-block></script><list></list></block></script><list><l>received payload</l><l>received topic</l></list></block><list><l>0</l><block s="reportListItem"><l>1</l><block var="options"/></block></list></custom-block></script></block-definition><block-definition s="$cloudOutline MQTT request %&apos;broker&apos; topic %&apos;topic&apos; $nl response topic %&apos;rtopic&apos; payload %&apos;payload&apos; $nl on response run %&apos;callback&apos; %&apos;options&apos;" type="command" category="other" helper="true"><comment x="0" y="0" w="242.99999999999997" collapsed="false">The options are not required but can be filled if needed.&#xD;&#xD;1. Append response topic (boolean): If true, the response topic is added at the end of the call topic after @ sign. The default condition (true) response topic is added.&#xD;&#xD;2. Sub binary mode (boolean) Default (false) - received payload is returned as text. &#xD;&#xD;If true,then the subscribed, received payload is returned as a single column list of values in the range of 0 to 255..  &#xD;&#xD;3.  Pub binary mode (boolean).  Default (false) - the payload is published as text.&#xD;&#xD;If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes.&#xD;&#xD;Note:  If the payload is a list and you don&apos;t set the buffer mode option, it will be automatically be converted into JSON and sent as text&#xD;&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input><input type="%s">name2</input><input type="%mlt">hello</input><input type="%cmdRing"></input><input type="%mult%s" expand="append response topic&#xD;sub binary mode&#xD;pub binary mode&#xD;" max="3">true&#xD;false&#xD;false</input></inputs><script><block s="doDeclareVariables"><list><l>error</l><l>informTopic</l><l>topicCall</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><block s="doSetVar"><l>informTopic</l><block s="reportIfElse"><block s="reportIsA"><block s="reportListItem"><l>1</l><block var="options"/></block><l><option>Boolean</option></l></block><block s="reportListItem"><l>1</l><block var="options"/></block><block s="reportBoolean"><l><bool>true</bool></l></block></block></block><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><block var="broker"/><block s="reportJoinWords"><list><block var="rtopic"/></list></block><block s="reifyScript"><script><block s="doApplyExtension"><l>err_try(cmd, catch, err)</l><list><block s="reifyScript"><script><block s="doRun"><block var="callback"/><list><block var="received payload"/><block var="received topic"/></list></block></script><list></list></block><block s="reifyScript"><script><block s="doRun"><block var="callback"/><list></list></block></script><list></list></block><block var="error"/></list></block></script><list><l>received payload</l><l>received topic</l></list></block><list><l>0</l><block s="reportListItem"><l>2</l><block var="options"/></block></list></custom-block><block s="doIfElse"><block var="informTopic"/><script><block s="doSetVar"><l>topicCall</l><block s="reportJoinWords"><list><block var="topic"/><l>/</l><block s="reportJoinWords"><list><l>@</l><block var="rtopic"/></list></block></list></block></block></script><script><block s="doSetVar"><l>topicCall</l><block var="topic"/></block></script></block><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><block var="broker"/><block var="topicCall"/><block var="payload"/><list><l></l><l></l><block s="reportListItem"><l>3</l><block var="options"/></block></list></custom-block></script></block-definition><block-definition s="$cloudOutline MQTT example response reporter payload %&apos;payload&apos; topic %&apos;topic&apos;" type="reporter" category="other" helper="true"><comment x="0" y="0" w="90" collapsed="false">This is a simple echo example.&#xD;Topic can be used to filter the response.</comment><header></header><code></code><translations></translations><inputs><input type="%mlt">hello</input><input type="%txt">name</input></inputs><script><block s="doReport"><block var="payload"/></block></script></block-definition><block-definition s="$cloudOutline MQTT request %&apos;broker&apos; topic %&apos;topic&apos; $nl response topic %&apos;rtopic&apos; payload %&apos;payload&apos; %&apos;options&apos;" type="reporter" category="other" helper="true"><comment x="0" y="0" w="343" collapsed="false">The response topic should be a unique value for each call e.g. use timer&#xD;&#xD;The options are not required but can be filled if needed&#xD;&#xD;1.  Timeout value - default is 3 seconds&#xD;&#xD;2.  Append response topic (boolean): If true, the response topic is added at the end of the call topic after @ sign. The default condition (true) response topic is added.&#xD;&#xD;3. Sub binary mode (boolean) Default (false) - received payload is returned as text. &#xD;&#xD;If true, subscribed, received payload returned as single column list of values in the range of 0 to 255..  Default (false) - it is returned as text&#xD;&#xD;4.  Pub binary mode (boolean).  Default (false) - the payload is published as text.&#xD;&#xD;If set to true then published payload is expected to be a single column list of values in the 0 to 255 range and is published to the broker as a buffer of bytes.&#xD;&#xD;Note:  If the payload is a list and you don&apos;t set the buffer mode option, it will be automatically be converted into JSON and sent as text&#xD;&#xD;</comment><header></header><code></code><translations></translations><inputs><input type="%s">broker.emqx.io<options>broker.emqx.io&#xD;mqtt.eclipseprojects.io&#xD;test.mosquitto.org&#xD;broker.xmqtt.net</options></input><input type="%s">name</input><input type="%s">name2</input><input type="%mlt">hello</input><input type="%mult%s" expand="timeout&#xD;append response topic&#xD;sub binary mode&#xD;pub binary mode&#xD;" max="4">3&#xD;true&#xD;false&#xD;false</input></inputs><script><block s="doDeclareVariables"><list><l>resp</l><l>semaphore</l><l>timer0</l><l>timeout</l><l>informTopic</l><l>topicCall</l></list></block><block s="doSetVar"><l>options</l><custom-block s="sanitise options %l mask %l"><block var="options"/><block s="reportNewList"><list><l></l><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>true</bool></l></block></list></block></custom-block></block><block s="doSetVar"><l>semaphore</l><l>0</l></block><block s="doSetVar"><l>timeout</l><block s="reportIfElse"><block s="reportIsA"><block s="reportListItem"><l>1</l><block var="options"/></block><l><option>number</option></l></block><block s="reportListItem"><l>1</l><block var="options"/></block><l>3</l></block></block><block s="doSetVar"><l>informTopic</l><block s="reportIfElse"><block s="reportIsA"><block s="reportListItem"><l>2</l><block var="options"/></block><l><option>Boolean</option></l></block><block s="reportListItem"><l>2</l><block var="options"/></block><block s="reportBoolean"><l><bool>true</bool></l></block></block></block><block s="doSetVar"><l>resp</l><l>timeout</l></block><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><block var="broker"/><block s="reportJoinWords"><list><block var="rtopic"/></list></block><block s="reifyScript"><script><block s="doSetVar"><l>resp</l><block var="received payload"/></block><block s="doSetVar"><l>semaphore</l><l>1</l></block></script><list><l>received payload</l><l>received topic</l></list></block><list><l>0</l><block s="reportListItem"><l>3</l><block var="options"/></block></list></custom-block><block s="doIfElse"><block var="informTopic"/><script><block s="doSetVar"><l>topicCall</l><block s="reportJoinWords"><list><block var="topic"/><l>/</l><block s="reportJoinWords"><list><l>@</l><block var="rtopic"/></list></block></list></block></block></script><script><block s="doSetVar"><l>topicCall</l><block var="topic"/></block></script></block><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><block var="broker"/><block var="topicCall"/><block var="payload"/><list><l>0</l><l>false</l><block s="reportListItem"><l>4</l><block var="options"/></block></list></custom-block><block s="doSetVar"><l>timer0</l><block s="reportDate"><l><option>time in milliseconds</option></l></block></block><block s="doWaitUntil"><block s="reportVariadicOr"><list><block s="reportVariadicEquals"><list><block var="semaphore"/><l>1</l></list></block><block s="reportVariadicGreaterThan"><list><block s="reportDifference"><block s="reportDate"><l><option>time in milliseconds</option></l></block><block var="timer0"/></block><block s="reportVariadicProduct"><list><block var="timeout"/><l>1000</l></list></block></list></block></list></block></block><custom-block s="$cloudOutline MQTT unsubscribe from %s topic %s"><block var="broker"/><block s="reportJoinWords"><list><block var="rtopic"/></list></block></custom-block><block s="doReport"><block var="resp"/></block></script></block-definition><block-definition s="MQTT Extension Examples" type="command" category="other" helper="true"><comment x="0" y="0" w="385.9999999999999" collapsed="false">Open (edit) this block to look at examples how to use the MQTT Extension blocks&#xD;&#xD;Background documentation:&#xD;https://github.com/pixavier/mqtt4snap&#xD;&#xD;Last source code version (mqtt.xml and mqttExtension.js):&#xD;https://gitlab.com/cymplecy/Snap/-/tree/master/libraries</comment><header></header><code></code><translations></translations><inputs></inputs><scripts><comment x="489.99999999999955" y="215.19999999999987" w="222.99999999999997" collapsed="false">Step 0: Connect to the broker</comment><comment x="31.33333333333337" y="152.20000000000016" w="239.99999999999997" collapsed="false">PubSub Hello World!</comment><comment x="489.99999999999955" y="271.19999999999953" w="222" collapsed="false">Step 1: Subscribe to a topic</comment><script x="25.33333333333337" y="272.1999999999993"><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><l>broker.emqx.io</l><l>name</l><block s="reifyScript"><script><block s="doSayFor"><block var="payload"/><l>2</l></block></script><list><l>payload</l><l>received topic</l></list></block><list></list></custom-block></script><script x="29.33333333333337" y="366.86666666666605"><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><l>name</l><l>hello</l><list></list></custom-block></script><comment x="492.99999999999955" y="357.1999999999993" w="222" collapsed="false">Step 2: Publish a message</comment><script x="33.99999999999966" y="484.19999999999976"><custom-block s="$cloudOutline MQTT subscribe to %s topic %s %br on each message run %cmdRing %mult%s"><l>broker.emqx.io</l><l>name1</l><block s="reifyScript"><script><custom-block s="$cloudOutline MQTT publish to %s topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><l>name2</l><block var="payload"/><list></list></custom-block></script><list><l>payload</l><l>topic</l></list></block><list></list></custom-block></script><comment x="499" y="481.69999999999817" w="220" collapsed="false">Step 1: Activate the responder as a simple subscription</comment><script x="32.999999999999886" y="602.0333333333335"><block s="doSayFor"><custom-block s="$cloudOutline MQTT request %s topic %s %br response topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><l>name1</l><l>name2</l><l>hello</l><list><l>3</l><l>false</l></list></custom-block><l>2</l></block></script><comment x="500" y="606.6999999999989" w="220" collapsed="false">Step 2: Send a request and wait the answer.</comment><comment x="504.99999999999955" y="131.19999999999993" w="191" collapsed="false">To execute the examples, single click on blocks, following the corresponding steps.</comment><comment x="499.66666666666697" y="756.3666666666654" w="224.00000000000003" collapsed="false">Step 2 bis: Send a request and do not wait for the answer</comment><comment x="24.33333333333337" y="871.1999999999987" w="356.99999999999994" collapsed="false">Synchronous client-server Hello World! with dynamic response topic (timer)</comment><comment x="510.99999999999955" y="930.700000000001" w="220" collapsed="false">Step 1: Activate the responder</comment><script x="34.33333333333337" y="1048.1999999999982"><block s="doSayFor"><custom-block s="$cloudOutline MQTT request %s topic %s %br response topic %s payload %mlt %mult%s"><l>broker.emqx.io</l><l>name</l><block s="getTimer"></block><l>hello</l><list></list></custom-block><l>2</l></block></script><comment x="510.99999999999955" y="1050.6999999999987" w="219.0000000000002" collapsed="false">Step 2: Send a request (timer acts as idCall) and wait for the answer</comment><comment x="31.999999999999886" y="1138.6999999999982" w="352.0000000000003" collapsed="false">Asynchronous client-server Hello World! with dynamic response topic (timer)</comment><script x="31.999999999999886" y="1207.0333333333313"><custom-block s="$cloudOutline MQTT request %s topic %s %br response topic %s payload %mlt %br on response run %cmdRing %mult%s"><l>broker.emqx.io</l><l>name</l><block s="getTimer"></block><l>hello</l><block s="reifyScript"><script><block s="doSayFor"><block var="payload"/><l>2</l></block></script><list><l>payload</l><l>topic</l></list></block><list></list></custom-block></script><comment x="514.9999999999995" y="1204.6999999999991" w="224.00000000000003" collapsed="false">Step 2 bis: Send a request (timer acts as idCall) and do not wait for the answer</comment><script x="28.99999999999966" y="225.2000000000001"><custom-block s="$cloudOutline MQTT connect to %s %mult%s"><l>broker.emqx.io</l><list></list></custom-block></script><script x="25.33333333333337" y="932.2000000000014"><custom-block s="$cloudOutline MQTT response %s topic %s %br reply %repRing %mult%s"><l>broker.emqx.io</l><l>name/#</l><block s="reifyReporter"><autolambda><custom-block s="$cloudOutline MQTT example response reporter payload %mlt topic %txt"><block var="payload"/><block var="topic"/></custom-block></autolambda><list><l>payload</l><l>topic</l></list></block><list></list></custom-block></script><comment x="26.999999999999886" y="685.6999999999982" w="372.0000000000004" collapsed="false">Asynchronous client-server Hello World! with static response topic (name2)</comment><script x="27.999999999999886" y="751.0333333333324"><custom-block s="$cloudOutline MQTT request %s topic %s %br response topic %s payload %mlt %br on response run %cmdRing %mult%s"><l>broker.emqx.io</l><l>name1</l><l>name2</l><l>hello</l><block s="reifyScript"><script><block s="doSayFor"><block var="payload"/><l>2</l></block></script><list><l>payload</l><l>topic</l></list></block><list><l>false</l></list></custom-block></script><comment x="28.999999999999886" y="412.36666666666696" w="361.99999999999994" collapsed="false">Synchronous client-server Hello World! with static response topic (name2)</comment></scripts></block-definition><block-definition s="sanitise options %&apos;data&apos; mask %&apos;mask&apos;" type="reporter" category="other" helper="true"><comment x="0" y="0" w="226" collapsed="false">Modify V10 variadic defaults to be able to work for blank and psuedo (false/true) boolean entries&#xD;&#xD;Blank defaults are set as zero width spaces which are removed when block is executed&#xD;&#xD;This is needed for the connect block&#xD;&#xD;The options are then checked to see if they should be boolean and if they are not aready a boolean value, then they are replaced with boolean true if default is text &quot;true&quot;, otherwise boolean false.</comment><header></header><code></code><translations></translations><inputs><input type="%l" initial="1"></input><input type="%l" initial="1"></input></inputs><script><block s="doDeclareVariables"><list><l>zero width space</l></list></block><block s="doSetVar"><l>zero width space</l><block s="reportUnicodeAsLetter"><l>8203</l></block></block><block s="doSetVar"><l>data</l><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportIsA"><block var="value"/><l><option>text</option></l></block><block s="reportCombine"><block s="reportTextSplit"><block var="value"/><block var="zero width space"/></block><block s="reifyReporter"><autolambda><block s="reportJoinWords"><list><l></l><l></l><l></l></list></block></autolambda><list></list></block></block><block var="value"/></block></autolambda><list><l>value</l></list></block><block var="data"/></block></block><block s="doReport"><block s="reportListAttribute"><l><option>flatten</option></l><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportIfElse"><block s="reportVariadicAnd"><list><block s="reportIsA"><block s="reportListItem"><l>2</l><block var="value"/></block><l><option>Boolean</option></l></block><block s="reportNot"><block s="reportIsA"><block s="reportListItem"><l>1</l><block var="value"/></block><l><option>Boolean</option></l></block></block></list></block><block s="reportIfElse"><block s="reportVariadicEquals"><list><block s="reportListItem"><l>1</l><block var="value"/></block><l>true</l></list></block><block s="reportBoolean"><l><bool>true</bool></l></block><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="reportListItem"><l>1</l><block var="value"/></block></block></autolambda><list><l>value</l><l>index</l></list></block><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportNewList"><list><block var="value"/><block s="reportListItem"><block var="index"/><block var="mask"/></block></list></block></autolambda><list><l>value</l><l>index</l></list></block><block var="data"/></block></block></block></block></script></block-definition></blocks><primitives></primitives><stage name="Blank" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="false" hyperops="true" codify="false" inheritance="true" sublistIDs="false" id="1289"><pentrails>data:image/png;base64,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vKpukI0hgAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIAAAggggAACCCCAAAIIIIBA7QT+H60keWg5WjfKAAAAAElFTkSuQmCC</pentrails><costumes><list struct="atomic" id="1290"></list></costumes><sounds><list struct="atomic" id="1291"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Blocks" idx="1" x="-24.5" y="-30.500000000000057" heading="25" scale="1" volume="100" pan="0" rotation="1" draggable="true" hidden="true" costume="0" color="10,255,246,1" pen="tip" id="1296"><costumes><list struct="atomic" id="1297"></list></costumes><sounds><list struct="atomic" id="1298"></list></sounds><blocks></blocks><variables></variables><scripts></scripts></sprite></sprites></stage><variables><variable name="__module__beetle__" hidden="true"><l>libraries/beetle/init.js</l></variable></variables></scene></scenes></project><media name="Geometry blocks" app="Snap! 10, https://snap.berkeley.edu" version="2"></media></snapdata>