DEV Community

Send telemetry data from e-RT3 Plus to Azure IoT hub

In this tutorial, we are going to establish telemetry communication between e-RT3 Plus and azure IoT Hub. There
are some basic pre-requisites for this tutorial as followed -

  1. Azure IoT Hub
  2. Python
  3. SSH communication between e-RT3 Plus and PC

In this tutorial, we have used -

  1. Azure Portal to Create an IoT Hub.
  2. Azure Cloud Shell to Create a device and to get the Connection String from the created device.
  3. Visual Studio Code to write a Python script to send the telemetry data.
  4. Azure IoT explorer to verify the received data.

Table of contents

In this tutorial, we are going to cover the following things -


Configure Azure IoT hub

This section is to describes how to configure an IoT hub in Azure Portal. This section is divided into two parts -

  1. Create an IoT hub
  2. Register a device in the IoT hub

Create an IoT hub

To create an IoT hub in Azure portal we need to follow the following steps -

  1. Sign in to your Azure portal. After a successful login to the portal, your web browser should look like as follow - Screen capture after signed in to azure portal

Note: If your web browser does not look like the same as mentioned here, then please consider to refer the official documentation provided by Microsoft.

  1. Create an IoT Hub resource. To create an IoT hub please select the + Create a resource button.
    Screen capture for creating a resource button
    After clicking this button it will navigate to the Azure marketplace.
    Screen capture for search box of azure marketplace
    Type IoT hub in the search box and select IoT Hub from the drop-down option.
    Screen capture for search box of azure marketplace
    Once you select the IoT Hub from the list it will navigate to the hub page. After successful navigation click on the Create button.
    Screen capture - create hun

  2. Complete the IoT Hub form.
    Screen capture - hub form
    On the Basics tab, you need to fill-up the form provided by Azure.
    Once you complete the review click on the Create button to create the hub (This might take some time to complete).

Register a device in the IoT hub

To register a device inside your IoT hub you need to follow the following steps -

  1. Open a new tab and navigate to Azure Cloud Shell.

  2. Now, checked whether your account has an azure-iot extension or not by using the following command

az extension list
Enter fullscreen mode Exit fullscreen mode
  1. If you can't find an extension named azure-iot then you should install it by using the following command
az extension add --name azure-iot
Enter fullscreen mode Exit fullscreen mode
  1. Execute the following command, Where, YOUR_HUB_NAME is the name of the IoT hub you provided during the creation of the IoT hub and YOUR_DEVICE_ID This is the name of the device you're registering.
az iot hub device-identity create --hub-name YOUR_HUB_NAME --device-id YOUR_DEVICE_ID
Enter fullscreen mode Exit fullscreen mode
  1. To get the device connection string, execute the following command (This connection string will be required by the python script, so take a backup of your connection string into some file).
az iot hub device-identity connection-string show --hub-name YOUR_HUB_NAME --device-id YOUR_DEVICE_ID --output table
Enter fullscreen mode Exit fullscreen mode

Note: To create the device instance into Azure IoT Hub we are using Azure Cloud Shell. Without accessing the Azure Cloud Shell, you might lose your connect string. It's always a good idea to take a backup of your connection string into somewhere else like a temporary file.

Send simulated telemetry data with python

To send the telemetry data, we are using the Python script. For this step please Make sure that you have installed pip3 and venv on your e-RT3 Plus device. pip3 comes by default with the e-RT3 Plus OS. Please note that the e-RT3 Plus OS file is only accessible to the registered member of the partner portal.

In case you did not install the python virtual module (venv) previously, then you can install it by using the following steps -

Enabling SUDO user

When you are working as a normal user and you want to use commands that require root privileges, you usually add sudo to the beginning, but you may be rejected as follows -

# Working with the General User username
$sudo apt update
[sudo] password for username:     # Enter Password
username is not in the sudoers file.  This incident will be > reported.

If that is the case, you could resolve it by using the following steps -

Since the configuration is done as root, switch to the root user with the su command once.

$su
Password:     # Enter root password
root @ ubuntu:/home/username #

