Sending Telemetry to Azure IoT Hub

As I promised in my previous article, I will show you how to connect a temperature sensor to a Raspberry Pi, read real telemetry data, and send it to the Azure IoT Hub:

I am using a Raspberry Pi 4, a DHT11 temperature sensor, and a GPIO Extension Board to connect the sensor to the Raspberry. We’ll be using Azure IoT Python SDK enabling connection to the Azure IoT Hub. And we need DHT11 Python library for reading temperature and humidity from DHT11 sensor on Raspberry Pi.

First, we need to create an IoT Hub and to set up a Raspberry Pi. Repeat the steps described in my article “Connect Raspberry Pi 4 to Azure IoT Hub“:

Connect the sensor to Raspberry Pi

The DHT11 sensor can collect temperature and humidity data. Use the following wiring to connect the sensor to GPIO pins:

DHT11 Sensor pinsGPIO pins
Vcc (+)5V (pin 2)
Ground (-)GND (pin 6)
DataGPIO17 (pin 11)

Turn on your Raspberry Pi and connect it to your network.

Run the application

When it is done, clone the azure-iot-blog GitHub repository into a folder in your Raspberry Pi:

git clone https://github.com/jevgenij-p/azure-iot-blog.git

Find the Python application send_sensor_data.py in the raspberry-to-iot-hub/send-telemetry folder:

import asyncio
import time
import board
import RPi.GPIO as GPIO
import dht11
from azure.iot.device import Message
from azure.iot.device.aio import IoTHubDeviceClient

CONNECTION_STRING = ""

DELAY = 5
TEMPERATURE = 20.0
HUMIDITY = 60
PAYLOAD = '{{"temperature": {temperature}, "humidity": {humidity}}}'

async def main():

    try:
        # Create instance of the device client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)

        # Initialize GPIO
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        GPIO.cleanup()

        # Read data using pin GPIO17
        dhtDevice = dht11.DHT11(pin=17)

        print("Simulated device started. Press Ctrl-C to exit")
        while True:

            try:
                result = dhtDevice.read()
                if result.is_valid():
                    temperature = result.temperature
                    humidity = result.humidity

                    data = PAYLOAD.format(temperature=temperature, humidity=humidity)
                    message = Message(data)

                    # Send a message to the IoT hub
                    print(f"Sending message: {message}")
                    await client.send_message(message)
                    print("Message successfully sent")
                else:
                    # print("Error: %d" % result.error_code)
                    continue

                await asyncio.sleep(DELAY)

            except KeyboardInterrupt:
                print("Simulated device stopped")
                GPIO.cleanup()
                break

    except Exception as error:
        print(error.args[0])

if __name__ == '__main__':
    asyncio.run(main())

IMPORTANT

Make sure you copy-paste the Primary Connection String you saved when you created your IoT device, into the quotes in the Line 9.

Now, open your Raspberry Pi terminal and install Python packages:

pip3 install azure-iot-device
pip3 install asyncio
pip2 install dht11

Run the application:

python3 send_sensor_data.py

If everything is configured and connected correctly, the program will be sending sensor data every 5 seconds to your IoT hub:

Open Azure Portal, find your IoT hub, and select Overview in the left navigation menu. You should see number of messages received by your IoT hub from your device:

Stay tuned. I’ll continue the “Azure IoT” series.

Connect Raspberry Pi 4 to Azure IoT Hub

I have a Raspberry Pi 4 running Raspbian and I wanted to implement the simplest IoT Architectural pattern of direct connecting an IoT device to an Azure IoT Hub:

Create IoT Hub

First, we need to create an Azure IoT Hub. Login to Microsoft Azure Portal, find an “IoT Hub” in the Azure Marketplace, and create it:

Then, we need to specify as existing Resource Group, or create a new one, specify a Region closest to you, and a globally unique IoT hub name:

On the Management tab, select F1: Free tier and press Review + create button to create the hub:

When the hub is created, we need to create a device identity in the identity registry in your IoT hub. In the left navigation menu, open IoT devices, and then press New to add a device:

In Create a device panel, provide a name for your device (Device ID), and press Save:

Soon, you will see your device in IoT devices:

Click on it to open its properties. You need to copy its Primary Connection String and save it somewhere in a text file. We will need this string a bit later to establish connection between your device and the IoT hub.

Set up your Raspberry Pi

Before we continue, you need to prepare you Raspberry Pi. First, make sure SSH and SPI interfaces are enabled in your Raspberry Pi Configuration.

You can use PuTTY to connect to your Raspberry. Copy the IP address of your Raspberry Pi into the Host name and select SSH as the connection type:

