Default Azure Pipeline yaml as task

A quick note on Azure Pipelines. If you create a pipeline thru Azure DevOps on a .NET Core App the yaml file will use script rather than tasks.

image

This is also used in the Azure Pipelines Yaml Templates Github Repo.

image

It works yes but I would rather use tasks. If you are interested to use that as well, head on here:

image

https://github.com/johndelizo/Bunch-of-scripts/blob/master/Azure-Yaml/azure-pipeline-task-not-script.yml

Azure IoT Hub with ESP8266 and automated plant watering with soil moisture sensor

They said that taking care of plants relieves stress [1]. But no one told me that I cannot automate this.

[1] https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4419447/

So I created this.

image

Its an IoT based automated plant watering system with soil moisture sensor and monitoring system. This project uses Azure IoT Hub, Azure Streaming Analytics and PowerBI for dashboard. Data is sent by the NodeMCU / ESP8266 Arduino. Data is from a collected from a Soil Moisture sensor which controls a submersible pump thru a relay module. The relay turns on the pump depending on the amount of reported soil moisture and waters the plant from a water source. Reported soil moisture is also shown in the 20×4 LCD and is sent to the Azure IoT hub over the internet.

Lets get started!

For software you would be needing an Azure Subscription and A PowerBI Subscription. Hardware components are discussed on the hardware section. You may want to jump there to see if you have the right parts for this project.

We will first configure the cloud based resources needed for this project. We would be needing just the Azure IoT hub for now and streaming analytics.

First is to create a Resource Group

https://docs.microsoft.com/en-us/azure/azure-resource-manager/management/manage-resource-groups-portal#create-resource-groups

Azure IoT Hub

Then inside the Azure resource group, create a new IoT Hub. IoT hub controls and receives messages from our IoT devices. Start by clicking the add icon.

image

Search for IoT Hub. Then click create.

image

image

Choose the newly created Resource Group and remember the IoT Hub name you specified here. You will be needing it later.

image

IoT hub has Freeee tier. Lets use that for now. Note that in production setup, you may want to review the scale tier and messages per day. https://azure.microsoft.com/en-us/pricing/details/iot-hub/

image

Once created, it would look like this:

image

Now lets create a device in the IoT Hub. On the explorers tab, click IoT Device then click + New icon.

image

On the create a device, make sure you have the auto-generate keys checked. Specify a unique device name and then click save.

image

After adding a device, open Azure Cloud Shell located at the top right corner of the page. We will use PowerShell.

image

Once open add the azure iot cli extentions by executing:

“az extension add –name azure-cli-iot-ext”

image

https://github.com/Azure/azure-iot-cli-extension

Then using the Azure IOT CLI extension, lets create a SAS Token. A Shared Access Signature (SAS) Token is used by a physical device to authenticate to Azure IoT Hub. IoT Hub then checks the token and authorizes the device to send data.

https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-devguide-security

To generate a SAS token use:

“az iot generate-sas-token –d <devicename>– n <iot-hub-name>”

image

Replace <devicename> with the device name that you specified during device creation and the <iot-hub-name> with the name of your IoT hub. SAS Tokens looks like this:

SharedAccessSignature sr=iothubname.azure-devices.net%2fdevices%2fDeviceId&sig=kPszxZZZZZZZZZZZZZZZZZAhLT%2bV7o%3d&se=1487709501

https://docs.microsoft.com/en-us/cli/azure/ext/azure-cli-iot-ext/iot/hub?view=azure-cli-latest#ext_azure_cli_iot_ext_az_iot_hub_generate_sas_token

It is important that you save the result SAS token.

Lets test the SAS Token and the IoT Hub. You may use other mock or API testing software. For now, lets use postman.

image

Perform an HTTP Post to this URL, replacing the <iot-hub-name> with your IoT Hub Name and the <device-name> with your newly created device.

https://<iot-hub-name>.azure-devices.net/devices/<device-name>/messages/events?api-version=2020-03-13