Edit the configuration file with the visudo command -

visudo

Add the following lines at the end of the configuration file and save it -
Replace username with your username.

username ALL = (ALL) ALL     # replace username with your username

Log out of root and see if the sudo command works -

root @ ubuntu:/home/username # exit
exit
username @ ubuntu: ~ $sudo apt update
[sudo] password for username:     # Enter Password
Get: 1 http://ports.ubuntu.com/ubuntu-ports bionic InRelease [242 kB]
...

username @ ubuntu: ~ $

If you have configured your ert3 user with sudo permissions, then you may try to use the following commands to install the same -

sudo apt update
sudo apt install python3-venv

Once the installation is completed you are ready to create a virtual python environment. If you need Proxy settings, please visit the supplementary section.

Create a python virtual environment

To create a python virtual environment, first, you have to navigate to your desire folder location (workspace). Once navigated please execute the following command to create a python virtual environment -

python3 -m venv YOUR_ENV_NAME
Enter fullscreen mode Exit fullscreen mode

Once you have created a virtual environment, you may activate it by using the following command -

source YOUR_ENV_NAME/bin/activate
Enter fullscreen mode Exit fullscreen mode

After activation is completed your terminal should be like as follow -

(YOUR_ENV_NAME)username@ubuntu: ~ $
Enter fullscreen mode Exit fullscreen mode

Once you have activated the virtual environment, you may want to create a python script to send the telemetry data. To create a python script, you can execute the following command -

touch YOUR_FILE_NAME.py
Enter fullscreen mode Exit fullscreen mode

Python code to send the simulated data

Once you have access to the "e-RT3 Plus" and able to execute a python script, then it's time to send some simulated data to Azure IoT Hub.

  1. To send simulated data we are going to use a python module provided by azure called azure-iot-device. In your terminal window, run the following command to install azure-iot-device if required.
   pip3 install azure-iot-device
Enter fullscreen mode Exit fullscreen mode

Once the installation is completed, then start writing the code to the created file.

  1. first of all we need to import the module by using the following line
   from azure.iot.device import IoTHubDeviceClient, Message
Enter fullscreen mode Exit fullscreen mode
  1. Then. declare a variable to store the device connection string (for reference you may follow the 5th step of Register a device in the IoT hub)
   CONNECTION_STRING = YOUR_CONNECTION_STRING
Enter fullscreen mode Exit fullscreen mode
  1. After that, create a client instance by using the following line
   # Method to initialize the iot hub client instance
   def iothub_client_init():
       # Create an IoT Hub client
       client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
       # return the client instance
       return client
Enter fullscreen mode Exit fullscreen mode
  1. Next, add the following function, which will send the telemetry data to Azure IoT hub.
   def iothub_client_telemetry_sample_run():
     # crete a client instance
     client = iothub_client_init()
     # create a Message to send to the IoT Hub
     message = Message("YOUR_TELEMETRY_DATA_AS_STRING")
     # Send the message to IoT hub
     client.send_message(message)
Enter fullscreen mode Exit fullscreen mode
  1. Call the iothub_client_telemetry_sample_run from the main method to send the telemetry data as followed -
   if __name__ == '__main__':
     iothub_client_telemetry_sample_run()
Enter fullscreen mode Exit fullscreen mode
  1. Complete sample code with the simulated data will look as follow -
   import random
   import time
   # Import azure IoT hub client and Message from `azure-iot-device`
   from azure.iot.device import IoTHubDeviceClient, Message

   # Your connection string of the IoT Device
   CONNECTION_STRING="YOUR_CONNECT_STRING"

   # Initializing the iot hub client instance
   def iothub_client_init():
       # Create an IoT Hub client with connection string
       client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
       # returning the client
       return client

   def iothub_client_telemetry_sample_run():
       try:
           # crete a client instance
           client = iothub_client_init()
           print ( "IoT Hub device sending messages, press Ctrl+C to exit" )
           while True:
               # create a Message to send to the IoT Hub
               message = Message("YOUR_TELEMETRY_DATA_AS_STRING")
               # Create a custom property with the Message payload
               message.custom_properties["myCustomProp"] = (random.random() * 15)
               # Send the message to IoT hub
               print( "Sending message: ")
               #print data and both system and application (custom) properties
               for property in vars(message).items():
                   if all(property):
                       print("    {0}".format(property))
               client.send_message(message)
               print ( "Message successfully sent" )
               time.sleep(10)
       except KeyboardInterrupt:
           print ( "IoTHubClient sample stopped" )

   if __name__ == '__main__':
       iothub_client_telemetry_sample_run()