Then, open your terminal and log in to your device:

Run the application

I created a simple Python application, sending simulated data to the Azure IoT hub. The code is in the azure-iot-blog GitHub repository. You can clone it into a folder in your Raspberry Pi:

git clone https://github.com/jevgenij-p/azure-iot-blog.git

Or, you can clone it to a folder on your computer, and copy only the send_simulated_messages.py file to the Raspberry Pi using WinSCP (if you are working on a machine with Windows).

The Python application is send_simulated_messages.py in the raspberry-to-iot-hub/send-telemetry folder:

import asyncio
import random
from azure.iot.device import Message
from azure.iot.device.aio import IoTHubDeviceClient

CONNECTION_STRING = ""

TEMPERATURE = 20.0
HUMIDITY = 60
PAYLOAD = '{{"temperature": {temperature}, "humidity": {humidity}}}'

async def main():

    try:
        # Create instance of the device client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)

        print("Simulated device started. Press Ctrl-C to exit")
        while True:

            temperature = round(TEMPERATURE + (random.random() * 15), 2)
            humidity = round(HUMIDITY + (random.random() * 20), 2)
            data = PAYLOAD.format(temperature=temperature, humidity=humidity)
            message = Message(data)

            # Send a message to the IoT hub
            print(f"Sending message: {message}")
            await client.send_message(message)
            print("Message successfully sent")

            await asyncio.sleep(5)

    except KeyboardInterrupt:
        print("Simulated device stopped")

if __name__ == '__main__':
    asyncio.run(main())

IMPORTANT

Make sure you copy-paste the Primary Connection String you saved before, into the quotes in the Line 6.

Next, open your Raspberry Pi terminal and install some Python packages:

pip3 install azure-iot-device
pip3 install asyncio

Azure IoT Python SDK is a library, providing functionality for communicating between IoT devices and the Azure IoT Hub.

Now, you can run the application:

python3 send_simulated_messages.py

The program is sending data every 5 seconds to your IoT hub:

Let it work a few minutes and open Microsoft Azure Portal. Find your IoT hub, and select Overview in the left navigation menu to see your IoT Hub Usage:

Now you know how to send telemetry data (simulated in this case) to your Azure IoT hub. Next time I will show you how to send real data.

Temperature Sensor for Windows 10 IoT Core

I know it is not a rocket science to connect a sensor to your computer and read its measurements. But if you haven’t been doing it before, I will show you a simple experiment with a Raspberry Pi and a temperature sensor.

temp-sensor

I used a Raspberry Pi 3 Model B, though Pi 2 would be of use as well. If you already have Windows 10 IoT Core installed on your Raspberry Pi – that’s fine. If not, there is a good guide how to install it: How to install Windows 10 IoT Core on Raspberry Pi 3. The only remark I would add is my advice to format your MicroSD card with an SD Memory Card Formatter before installing any OS on it.

temp-sensor1

Next, we will need a sensor. I bought a cheap (and not too accurate) Humidity and Temperature Sensor DHT11. It has three pins:

  1. Power supply 3 – 5.5 V DC (+)
  2. Serial data output
  3. Ground (-)

Having everything in hand, connect the sensor to the Raspberry Pi as shown below:

temp-sensor-connection

When everything is set up, connected and switched on, open Windows 10 IoT Core Dashboard and connect to your Raspberry Pi (see instructions if something went wrong).

Find your device in the list, right-click on it and select Open in Device Portal. This will launch the Windows Device Portal. The Windows Device Portal lets you manage your device remotely over a network. In order to enable remote display functionality on your Raspberry, choose Remote from the options on the left, and Enable Window IoT Remote Server.

win-core-screenInstall the Windows IoT Remote Client on your workstation and run it. Connect to your Raspberry Pi device through the client. You should see a window like this one on the left.

Now, you can download a source code of the TemperatureSensor project from GitHub: https://github.com/jevgenij-p/blog/tree/master/Temperature%20Sensor.

Open the project in the Visual Studio 2017 and build it. You will find a separate library Sensors.Dht, written by Daniel Porrey. I used his code to read sensor’s data.

Set the solution platform to ARM and the target as Remote Machine in the tool bar:

vs-menu

Open the TemperatureSensor project properties and choose Debug page. Check that Remote machine field contains your Raspberry Pi device name or IP address:

vs-debug-properties

Press F5 to build and deploy the application to your Raspberry Pi. The sensor should start sending temperature and humidity values every second, and the Windows IoT Remote Client will show a screen like this one:

sensor-screen

Voila!

The source code of the Visual Studio project can be found there download