THE EASIEST

Pick-to-Light REST Integration

Pick to Light example device

Simple!  The way it should be.

Two different APIs

Voodoo Robotics supports two different APIs for interacting with Pick-to-Light devices.

Integration between your warehouse management system (WMS) or Enterprise Resource Management Solution (ERP) is easy.

  • Simple. The easiest pick-to-light integration is the simple query string with a GET request We suggest using this for initial evaluation. This does not use REST principles.
  • Advanced. For more powerful interfaces, consider using our REST API. It is slightly more complicated, but really worth the trouble.

This is a playlist of REST API tutorials on our Voodoo Robotics YouTube Channel

  • Get a list of all devices in your account.  Use a GET request on the endpoint https://www.voodoodevices.com/api/device/.  As with most REST servers, you can use XML or JSON in your request.  See the examples below.

  • Inspect Request

    Once you have a particular DeviceID, you can get more information about that device (voltage, uptime, etc.).  Use a GET request on the endpoint https://www.voodoodevices.com/api/device/FFFFFF:EEEEEE/.  As above, you can use XML or JSON in your request.

  • Update Request

    You can also update the message on a Device.  Use a POST request on the endpoint https://www.voodoodevices.com/api/device/FFFFFF:EEEEEE/.  You can submit your data as application/xml or application/json.  Notice that POST and PUT are equivalent in our REST API since there is no object creation mechanism.

  • Update Multiple

    You can also update multiple Devices in one API call.  Use a POST request on the endpoint https://www.voodoodevices.com/api/devices/.  (Note the plural ‘devices’.)  You can submit your data as application/xml or application/json.  This saves time and resources by consolidating API calls.  See the example below.

  • Inspect Turbos

    In a similar way to the device endpoint, you can use the turbo endpoint to get information about your Turbos.  Use a GET request on the endpoint https://www.voodoodevices.com/api/turbo/, or https://www.voodoodevices.com/api/turbo/SERIALNO/.

The examples on this page show you how to really leverage the power of REST with our modern Cloud Display Devices.  You can write your code in any language you choose.  We have chosen PHP for demonstration purposes–it is fairly easy for any programmer to read PHP and understand the critical steps.

Be sure to read the comments around the code.  They can be very useful, particularly if you do not know PHP.

Most Simple Example (Python)

In just five lines of Python code, you can send a simple command to a device.

import requests,json
session = requests.Session()
url = "https://bblock-demo.voodoorobotics.com/api/"
x = session.post(url+"user/login/",json={'username': 'yourusername','password':'yourpassword'})
z = json.loads(x.text)
session.post(
    url+"device/E8D008:619874/",
    headers = {'referer': url,'x-csrf-token': z['token'],},
    json={'command':'flash','line1':'Hello','line2':'There'},
)

#That was just FIVE LINES of CODE (plus a variable assignment)

#Here's a function and a function call
def simplePickCommand(deviceID,line1,line2):
    session.post(
        url+"device/"+deviceID+"/",
        headers = {'referer': url,'x-csrf-token': z['token'],},
        json={'command':'flash','line1':line1,'line2':line2},
    )

#now let's call the function
simplePickCommand('E8D008:619874','Ben','Take 5')
simplePickCommand('E476EA:EA3329','Fred Put','Red Shirts Here')

Step by Step (in PHP)

Let’s walk through it together…

//This code is written in PHP.  (Revised February 2022)