In the header, add an Authorization key and for its value, use the Shared Access Signature that was returned during the SAS Token Creation in Azure CLI.

For the body, create a simple JSON that has some payload. In my payload I have “smc” or soil moisture content of 80 value and “idn” or device identification which I specified as “device5” again. Do not forget to make it as a “raw” – “json” request and then hit send. You should be able to get a 2XX response from Azure IoT hub.

image

Stream Analytics Job

Our next is to create a stream analytics job. A stream analytics “accepts” or ingests data, streams it real-time to dashboards or any data at rest storage. For our project, as highlighted here in this figure that data will be coming from IoT Devices thru the IoT Hub. Streaming analytics then delivers our data into a Power BI dashboard in real time.

image

https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-introduction

Same as IoT Hub, search and create for Stream Analytics Job

image

Choose a name for your new Stream Analytics Job, make sure your location is as close as possible and click create.

image

Once created we need to configure an Input to be able to ingest some data. So on Job topology, click Add a Stream Input and choose IoT Hub.

image

Add an alias and select the IoT Hub from your Azure subscription, click save after.

image

Now lets deliver data from IoT Hub to PowerBI. Still on Job Topology, click output and select PowerBI.

image

Click Authorize and sign-in to your account. Few window will pop-up, follow the wizard until you are already signed-in.

image

This part is important, It was hard for me at first and tried to figure out how this works but for now you must choose “user token” authentication mode. This is so that the group workspace shows includes the “my workspace” in the dropdown. Add an output alias, a dataset (database) name and a table name. Remember your values here and then click Save.

image

Now lets tie them together. From the Job Topology, click query. Use a query that selects all inputs into your output from your input like so. Save the query. 

image

Check your query in the overview and you may start the Streaming Analytics at this point.

image

Important: Using Postman, send a couple of requests for you to see if there are data coming from Azure IoT hub to Azure Streaming Analytics. Click test query to check if there are Json payload.

Power BI

Login to your Power BI account with the same account used during the authorizing process in Azure Stream Analytics. Expand My workspace and you should see your datasets under the datasets. Remember the  dataset (database) name and a table name used in streaming analytics? This should be the same.

image

Click your dataset and there fields of the table would appear on your right hand pane.

image

You may now be able to design your report. Add Event enqueue and the sum of SMC in the fields selection. Select an appropriate visualization such as a stacked area chart here.

image

Save your report.

image

Once saved, you may now create a new dashboard. Pin this report to a new dashboard and then click pin live.

image

image

You can also add more tiles in the dasbhoard by clicking edit and then add tile.

image

Select Custom Streaming Data and then click Next.

image

Your dataset should be available here. Select and click next.

image

Choose your visualization type, for this example, lets choose a gauge type.

image

On the tile details, use Soil Moisture Content and then click Apply.

image

Power BI is also available as an IoS App in the Apple Store.  https://apps.apple.com/us/app/microsoft-power-bi/id929738808

Here’s my running dashboard for device5. I plan to use more devices, sensors and pumps. And that’s for another blogpost. Until then, happy coding!

No description available.

To test real time integration, try and posting data using PostMan and send data to the streaming analytics. We should be able to show data in the Dashboard.

No description available.

Recap

We have configured the IoT back-end and dashboards for our project as shown as in the red dashed box in this figure.

image

Our next is to set-up the Arduino and Hardware part of our project. 

Arduino Hardware

So for our bill of materials:

  1. ESP8266 / NodeMCU Arduino
  2. Node MCU Base Board
  3. LCD Display 20×4 I2C
  4. HW-080 Soil Moisture Sensor
  5. Jumper Wires Pack (M-F / F-F)
  6. Relay Module
  7. 5v Power Adapter
  8. Used USB Power Adapter and Cord
  9. Submersible Pump

I got most of my Arduino parts from the following stores here in Philippines.

