{"id":707,"date":"2021-07-11T22:29:50","date_gmt":"2021-07-11T20:29:50","guid":{"rendered":"https:\/\/macchina.io\/blog\/?p=707"},"modified":"2021-07-14T09:35:17","modified_gmt":"2021-07-14T07:35:17","slug":"building-an-iot-edge-application-with-macchina-io-and-docker-part-2","status":"publish","type":"post","link":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/","title":{"rendered":"Building an IoT Edge Application with macchina.io and Docker (Part 2)"},"content":{"rendered":"<p>Welcome back to the second and final part of my article where I describe how I&#8217;ve built a simple edge computing application by combining <a href=\"https:\/\/macchina.io\/edge.html\">macchina.io EDGE<\/a>&nbsp;and&nbsp;<a href=\"https:\/\/macchina.io\/remote.html\">macchina.io Remote Manager<\/a> with <a href=\"https:\/\/www.influxdata.com\/products\/influxdb\/\" target=\"_blank\" rel=\"noopener\">InfluxDB<\/a>, a widely used time-series database, with everything running in <a href=\"https:\/\/www.docker.com\" target=\"_blank\" rel=\"noopener\">Docker<\/a> containers that can be managed via <a href=\"https:\/\/www.portainer.io\" target=\"_blank\" rel=\"noopener\">Portainer<\/a>.<\/p>\n<p><div id=\"attachment_657\" style=\"width: 650px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-657\" class=\"wp-image-657\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-300x228.jpg\" alt=\"macchina.io Edge Demo Setup\" width=\"640\" height=\"488\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-300x228.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-768x585.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/demosetup-1536x1169.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><p id=\"caption-attachment-657\" class=\"wp-caption-text\">macchina.io Edge Computing Demo Setup<\/p><\/div><\/p>\n<p>In <a href=\"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-1\/\">the first part<\/a>, I described how I&#8217;ve set up the basic system to work on a Raspberry Pi 4 (with Raspberry Pi OS Lite 64-bit). The basic setup has all the applications running in Docker containers, and already provides secure remote access to them via macchina.io Remote Manager.<\/p>\n<p>In this second part, I will show how to write a small JavaScript program that reads sensor data (temperature, humidity, light, acceleration) from a USB-connected multi-sensor device (Bosch CISS), and write that data to an InfluxDB database. I will then use InfluxDB 2&#8217;s graphing and dashboard features to build a simple dashboard showing the sensor data. While this is by no means a full-fledged IoT edge computing application, it nevertheless demonstrates the first steps to build one. Typically the first step when building such an application is to collect &#8220;interesting&#8221; sensor (and other) data from a number of sensors or other sources, and put these values into a time series database, to see how the data looks like and changes over time. From that, further steps, like developing algorithms for analyzing the data, can be taken.<\/p>\n<h2>Connecting the Sensor<\/h2>\n<p>I have already briefly mentioned in the first part that the Bosch CISS multi-sensor device I&#8217;m using is connected to the Raspberry Pi by USB. The actual communication with the sensor happens over a &#8220;virtual&#8221; serial port over the USB connection, so from a programming perspective the device looks like it&#8217;s connected with a good old RS-232 cable. macchina.io EDGE already ships with a plug-in (<a href=\"https:\/\/github.com\/macchina-io\/macchina.io\/tree\/develop\/devices\/CISS\" target=\"_blank\" rel=\"noopener\">macchina.io CISS Sensors bundle<\/a>) that implements the communication with the multi-sensor device, and which also exposes all the sensors through the sensors and devices API provided by macchina.io EDGE. So all I have to do is:<\/p>\n<ol>\n<li>Connect the Bosch CISS multi-sensor to one of the Raspberry Pi&#8217;s USB ports.<\/li>\n<li>Verify that the device shows up as a new serial device in <code>\/dev<\/code>, as <code>\/dev\/ttyACM0<\/code>.<\/li>\n<li>Expose the <code>\/dev\/ttyACM0<\/code> device to the macchina.io EDGE Docker container.<\/li>\n<li>Configure macchina.io EDGE so that it enables the device.<\/li>\n<\/ol>\n<p>When exposing device files to a Docker container, you may want to make sure that the device file always has the same name. This can be handled in Linux by defining <em>udev<\/em> rules. Also, the device must be connected while the container is running. If a device file exposed to the container is not available, the container will fail to start. In typical industrial settings, devices are not randomly connected and disconnected, so in practice this is not a major concern. Instead of exposing only specific device files to a container, it is also possible to start a Docker container in privileged mode, which gives the application running in it access to the entire <code>\/dev<\/code> filesystem. However, from a security perspective, running containers in privileged mode is not advisable.<\/p>\n<p>The <a href=\"https:\/\/github.com\/macchina-io\/meta-macchina-edge-demo\/blob\/main\/docker-compose.yml\" target=\"_blank\" rel=\"noopener\">docker-compose.yml<\/a> file in the <a href=\"https:\/\/github.com\/macchina-io\/meta-macchina-edge-demo\" target=\"_blank\" rel=\"noopener\">GitHub repository<\/a> for this article has the settings for exposing the USB device commented out. So the first step in making the sensor accessible to macchina.io EDGE is to uncomment the respective lines in the <code>docker-compose.yml<\/code> file:<\/p>\n<pre># Note: uncomment (and modify) devices as required.<br># The container will fail to start if any specified<br># device is not available.<br>devices:<br>&nbsp; - \"\/dev\/ttyACM0:\/dev\/ttyACM0\"<\/pre>\n<p>After uncommenting the two lines, restart the containers with:<\/p>\n<pre>$ docker-compose down<br>$ docker-compose up -d<\/pre>\n<p>The above two commands must be executed in the directory where the <code>docker-compose.yml<\/code> file is located.<\/p>\n<p>Next I&#8217;m going to enable the device in macchina.io EDGE. In order to do that, a configuration property must be defined, and the CISS bundle must be restarted. This is done by logging in to the macchina.io EDGE web user interface, available on port <a href=\"http:\/\/raspberrypi:22080\" data-wplink-url-error=\"true\">22080<\/a> of the Raspberry Pi (or via macchina.io Remote Manager). The default username and password is <code>edgeadmin<\/code>. After logging in, launch the <strong>Settings<\/strong> app by clicking its icon.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-713\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge1-300x242.jpg\" alt=\"macchina.io EDGE Launcher\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge1-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge1-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge1-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge1-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>In the Settings app, click the <strong>[+] Add<\/strong> button to add a new setting.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-714\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge2-300x242.jpg\" alt=\"macchina.io EDGE Settings\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge2-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge2-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge2-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge2-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>In the Add dialog, under <strong>Name<\/strong> enter <code>ciss<\/code>, leave <strong>Value<\/strong> empty, and press enter or click <strong>Add<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-715\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge3-300x242.jpg\" alt=\"macchina.io EDGE Add Setting\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge3-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge3-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge3-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge3-1536x1237.jpg 1536w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge3-2048x1650.jpg 2048w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>You will then see a new row for the <code>ciss<\/code> property. On the property, click the [+] button to add another property under it.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-716\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge4-300x242.jpg\" alt=\"macchina.io EDGE Add Sub-Property\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge4-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge4-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge4-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge4-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Under <strong>Name<\/strong> enter <code>ports<\/code>, leave <strong>Value<\/strong> empty again, and press enter or click <strong>Add<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-717\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge5-300x242.jpg\" alt=\"macchina.io EDGE Settings\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge5-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge5-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge5-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge5-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Next, add another setting under <code>ports<\/code> with <strong>Name<\/strong> <code>ciss0<\/code>, leave <strong>Value<\/strong> empty, and then add another setting named <code>device<\/code>. This time, for&nbsp;<strong>Value <\/strong>enter <code>\/dev\/ttyACM0<\/code>. The final settings should then look like shown below. Don&#8217;t forget to click <strong>Save <\/strong>to commit the changes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-719\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge6-300x242.jpg\" alt=\"macchina.io EDGE Settings\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge6-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge6-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge6-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge6-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Next, return to the Launcher page by clicking the macchina.io logo in the header. The CISS bundle must be restarted in order to apply the configuration changes and make the device available. This is done from the <strong>Bundles<\/strong> app.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-720\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge7-300x242.jpg\" alt=\"macchina.io EDGE Launcher\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge7-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge7-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge7-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge7-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>In the list of bundles, locate the bundle named <strong>macchina.io CISS Sensors<\/strong> (scroll down, or use the Browser&#8217;s search function) and click the name.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-722\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge8-300x242.jpg\" alt=\"macchina.io EDGE Bundles\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge8-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge8-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge8-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge8-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>On the bundle&#8217;s page, click <strong>Stop.<\/strong>&nbsp;After new menu items for a stopped bundle appear, click <strong>Start<\/strong>. The CISS bundle will start again and use the updated configuration settings to connect to the CISS multi-sensor device.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-723\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge9-300x242.jpg\" alt=\"macchina.io EDGE CISS Bundle\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge9-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge9-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge9-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge9-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>To verify that the CISS sensors are now available, go back to the Launcher screen, by clicking the macchina.io logo in the header, then go to the <strong>Sensors &amp; Devices<\/strong> app.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-724\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge10-300x242.jpg\" alt=\"macchina.io EDGE Launcher\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge10-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge10-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge10-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge10-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>The sensors in the CISS multi-sensor device and their current values should now be visible, along with some other sensors default-enabled in macchina.io EDGE.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-725\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge11-300x242.jpg\" alt=\"macchina.io EDGE Sensors &amp; Devices\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge11-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge11-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge11-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge11-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<h2>Connecting to InfluxDB<\/h2>\n<p>With the sensor data available in macchina.io EDGE, now it&#8217;s time to get the data into InfluxDB. InfluxDB provides a relatively simple <a href=\"https:\/\/docs.influxdata.com\/influxdb\/v2.0\/write-data\/developer-tools\/api\/\" target=\"_blank\" rel=\"noopener\">HTTP-based protocol<\/a> for writing sensor data measurements into a database. This protocol can easily be implemented in a few tens of lines of JavaScript, using the built-in HTTP client feature in macchina.io EDGE.<\/p>\n<p>The full program can be found in a <a href=\"https:\/\/gist.github.com\/obiltschnig\/4596c742ac9a36c1fc74ad31e24be0d1\" target=\"_blank\" rel=\"noopener\">Gist<\/a> on GitHub, and I won&#8217;t replicate it here. It consists of three parts. In the first part, the InfluxDB protocol is implemented, using the built-in HTTP client. Most of the code there deals with properly formatting the measurement data for InfluxDB.<\/p>\n<p>The second part discovers the available sensor services, looking for generic temperature, humidity and illumination sensors, as well as an accelerometer. To keep the program simple, the program takes the first one of each of the available sensors found. A &#8220;real&#8221; program would be more stringent here and use more specific search queries for finding the sensors.<\/p>\n<p>Finally, the third part sets up two timers to periodically read the sensor values, and write them to InfluxDB. Temperature, humidity and illumination values are read at longer intervals (10 seconds), and all three values are written as a single measurement named <code>environmental<\/code>.<\/p>\n<p>Acceleration values are read with a higher rate (50 times per second). Measurements are first collected in an array and after 100 measurements have been obtained, all 100 measurements are written in a single <code>POST<\/code> request to InfluxDB. This reduces the overhead associated with HTTP requests, and is a good idea for higher-rate measurements to reduce overall system load. On a Raspberry Pi 4, reading 50 measurements per second and writing them to InfluxDB every 5 seconds hardly stresses the CPU at all (CPU load stays in the range from 2-5 %), so even much higher-rate measurements of the acceleration values are possible. I briefly tested a 500 Hz sample rate, writing to InfluxDB once a second (therefore, 500 measurements per POST request), and CPU load stayed well below 15 %. However, one factor to keep in mind on the Raspberry Pi is the SD card. SD cards not only have limited amount of space (at least compared to solid state disks, or good old hard disks), but also a have limited number of write cycles. So writing high-rate sensor data to an SD card could damage the SD card, if done over a longer period. To which extent this is an issue also depends on the particular model of SD card &#8211; some handle this better than others, and there are also industrial-grade SD cards that can take a lot of abuse.\u00a0<\/p>\n<p>To run the JavaScript program in macchina.io EDGE, open the <strong>Playground<\/strong> app and copy the code into the code editor.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-729\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge12-300x242.jpg\" alt=\"macchina.io EDGE Playground\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge12-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge12-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge12-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge12-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>Before running the JavaScript program (by clicking the <strong>Run<\/strong> button), a few more configuration settings must be defined, as these will be used by the program to obtain the credentials for connecting to InfluxDB.<\/p>\n<p>The three required settings are the name of the InfluxDB bucket,\u00a0<code>influxdb.bucket<\/code> (<code>edge-demo<\/code>), the InfluxDB organization name\u00a0<code>influxdb.org<\/code> (<code>macchina<\/code>) and the authentication token\u00a0<code>influxdb.token<\/code>. The values for the first two settings can be obtained from the initial InfluxDB configuration in the <code>docker-compose.yml<\/code> file. The token can be obtained by logging in to InfluxDB (initial username and password are in the <code>docker-compose.yml<\/code> file), going to <strong>Data<\/strong>, then selecting the <strong>Tokens<\/strong> tab, and clicking on <strong>macchina&#8217;s Token<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-730\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge13-300x242.jpg\" alt=\"macchina.io EDGE InfluxDB Settings\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge13-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge13-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge13-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge13-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>When running, the JavaScript program will write some log entries. These can be viewed in the <strong>Console<\/strong> app.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-731\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge14-300x242.jpg\" alt=\"macchina.io EDGE Console\" width=\"640\" height=\"516\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge14-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge14-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge14-768x619.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/edge14-1536x1237.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/p>\n<p>A script run directly from the Playground up will not be restarted automatically when macchina.io EDGE restarts. To fix this, it&#8217;s possible to export the script as a bundle, and to deploy that bundle to the macchina.io EDGE instance. This is done by clicking the <strong>Export Bundle<\/strong> button in the Playground. In the dialog that appears, enter suitable values (as shown below) and click the <strong>Export<\/strong> button. The bundle file will be downloaded to your browser&#8217;s Downloads folder.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-739 size-medium\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/export-300x186.jpg\" alt=\"Export Bundle\" width=\"300\" height=\"186\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/export-300x186.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/export-768x476.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/export.jpg 904w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>Don&#8217;t forget to stop the Playground script by clicking on the <strong>Stop<\/strong> button (otherwise you would have the same program running twice after the next step) and go to the <strong>Bundles<\/strong> app. In the Bundles app, click the Install button, then drag and drop the just downloaded bundle file into the drop area to upload and install it. Alternatively, you can also click the drop area to show a file browser dialog to select the bundle file. After installing the bundle, click the <strong>Start<\/strong> button to run it.<\/p>\n<h2>Creating a Dashboard<\/h2>\n<p>The final task now is to create a dashboard showing the stored sensor values. This can be done using the graphing and dashboard features available directly in InfluxDB 2. Alternatively, it would also be possible to install an additional container running <a href=\"https:\/\/grafana.com\" target=\"_blank\" rel=\"noopener\">Grafana<\/a>, which provides even more extensive graphing and dashboard features.<\/p>\n<p>I won&#8217;t go much into the detail of how to create a dashboard in InfluxDB. There&#8217;s plenty of <a href=\"https:\/\/docs.influxdata.com\/influxdb\/v2.0\/visualize-data\/\" target=\"_blank\" rel=\"noopener\">documentation<\/a> available, and even without reading the documentation, I was able to quickly come up with dashboard shown below by playing around in the InfluxDB web application.<\/p>\n<p><div id=\"attachment_733\" style=\"width: 650px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-733\" class=\"wp-image-733\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-300x242.jpg\" alt=\"InfluxDB Dashboard\" width=\"640\" height=\"517\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-300x242.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-768x620.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-1536x1241.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><p id=\"caption-attachment-733\" class=\"wp-caption-text\">A simple sensor data dashboard built with InfluxDB 2.<\/p><\/div><\/p>\n<p>Another possibility that InfluxDB provides is monitoring the resource usage (CPU, memory, used space on SD card, etc.). This can be done by installing and running <a href=\"https:\/\/www.influxdata.com\/time-series-platform\/telegraf\/\" target=\"_blank\" rel=\"noopener\">Telegraf<\/a>, an agent that collects system metrics for InfluxDB, directly on Raspberry Pi OS (not in a container).\u00a0<\/p>\n<p>This completes the two part series about building an IoT edge computing application with macchina.io EDGE, macchina.io Remote Manager, InfluxDB and Portainer. I have shown how to set Docker on a Raspberry Pi, set up the containers with Docker Compose, connect a multi-sensor device to macchina.io EDGE and write the sensor values to an InfluxDB time-series database. An important aspect of this demo is that with macchina.io Remote Manager, all web apps provided by the different applications can be accessed remotely, even if the Raspberry Pi would be located in a different network. Furthermore, I have only shown the features available in macchina.io EDGE out of the box (in the provided Docker image). macchina.io EDGE is highly customizable and provides very comprehensive APIs for building much more sophisticated edge applications by combining C++ and JavaScript.\u00a0<\/p>\n<p>A final word on memory usage. Total memory usage is about 320 MB RAM on the Raspberry Pi, with the majority (approx. 100 MB) used by InfluxDB. macchina.io EDGE uses less than 40 MB (with most of the memory actually used by the JavaScript engine), and the Remote Manager Gateway container about 4 MB. So, in practice, a container-based approach seems feasible with device with at least 512 GB of RAM. With macchina.io EDGE running standalone and without JavaScript support, memory usage even goes down below 16 MB, making it a great platform even for smaller Linux-based devices.<\/p>\n<p><div id=\"attachment_740\" style=\"width: 650px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-740\" class=\"wp-image-740\" src=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/portainer-300x200.jpg\" alt=\"Monitoring container resources with Portainer\" width=\"640\" height=\"427\" srcset=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/portainer-300x200.jpg 300w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/portainer-scaled.jpg 1024w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/portainer-768x512.jpg 768w, https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/portainer-1536x1024.jpg 1536w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><p id=\"caption-attachment-740\" class=\"wp-caption-text\">Monitoring macchina.io EDGE resource usage with Portainer<\/p><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Welcome back to the second and final part of my article where I describe how I&#8217;ve built a simple edge computing application by combining macchina.io EDGE&nbsp;and&nbsp;macchina.io Remote Manager with InfluxDB, a widely used time-series database, with everything running in Docker containers that can be managed via Portainer. In the first part, I described how I&#8217;ve [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":733,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_eb_attr":"","footnotes":""},"categories":[41,3,37,31],"tags":[],"class_list":["post-707","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-edge-computing","category-internet-of-things","category-macchina-io","category-my-devices-net"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Building an IoT Edge Application with macchina.io and Docker (Part 2) - macchina.io Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Building an IoT Edge Application with macchina.io and Docker (Part 2) - macchina.io Blog\" \/>\n<meta property=\"og:description\" content=\"Welcome back to the second and final part of my article where I describe how I&#8217;ve built a simple edge computing application by combining macchina.io EDGE&nbsp;and&nbsp;macchina.io Remote Manager with InfluxDB, a widely used time-series database, with everything running in Docker containers that can be managed via Portainer. In the first part, I described how I&#8217;ve [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/\" \/>\n<meta property=\"og:site_name\" content=\"macchina.io Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-11T20:29:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-07-14T07:35:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"827\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00fcnter Obiltschnig\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@macchina_io\" \/>\n<meta name=\"twitter:site\" content=\"@macchina_io\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00fcnter Obiltschnig\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/\"},\"author\":{\"name\":\"G\u00fcnter Obiltschnig\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#\\\/schema\\\/person\\\/85e732123d4102689b6436b2807a626b\"},\"headline\":\"Building an IoT Edge Application with macchina.io and Docker (Part 2)\",\"datePublished\":\"2021-07-11T20:29:50+00:00\",\"dateModified\":\"2021-07-14T07:35:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/\"},\"wordCount\":2108,\"publisher\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/macchina.io\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/influx1-scaled.jpg\",\"articleSection\":[\"Edge Computing\",\"Internet of Things\",\"macchina.io\",\"my-devices.net\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/\",\"url\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/\",\"name\":\"Building an IoT Edge Application with macchina.io and Docker (Part 2) - macchina.io Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/macchina.io\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/influx1-scaled.jpg\",\"datePublished\":\"2021-07-11T20:29:50+00:00\",\"dateModified\":\"2021-07-14T07:35:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/#primaryimage\",\"url\":\"https:\\\/\\\/macchina.io\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/influx1-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/macchina.io\\\/blog\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/influx1-scaled.jpg\",\"width\":1024,\"height\":827,\"caption\":\"InfluxDB Dashboard\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/internet-of-things\\\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/macchina.io\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Building an IoT Edge Application with macchina.io and Docker (Part 2)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/macchina.io\\\/blog\\\/\",\"name\":\"macchina.io Blog\",\"description\":\"Internet of Things, edge computing, IoT device software, C++\",\"publisher\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/macchina.io\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#organization\",\"name\":\"macchina.io\",\"url\":\"https:\\\/\\\/macchina.io\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/macchina.io\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/macchina.io_emp_logo.png\",\"contentUrl\":\"https:\\\/\\\/macchina.io\\\/blog\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/macchina.io_emp_logo.png\",\"width\":1537,\"height\":529,\"caption\":\"macchina.io\"},\"image\":{\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/macchina_io\",\"https:\\\/\\\/www.linkedin.com\\\/showcase\\\/37869369\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/macchina.io\\\/blog\\\/#\\\/schema\\\/person\\\/85e732123d4102689b6436b2807a626b\",\"name\":\"G\u00fcnter Obiltschnig\",\"sameAs\":[\"http:\\\/\\\/www.appinf.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Building an IoT Edge Application with macchina.io and Docker (Part 2) - macchina.io Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/","og_locale":"en_US","og_type":"article","og_title":"Building an IoT Edge Application with macchina.io and Docker (Part 2) - macchina.io Blog","og_description":"Welcome back to the second and final part of my article where I describe how I&#8217;ve built a simple edge computing application by combining macchina.io EDGE&nbsp;and&nbsp;macchina.io Remote Manager with InfluxDB, a widely used time-series database, with everything running in Docker containers that can be managed via Portainer. In the first part, I described how I&#8217;ve [&hellip;]","og_url":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/","og_site_name":"macchina.io Blog","article_published_time":"2021-07-11T20:29:50+00:00","article_modified_time":"2021-07-14T07:35:17+00:00","og_image":[{"width":1024,"height":827,"url":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-scaled.jpg","type":"image\/jpeg"}],"author":"G\u00fcnter Obiltschnig","twitter_card":"summary_large_image","twitter_creator":"@macchina_io","twitter_site":"@macchina_io","twitter_misc":{"Written by":"G\u00fcnter Obiltschnig","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/#article","isPartOf":{"@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/"},"author":{"name":"G\u00fcnter Obiltschnig","@id":"https:\/\/macchina.io\/blog\/#\/schema\/person\/85e732123d4102689b6436b2807a626b"},"headline":"Building an IoT Edge Application with macchina.io and Docker (Part 2)","datePublished":"2021-07-11T20:29:50+00:00","dateModified":"2021-07-14T07:35:17+00:00","mainEntityOfPage":{"@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/"},"wordCount":2108,"publisher":{"@id":"https:\/\/macchina.io\/blog\/#organization"},"image":{"@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-scaled.jpg","articleSection":["Edge Computing","Internet of Things","macchina.io","my-devices.net"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/","url":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/","name":"Building an IoT Edge Application with macchina.io and Docker (Part 2) - macchina.io Blog","isPartOf":{"@id":"https:\/\/macchina.io\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/#primaryimage"},"image":{"@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-scaled.jpg","datePublished":"2021-07-11T20:29:50+00:00","dateModified":"2021-07-14T07:35:17+00:00","breadcrumb":{"@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/#primaryimage","url":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-scaled.jpg","contentUrl":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2021\/07\/influx1-scaled.jpg","width":1024,"height":827,"caption":"InfluxDB Dashboard"},{"@type":"BreadcrumbList","@id":"https:\/\/macchina.io\/blog\/internet-of-things\/building-an-iot-edge-application-with-macchina-io-and-docker-part-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/macchina.io\/blog\/"},{"@type":"ListItem","position":2,"name":"Building an IoT Edge Application with macchina.io and Docker (Part 2)"}]},{"@type":"WebSite","@id":"https:\/\/macchina.io\/blog\/#website","url":"https:\/\/macchina.io\/blog\/","name":"macchina.io Blog","description":"Internet of Things, edge computing, IoT device software, C++","publisher":{"@id":"https:\/\/macchina.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/macchina.io\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/macchina.io\/blog\/#organization","name":"macchina.io","url":"https:\/\/macchina.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/macchina.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2018\/08\/macchina.io_emp_logo.png","contentUrl":"https:\/\/macchina.io\/blog\/wp-content\/uploads\/2018\/08\/macchina.io_emp_logo.png","width":1537,"height":529,"caption":"macchina.io"},"image":{"@id":"https:\/\/macchina.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/macchina_io","https:\/\/www.linkedin.com\/showcase\/37869369"]},{"@type":"Person","@id":"https:\/\/macchina.io\/blog\/#\/schema\/person\/85e732123d4102689b6436b2807a626b","name":"G\u00fcnter Obiltschnig","sameAs":["http:\/\/www.appinf.com"]}]}},"_links":{"self":[{"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/posts\/707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/comments?post=707"}],"version-history":[{"count":17,"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/posts\/707\/revisions"}],"predecessor-version":[{"id":749,"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/posts\/707\/revisions\/749"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/media\/733"}],"wp:attachment":[{"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/media?parent=707"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/categories?post=707"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/macchina.io\/blog\/wp-json\/wp\/v2\/tags?post=707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}