Enter fullscreen mode Exit fullscreen mode

Note: You may require proxy setup to send the telemetry data to azure could. In that case please replace the iothub_client_init() function with the following code -

   from azure.iot.device import ProxyOptions
   import socks

   def iothub_client_init():
       proxy_opts = ProxyOptions(
           proxy_type=socks.HTTP,
           proxy_addr="YOUR_PROXY_ADDRESS",
           proxy_port=YOUR_PROXY_PORT,
           proxy_username="YOUR_PROXY_USERNAME",
           proxy_password="YOUR_PROXY_PASSWORD"
       )
       # Create an IoT Hub client with connection string
       client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING, websockets=True, proxy_options=proxy_opts)
       # returning the client
       return client
Enter fullscreen mode Exit fullscreen mode
  1. Save the file and run the script by using the following command -
   python3 YOUR_FILE_NAME.py
Enter fullscreen mode Exit fullscreen mode
  1. After executing the script your console might like as follow -
   (YOUR_ENV_NAME) username@ubuntu:~/workspace$ python3 YOUR_FILE_NAME.py
   IoT Hub device sending messages, press Ctrl+C to exit
   Sending message:
       ('data', 'YOUR_TELEMETRY_DATA_AS_STRING')
       ('custom_properties', {'myCustomProp': 13.066109804837703})
   Message successfully sent
   Sending message:
       ('data', 'YOUR_TELEMETRY_DATA_AS_STRING')
       ('custom_properties', {'myCustomProp': 11.664970897921908})
   Message successfully sent
Enter fullscreen mode Exit fullscreen mode

Read the telemetry data from the IoT hub

Once telemetry data successfully updated to the Azure IoT hub You may verify it by using azure-iot-explorer. Microsoft has provided very good documentation on this software please, read more about it by clicking this link.

Once, you have installed and able to connect to the IoT hub click on the Telemetry tab and hit the start button to read those telemetry data.

Screen capture - Explorer view

Supplementary

Proxy settings

Personally for me, one of the most difficult things is to configure the Proxy settings, and also I think this varies from environment to environment. Here I'm going to mention my setting for this e-RT3 Plus device.

  1. Open a Terminal window where you need proxy access.
  2. Set and export the HTTP_PROXY variable.
   export HTTP_PROXY=USERNAME:PASSWORD@your.proxy.server:port
Enter fullscreen mode Exit fullscreen mode
  1. Set and export the HTTPS_PROXY variable.
   export HTTPS_PROXY=USERNAME:PASSWORD@your.proxy.server:port
Enter fullscreen mode Exit fullscreen mode
  1. Set and export the NO_PROXY variable to prevent local traffic from being sent to the proxy.
   export NO_PROXY=localhost,127.0.0.1,*.my.lan.domain
Enter fullscreen mode Exit fullscreen mode

If Proxy settings are made, add the -E option to inherit environment variables and execute

# apt command example
sudo  -E apt update
Enter fullscreen mode Exit fullscreen mode

Once completed, Use the following command to delete the environment variables -

unset HTTP_PROXY HTTPS_PROXY NO_PROXY
Enter fullscreen mode Exit fullscreen mode

Conclusion

This is an entry-level python script to upload the telemetry data which might require some pre-knowledge of e-RT3 Plus and Azure IoT hub.

Reference

1. Azure Tutorial

2. Azure IoT Explorer

3. Python Virtual Environments and Packages

4. Azure SDK for Python

Top comments (0)