//First define an initialization function to log in with username and password
//The key thing is that we have to capture both the session cookie and the CSRF token
//They will both be stored in the global $ch.
function init()
{
    global $ch;         //PHP is silly in the way scoping rules work!
    $ch = curl_init();  //initialize the cURL object

    curl_setopt($ch, CURLOPT_URL,"https://www.voodevices/api/user/login/");
    //note that we are using api2 and we first access the login endpoint
    //for REST API, you cannot use https://www.voodoodevices.com/api/    <===BAD!!!

    curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookie.txt");
    //use a cookiejar, because the session ID will be stored in the cookie

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //silly cURL, it should be like this by default! This alows us to do $x = curl_exec()

    curl_setopt($ch, CURLOPT_POST, true);
    //login requires a POST with username and password content

    curl_setopt($ch, CURLOPT_HTTPHEADER,array(  //specify XML for input and output (you could use JSON instead)
        "content-type: application/xml",        //format of the outbound data/commands
        "accept: application/xml",                //format of the inbound response
    ));
    //We could have used JSON here, but are sticking to both input and output in XML for simplicity

    //curl_setopt($ch, CURLOPT_VERBOSE, 1);
    //uncomment the above line if you encounter problems -- curl will give you some diagnostics

    $xml = "
        
          yourusername
          yourpassword
        
    ";
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); $theXml = curl_exec($ch); // this logs us in, puts a session cookie in the cookiejar, a // returns some XML that contains our super-secret token $response = simplexml_load_string($theXml); // parse the returned XML curl_setopt($ch, CURLOPT_HTTPHEADER,array( //do what we did before, but this time add the CSRF token "content-type: application/xml", //format of the outbound data/commands "accept: application/xml", //format of the inbound response "referer: https://www.voodoodevices.com/api/", //referer field is required. For more info see "x-csrf-token: ".$response->token,                // https://seclab.stanford.edu/websec/csrf/csrf.pdf
            ));
    //this is very important: the above updates the header with the token
    //and since $ch is global, it maintains the cookie and the CSRF token
    //we will rely on this in the functions below
    //some would argue that a CSRF token is overkill, but cookies are not very well protected
    //these days. For more information about session riding attacks, see
    //https://en.wikipedia.org/wiki/Cross-site_request_forgery

    //REST api, unlike QueryString api REQUIRES the x-csrf-token 
}

//As an example of getting device information, we get the voltage
//Just pass the function the Device ID like this:
//
//   print(getVoltage('FD02EF:AB9A16'));
//
function getVoltage($devID)
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, false);
    //make sure we are doing a GET request

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
    //to get info on a device, append the device ID to the endpoint

    $theXml = curl_exec($ch);                     // make the request -- the returned XML has everything in it

    $response = simplexml_load_string($theXml);  // parse the returned XML

    //print_r($response);  //uncomment this line to see all the fields you can access
    return $response->voltage; //we only want the voltage in this example
}

//What if we did not know what our device IDs were? Here is a function that returns all of our device IDs 
//in an array.
function arrayOfDevices()
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, false);
    //make sure we are doing a GET request

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/");
    //without a device ID in the URL, we get a list of all of them

    $theXml = curl_exec($ch);    // make the request -- the returned XML has everything in it

    $response = simplexml_load_string($theXml);  // parse the returned XML

    return (array)$response->item;               //result is in the 'item'
}

//Now we show how we can _set_ device information.  
//Setting the command and associated fields forces a call to the device to light up.  
//* If the command is 'flash', the light flashes.
//* If the command is 'display', the light is solid.  (We recommend flash, as it uses less power.)
//For a command, you can set 'line1', 'line2', 'line3', 'line4', 'line5', 'sound', 'seconds', 'color',
//and 'nonce'.  Only our V2/Modern devices support lines3-5 and color. (Classic Devices will ignore them.) 
//Our feedback protocol uses the nonce.
//See https://voodoorobotics.com/closed-loop-system/
//Sound strings are just the tempo followed by a series of notes.  See our Section 7 of our page at
//https://voodoorobotics.com/constructing-a-url/ for some examples.
//Using long sounds consumes batteries quickly, so try to use simple sounds like a simple beep ('15,c5,4').
//See our new battery estimator at https://voodoorobotics.com/pick-light-batteries/
function messageDevice($devID,$line1,$line2,$line3,$line4,$line5,$time = 10,$sound = '15,c5,4',$color = 'r')
//Again, note that Classic Devices do not use $line3-5 and $color
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
    //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
    //append the device ID to the endpoint.  (The response is ignored.)

    $xml = "
        
          2.0
          flash
          $line1
          $line2
          $line3
          $line4
          $line5
          $time
          $sound
          $color
        
    ";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch); // make the request
}

//Here is an example using a nonce for feedback
function messageWithNonce($devID,$line1,$nonce,$time = 10,$sound = '15,c5,4',$color = 'r')
//Again, note that Classic Devices do not use $line3-5 and $color
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
                            //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
                            //append the Device ID to the endpoint.  (The response is ignored.)

    $xml = "
        
          2.0
          flash
          $line1
          $nonce
          $time
          $sound
          $color
        
    ";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch); // make the request
}

//Here is how you can terminate a currently pending command
//Note that you have to reference the command both by device ID and the nonce that
//you originally used when you sent the command
function messageWithNonce($devID,$nonce)
{
    global $ch;
    if (empty($ch)) init(); //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
                            //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
                            //append the Device ID to the endpoint.  (The response is ignored.)

    $xml = "
        
          2.0
          kill
          $nonce
        
    ";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch); // make the request
}

