Wednesday, April 7, 2021

Take actions based on IOT telemetry with IOT Hub, Event Grid and Logic App

This article is a continuation of my previous Post

With this article I'll explain how to notify users when a metric has reached a threshold value. In this example I will fire an email when the temperature exceeds 25c.

For this example also I'm using Raspberry Pi Azure IoT Online Simulator. (Kudos to the developers !!) 

In order to accomplish the task I need to cover following area

  • Configuration of IOT Hub to receive telemetry (Covered in previous post)
  • Creation of logic app to filter out relevant telemetry and notify
  • Connect IOT hub to Event Grid which uses WebHook to transfer IOT telemetry

Will start with the first part. Following are the steps I used create the logic app

Creation of Logic App

Step 1: Select when a HTTP request is received trigger

Click on Use sample payload to generate the schema link

Since we are expecting the telemetry payload, provide the following. You can get more information Here


{
    "body": [
        {
            "id": "a68df6bc-0fa3-16b1-fbfb-0f00c7677708",
            "topic": "/SUBSCRIPTIONS/AFC2F241-D12F-45C5-9791-72A633F51345/RESOURCEGROUPS/CONTOSO-RESOURCE/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/CONTOSO-HUB",
            "subject": "devices/iot-test",
            "eventType": "Microsoft.Devices.DeviceTelemetry",
            "data": {
                "properties": {
                    "temperatureAlert": "false"
                },
                "systemProperties": {
                    "iothub-connection-device-id": "iot-test",
                    "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
                    "iothub-connection-auth-generation-id": "637795588618116304",
                    "iothub-enqueuedtime": "2022-02-05T14:02:38.4880000Z",
                    "iothub-message-source": "Telemetry"
                },
                "body": "eyJtZXNzYWdlSWQiOjkwLCJkZXZpY2VJZCI6IlJhc3BiZXJyeSBQaSBXZWIgQ2xpZW50IiwidGVtcGVyYXR1cmUiOjI2LjY2NDI1NDk5NDIyNzg1NywiaHVtaWRpdHkiOjY0LjQ2NDk5OTA1NjMwMDY3fQ=="
            },
            "dataVersion": "",
            "metadataVersion": "1",
            "eventTime": "2021-02-05T14:02:38.488Z"
        }
    ]
}











Step 2: This payload is retrieved as an array. We need to get the first item from the array in order to process

First we will initialize a variable and set value from the output from our POST Body.








Step 3: Again we will initialize a variable and use previously created variable and get the first element








Step 4: We will use the Parse JSON activity, and parse Body_Param variable. We use following JSON body to generate the schema


{
    "id": "a68df6bc-0fa3-16b1-fbfb-0f00c7677708",
    "topic": "/SUBSCRIPTIONS/AFC2F241-D12F-45C5-9791-72A633F51345/RESOURCEGROUPS/CONTOSO-RESOURCE/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/CONTOSO-HUB",
    "subject": "devices/iot-test",
    "eventType": "Microsoft.Devices.DeviceTelemetry",
    "data": {
        "properties": {
            "temperatureAlert": "false"
        },
        "systemProperties": {
            "iothub-connection-device-id": "iot-test",
            "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
            "iothub-connection-auth-generation-id": "637795588618116304",
            "iothub-enqueuedtime": "2022-02-05T14:02:38.4880000Z",
            "iothub-message-source": "Telemetry"
        },
        "body": "eyJtZXNzYWdlSWQiOjkwLCJkZXZpY2VJZCI6IlJhc3BiZXJyeSBQaSBXZWIgQ2xpZW50IiwidGVtcGVyYXR1cmUiOjI2LjY2NDI1NDk5NDIyNzg1NywiaHVtaWRpdHkiOjY0LjQ2NDk5OTA1NjMwMDY3fQ=="
    },
    "dataVersion": "",
    "metadataVersion": "1",
    "eventTime": "2021-02-05T14:02:38.488Z"
}











Step 5: The telemetry field is in "body" field. Now we need to retrieve it. Again we will initialize another variable to hold the field









Step 6: Now we need to work with the telemetry string. Which is also a JSON. In order to do it first initialize a new variable. We need this to hold the later decoded value









Step 7: Our telemetry field is base64 encoded. for an example we get a value like this


"body": "eyJtZXNzYWdlSWQiOjkwLCJkZXZpY2VJZCI6IlJhc3BiZXJyeSBQaSBXZWIgQ2xpZW50IiwidGVtcGVyYXR1cmUiOjI2LjY2NDI1NDk5NDIyNzg1NywiaHVtaWRpdHkiOjY0LjQ2NDk5OTA1NjMwMDY3fQ=="

We can use an online base64 decoder to check













We can use expression to to decode 










Step 8:  Then we will parse the telemetry JSON string.

We can use following to generate the schema


{
  "messageId":90,
  "deviceId":"Raspberry Pi Web Client",
  "temperature":26.664254994227857,
  "humidity":64.46499905630067
}


 







Step 9: Now comes to the interesting part. Now we will evaluate the value of the temperature. If it is larger than 25, we need to send an alert. We use If/Else branch to evaluate the condition









Step 10: We can use an email service to send an email. I use Gmail provider. We can construct the body of the email as we wish









That's all we have to do from Logic App side. Let's save it

Connect IOT Hub to Event Grid and use WebHook to connect to Logic App

Step 1: Navigate to IOT Hub and click on Events. Then click on Event Subscription











Step 2: Create Event Grid Subscription and Select 

  • Device Telemetry event type
  • WebHook for the endpoint


















What would be the url of our endpoint. Easy! We will navigate to our logic app and HTTP request action. Our endpoint URL is there







We will specify that URL for the WebHook








That's it.

Let's try this out











We can check from our logic app overview to see if it succeeded









Great!! Let's see if I got any email alert












That's all. Hope I covered everything here :)

No comments: