{"id":32041,"date":"2023-03-10T15:22:37","date_gmt":"2023-03-10T14:22:37","guid":{"rendered":"https:\/\/mimolive.com\/?post_type=user-manual&#038;p=32041"},"modified":"2026-02-08T10:06:17","modified_gmt":"2026-02-08T09:06:17","slug":"automazione","status":"publish","type":"user-manual","link":"https:\/\/mimolive.com\/it\/user-manual\/remote-control-automation\/automation\/","title":{"rendered":"Livello di automazione"},"content":{"rendered":"<h2 class=\"wp-block-heading\">Streamline Your Production with mimoLive&#8217;s Automation Layer<\/h2>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n <div class=\"brlbs-cmpnt-container brlbs-cmpnt-content-blocker brlbs-cmpnt-with-individual-styles\" data-borlabs-cookie-content-blocker-id=\"youtube-content-blocker\" data-borlabs-cookie-content=\"PGlmcmFtZSB0aXRsZT0ibWltb0xpdmXihKIgTWFzdGVyY2xhc3M6IEF1dG9tYXRpb24iIHdpZHRoPSI4MDAiIGhlaWdodD0iNDUwIiBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUtbm9jb29raWUuY29tL2VtYmVkL0NvNDZpa3hqVTNFP2ZlYXR1cmU9b2VtYmVkIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3c9ImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmU7IHdlYi1zaGFyZSIgcmVmZXJyZXJwb2xpY3k9InN0cmljdC1vcmlnaW4td2hlbi1jcm9zcy1vcmlnaW4iIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4=\"><div class=\"brlbs-cmpnt-cb-preset-c brlbs-cmpnt-cb-youtube\"> <div class=\"brlbs-cmpnt-cb-thumbnail\" style=\"background-image: url('https:\/\/mimolive.com\/wp-content\/uploads\/borlabs-cookie\/1\/yt_Co46ikxjU3E_hqdefault.jpg')\"><\/div> <div class=\"brlbs-cmpnt-cb-main\"> <div class=\"brlbs-cmpnt-cb-play-button\"><\/div> <div class=\"brlbs-cmpnt-cb-content\"> <p class=\"brlbs-cmpnt-cb-description\">Stai visualizzando un contenuto segnaposto da <strong>YouTube<\/strong>. Per accedere al contenuto effettivo, clicca sul pulsante sottostante. Si prega di notare che in questo modo si condividono i dati con provider di terze parti.<\/p> <a class=\"brlbs-cmpnt-cb-provider-toggle\" href=\"#\" data-borlabs-cookie-show-provider-information role=\"button\">Ulteriori informazioni<\/a> <\/div> <div class=\"brlbs-cmpnt-cb-buttons\"> <a class=\"brlbs-cmpnt-cb-btn\" href=\"#\" data-borlabs-cookie-unblock role=\"button\">Sblocca il contenuto<\/a> <a class=\"brlbs-cmpnt-cb-btn\" href=\"#\" data-borlabs-cookie-accept-service role=\"button\" style=\"display: inherit\">Accetta il servizio richiesto e sblocca i contenuti<\/a> <\/div> <\/div> <\/div><\/div>\n<\/div><\/figure>\n\n\n\n<p>The mimoLive Automation Layer was originally developed as a proof of concept but has since proven to be an incredibly useful tool for users. This layer can be used to automate the switching on and off of layers in a specific sequence or at predetermined times, fetch data from remote sources via HTTP and push processed information to layer input fields, start and stop <a href=\"https:\/\/mimolive.com\/user-manual\/using-mimolive\/output-destinations\/\" data-type=\"user-manual\" data-id=\"31774\">Output Destinations<\/a>, and so much more!<\/p>\n\n\n<section class=\"boinx_exclamation\">\n    <div class=\"main_div_exclamation\">\n        <div class=\"left_div_icon_exclamation\">\n                <i class=\"icon_exclamation\">&#10071;<\/i>\n        <\/div>\n\n        <div class=\"right_div_text_exclamation\">\n                <div><p class=\"text_exclamation_headline\">Automation Scripts in mimoLive Do Not Run in Real Time<\/p><\/div>\n                <div><p class=\"text_exclamation\">Please note that the timing of automation scripts in mimoLive may be not accurate due to the asynchronous nature of HTTP requests called by the video rendering engine. Some script commands send HTTP requests to the mimoLive API and the length of these requests cannot be accurately determined, resulting in potential timing discrepancies. Keep this in mind when using automation scripts in your production workflow.<\/p><\/div>\n        <\/div>    \n    <\/div>\n<\/section>\n\n\t\t<style>.boinx_exclamation {\n    margin:30px 0;\n    padding:10px;\n    background-color:rgb(242,222,222);\n    border-radius: 8px;\n}\n.icon_exclamation {\n    display:block;\n    padding:5px;\n    font-size:80px;\n    color:rgb(184,74,72);\n    line-height:60px;\n}\n.text_exclamation {\n    color:rgb(184,74,72);\n}\n\n.text_exclamation_headline{\n    font-weight:bold;\n    color:rgb(184,74,72);\n}\n\n\n.main_div_exclamation\n{\n    display:flex !IMPORTANT;\n    flex-wrap: wrap;\n    flex-direction: row;\n    justify-content : flex-start;\n    align-items : flex-start\n    align-content : flex-start;\n    \n}\n\n.left_div_icon_exclamation{\n    display:flex !IMPORTANT;\n    width:80px;\n    padding:10px;\n    margin:20px 20px 20px 0;\n    height:40px;\n}\n.right_div_text_exclamation{\n    display:flex !IMPORTANT;\n    flex-direction: column;\n    flex-grow: 1;\n    width:200px;\n    padding:10px;\n    margin:0;\n}<\/style>\n\t\t\n\n\n<h2 class=\"wp-block-heading\">Prerequisite<\/h2>\n\n\n\n<p>In order to make this layer work you need to switch on the HTTP Server in mimoLive to enable the Remote Control API. Go to <strong>mimoLive<\/strong> &gt; <strong>Preferences<\/strong> &gt; <strong>Remote Controls<\/strong>: Check the \u201c<strong>Allow Remote Control Access<\/strong>\u201d option. (Currently Automation layer in mimoLive only works without a password)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1000\" height=\"522\" src=\"https:\/\/mimolive.com\/wp-content\/uploads\/2023\/03\/6102d04e-4eb3-4600-b410-0d2b2aef0767.png\" alt=\"\" class=\"wp-image-32043\" style=\"width:500px;height:261px\" srcset=\"https:\/\/mimolive.com\/wp-content\/uploads\/2023\/03\/6102d04e-4eb3-4600-b410-0d2b2aef0767.png 1000w,  https:\/\/mimolive.com\/wp-content\/uploads\/2023\/03\/6102d04e-4eb3-4600-b410-0d2b2aef0767-300x157.png 300w,  https:\/\/mimolive.com\/wp-content\/uploads\/2023\/03\/6102d04e-4eb3-4600-b410-0d2b2aef0767-768x401.png 768w,  https:\/\/mimolive.com\/wp-content\/uploads\/2023\/03\/6102d04e-4eb3-4600-b410-0d2b2aef0767-18x9.png 18w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Set up the Automation Layer<\/h2>\n\n\n\n<p>There are two options on how the layer should behave after switched live:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Option<\/strong><\/td><td><strong>Behavior<\/strong><\/td><\/tr><tr><td>Switch layer off automatically<\/td><td>This option is single as applied once the script has finished running, the layer will automatically switch itself off. Use this option when a script should be executed only once.<\/td><\/tr><tr><td>Switch layer off manually (e.g. by the operator)<\/td><td>In this mode, three scripts are available:<br><br>\u2022 <strong>On Live<\/strong> \u2013 Runs once when the layer is switched live.<br>\u2022 <strong>While Live<\/strong> \u2013 Runs continuously as an endless loop after the On Live script finishes.<br>\u2022 <strong>Turned Off<\/strong> \u2013 Runs once when the layer is switched off.<br><br>When the layer is switched off, the While Live script is terminated before Turned Off script is executed.<br>If the layer is switched on again, you can relive in previous state.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Source Code Comments<\/h2>\n\n\n\n<p>To remember the purpose and functionality of your script, we recommend adding comments inside the code. Begin each comment line with \/\/.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ First sleep for 5 seconds...\nsleep(5)\n\n\/\/ ...then start the Stop Watch layer:\nlayerOn(\"7C4665C4-0E17-4F63-BCFF-B59D68D75956\")<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"scripting-commands\">Scripting Commands<\/h2>\n\n\n\n<p>The scripting language is proprietary and includes several commands. These commands are listed in a cheat sheet in the layer preview on the right. If this list is difficult to read, you can expand the preview by clicking the button located above and to the right of the preview area.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"layeroffapi-layer-id\">layerOn(&lt;API Layer ID as String Expression&gt;)<\/h3>\n\n\n\n<p>Switches on a layer or a layer variant by its ID or API Endpoint URL, or by variable.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ switching on a layer by its id\nlayerOn(\"4E38A868-DCB5-4E9C-AC75-231764229BFA\")\n\n\/\/ switching on a layer variant by its id\nlayerOn(\"4E38A868-DCB5-4E9C-AC75-231764229BFA\/variants\/5F18C566-F59F-45B4-8D40-27EF289D47B1\")\n\n\/\/ switching on a layer by its long API Endpoint URL\nlayerOn(\"\/api\/v1\/documents\/863743527\/layers\/4E38A868-DCB5-4E9C-AC75-231764229BFA\")\n\n\/\/ switching on a layer with a defined variable\nsetVariable($myLayerID, \"4E38A868-DCB5-4E9C-AC75-231764229BFA\")\nlayerOn($myLayerID)\n\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">layerOff(<em><em>&lt;<span class=\"caps\">API<\/span> Layer ID as String Expression&gt;<\/em><\/em>)<\/h3>\n\n\n\n<p>Switches off a layer or a layer variant by its ID or API Endpoint URL, or by variable.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ switching off a layer by its id\nlayerOff(\"4E38A868-DCB5-4E9C-AC75-231764229BFA\")\n\n\/\/ switching off a layer variant by its id\nlayerOff(\"4E38A868-DCB5-4E9C-AC75-231764229BFA\/variants\/5F18C566-F59F-45B4-8D40-27EF289D47B1\")\n\n\/\/ switching off a layer by its long API Endpoint URL\nlayerOff(\"\/api\/v1\/documents\/863743527\/layers\/4E38A868-DCB5-4E9C-AC75-231764229BFA\")\n\n\/\/ switching off a layer with a defined variable\nsetVariable($myLayerID, \"4E38A868-DCB5-4E9C-AC75-231764229BFA\")\nlayerOff($myLayerID)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"layersetrecallapi-layer-set-id\">layerSetRecall(&lt;<em>API Layer Set ID as String Expression<\/em>&gt;)<\/h3>\n\n\n\n<p>Triggers the recall for a certain <a href=\"#404\">Layer Set<\/a>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ recall a Layer Set by its id\nlayerSetRecall(\"E6950B7A-7457-44C5-81F7-972D9B04DBC3\")\n\n\/\/ recall a Layer Set by its long API Endpoint URL\nlayerSetRecall(\"\/api\/v1\/documents\/863743527\/layer-sets\/E6950B7A-7457-44C5-81F7-972D9B04DBC3\")\n\n\/\/ recall a Layer Set with a defined variable\nsetVariable($myLayerSetID, \"E6950B7A-7457-44C5-81F7-972D9B04DBC3\")\nlayerSetRecall($myLayerSetID)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"outputOn\">outputOn(&lt;<em>API Output Destination ID as String Expression<\/em>&gt;)<\/h3>\n\n\n\n<p>Turns on an Output Destination.<\/p>\n\n\n\n<p><code>\/\/ start an Output Destination by its id<br>outputOn(\"1953186E-4176-4849-A8ED-5B47EE1627BD\")<\/code><\/p>\n\n\n\n<p><code>\/\/ start an Output Destination by its long API Endpoint URL<br>outputOn(\"\/api\/v1\/documents\/1677022440\/output-destinations\/1953186E-4176-4849-A8ED-5B47EE1627BD\")<\/code><\/p>\n\n\n\n<p><code>\/\/ start an Output Destination with a defined variable<br>setVariable($myOutputDestinationtID, \"1953186E-4176-4849-A8ED-5B47EE1627BD\")<br>outputOn($myOutputDestinationtID)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"outputOff\">outputOff(&lt;<em>API Output Destination ID as String Expression<\/em>&gt;)<\/h3>\n\n\n\n<p>Turns off an Output Destination.<\/p>\n\n\n\n<p><code>\/\/ stop an Output Destination by its id<br>outputOff(\"1953186E-4176-4849-A8ED-5B47EE1627BD\")<\/code><\/p>\n\n\n\n<p><code>\/\/ stop an Output Destination by its long API Endpoint URL<br>outputOff(\"\/api\/v1\/documents\/1677022440\/output-destinations\/1953186E-4176-4849-A8ED-5B47EE1627BD\")<\/code><\/p>\n\n\n\n<p><code>\/\/ stop an Output Destination with a defined variable<br>setVariable($myOutputDestinationtID, \"1953186E-4176-4849-A8ED-5B47EE1627BD\")<br>outputOff($myOutputDestinationtID)<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sleepseconds\">getLayerData(<em>$resultVariableName<\/em>, &lt;API Layer ID as String Expression&gt;, &lt;Key Path as String Expression&gt;)<\/h3>\n\n\n\n<p>Retrieves layer data by key path. <br><br>This command combines multiple commands in one script step: It retrieves the layer information from the HTTP server and stores a specific data field from the JSON response into a variable. You need the exact path to the value you want to read. For the input parameter of layers, this path usually starts with \u2018data.attributes.input-values\u2019.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ set up useful variables\nsetVariable($myScoreboardLayerID, \"36FA76B4-11FE-4879-8DE1-307222512712\")\nsetVariable($pathToHomeScore, \"data.attributes.input-values.tvGroup_Control__Score_Home\")\n\n\/\/ read the score for the home team from the Basketball layer\ngetLayerData($currentHomeScore, $myScoreboardLayerID, $pathToHomeScore)\n\n\/\/ The variable $currentHomeScore now contains the Home Score input value of the Basketball Score layer<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sleepseconds\">getObjectIDByName(<em>$resultVariableName<\/em>, &lt;Object Type as String Expression&gt;, &lt;Name of Object as String Expression&gt;)<\/h3>\n\n\n\n<p>Retrieves the API Endpoint for a specified mimoLive object by its display name. <br><br>Keep in mind that the display name can be changed at any time by the operator in the mimoLive user interface. If the name changes, the automation script may fail because it can no longer find the specified object. On the other hand, this command is useful for programmatically discovering API endpoints without having to hardcode their IDs in the script.<\/p>\n\n\n\n<p>Works for \u201csource\u201d, \u201clayer\u201d, \u201clayer-variant\u201d, \u201clayer-set\u201d, \u201coutput-destination\u201d.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Get the API Endpoint for the Basketball Score layer\ngetObjectIDByName($myBasketballScoreLayerID, \"layer\", \"My Basketball Score Keeper\")\n\n\/\/ switch this layer on\nlayerOn($myBasketballScoreLayerID)<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"598\" height=\"254\" src=\"https:\/\/mimolive.com\/wp-content\/uploads\/2024\/06\/Screenshot-2024-06-11-at-15.20.42.png\" alt=\"\" class=\"wp-image-38074\" srcset=\"https:\/\/mimolive.com\/wp-content\/uploads\/2024\/06\/Screenshot-2024-06-11-at-15.20.42.png 598w,  https:\/\/mimolive.com\/wp-content\/uploads\/2024\/06\/Screenshot-2024-06-11-at-15.20.42-300x127.png 300w,  https:\/\/mimolive.com\/wp-content\/uploads\/2024\/06\/Screenshot-2024-06-11-at-15.20.42-18x8.png 18w\" sizes=\"(max-width: 598px) 100vw, 598px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sleepseconds\">sleep(<em>&lt;Seconds<\/em>&gt; as number)<\/h3>\n\n\n\n<p>Pauses script execution for a number of seconds.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ pause the script execution for 12 seconds\nsleep(12)\n\n\/\/ pause the script execution for 35.6 seconds\nsleep(35.6)\n\n\/\/ pause the script execution for a time interval specified by a variable\nsetVariable($mySleepInterval, 17)\nsleep($mySleepInterval)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sleepuntilhhmmss\">sleepUntil(&lt;<em>Time as String Expression<\/em>&gt;)<\/h3>\n\n\n\n<p>Pauses until a given clock time (HH:MM or HH:MM:SS).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ sleep until 5:15pm\nsleepUntil(\"17:15:00\")\n\n\/\/ sleep until 9:12am\nsleepUntil(\"9:12\")\n\n\/\/ sleep until a time specified by a variable\nsetVariable($myWakeUpTime, \"9:41\")\nsleepUntil($myWakeUpTime)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"sleepontheminute12345610121520306090120-\">sleepOnTheMinute(&lt;Minute as Number Expression&gt;)<\/h3>\n\n\n\n<p>Pauses the script until the next \u2018on the minute\u2019 fraction of an hour is reached.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ go on every 20 minutes: on the hour, 20 and 40 minutes past the hour:\nsleepOnTheMinute(20)\n\n\/\/ go on \"on the hour\"\nsleepOnTheMinute(60)\n\n\/\/ go on every 10 minutes past the hour (specified by a variable)\nsetVariable($myWakeUpMinute, 10)\nsleepOnTheMinute($myWakeUpMinute)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"setvariablevariablename-valu\">setVariable(<em>$variableName, &lt;value<\/em>&gt;)<\/h3>\n\n\n\n<p>Creates or changes a local variable (starts with $). The value may be string, number, or boolean.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setVariable($myText, \"This is a text\")\nsetVariable($myNumber, 15.73)\nsetVariable($myBoolValue, false)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"setglobalvariablename-value\">setGlobal(<em>$variableName, &lt;value<\/em>&gt;)<\/h3>\n\n\n\n<p>Creates or changes a global variable shared across automation layers.<\/p>\n\n\n\n<p>Please note that global variables are accessible to other Automation layers as long as the originating layer is live. This arrangement allows you to switch global variables by activating a different layer with distinct global variable definitions. Best practice in this scenario is to set the &#8216;Switch Layer Off&#8217; option of the Automation layer to &#8216;Manually&#8217; and define the globals in the &#8216;On Live&#8217; script.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setGlobal($myGlobalText, \"This is a text\")\nsetGlobal($myGlobalNumber, 15.73)\nsetGlobal($myGlobalBoolValue, false)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">concat($resultVariableName, &lt;String Expression&gt;)<\/h3>\n\n\n\n<p>Concatenates string expressions.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ define some variables\nsetVariable($myVariableA, \"This is\")\nsetVariable($myVariableB, \"text.\")\n\n\/\/ concatenate those variables and store the result into a new one\nconcat($myResultVariable, $myVariableA + \" a \" + $myVariableB)\n\n\/\/ The variable $myResultVariable contains \"This is a text.\".<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">replace(&lt;$resultVariableName&gt;, &lt;Source String Expression&gt;, &lt;Search String Expression&gt;, &lt;Replace String Expression&gt;)<\/h3>\n\n\n\n<p>This command creates a new string by replacing all occurrences of a search string within a source string. The result is stored in the specified result variable.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ define a source string\nsetVariable($source, \"Hello mimoLive, hello automation!\")\n\n\/\/ replace \u201chello\u201d (lowercase) with \u201cHi\u201d\nreplace($result, $source, \"hello\", \"Hi\")\n\n\/\/ $result = \"Hello mimoLive, Hi automation!\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">math($resultVariableName, &lt;Number Expression&gt;)<\/h3>\n\n\n\n<p>This command performs simple math calculations, including addition (+), subtraction (-), multiplication (*), and division (\/). Please note that calculations are performed in the order they appear and <strong>do not<\/strong> follow the PEMDAS\/BODMAS rule.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ define some variables\nsetVariable($myVariableA, 3)\nsetVariable($myVariableB, 5)\n\n\/\/ perform the calculation\nmath($myResult, $myVariableA + 2 * $myVariableB)\n\n\/\/ The result in $myResult is 25 (!) and not 13\n\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">list($resultVariableName, &lt;value 1&gt;[, &lt;value 2&gt;, &#8230;])<\/h3>\n\n\n\n<p>The list command creates a list and put it into the result variable. You can use the list variable in getListItem command to iterate through this list.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ create a list and put it into a variable\nlist($myList, \"A\", \"B\", \"C\", \"D\")\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">appendToList($listVariableName, &lt;value&gt;)<\/h3>\n\n\n\n<p>This command will append a certain value to an existing list.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ create a list and put it into a variable\nlist($myList, \"A\", \"B\", \"C\", \"D\")\n\n\/\/ append an item to the list\nappendToList($myList, \"E\")\n\n\/\/ The result is a list with 5 items \"A\", \"B\", \"C\", \"D\" and \"E\"\n<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">getListItem($resultVariableName, $listVariableName, &lt;itemNumber&gt;)<\/h3>\n\n\n\n<p>With this command you can retrive a certain item from a list specified by the list command. Please note that the item number starts at 1 in oppose to many other programming languages where arrays often starts with the index 0.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ create a list and put it into a variable\nlist($myList, \"A\", \"B\", \"C\", \"D\")\n\n\/\/ get a specific list item\ngetListItem($myCharacter, $myList, 2)\n\n\/\/ The result \"B\" is stored in variable $myCharacter\n\n\n\/\/ The following is a more complex example on how to iterate through the list with a loop command\n\n\/\/ define a list of layer IDs that should be turned on\nlist($myLayerIDs, \"4ECB8ACC-DEF5\", \"9852-60E2C81\", \"DFD87A4D-9FC9\", \"4324-9B7C\", \"7B1C13-2CD28\")\n\nsetvariable($iteration,1)\nloop(5)\n\n  getListItem($myLayerID,$myLayerIDs,$iteration)\n  setLayerOn($myLayerID)\n  math($iteration,$iteration+1)\n\nendloop()\n\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">getListCount($resultingListCountVariableName, $listVariableName)<\/h3>\n\n\n\n<p>With this command you can get the count of items in a list variable you created with list().<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ create a list and put it into a variable\nlist($myList, \"A\", \"B\", \"C\", \"D\")\n\n\/\/ get a specific list item\ngetListCount($myListCount, $myList)\n\n\/\/ The result 4 is stored in variable $myListCount\n\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">if(&lt;Number Expression 1&gt;, &lt;Comparator as String&gt;, &lt;Number Expression 2&gt;) [else] endif<\/h3>\n\n\n\n<p>This&nbsp;<code>if<\/code>&nbsp;statement compares two numerical expressions using a specified comparator. If the comparison is true, then the following command(s) are executed. Otherwise, subsequent commands are skipped until an&nbsp;<code>else<\/code>&nbsp;or&nbsp;<code>endif<\/code>&nbsp;is reached.<\/p>\n\n\n\n<p>Valid comparators are:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&#8220;==&#8221;<\/td><td>equals<\/td><\/tr><tr><td>&#8220;!=&#8221;<\/td><td>not equals<\/td><\/tr><tr><td>&#8220;&gt;&#8221;<\/td><td>greater than<\/td><\/tr><tr><td>&#8220;&lt;&#8220;<\/td><td>less than<\/td><\/tr><tr><td>&#8220;&gt;=&#8221;<\/td><td>greater or equal than<\/td><\/tr><tr><td>&#8220;&lt;=&#8221;<\/td><td>less or qual than<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ define a variable\nsetVariable($myVariable, 3)\n\n\/\/ test if the variable is bigger than 10\nif($myVariable, \"&gt;\", 10)\n   setVariable($text, \"is bigger than 10\")\nelse\n   setVariable($text, \"is less or equal 10\")\nendif\n\n\/\/ The result in $text is \"is less or equal 10\"\n\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ifString(&lt;String Expression 1&gt;, &lt;Comparator as String&gt;, &lt;String Expression 2&gt;) [else] endif<\/h3>\n\n\n\n<p>This&nbsp;<code>ifString<\/code>&nbsp;statement compares two string expressions using a specified comparator. The comparison is based on the ASCII character code of each letter in the strings. If the comparison is true, then the following commands are executed. Otherwise, subsequent commands are skipped until an&nbsp;<code>else<\/code>&nbsp;or&nbsp;<code>endif<\/code>&nbsp;is reached.<\/p>\n\n\n\n<p>For valid comparators see the if-command.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ define a variable\nsetVariable($myVariable, \"mimoLive\")\n\n\/\/ test if the variable is \"mimoLive\"\nifString($myVariable, \"==\", \"mimoLive\")\n   setVariable($text, \"yes\")\nelse\n   setVariable($text, \"no\")\nendif\n\n\/\/ The result in $text is \"yes\"\n\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">ifLayerIsOn(<em><em>&lt;<span class=\"caps\">API<\/span> Layer ID as String Expression&gt;<\/em><\/em>) &#8211; ifLayerIsOff(<em><em>&lt;<span class=\"caps\">API<\/span> Layer ID as String Expression&gt;<\/em><\/em>) [else] endif<\/h3>\n\n\n\n<p>These&nbsp;<code>if<\/code>&nbsp;statements test whether a certain layer is currently live or not. If the specified condition is met (the layer is on or off), then the following commands are processed. Otherwise, the subsequent commands are skipped until an&nbsp;<code>else<\/code>&nbsp;or&nbsp;<code>endif<\/code>&nbsp;is reached.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setVariable($myLayerA, \"D6A326CA-72E6-45E5-836D-9795F8F534F4\")\nsetVariable($myLayerB, \"8C58DEA7-CCBE-44CB-A60F-97C5BD456C68\")\n\nifLayerIsOn($myLayerA)\n   \/\/ the layer is live, switch it off\n   layerOff($myLayerA)\nelse\n   \/\/ the layer is currently off, switch it on\n   layerOn($myLayerA)\nendif\n\nifLayerIsOff($myLayerB)\n   \/\/ the layer is currently off, switch it on\n   layerOn($myLayerB)\nendif<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"iflayersetisactiveapi-layer-set-id---iflayersetisinactiveapi-layer-set-id-else-endif\">ifLayerSetIsActive(<em><em>&lt;<span class=\"caps\">API<\/span> Layer ID as String Expression&gt;<\/em><\/em>) \u2013 ifLayerSetIsInactive(<em><em>&lt;<span class=\"caps\">API<\/span> Layer ID as String Expression&gt;<\/em><\/em>) [else] endif<\/h3>\n\n\n\n<p>These&nbsp;<code>if<\/code>&nbsp;statements test whether a certain <a href=\"#404\">Layer Set<\/a> is currently live or not. If so, the following commands are processed. Otherwise, the subsequent commands are skipped until an&nbsp;<code>else<\/code>&nbsp;or&nbsp;<code>endif<\/code>&nbsp;is reached.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setVariable($myLayerSetA, \"CEF07AFA-B552-40F8-821C-CF424EB93500\")\nsetVariable($myLayerSetB, \"E4B15B8B-EE34-4CCE-BDE7-58120A65E83A\")\nsetVariable($myLayer, \"8C58DEA7-CCBE-44CB-A60F-97C5BD456C68\")\n\n\nifLayerSetIsActive($myLayerSetA)\n   \/\/ the layer set A is active, switch layer on\n   layerOn($myLayer)\nelse\n   \/\/ the layer set A is currently inactive, switch the layer off\n   layerOff($myLayer)\nendif\n\nifLayerSetIsInactive($myLayerSetB)\n   \/\/ the layer set B is currently inactive, switch the layer off\n   layerOn($myLayer)\nendif<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"iflayerdataapi-layer-id-keypath-comparator-value\">ifLayerData(&lt;API Layer ID as String Expression&gt;, &lt;Key Path as String Expression&gt;, &lt;Comparator as String Expression&gt;, &lt;Value as Number Expression&gt;) [else] endif<\/h3>\n\n\n\n<p>This complex command allows you to test any parameter of a layer that the <a href=\"https:\/\/mimolive.com\/user-manual\/http-api\"><span class=\"caps\">HTTP<\/span> <span class=\"caps\">API<\/span><\/a> provides. You need to specify a layer by its API ID, the key path within the JSON data returned by the HTTP API, a comparator (as a string in quotation marks, e.g.,&nbsp;&#8220;<code>==\"<\/code>), and a value.<\/p>\n\n\n\n<p>Valid comparator values are:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>&#8220;==&#8221;<\/td><td>equals<\/td><\/tr><tr><td>&#8220;!=&#8221;<\/td><td>not equals<\/td><\/tr><tr><td>&#8220;&gt;&#8221;<\/td><td>greater than<\/td><\/tr><tr><td>&#8220;&lt;&#8220;<\/td><td>less than<\/td><\/tr><tr><td>&#8220;&gt;=&#8221;<\/td><td>greater or equal than<\/td><\/tr><tr><td>&#8220;&lt;=&#8221;<\/td><td>less or qual than<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ Example: Testing if the audio volume is turned up on a layer\n\nsetVariable($myLayerA, \"D6A326CA-72E6-45E5-836D-9795F8F534F4\")\nsetVariable($myLayerB, \"8C58DEA7-CCBE-44CB-A60F-97C5BD456C68\")\n\nifLayerData($myLayerA,\"data.attributes.volume\",\"&gt;\",0.5)\n   \/\/ The audio volume is bigger than 0.5 so turn layer B on\n   layerOn($myLayerB)\nelse\n   \/\/ The volume is lower than 0.5, lets turn layer B off\n   layerOff($myLayerB)\nendif<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"loopiterations-break-endloop\">loop([&lt;Iterations as Number Expression&gt;]) [break] endloop<\/h3>\n\n\n\n<p>The&nbsp;<code>loop<\/code>&nbsp;command allows you to execute code multiple times. If you do not specify the number of iterations, the loop will run indefinitely. The&nbsp;<code>break<\/code>&nbsp;command lets you exit the loop at any time.&nbsp;<code>endloop<\/code>&nbsp;is necessary to mark the end of the command block that should be looped.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setVariable($myLayerA, \"D6A326CA-72E6-45E5-836D-9795F8F534F4\")\n\n\/\/ blink layer A 4 times\nloop(4)\n   layerOn(setVariable(myLayerA)\n   sleep(1)\n   layerOff(setVariable(myLayerA)\n   sleep(1)\nendloop\n\n\/\/ wait for volume of layer A will be bigger than 0.5\nloop()\n   ifLayerData($myLayerA,\"data.attributes.volume\",\"&gt;\",0.5)\n      \/\/ The audio volume is bigger than 0.5 exit the loop now\n      break\n   endif\n   sleep(1)\nendloop<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"httprequesthttp-url\">httpRequest(&lt;URL as String Expression&gt;)<\/h3>\n\n\n\n<p>The&nbsp;<code>httpRequest()<\/code>&nbsp;command triggers the given URL. This offers a lot of flexibility in how you can use this script command. In&nbsp;<code>mimoLive<\/code>, it can even trigger actions in other documents or remote scripts. For details on&nbsp;<code>mimoLive<\/code>HTTP API commands, please consult the <a href=\"https:\/\/mimolive.com\/user-manual\/http-api\"><span class=\"caps\">HTTP<\/span> <span class=\"caps\">API<\/span><\/a> documentation to explore all possible API calls.<\/p>\n\n\n\n<p><code>\/\/ switch on a layer<\/code><br><code>httpRequest(\"http:\/\/127.0.0.1:8989\/api\/v1\/documents\/188462841\/layers\/BA868701-8131-49CB-8EDD-8C7E6E7CD60B\/setLive\")<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"httprequesthttp-url\">httpRequestJSON($resultVariableName, &lt;URL as String Expression&gt;)<\/h3>\n\n\n\n<p>This command reads the response of the HTTP call as JSON and stores the data in the specified result variable. After this, you can access the data via the&nbsp;<code>getJSONData()<\/code>&nbsp;command.<\/p>\n\n\n\n<p>The URL can be a http request or a local file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ read in the data from a layer:\nhttpRequestJSON($result, \"http:\/\/127.0.0.1:8989\/api\/v1\/documents\/188462841\/layers\/BA868701-8131-49CB-8EDD-8C7E6E7CD60B\")\n\n\/\/ read in a json from a local file:\nhttpRequestJSON($result, \"file:\/\/\/Users\/john\/MyProjectFolder\/jsondata.txt\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"httprequesthttp-url\">getJSONData($resultVariableName, $jsonDataVariable, &lt;Key Path as String Expression&gt;)<\/h3>\n\n\n\n<p>This command retrieves a specific data value from a JSON structure stored in a variable. You need to specify the variable containing the JSON data (<code>$jsonDataVariable<\/code>), the path to the data within the JSON structure (<code>&lt;Key Path as String Expression&gt;<\/code>), and the variable where the result should be stored (<code>$resultVariableName<\/code>). This allows precise extraction of data for further processing or use in your script. The key path can contain references to elements in an array, e.g. &#8220;myarray.[12].myvalue&#8221; will output the value element of myvalue of an array called myarray at element 12. (element count starts at 1).<\/p>\n\n\n\n<p><code>\/\/ get all data of a layer<br>httpRequestJSON($myLayerData, \"http:\/\/127.0.0.1:8989\/api\/v1\/documents\/188462841\/layers\/BA868701-8131-49CB-8EDD-8C7E6E7CD60B\")<br><br>\/\/ get the value of the volume dial<br>getJSONData($volumenDial, $myLayerData, \"data.attributes.volume\")<\/code><br><code>\/\/ Now, the $volumenDial variable will hold a value between 0 and 1.<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">setJSONData(&lt;$jsonData&gt;, &lt;Key Path as String Expression&gt;, &lt;value&gt;)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Writes a value into a JSON variable at the provided key path. Use this to modify JSON you\u2019ve built or fetched with <code>httpRequestJSON<\/code>. Key paths are dot-separated.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ set fields\nsetJSONData($json, \"data.attributes.input-values.title\", \"My Headline\")\nsetJSONData($json, \"data.attributes.volume\", 0.75)<\/code><\/pre>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">JSONToString(&lt;$resultVariableName&gt;, &lt;$jsonData&gt;)<\/h3>\n\n\n\n<p>Serializes a JSON object variable into a compact string (useful for logging, sending, or storing).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ assume $json already contains data\nJSONToString($jsonString, $json)\n\/\/ $jsonString now holds the serialized JSON text<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">urlEncode(&lt;$resultVariableName&gt;, &lt;String Expression&gt;)<\/h3>\n\n\n\n<p>URL-encodes a string so it can be safely used in query parameters or paths in http requests.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ build a query value and encode it\nsetVariable($q, \"mimoLive tips &amp; tricks\")\nurlEncode($qEncoded, $q)\n\n\/\/ $qEncoded -&gt; \"mimoLive%20tips%20%26%20tricks\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">urlDecode(&lt;$resultVariableName&gt;, &lt;String Expression&gt;)<\/h3>\n\n\n\n<p>URL-decodes a percent-encoded string back to readable text.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ decode an encoded query value\nsetVariable($raw, \"mimoLive%20tips%20%26%20tricks\")\nurlDecode($decoded, $raw)\n\n\/\/ $decoded -&gt; \"mimoLive tips &amp; tricks\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">stop<\/h3>\n\n\n\n<p>Immediately stops the currently running script. Useful for early exit after a condition is met.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ wait for a condition, then stop the script\nifLayerData(\"D6A326CA-72E6-45E5-836D-9795F8F534F4\", \"data.attributes.volume\", \"&gt;\", 0.5)\n  \/\/ do one action then stop\n  layerOn(\"8C58DEA7-CCBE-44CB-A60F-97C5BD456C68\")\n  stop\nelse\n  \/\/ keep waiting\n  sleep(1)\nendif<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"httprequesthttp-url\">&gt; (Breakpoint for debugger)<\/h3>\n\n\n\n<p>When the script debugger is enabled and the debugging mode is set to &#8216;Continuously,&#8217; the execution of the script will pause at this marker and wait until the mimoLive operator clicks the &#8216;Next Step&#8217; button. Please see &#8216;Best Practices &#8211; Debugging Scripts&#8217; for more information about the debugging possibilities.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ do something\nlayerOn(\"D6A326CA-72E6-45E5-836D-9795F8F534F4\")\n\n\/\/ breakpoint: script pauses here in debugger\n&gt;\n\n\/\/ continue after stepping\nsleep(1)\nlayerOff(\"D6A326CA-72E6-45E5-836D-9795F8F534F4\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Constant: $DOCUMENT_ID<\/h3>\n\n\n\n<p>Holds the <strong>API document ID<\/strong> for the current mimoLive document. Handy for constructing endpoints without hardcoding.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ build a layer endpoint using the document ID\nsetVariable($layerId, \"BA868701-8131-49CB-8EDD-8C7E6E7CD60B\")\nconcat($endpoint, \"\/api\/v1\/documents\/\" + $DOCUMENT_ID + \"\/layers\/\" + $layerId + \"\/setLive\")\n\n\/\/ switch the layer on using the constructed URL\nhttpRequest($endpoint)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"data-types\">Data Types<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"api-endpoints-api-id\"><span class=\"caps\">API<\/span> Endpoints<\/h3>\n\n\n\n<p>The parameter should be an API Endpoint for a Layer, a Layer Variant, a Layer Set, a Source or an Output Destination. You can obtain these API Endpoints by right-clicking on the object in the mimoLive document. A context menu should appear with a &#8216;Copy API Endpoint to Clipboard&#8217; menu item.<\/p>\n\n\n\n<p>This action will copy the API Endpoint for this object to the clipboard. If you paste it elsewhere, it will look something like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/api\/v1\/documents\/863743527\/layers\/D6A326CA-72E6-45E5-836D-9795F8F534F4\n\n\/api\/v1\/documents\/863743527\/layers\/68F63C8F-2376-4CA3-9764-CC17CBFC5F8D\/variants\/3FF72CC3-AF80-4252-A879-F8AFD68DB922\n\n\/api\/v1\/documents\/863743527\/layer-sets\/E6950B7A-7457-44C5-81F7-972D9B04DBC3<\/code><\/pre>\n\n\n\n<p>For layer related commands you may reduce the <span class=\"caps\">API<\/span> Endpoints to the important part only by removing the prefix &#8220;\/api\/v1\/documents\/&lt;documentID&gt;\/layers\/&#8221; . This will make your script shorter as shown here:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ switching on a layer:\nlayerOn(\"\/api\/v1\/documents\/863743527\/layers\/D6A326CA-72E6-45E5-836D-9795F8F534F4\")\n\/\/ OR\nlayerOn(\"D6A326CA-72E6-45E5-836D-9795F8F534F4\")\n\n\/\/ switching on a variant:\nlayerOn(\"\/api\/v1\/documents\/863743527\/layers\/68F63C8F-2376-4CA3-9764-CC17CBFC5F8D\/variants\/3FF72CC3-AF80-4252-A879-F8AFD68DB922\")\n\/\/ OR\nlayerOn(\"68F63C8F-2376-4CA3-9764-CC17CBFC5F8D\/variants\/3FF72CC3-AF80-4252-A879-F8AFD68DB922\")<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"hhmmss\">&nbsp;<\/h3>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"scripting-ideas\">Best Practice<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"run-a-stinger-before-you-switch-to-a-certain-layer\">API Endpoints<\/h3>\n\n\n\n<p>How to get API Endpoints<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>By right clicking on the layer and selecting &#8220;Copy API Endpoint&#8221;<\/li>\n\n\n\n<li>by using the getAPIEndpoint() command (see documentation)<\/li>\n<\/ul>\n\n\n\n<p>Adressing API Endpoints<\/p>\n\n\n\n<p>You can either use the complete API endpoint or remove the &#8220;\/api\/v1\/documents\/&lt;documentID&gt;\/&#8221; part to make sure your script also works when copied to another document. However the document ID is important if you want to address a API point in a different mimoLive document.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"run-a-stinger-before-you-switch-to-a-certain-layer\">Debugging Scripts<\/h3>\n\n\n\n<p>There is a script debugger build in into the Automation layer. You can switch the layer into Debugging Mode by setting the layer parameter &#8220;Debug&#8221; to on.<\/p>\n\n\n\n<p>TBD.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"scripting-ideas\">Scripting Ideas<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"run-a-stinger-before-you-switch-to-a-certain-layer\">Run an ad every 10 minutes<\/h3>\n\n\n\n<p>In combination with a \u201c<span class=\"caps\">PIP<\/span> Window\u201d layer an a \u201cMedia Playlist source\u201d containing multiple short advertising movie clips you can playback one advertising every 10 minutes. Make sure to uncheck the \u201cNon-Stop\u201d option in the Media Playlist source. This way each time the <span class=\"caps\">PIP<\/span> Window gets set to live it will playback one ad from the Playlist source and switches itself off. After 10 minutes the next ad will be played back.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Run a stinger before you switch to a certain layer<\/h3>\n\n\n\n<p>You need to prepare a short stinger video that will have an In-transition until it covers all the screen (e.g. after 1 sec). After 1 second you switch live that layer you want to reveal. Place this layer below the layer playing back the stinger video. Now that the stinger video is covering the screen the switching of the layer below can\u2019t be seen. The stinger video should go on with revealing the layer below. Please make sure that the stinger video is rendered in ProRes4444 video codec so that it carries the transparency necessary for the transition with it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"create-a-complex-show-opener\">Create a complex show opener<\/h3>\n\n\n\n<p>Because you can switch on and off layers one after another over a longer period of time you can have multiple Text or Annotation layers, Placer layer showing graphics or even lower thirds that fills the screen to make you own animated show opener. Get creative!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"trigger-a-remote-http-url-by-a-tap-on-the-remote-control-surface\">Trigger a remote <span class=\"caps\">HTTP<\/span> <span class=\"caps\">URL<\/span> by a tap on the Remote Control Surface<\/h3>\n\n\n\n<p>If you need to trigger an <span class=\"caps\">HTTP<\/span> Request by a button on your <a href=\"https:\/\/mimolive.com\/user-manual\/remote-control-surfaces\">Remote Control Surface<\/a> you can add an Automation layer to you layer stack and set the \u201cSwitch Layer Off\u201d option of that layer to \u201cAutomatically\u201d. Now you can put in a single httpRequest() command in the \u201cOn Live\u201d script field. On your Remote Control Surface add the Live button of this layer to the layout. Once you press this button on your Remote Control Surface the <span class=\"caps\">HTTP<\/span> request will be performed.<\/p>\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Streamline Your Production with mimoLive&#8217;s Automation Layer The mimoLive Automation Layer was originally developed as a proof of concept but has since proven to be an incredibly useful tool for users. This layer can be used to automate the switching on and off of layers in a specific sequence or at predetermined times, fetch data [&hellip;]<\/p>","protected":false},"author":3,"featured_media":0,"parent":40865,"menu_order":1,"template":"","meta":{"_acf_changed":false,"_angie_page":false,"_lmt_disableupdate":"","_lmt_disable":"","footnotes":""},"categories":[258],"tags":[],"class_list":["post-32041","user-manual","type-user-manual","status-publish","hentry","category-manual"],"acf":[],"_links":{"self":[{"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/user-manual\/32041","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/user-manual"}],"about":[{"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/types\/user-manual"}],"author":[{"embeddable":true,"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/users\/3"}],"version-history":[{"count":16,"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/user-manual\/32041\/revisions"}],"predecessor-version":[{"id":43413,"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/user-manual\/32041\/revisions\/43413"}],"up":[{"embeddable":true,"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/user-manual\/40865"}],"wp:attachment":[{"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/media?parent=32041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/categories?post=32041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mimolive.com\/it\/wp-json\/wp\/v2\/tags?post=32041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}