//Resetting a device removes all commands in the device's queue (including overlapped commands)
function resetDevice($devID)
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
                            //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
                            //append the device ID to the endpoint.  (The response is ignored.)

    $xml = "
        
          2.0
          reset
        
    ";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch);         // make the request
}

//Rebooting a device is like power-cycling the device, i.e. replacing the batteries
//All pending commands are lost
function rebootDevice($devID)
{
    global $ch;
    if (empty($ch)) init(); //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
                            //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
                            //append the device ID to the endpoint. (The response is ignored.)

    $xml = "
        
          2.0
          reboot
        
    ";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch);         // make the request
}

//The following function sets the static display of the device--what it displays by default
//when there are no active commands (like above).  V2/Modern devices rely on 'statica', 'staticb'
//'staticc', 'staticd', 'statice', while the Classic Devices use 'static' and 'static2'
//You can also set the default display timeout (not to be confused with 'seconds' above) with
//'timeout'.  Set a location override with 'location_override' and brightness with, yes, 'brightness'
//(a value between 0 and 100).
function displayOnDevice($devID,$line1,$line2,$line3 = '',$line4 = '',$line5 ='')
{
    global $ch;
    if (empty($ch)) init(); //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
                            //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
                            //append the Device ID to the endpoint.  (The response is ignored.)

    $xml = "
        
          2.0
          $line1|$line2
          $line1
          $line2
          $line3
          $line4
          $line5
        
    ";
    //Note that we do not clear the other static fields here.  You may or may not want
    //to do that in your code.

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec ($ch); // make the request
}

//Want something fancier?  Here is some PHP to put a barcode on a V2/Modern device
//Use '\bc' for barcode, '\ic' for icon, and '\qr' for a QR Code
//For a list of possible icons see this discussion https://voodoorobotics.com/line-encodings
function messageWithBarcode($devID,$line1,$line2,$bc,$time = 10)
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
                            //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
                            //append the device ID to the endpoint.  (The response is ignored.)

    $xml = "
        
          2.0
          flash
          $line1
          $line2
          \bc$bc
          $time
        
    ";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch); // make the request
}

//How about showing some quantity?  Here is some PHP to put the quantity in a corner box
//Use '\qt' for quantity as described on https://voodoorobotics.com/line-encodings
function messageWithQuantity($devID,$line1,$line2,$line3,$qt,$time = 10)
{
    global $ch;
    if (empty($ch)) init();     //initialize with the cookie and the csrf token if needed

    if ($qt <= 63) {
        $qt = "\qt".$qt;        //note that the \qt syntax only supports integers up to 63
    }
    else {
        $qt = "Quantity: ".$qt; //if you have more than 63, display using text
    }

    curl_setopt($ch, CURLOPT_POST, true);
                        //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
                        //append the Device ID to the endpoint.  (The response is ignored.)

    $xml = "
        
          2.0
          flash
          $line1
          $line2
          $line3
          $qt
          $time
        
    ";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch); // make the request
}

// THE FOLLOWING IS AN EXAMPLE THAT ILLUSTRATES WHAT YOU SHOULD NOT DO
// Here is a function to make the device light up and then set the background
// data at the same time.  Please don't do this.  It wastes batteries and slows down communications.
// Having a barcode and a QR code in close proximity might confuse some barcode scanners.
function ridiculouslyFancy($devID,$line1,$line2,$bc,$ic,$qr,$sound,$time,$color,$sline1,$sline2,$sbc,$sic,$sqr)
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
                            //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/device/".$devID."/");
                            //append the Device ID to the endpoint.  (The response is ignored.)



    //NOTE AGAIN:  THIS IS WHAT _NOT_ TO DO!
    $xml = "
        
          2.0
          flash
          $line1
          $line2
          \bc$bc
          \ic$ic
          \qr$qr
          $sound
          $time
          $color
          $sline1
          $sline2
          \ic$sic
          \bc$sbc
          \qr$sqr
        
    ";
    //NOTE AGAIN:  THE ABOVE IS WHAT _NOT_ TO DO!



    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch); // make the request
}

//What about information about the Turbos?
//To get a list of Turbos in your account try this:
function arrayOfTurbos()
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, false);
    //make sure we're doing a GET request

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/turbo/");
    //without a device ID in the URL, we get a list of all of them

    $theXml = curl_exec($ch);    // make the request -- the XML returned has everything in it

    $response = simplexml_load_string($theXml);  // parse the returned XML

    return (array)$response->item; //result is in the 'item'
}

//Or to get specific information about a particular Turbos
function turboInfo($turboID)
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, false);
    //make sure we are doing a GET request

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/turbo/".$turboID."/");
    //without a device ID in the URL, we get a list of all of them

    $theXml = curl_exec($ch);    // make the request -- the XML returned has everything in it

    $response = simplexml_load_string($theXml);  // parse the returned XML
    
    //print_r($response);  //uncomment this line to see all the fields you can access

    return (array)$response->item; //result is in the 'item'
}


//OK, we saved the most useful for last:
//How about a single API call to light up multiple devices?
//Here we create an Array in XML for several commands to several Devices
//Note that we use the 'devices' endpoint, not the 'device' endpoint
function helloTimesFive($id1,$id2,$id3,$id4,$id5)
{
    global $ch;
    if (empty($ch)) init();  //initialize with the cookie and the CSRF token if needed

    curl_setopt($ch, CURLOPT_POST, true);
    //updating the static data or making the device flash requires a post

    curl_setopt($ch, CURLOPT_URL,"https://https://www.voodoodevices.com/api/devices/");
    //append the Device ID to the endpoint.  (The response is ignored.)

    //notice how building an array in XML is kind of tricky!  Using JSON to form an array is easier
    //We encourage the use of JSON instead, but we use XML here for consistency
    $xml = "
        
            
                
                    2.0
                    $id1
                    flash
                    Hello
                    Howdy
                    10
                    15,c5,4
                
             
                    2.0
                    $id2
                    flash
                    Hello
                    Howdy
                    10
                    15,c5,4
                
                
                    2.0
                    $id3
                    flash
                    Hello
                    Howdy
                    10
                    15,c5,4
                
             
                    2.0
                    $id4
                    flash
                    Hello
                    Howdy
                    10
                    15,c5,4
                
                
                    2.0
                    $id5
                    flash
                    Hello
                    Howdy
                    10
                    15,c5,4
                
            
        
    ";

    //if we were using JSON, we would use
    $json = "
        [
           {
              'API': '2.0',
              'deviceID': $id1,
              'command': 'flash',
              'line1': 'Hello',
              'line2': 'Howdy',
              'seconds': '10',
              'sound': '15,c5,4'
           },
           {
              'API': '2.0',
              'deviceID': $id2,
              'command': 'flash',
              'line1': 'Hello',
              'line2': 'Howdy',
              'seconds': '10',
              'sound': '15,c5,4'
           },
           {
              'API': '2.0',
              'deviceID': $id3,
              'command': 'flash',
              'line1': 'Hello',
              'line2': 'Howdy',
              'seconds': '10',
              'sound': '15,c5,4'
           },
           {
              'API': '2.0',
              'deviceID': $id4,
              'command': 'flash',
              'line1': 'Hello',
              'line2': 'Howdy',
              'seconds': '10',
              'sound': '15,c5,4'
           },
           {
              'API': '2.0',
              'deviceID': $id5,
              'command': 'flash',
              'line1': 'Hello',
              'line2': 'Howdy',
              'seconds': '10',
              'sound': '15,c5,4'
           }
        ]
    ";
    //this demo ignores the above $json variable.  If you want to use it, you'd have to
    //modify the headers in init()

    //A special note for Stand-alone Server users only: (most customers can ignore this)
    //Another reason to use JSON is that the XML above will not work on the Stand-alone Server!
    //Your XML for the Stand-alone Server must be formatted as
    // ......
    //Yuck!

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    curl_exec($ch); // make the request
}

Sequence CRUD

The Big Block Server supports Sequences of Steps.  Here’s an example of how to Create, Read, Update, or Delete Sequences using the REST API.

//Again we define an init function.  This time we'll make it a little more flexible by
//defining a $base variable to hold the base URL of all the endpoints.  Note, we use
//this $base as the 'referer' in all requests after login.
function init()
{
    global $ch;  //Now we have two globals!
    global $base;
    
    $ch = curl_init();  //initialize the cURL object
    $base = "https://bblock.mydomain.com/api";  //use your own local server address here


    curl_setopt($ch, CURLOPT_URL,$base."/user/login/");
    //we first access the login endpoint

    curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookie.txt");
    //use a cookiejar, because the session ID will be stored in the cookie

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    //as before, this allows us to do $x = curl_exec()

    curl_setopt($ch, CURLOPT_POST, true);
    //login requires a POST with username and password content

    curl_setopt($ch, CURLOPT_HTTPHEADER,array(    //specify XML for input and output (could use JSON instead)
        "content-type: application/xml",          //format of the outbound data/commands
        "accept: application/xml",                //format of the inbound response
    ));

    //curl_setopt($ch, CURLOPT_VERBOSE, 1);
    //uncomment the above line if you're having problems -- curl will give you some diagnostics

    $xml = "
        
          yourusername
          yourpassword
        
    ";

    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);

    $theXml = curl_exec($ch);    // this logs us in, puts a session cookie in the cookiejar, and
                                // returns some XML that contains our super-secret token

    $response = simplexml_load_string($theXml);  // parse the XML that was returned

    curl_setopt($ch, CURLOPT_HTTPHEADER,array(        //do what we did before, but this time add the csrf token
                "content-type: application/json",    //format of the outbound data/commands
                "accept: application/json",            //format of the inbound response
                "referer: ".$base,                    //referer field is required. For more info see
                "x-csrf-token: ".$response->token,    // https://seclab.stanford.edu/websec/csrf/csrf.pdf
            ));
    //this is very important:  the above updates the header with the token
    //and since $ch is global, it's maintaining the cookie and the csrf token
    //we'll rely on this in the functions below
}

//Let's get a list of all the Sequences and their Steps
//This will return ALL Sequences, unstarted, started, and completed
//Check the started and completed times to know if a step has been started or is in progress
function allSequences()
{
    global $ch;
    global $base;
    if (empty($ch)) init();  //initialize with the cookie and the csrf token if needed

    curl_setopt($ch, CURLOPT_POST, false);
    //make sure we're doing a GET request

    curl_setopt($ch, CURLOPT_URL,$base."/sequence/");
    //don't specify a Sequence ID and you'll get a list of all of them
    //if you specify a Sequence ID, you'll get only that one

    $theJSON = curl_exec($ch);    // make the request -- the JSON returned has everything in it

    $response = json_decode($theJSON);  // parse the JSON that was returned

    //print_r($response);    //uncomment this line to see the format of the response
                            //in particular, note that sequences are paginated at 50 per request
                            
    return $response; 
}

//Let's create a Sequence with a few Steps
function createSequence()  //uses POST (not PUT)
{
    global $ch;
    global $base;
    if (empty($ch)) init();  //initialize with the cookie and the csrf token if needed

    curl_setopt($ch, CURLOPT_POST, true);
    //make sure we're doing a POST request

    curl_setopt($ch, CURLOPT_URL,$base."/sequence/");
    //to get info on a device, append the device ID to the endpoint

    $newSequence = <<

You May Also be Interested in:

Device Limitations

The REST API works for both our Modern Cloud Display Devices and our Classic devices.

Modern Cloud Display Devices devices support five lines both for commands and for static data.  As you can see in the code example we use line 1-5 and static a-e for these lines.  The device display will scale to fit the text that you send it, so if you have a five character string on only one line, it'll be much larger than five 26-character lines.  Each line supports up to 26 characters.

Classic devices only support two lines of text.  The display is 16 characters wide, but you can send a maximum of 32 characters.  If you send more than 16 characters, the display will scroll back and forth, left to right.  Classic devices require a  bar delimiter '|' to separate lines in a static call, and support both 'static' and 'static2'.  Static is shown after a single button push, and static2 is shown after two button pushes.  Please contact us if you wish to replace your Classic devices with the new Modern devices.

Barcodes, QR Codes, and Icons

You can replace any command or static line of text on a Modern Cloud Display Device with a barcode, QR Code or icon.  As you can see in the example above, if you preface a line with 'bc' you will get a barcode.  If you preface a line with 'qr' you will get a QR Code.  And if you preface a line with 'ic' you will get an icon.  And, of course, you could do all three!

Since Modern devices have a limitation of 26 characters per line of text, barcodes and QR Codes are limited to 23 characters (three are used for the prefix).  Note that bitly links are 22 characters -- so you can encode any URL on a device.

Modern devices also support two main types of icons: arrows and hazard signs.

Learn about the different encoding formats for icons.

© Copyright 2022 Voodoo Robotics. All Rights Reserved. Patents Pending. Voodoo Robotics, Voodoo Devices, Big Block Server, and Turbo names and logos are all trademarks of Voodoo Robotics.