Monitor and visualise constructing occupancy with AWS IoT Core, Amazon QuickSight and Raspberry Pi



Occupancy monitoring in buildings is a useful device throughout totally different industries. From healthcare to industrial, and from leisure to retail, prospects are searching for fashionable and scalable IoT options to make sensible enterprise selections. For instance, many exhibitions in public artwork museums make use of an open-ended strategy, the place there isn’t a clear beginning or ending level to the exhibition. The format of an exhibition must consider the best way through which the viewers discover their method by the exhibition contributes to the viewers’ engagement with the art work. Nonetheless, museums can fluctuate the position of the gallery primarily based on the recognition and variety of guests. They’ll analyse occupancy information in close to real-time and determine the actual gallery needs to be on the entrance of the constructing to achieve extra views or it’s already in style and could be moved and grouped with different exhibitions.

This weblog describes a easy answer that makes use of constructing occupancy information to observe how house is being utilised. It reveals how busy every sub-area of the constructing will get throughout totally different instances of the day primarily based on a movement sensor’s location. We place the bodily gadget which consists of a Raspberry Pi with Passive InfraRed (PIR) sensor on the entrance. The PIR sensor permits one to sense the movement in direct proximity, (i.e., whether or not a human has moved in or out of the sensors vary) and can generate the information which then will likely be related to cloud native providers for information storage, evaluation and visualisation in close to real-time.

Answer Overview

The diagram reveals a excessive stage structure overview. The information is generated domestically on the Raspberry Pi and revealed in JSON format to AWS IoT Core that simply and securely connects units by the MQTT and HTTPS protocols. Guidelines Engine, a characteristic of AWS IoT Core, repeatedly processes incoming messages, enabling your units to work together with different AWS providers and streams IoT information into Amazon Kinesis Knowledge Firehose. Kinesis Knowledge Firehose permits you to seize and mechanically load streaming information into Amazon S3. AWS Glue creates a knowledge catalog with a desk for Amazon Athena to question this information from Amazon S3 bucket. Amazon QuickSight, the cloud-powered enterprise intelligence device, connects to Amazon Athena to create a visualisation dashboard for additional evaluation.


Minimal necessities:

  • An AWS account.
  • Raspberry Pi 4 Mannequin B with a pre-installed Working System SD card and an influence cable.
  • Passive InfraRed (PIR) sensor.
  • Breadboard with feminine to feminine(F2F) and male to male (M2M) jumper wires, LED gentle and resistor.

Throughout the course of I exploit the headless connection sort with third occasion software program suppliers to entry the Raspberry Pi, moreover you possibly can entry through SSH.

Step-by-step Implementation

Observe: I exploit a inventory Raspberry Pi 4 Mannequin B. Determine 1 reveals the Raspberry Pi mounted on a Black Case Field package. This Field package neatly packages the Pi and prevents injury, however is just not vital.

Determine 1 reveals a Raspberry Pi with marked colors the place the same-coloured wires will likely be related with the sensor and a breadboard. I exploit the next pinout in Raspberry Pi:

  1. 5V energy – marked as crimson
  2. GROUND – purple
  3. GPIO 4 (GPCLK0) – orange
  4. GPIO 17 – inexperienced

Determine 1: Raspberry Pi.

Determine 2 reveals vital parts comparable to a breadboard, PIR sensor, a resistor, crimson LED gentle, 5 male-to-female and 1 female-to-female jumper wire cables.

Determine 2: Needed parts.

Determine 3 demonstrates the breadboard marked with colors the place the identical colored wires belong. Let’s have a look at them in additional element:

Determine 3: Breadboard with the wires, resistor and LED gentle diagram

  1. The blue curve signifies the resistor and the same-coloured jumper wire will likely be inserted into ‘5-’ and ‘5J’.
  2. The crimson LED gentle is proven as a crimson line with a circle on prime. For those who have a look at the LED gentle, you will notice that it has two totally different tip lengths, the brief half will likely be inserted into ‘I5’ and the lengthy one into ‘I8’.
  3. The inexperienced sq. marked in ‘H8’ is used for the LED gentle to speak with Raspberry Pi and LED gentle.
  4. The white and black squared ‘7+’ and ‘7-’ wires are related with the PIR sensor, specifically to the GND and VCC pinout of the sensor.
  5. The crimson and purple squared ‘1+’ and ‘1-’ wires are related with the colored pins in Raspberry Pi, specifically to the 5V energy and GROUND pinouts.

Determine 4 reveals the Passive InfraRed (PIR) sensor with VCC, GND and OUT pinouts, the place black, white and orange colored jumper wires will likely be related.

Determine 4: PIR sensor related with the Raspberry Pi and the breadboard.

  1. The white and black wires on the PIR sensor are related with the identical color marked pins within the breadboard, as seen in Determine 3.
  2. The orange wire is related to the Raspberry Pi GPIO 4 (GPCLK0) pinout or as marked in orange color, as seen in Determine 1.

Now, it’s time to attach the PIR sensor, the breadboard with the crimson LED gentle and the resistor, and Raspberry Pi with one another. If all the pieces is related appropriately, the crimson LED gentle will activate if any movement detected as seen in Determine 5, the code for which we’ll write up in later steps.

Determine 5: Mounting all the pieces collectively on Raspberry Pi.

As soon as the bodily development is full, we’re able to look into particulars on the way to join and ship JSON movement detection information to AWS and put it aside securely.

The remainder of the weblog particulars 5 steps for publishing IoT information to the cloud and growing close to real-time dashboards. The steps are briefly summarised after which described in additional particulars under.

  1. Learn how to join a Raspberry Pi to AWS IoT Core
  2. Learn how to stream JSON information to Amazon Kinesis Knowledge Firehose and save to Amazon S3
  3. Create AWS Glue Knowledge Catalog
  4. Configure Amazon Athena
  5. Visualise object motion with Amazon QuickSight dashboard in close to real-time

Step 1. Learn how to join a Raspberry Pi to AWS IoT Core

On this part, I describe the way to arrange the PIR sensor that when movement is detected the crimson LED gentle activates and we see a message “Movement Detected” on the Raspberry Pi. Subsequent, we might want to join our Raspberry Pi with AWS by registering it as a “factor”, making a coverage and certificates. In the long run, we’ll see the movement messages transmitted to the cloud and saved securely for additional evaluation.

1.1 Begin making a coverage in AWS IoT Core and we’ll connect this coverage to our factor within the subsequent step.

  1. Navigate to the AWS IoT Core console. Within the navigation pane, select Safe, Insurance policies, Create a coverage.
  2. For the Title give your coverage a reputation.
  3. For Add statements select Superior mode and add the coverage assertion together with your AWS area, account quantity and subject identify as seen under. Please examine this supply for extra coverage examples.
  4. Choose Create.
"Model": "2012-10-17",
 "Assertion": [   
      "Effect": "Allow",     
   "Action": [        
"Useful resource": "arn:aws:iot:eu-west-1:<AWS-account-id>:subject/<topicname>"

1.2 Create and obtain the AWS IoT Core gadget certificates

The Raspberry Pi requires an AWS IoT root CA (fetched by the set up script), certificates, and a non-public key to authenticate with AWS IoT Core. Create a brand new certificates and fasten the IoT coverage deployed by the serverless software.

  1. Navigate to the AWS IoT Core console. Within the navigation pane, select Handle, Issues, Register a Factor, Create a single factor.
  2. For the Title give your factor a reputation.
  3. For the remaining depart it as default
  4. Choose Subsequent and Add a certificates on your factor
  5. Create a certificates with One-click certificates creation (beneficial)

When you adopted the steps above and initiated the ‘one-click certificates creation’, you will notice a message that the certificates is generated efficiently, as seen under. Now, the certificates can be found for obtain. Save these certificates securely as you’ll not have a second likelihood to obtain the identical certificates.

Having created a certificates, that you must do the next:

  1. Choose Obtain “a certificates for this factor” and “a non-public key”. (Save these securely, as that is the one time you possibly can obtain this certificates.)
  2. You additionally have to obtain a root CA for AWS IoT (proper click on on obtain and choose on RSA 2048 bit key Amazon Root CA1, save as a file)
  3. Activate the Root CA for AWS IoT.
  4. Select Connect a coverage (that we created on step 1.1).

 1.3 Obtain certificates and securely put it aside to your laptop.

Now, we have to copy these certificates to Raspberry Pi, in order that it understands the place to attach and ship the generated information. There are a number of choices to attach with Raspberry Pi and duplicate over the recordsdata. I exploit the SFTP route and save the certificates in a secure folder in my Raspberry Pi from the place I can reference in my code later.

1.4 Set up AWS IoT Python SDK within the Pi and create a file to jot down our python code

1. Open the terminal within the Raspberry Pi and set up AWS IoT Python SDK:

pip3 set up AWSIoTPythonSDK

2. Create a file within the Raspberry Pi to jot down our Python script that may determine whether or not movement has been detected by the PIR sensor.

3. Copy and paste the python script under to file:

from gpiozero import LED
from gpiozero import MotionSensor
from datetime import datetime

international message
import requests
import time
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient

myMQTTClient = AWSIoTMQTTClient("ClientID")
myMQTTClient.configureEndpoint("", 8883)

myMQTTClient.configureCredentials("/residence/pi/pi-projects/root-CA.pem", "/residence/pi/pi-projects/LED-private.pem.key", "/residence/pi/pi-projects/LED.pem.crt")
print ('Initiating Realtime Knowledge Switch From Raspberry Pi...')

Myvar= myMQTTClient.join()

date ="%Y_percentm_percentd-%I:%M:%S_percentp")
print (f"Timestamp:{date}")

red_led = LED(17)
pir = MotionSensor (4)

whereas True:
    print("Movement Detected")
    message= "Movement Detected"
    myMQTTClient.publish("subject/pi", "{"MotionMessage":""+ message + "", "Timestamp" :""+ str(date)+ ""}", 0)
    print ("No Movement")
    message= "No Movement"
    myMQTTClient.publish("subject/pi", "{"MotionMessage":""+ message + "", "Timestamp" :""+ str(date)+ ""}", 0)

Let’s study the code above:

1. We import some directories from the Python library (LED, movement sensor, date and time, MQTTClient which was put in from AWSIoTPythonSDK)

2. We join our Raspberry Pi to AWS IoT Core by organising a reputation for MQTT shopper, comparable to “ClientID’” in my case it’s myMQTTClient = AWSIoTMQTTClient(“ClientID”)

3. We create a loop to show the LED gentle on/off upon motion detection.

1.5 Copy your endpoint identify from the AWS IoT Core console.

We want the endpoint to configure our Raspberry Pi for MQTTClient.

1. Within the AWS IoT console, navigate to IoT Core, Handle, Issues, choose in your created factor identify, on the left aspect choose Work together.

2. Copy HTTPS endpoint.

3. When you copied the Relaxation API endpoint, that you must paste it into your file to attach with AWS endpoint:

myMQTTClient.configureEndpoint("", 8883)

4. Now, configure your credentials (with the certificates that we downloaded earlier within the step 1.2) with the code under:

Observe: I renamed the downloaded certificates for the comfort as follows: root-CA.pem – which is the ‘root-CA’ certificates that we activated, LED-private.pem.key – ‘a non-public key’, LED.pem.crt – ‘a certificates for this factor’. as we talked about in 1.3.

myMQTTClient.configureCredentials("/residence/pi/pi-projects/root-CA.pem", "/residence/pi/pi-projects/LED-private.pem.key", "/residence/pi/pi-projects/LED.pem.crt")
print ('Initiating Realtime Knowledge Switch From Raspberry Pi...')

5. As soon as we set the variable for our MQTTClient and set the endpoint, connect with that endpoint with:

Myvar= myMQTTClient.join()

6. Since we wish our movement to be detected with date and time-frame, set the date variable within the code:

date ="%Y_percentm_percentd-%I:%M:%S_percentp")
print (f"Timestamp:{date}")

7. Within the following steps with our code, we have to outline the crimson led gentle, the movement sensor and begin the movement detection with the crimson led gentle turned off.

red_led = LED(17)
pir = MotionSensor (4)

8. Now, its time to create a loop primarily based on the movement detection as following:

whereas True:
print("Movement Detected")
message= "Movement Detected"  myMQTTClient.publish("subject/pi", "{"MotionMessage":""+ message + "", "Timestamp" :""+ str(date)+ ""}", 0)
print ("No Movement")
message= "No Movement"
myMQTTClient.publish("subject/pi", "{"MotionMessage":""+ message + "", "Timestamp" :""+ str(date)+ ""}", 0)   time.sleep(1)

When you adopted the steps above within the doc, don’t forget to put it aside after which run the code. If all the pieces is ready up appropriately, upon the motion detection inside a 1–2-meter radius from the PIR sensor, you will notice a message “Movement Detected” and the crimson LED gentle in your breadboard will activate (as seen in Determine 5). Alternatively, if there’s no movement it is going to present “No Movement” and the LED gentle will flip off.

Step 2. Learn how to stream JSON information to Amazon Kinesis Knowledge Firehose and save into Amazon S3

2.1. Create a supply stream with Amazon Kinesis Knowledge Firehose.

As soon as we related our Raspberry Pi with AWS IoT Core, we have to create an Amazon Kinesis Knowledge Firehose Supply Stream utilizing the next area values:

Title Pi-to-Kinesis
S3 Bucket <Create one>
S3 Prefix s3://pi-to-bucket/2021/

A efficiently created supply stream with the identify Pi-to-Kinesis seems to be like this:

2.2. Configure the AWS IoT rule

After creating the Amazon Kinesis Knowledge Firehose Stream with the outlined storage location in Amazon S3, we have to set the foundations for AWS IoT Core to take all the information from the subject, stream it to Amazon Kinesis Knowledge Firehose, and save this information into the Amazon S3 bucket.

1. Within the AWS IoT console, navigate to AWS IoT Core, Act, Guidelines, Create a rule.

Create a brand new AWS IoT rule with the next area values:

Title ‘RaspberryPiRule’
Question Assertion *
Matter Filter ‘subject/pi’
Add Motion Ship messages to Amazon Kinesis Knowledge Firehose
Stream identify ‘Pi-to-Kinesis’
Choose Separator ‘n (newline)’

2. Let’s check if we’re getting movement messages with timestamps on AWS IoT Core.

3. Navigate to AWS IoT Core, MQTT check shopper, subscribe to a subject, “subject/pi” (the subject identify that you simply set in your python script), Subscribe.

4. If all the pieces is ready up appropriately you will notice the movement messages despatched from the Pi as under:

2.3. Examine the streamed information saved in Amazon S3

1. Navigate to Amazon S3 to see the bucket that you’ve created in step 2.1 whereas organising an Amazon Kinesis stream. You will note the created S3 bucket, in my case its known as ‘pi-to-bucket’.

2. Choose the ‘pi-to-bucket’ and examine if the generated JSON information efficiently saved. You will note objects in your bucket as under:

3. Choose a type of objects and select Obtain or Open. If all the pieces is ready appropriately you will notice your information as proven within the screenshot under:

Step 3. Create AWS Glue Knowledge Catalog

Our information lake is efficiently created and all the information saved securely in Amazon S3 bucket. Now, it’s time to use AWS Glue to create a knowledge catalog with a desk for Amazon Athena to question this information utilizing Easy Question Language (SQL).

Please comply with the directions right here to create a desk within the AWS Glue console. You’ll need to create a desk with column identify “motionmessage” and “timestamp” with information sort – string. Your desk will appear to be this:

Step 4. Configure Amazon Athena

Within the earlier steps, we noticed that our Raspberry Pi is efficiently related with AWS IoT Core and shows the movement messages stay. We additionally confirmed that the saved JSON information is saved in our created Amazon S3 bucket – ‘pi-to-bucket’. Now, we need to simply analyse the saved information with an interactive question service known as Amazon Athena.

Amazon Athena will play an instrumental position for the reference to the information visualisation device Amazon QuickSight which we talk about in later steps.

* Observe: for extra detailed info on the way to create the desk please comply with this instruction.

4.1. Create a easy desk in Amazon Athena that may question our Amazon S3 bucket that we created earlier.

1. Log in to the Athena Console. Within the Question Editor, create a desk utilizing the next question:

CREATE EXTERNAL TABLE IF NOT EXISTS default.new_table_pi (`MotionMessage` string,

`Timestamp` string
ROW FORMAT SERDE 'org.openx.information.jsonserde.JsonSerDe'
'serialization.format' = '1'
LOCATION 's3://pi-to-bucket/2021/'
TBLPROPERTIES ('has_encrypted_data'='false');

2. As soon as the desk is created you possibly can run the question under to see your information:

SELECT * FROM "default"."new_table_pi" restrict 10;

You will note one thing like this :

To sum up the above steps, we created a easy desk with two columns: the movement message and the timestamp, then we queried the information from the Amazon S3 bucket the place our PIR sensor-generated JSON information is saved.

Step 5. Visualise object motion with the Amazon QuickSight dashboard in close to real-time

Now, we’re able to analyse the information within the cloud-native and absolutely managed enterprise intelligence device Amazon QuickSight.

Observe: You will have to give Amazon QuickSight specific permissions to view your Amazon Athena desk.

To visualise information with Amazon QuickSight, comply with these steps:

1. Open the Amazon QuickSight console.

2. Choose New evaluation, New dataset. 

3. Select Athena as a brand new information supply.

4. Set the information supply identify (it’s a catalog identify in Amazon Athena).

5. Choose Create information supply.

6. As soon as the information supply is created, that you must select a database that comprises a set of tables and choose the particular desk which you need to visualise. Select Choose:

7. Within the screenshot under you see an outlined desk, information supply and an choice to decide on the way you need to question your information. Choose ‘Instantly question your information’ and choose Visualise.

8. Design the Amazon QuickSight visualisations within the drag and drop editor. You possibly can select any choice from visible sorts which are listed on the left aspect. I chosen a vertical bar chart and a donut chart which you see within the two screenshots under.

9. From the Fields checklist on the left pane you will notice column names that we created earlier in Amazon Athena. Drag a ‘timestamp’ area to the X-axis and ‘motionmessage’ to the Worth area wells.

The bar chart under reveals the variety of motions detected for hourly intervals over a particular time period. For instance, the very best variety of motions (1.25K) within the venue was detected at 10:49 AM on April 27,2021.

You might need to analyse the occupancy information by a distinct visible format. Merely select a ‘donut chart’ in visible sorts and you will notice the full variety of motions divided throughout totally different intervals. As seen on the screenshot under, 3.816K motions in complete has been detected within the constructing throughout totally different dates and time. Specifically, 33% of complete motion has been famous at 10:49 AM on April 27,2021.


On this weblog publish I confirmed the way to observe, monitor, and visualise the occupancy of a constructing utilizing Raspberry Pi and AWS serverless and managed providers structure. This can be a scalable answer which makes use of cloud native providers with movement sensors to get occupancy information into the cloud. You possibly can handle and analyse the information to begin constructing an area planning software. For instance, insurance coverage corporations can assess the hearth threat by understanding the capability of the constructing and the way typically the constructing will get busy throughout totally different instances, then construct an agile software with out managing any servers or provisioning the capability.

This weblog publish demonstrated the way to visualise information from a securely related distant IoT gadget. The answer is achieved by first connecting the Raspberry Pi to AWS IoT Core utilizing MQTT adopted by forwarding messages from the subject stream utilizing AWS IoT Guidelines and placing data on an Amazon Kinesis Knowledge Firehose supply stream. The latter, in flip, shops the information in an Amazon S3 bucket to create a knowledge lake. AWS Glue created a knowledge catalog with a desk which is queried utilizing Amazon Athena, after which the information is visualised utilizing Amazon QuickSight to derive the insights on a weekly, each day or hourly foundation.

To study extra, try this blogpost on the way to use Amazon QuickSight and AWS IoT Core for various use circumstances.

In regards to the creator

Jamila Jamilova is a Options Architect within the UK Public Sector. She enjoys serving to prospects to unravel complicated technical issues. Her space of curiosity consists of Web of Issues (IoT) and Machine Studying (ML). In her spare time, she is operating, taking part in piano and studying the way to play chess.