Open main menu

DAVE Developer's Wiki β

Changes

Introduction
==Introduction==
In essence, this Technical Note (TN) is very similar to [[MISC-TN-024: Automated test equipment (ATE) monitoring with SBCSPG gateway and ThingsBoard IoT platform|this one''MISC-TN-024: Automated test equipment (ATE) monitoring with SBCSPG gateway and ThingsBoard IoT platform'']]. There is a noticeable difference, however, as a different software stack was used on the edge device. In this case, [https://www.lfedge.org/projects/fledge/ LF EdgeFledge] was utilized.
==Testbed==
The edge device is the [[MISC-TN-004:_Running_Debian_(armbian)_on_SBCSPG#The_hardware_platform|SBCSPG gateway]] running Debian Bullseye. To deploy this distribution onto the target, the same approach described [[ORCA-TN-001_—_Running_Armbian_Bullseye_(Debian_11)|here]] was used. Unlike Orca SBC, SBCSPG is based on a 32-bit ARM Cortex-A7 processor, though. As such, a [https://mirrors.dotsrc.org/armbian-dl/tritium-h3/archive/Armbian_22.11.1_Tritium-h3_bullseye_current_5.15.80_minimal.img.xz different image] was used.
To install Fledge, the <code>apt</code>-based approach described [https://fledge-iot.readthedocs.io/en/latest/quick_start/installing.html here] was followed. It is worth to remember that some dependencies were handled manually. For instance, <code>autoconf</code> and <code>libtool</code> packages were installed manually.
===Enabling the connection to the PLC===
As described in [[MISC-TN-024: Automated test equipment (ATE) monitoring with SBCSPG gateway and ThingsBoard IoT platform|''MISC-TN-024'']], the PLC we want to talk to is connected to a different subnet, namely 192.168.30.0/24. For testing the connection to the PLC, after adding the required subnet configuration, the <code>modbus</code> command line tool was used, which is provided by the <code>modbus_cli</code> package. In the following example, the register mapped ad the address 300 is read.
<pre class="board-terminal">
root@sbcspg:/usr/local/fledge/python/fledge/plugins/north# ip addr add 192.168.30.253/24 dev eth0 label eth0:1
rootarmbian@sbcspg:~/devel/fledge$ pip install modbus_cliDefaulting to user installation because normal site-packages is not writeableRequirement already satisfied: modbus_cli in /home/armbian/.local/lib/python3.9/site-packages (0.1.8)Requirement already satisfied: colorama in /home/armbian/.local/lib/python3.9/site-packages (from modbus_cli) (0.4.6)Requirement already satisfied: umodbus in /home/armbian/.local/lib/python3.9/site-packages (from modbus_cli) (1.0.4)Requirement already satisfied: pyserial~=3.4 in /usr/local/lib/python3.9/dist-packages (from umodbus->modbus_cli) (3.5) [notice] A new release of pip is available: 23.0 -> 23.0.1[notice] To update, run: python3 -m pip install --upgrade pip...armbian@sbcspg:~$ ./.local/bin/modbus 192.168.30.42:502 300Parsed 0 registers definitions from 1 files300: 32 0x20</pre> We then configured Fledge in order to read periodically a couple of PLC's registers. Please note that this is a no-code operation as it is carried out with the help of the native web-based Fledge UI. To access PLC exposed data, the Fledge's <code>modbustcp</code> South plugin was used. Please note that also we had to patch it manually to solve a bug that prevented it from working properly. The patch is detailed [https://github.com/fledge-iot/pythonfledge-south-modbustcp/fledgepull/plugins26/north# history files here]. To make the change effective, we disabled and re-enabled the plugin via the web interface.  [[File:SBCSPG-Fledge-2.png| grep mosqcenter|thumb|600x600px|Installing the <code>modbustcp</code> South plugin.]] 205 history [[File:SBCSPG-Fledge-3.png|center|thumb| grep mosq600x600px|Configuring the plugin]][[File:SBCSPG-Fledge-4.png|center|thumb|600x600px|Configuring the plugin.]][[File:SBCSPG-Fledge-5.png|center|thumb|600x600px|The plugin is enabled.]][[File:SBCSPG-Fledge-6.png|center|thumb|600x600px|Fledge provides a native web interface to visualize collected data. ]]  === Enabling the connection to ThingsBoard IoT platform ===In order to upload collected data to ThingsBoard platform, a simple North plugin was developed. To this end, the Microsoft Azure plugin was used as reference. The ThingsBoard North plugin is minimalist and '''unfit for a real-world production environment'''. Nevertheless, it was enough to perform the basic tests described in this document. Before testing this new plugin, the <code>mosquitto-clients</code> package was installed as the plugin invokes the <code>mosquitto_pub</code> command line tool. <pre class="board-terminal">
root@sbcspg:/usr/local/fledge/python/fledge/plugins/north# apt install mosquitto mosquitto-clients
Reading package lists... Done
Created symlink /etc/systemd/system/multi-user.target.wants/mosquitto.service → /lib/systemd/system/mosquitto.service.
Processing triggers for libc-bin (2.31-13+deb11u5) ...
</pre>
 
The following box shows the code of the ThingsBoard plugin.
 
<syntaxhighlight lang="python" class"mw-collapsible="" mw-collapsed"="">
# -*- coding: utf-8 -*-
 
""" ThingsBoard North plugin"""
import asyncio
import time
import json
import sys
import os
 
 
 
from fledge.common import logger
from fledge.plugins.north.common.common import *
 
__author__ = "Andrea Marson"
__copyright__ = "Copyright (c) 2023 DAVE Srl"
__license__ = "Apache 2.0"
__version__ = "${VERSION}"
 
_LOGGER = logger.setup(__name__)
 
_CONFIG_CATEGORY_NAME = "THINGSBOARD"
_CONFIG_CATEGORY_DESCRIPTION = "ThingsBoard Python North Plugin"
_DEFAULT_CONFIG = {
'plugin': {
'description': 'ThingsBoard North Plugin',
'type': 'string',
'default': 'thingsboard',
'readonly': 'true'
},
"tb_iot_platform_host": {
"description": "ThingsBoard IoT platform host.",
"type": "string",
"default": "put the public name of your host here",
"order": "2",
"displayName": "ThingsBoard IoT platform host"
},
"tb_mqtt_topic": {
"description": "MQTT topic",
"type": "string",
"default": "v1/devices/me/telemetry",
"order": "3",
"displayName": "MQTT topic",
'readonly': 'true'
},
"tb_device_access_token": {
"description": "Device's access token.",
"type": "string",
"default": "put your device's token here",
"order": "4",
"displayName": "Device's access token"
},
"source": {
"description": "Source of data to be sent on the stream.",
"type": "enumeration",
"default": "readings",
"options": ["readings"],
"order": "5",
"displayName": "Source",
'readonly': 'true'
}
}
armbian@sbcspgdef plugin_info():~$ pip install modbus_cli return { 'name': 'thingsboard', 'version': '2.1.0', 'type': 'north', 'interface': '1.0', 'config': _DEFAULT_CONFIG }
armbian@sbcspgdef plugin_init(data):~$ _LOGGER./info('Initializing ThingsBoard North Python Plugin') global thingsboard_north, config thingsboard_north = ThingsBoardNorthPlugin() config = data _LOGGER.local/bin/modbus 192.168.30.42:502 300info(f'config = {config}')Parsed 0 registers definitions from 1 files300: 33 0x21 return config
https://github.com/fledge-iot/fledge-south-modbustcp/pull/26/files"""Example of payload
Riavviare south plugin disable/enable per via grafica[{'reading': {'base_joint_temperature_deg_C': 34, 'base_joint_current_mA': 2042}, 'asset_code': 'Modbus TCP', 'id': 35613, 'ts': '2023-02-22 16:33:49.961000+00:00', 'user_ts': '2023-02-22 16:33:47.126849+00:00'}, {'reading': {'base_joint_temperature_deg_C': 34, 'base_joint_current_mA': 2045}, 'asset_code': 'Modbus TCP', 'id': 35614, 'ts': '2023-02-22 16:33:49.961000+00:00', 'user_ts': '2023-02-22 16:33:48.126817+00:00'}, {'reading': {'base_joint_temperature_deg_C': 34, 'base_joint_current_mA': 2060}, 'asset_code': 'Modbus TCP', 'id': 35615, 'ts': '2023-02-22 16:33:49.961000+00:00', 'user_ts': '2023-02-22 16:33:49.126827+00:00'}]
Example of upload
You can think about this This Technical Note (TN) as an evolution of the article mosquitto_pub -d -q 1 -h "$THINGSBOARD_HOST_NAME" -t "v1/devices/me/telemetry"[[MISC-TNu "$ACCESS_TOKEN" -021m '{"base_joint_temperature_deg_C": SBCSPG and ThingsBoard IoT]]33}'"""async def plugin_send(data, payload, stream_id): try: _LOGGER. The use case described here is a realinfo(f'ThingsBoard North Python -world application based on the same elementsplugin_send: {stream_id}')* [[MISC-TN-004: Running Debian _LOGGER.info(armbianf'data = {data}') on SBCSPG#The hardware platform|The _LOGGER.info(f'payload = {payload}'SBCSPG) _LOGGER.info(f'' industrial gatewayhost = {data["tb_iot_platform_host"]["value"] }')* [https for reading in payload://thingsboard _LOGGER.io/docs/ info(f'reading = {reading}'ThingsBoard IoT platform) _LOGGER.info(f'reading[reading] = {reading["reading"]}'] )* [https://thingsboard.io/docs/iot s = 'mosquitto_pub -d -gateway/whatq 1 -ish "' + data["tb_iot_platform_host"]["value"] + '" -iott "' + data["tb_mqtt_topic"]["value"] + '" -gateway/ u "'+ data["tb_device_access_token"]["value"] + 'ThingsBoard IoT gateway" -m \''+ str(reading["reading"]) + "\'" _LOGGER.info(f's = {s}') os.system(s) except asyncio. CancelledError as ex:The application is to monitor robotized DAVE Embedded Systems _LOGGER.exception(f'Exception occurred in plugin_send: {ex}' ATEs like the one shown [https) else://youtu _LOGGER.be/OoNiKgJXq00?t=409 hereinfo('payload sent successfully') return True, payload[len(payload-1)]["id"]., len(payload)
== Implementation ==def plugin_shutdown(data):The implementation is suitable for a production environment. Unlike what we did for [[MISC-TN-021: SBCSPG and ThingsBoard IoT|this TN]], in this case the ThingsBoard IoT platform was installed on the cloud, specifically on an AWS EC2 instance running Ubuntu Linux. The following diagram shows the complete solution. pass
[[File# TODO:ATE monitoring SBCSPG ThingsBoard.png|center|thumb|1000x1000px]]North plugin can not be reconfigured? (per callback mechanism)def plugin_reconfigure(): pass
Technically, the gateway can communicate with the ATE using different physical links and protocols. In the example under discussion, the physical link is Ethernet and the protocol is Modbus/TCP. The gateway retrieves periodically some data regarding the robotic arm used to move the device under test class ThingsBoardNorthPlugin(DUTobject). These data are [https://www.universal-robots.com/articles/ur/interface-communication/modbus-server/ exposed by the PLC governing the arm] and are documented in detail [https://s3-eu-west-1.amazonaws.com/ur-support-site/16377/ModBus%20server%20data.pdf here]. """ North ThingsBoard Plugin """
=== ThingsBoard IoT configuration ===
To install ThingsBoard IoT platform on an EC2 instance, [https://thingsboard.io/docs/user-guide/install/cluster/aws-self-hosted-setup/ these instructions] were followed.
=== ThingsBoard IoT gateway configuration ===
To run this esample, the most important module to configure was the [https://thingsboard.io/docs/iot-gateway/config/modbus/ Modbus connector]. The following box shows the resulting configuration file needed to poll some variables of the arm's joints (namely temperatures and currents).<syntaxhighlight lang="json">
armbian@sbcspg:~$ cat /etc/thingsboard-gateway/config/modbus.json
{
"master": {
"slaves": [
{
"host": "192.168.30.42",
"port": 502,
"type": "tcp",
"method": "socket",
"timeout": 35,
"byteOrder": "BIG",
"retries": true,
"retryOnEmpty": true,
"retryOnInvalid": true,
"pollPeriod": 5000,
"unitId": 1,
"deviceName": "UR5",
"sendDataOnlyOnChange": true,
"connectAttemptTimeMs": 5000,
"connectAttemptCount": 5,
"waitAfterFailedAttemptsMs": 300000,
"timeseries": [
{
"tag": "base_joint_temperature_deg_C",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": 300
},
{
"tag": "shoulder_joint_temperature_deg_C",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": 301
},
{
"tag": "base_joint_current_mA",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": 290
},
{
"tag": "shoulder_joint_current_mA",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": 291
},
{
"tag": "elbow_joint_current_mA",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": 292
},
{
"tag": "wrist1_joint_current_mA",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": 293
},
{
"tag": "wrist2_joint_current_mA",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": 294
},
{
"tag": "wrist3_joint_current_mA",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": 295
}
]
}
]
}
}
</syntaxhighlight>
 == Dashboards Visualization of uploaded data ==ThingsBoard IoT allows Similarly to create easily custom dashboards to visualize data. At what we did in [[http://ec2-15-160-47-190.euMISC-southTN-1.compute.amazonaws.com024:8080/dashboard/1178fb20Automated test equipment (ATE) monitoring with SBCSPG gateway and ThingsBoard IoT platform|''MISC-e56dTN-11ec-8592-e3cb29424137?publicId=28967df0-e56d-11ec-8592-e3cb29424137 this link024'']] such , we created a simple dashboard is available showing some temperatures and currents of to visualize in real-time on cloud side collected data as shown in the arm's jointsfollowing example.[[File:ATE monitoring SBCSPG ThingsBoard dashboard1-Fledge-8.png|center|thumb|600x600px|Visualization of uploaded data.]]
4,650
edits