https://www.facebook.com/TinkerHubPH/ 

https://www.facebook.com/ElecDesignWorks

https://www.facebook.com/MakerlabElectronics

https://www.facebook.com/circuitrocksph/

Lets get started on assembling our hardware:

image

Follow this pin-out. Note that the soil moisture uses analog.

image

Instead of using a breadboard, I used a NodeMCU base board. This is so that I can power V5 PowerSource plus once completed, the project can already be deployable since the baseboard is more sturdy than a breadboard.

image

Connect the submersible pump to your relay. Use the normally closed on your relay. The relay turns connects the power or cuts off the power going to the submersible pump. Here’s my wiring:

image

At this point, the LCD can also be connected. Pin configuration is available in the diagram. Also attached the components with some glue stick to make it sturdy and easy to work with.

image

Casing is just a soap dispenser. Bought from SM Makati Smile (they got it all for youuuu…) bathroom section, near pillows 4th floor. Drilled some holes in the soap dispenser that would fit wiring and LCD screen. Since the NodeMCU needs power, a hole was also drilled on the side.

Here’s some measurements that I used.

image

Arduino Software / Firmware

I have created a simple repository that contains the relevant source codes for running this. Please do check-out this github link or directly to the circtuio.io storage.

https://github.com/johndelizo/AzureIOT-ESP8266-CircuiotIO-Blog

https://storage.circuito.io/circuitos/5f8101269fb9ea00309fa589/Firmware.zip

Checkout the code inside the loop.

image

For Wi-Fi and IoT I used ESP8266-SimpleWifiManager that is available in Github.

https://github.com/johndelizo/ESP8266-SimpleWifiManager

Integrating Arduino with Azure IoT Hub

For sending data to the cloud I used HTTP

https://www.arduino.cc/reference/en/libraries/httpclient/

Here’s the relevant code that sends data to Azure IoT Hub.

image

First is the SSL Fingerprint. As of writing, the HTTP Client that I am using seems to need the SSL fingerprint. There are a number of ways out there like from the following sites. Use that to begin your HTTP Client instance.

https://knowledge.digicert.com/solution/SO9840.html

https://security.stackexchange.com/questions/36750/is-fingerprint-check-enough-to-verify-https-certificates

The server address is the one you were given in creating the IoT Hub and adding a device. In my example, I already replaced <device-name> with device5.

https://<iot-hub-name>.azure-devices.net/devices/<device-name>/messages/events?api-version=2020-03-13

Also add the SAS as a value of the Authorization Header as you did in postman.

Perform an HTTP post with a formatted payload with your soil moisture and other information, mine, I added the last pump interval. I measure the amount of time the pump has been running. Why you say? Just wanted to make sure my plants are not drowning. Smile

The Completed Project

Horay! Lets run this. Closing the lid and powering on ESP8266 and the Submersible pump. Also soil moisture is being shown in Power BI Dashboard in mobile.

image

When soil moisture is below the threshold, ESP8266 turns on the pump and waters the plant. Also shows in LCD like here:

image

No description available.

So that’s it! Thats my pet project for the weekend. Hope this was informative and had much fun as I did.

In conclusion, watering plants can relive stress. Automate it, put some IoT and Azure, now fun begins!

image

Disclaimers:

Ahh before you leave and trying this out, make sure you have enough credits to support your Steaming Analytics Job. Would cost you a bit. So here is my bill after a while:

image

Second is that I am not an electrical engineer. My background is IT and Software. My last experience in electronics is back when I took Industrial Electro Mechanics in Don Bosco Canlubang. Other than that, I usually break electronics at home. Soooo.. Please check your wiring and double check sources. (As any other source in the internet, fact check people!). So I provide no warranties whatsoever and use at your own risk.

Its a prototype, a hobby build. Do not use in production.

Finally this is more of an opinionated approach. Thoughts of my own and I do not represent any institution or my employer.

GLHF!

image