Our IoT features are made for makers and hardware hackers out there, who wants to connect their selfmade IoT network devices quickly to an own server. If you built something based on platforms like RaspberryPi, Arduino or Esp8266, then this is for you!
At the moment we support the basic IP protocols UDP and TCP with HTTP and JSON/REST on top of it. MQTT and websocket interfaces are planned but there's no support for commercial consumer products and protocols yet.
LimboMedia comes with two kinds of components to manage your IoT devices: Sensors to collect and visualize data and Controls to send commands to your devices. For both of them we've got a predefined set for different kinds of data types that should fit most needs.
After creating a new sensor object in LimboMedia, there are 2 ways to get your data. Either you push your data, meaning the device sends request to your server containing the data or you let LimboMedia pull the data, meaning it frequently sends sends requests to your device to get the latest data within the response.
|Data type||Usage example|
|On / Off||boolean||Motion sensor, Open window/door detector, ...|
|Coordinate||2 numbers: x, y (latitude,longitude)||GPS tracker|
|Number||number||All kinds of measurements: temperatur, humidity, brightness, ...|
|String||string||Every kind of text.|
Everything you need to know for pushing data is described when you click the "Push data" icon beside the sensor. It's done with an HTTP POST request containing a JSON body. The request URL is shown in the dialog as well as required header fields and a sample body. Note that the UID is used as authentication token and shouldn't be made public. With these information you should be able to easiely submit data using wget, curl or with whatever programming language you're using.
We recommend using data push for devices that are not always online, not adressable (dynamic ip) or behind a NAT (i.e. at home) while the server is outside (internet).
You want to pull data from a device? What you need is an adressable (via IP or hostname) device and that runs a HTTP server with one or more endpoints serving the sensor data.
Choose when and how often to pull data via cron expression, enter the device URL and configure your request: GET or POST, header fields and request body. Your device then has to answer with an JSON response body that is similar to the one used for data push.
Controls are interactive elements allowing you to send requests to your IoT devices with the intend to let them do things.
|Data type||Usage example|
|Switch||boolean||All kinds of simple on/off switches like light switches or to switch other devices on and off.|
|Fire||No data||One shot events without data.|
|Select||String||Everywhere you'd like to have different options to choose. Maybe the color of your LED stripe or the station of your webradio.|
|Percent||number||When you want to choose between min(0%) and max(100%). Volume of your sound system or brightness of your light.|
|Text||String||Free not-predefined text. I.e. to show some text on a display.|
|Number||number||Free not-predefined number. For example to set the temperature of a heater.|
Whenever you use a control the corresponding action is triggered. As action you can choose between:
But how do I get the selected values into these requests?
Therefore we enabled the Freemarker templating engine for the fields URL and Content. This means the control value is passed as variable val and can be used however you need it. Note that the datatype of val depends on the control.
Lets say you've a switch control and depending wether it's on or off you'd like to send a HTTP request with a changing request parameter. Note that the switch control uses boolean and that's where we use freemarker to convert that boolean to string. Depending on your devices IP and your endpoint a URL could look like this:
This URL will be processed by freemarker, so depending on the switch state one of these 2 URLs will be called:
Check the Freemarker Manual for available expressions, build-ins and tutorials. This enables you to construct everything from simple type converters to complex logic using if/else-statements, loops, calculations and more.