GithubHelp home page GithubHelp logo

lamfra / counting-people Goto Github PK

View Code? Open in Web Editor NEW
3.0 1.0 0.0 193 KB

Counting People application. A project for the Serverless Computing course at University of Salerno.

Python 100.00%
dynamodb iot-device serverless-computing ifttt-webhooks python

counting-people's Introduction

Counting People application

Introduction

Counting People is a simulator that counts the total number of people inside the main shops of the "Campania" shopping centre. The project is based on an IoT Cloud architecture in which several IoT sectors (an entry and exit sensor for each shop considered) collect data and send them to the Cloud where they are processed via Serverless Computing and stored in a NoSQL database.

Structure

The IoT sensors are structured as follows:

  • for each shop considered there is a sensor at the entrance door capable of detecting when a person enters and another at the exit door capable of detecting when a person leaves the shop.

(back to top)

Architecture

architecture

The purpose of this project is to indicate the number of people inside a shop in order to never exceed the maximum threshold allowed for each shop. Each sensor (entry and exit) sends a message with the number of persons detected to the queue for its shop.

  • Every minute, a time-triggered Servereless function calculates the total number of people for each main shop using the messages stored in the queues. For each queue, the function collects the number of people detected by the entry and exit sensors and calculates the total number of those inside each shop, then uploads the result to a NoSQL database.
  • Every hour, a message-triggered Servereless function calculates the average number of people in all of the shops within the shopping centre and a message is sent to a specific queue. A message sent on the queue Summary triggers a Serverless function that sends an email notifying the daily report.

(back to top)

Installation

Prerequisites

(back to top)

Getting Started

  1. Clone the repository
    git clone https://github.com/LamFra/CountingPeople.git
  2. Launch LocalStack
    docker run --rm -it -p 4566:4566 -p 4571:4571 localstack/localstack
  3. Create a SQS queue for each shop
    aws sqs create-queue --queue-name Carpisa --endpoint-url=http://localhost:4566
    aws sqs create-queue --queue-name Adidas --endpoint-url=http://localhost:4566
    aws sqs create-queue --queue-name Zuiki --endpoint-url=http://localhost:4566
    aws sqs create-queue --queue-name Carrefour --endpoint-url=http://localhost:4566
    aws sqs create-queue --queue-name Sephora --endpoint-url=http://localhost:4566
    aws sqs create-queue --queue-name Summary --endpoint-url=http://localhost:4566
  • Placed on the path of the cloned folder:
    cd CountingPeople
  1. Create the DynamoDB table
    python3 settings/createTable.py
  2. Populate the tables with initial data
    python3 settings/loadData.py
  • Check the value of the entire database with populate tables
    aws dynamodb scan --table-name CentroCommercialeCampania --endpoint-url=http://localhost:4566
  1. Create the time-triggered Lambda function to count the total number of people within each shop
  • Create the role and attach the policy
    aws iam create-role --role-name lambdarole --assume-role-policy-document file://settings/role.json --query 'Role.Arn' --endpoint-url=http://localhost:4566
    aws iam put-role-policy --role-name lambdarole --policy-name lambdapolicy --policy-document file://settings/policy.json --endpoint-url=http://localhost:4566
  • Create the zip file
    zip countFunc.zip settings/countFunc.py
  • Create the lambda function and save the Arn
    aws lambda create-function --function-name countFunc --zip-file fileb://countFunc.zip --handler /settings/countFunc.lambda_handler --runtime python3.6 --role arn:aws:iam::000000000000:role/lambdarole --endpoint-url=http://localhost:4566
  • Invoke manually the function
    aws lambda invoke --function-name countFunc --payload fileb://settings/shop.json out --endpoint-url=http://localhost:4566
  1. Set up a rule to trigger the Lambda function every minute
  • Create the rule and save the Arn
    aws events put-rule --name calculateNumPeople --schedule-expression 'rate(1 minutes)' --endpoint-url=http://localhost:4566
  • Add permissions to the rule
    aws lambda add-permission --function-name countFunc --statement-id calculateNumPeople --action 'lambda:InvokeFunction' --principal events.amazonaws.com --source-arn arn:aws:events:us-east-2:000000000000:rule/countFunc --endpoint-url=http://localhost:4566
  • Add the lambda function to the rule using the JSON file
    aws events put-targets --rule calculateNumPeople --targets file://settings/target.json --endpoint-url=http://localhost:4566
  • Simulate the IoT devices
    python3 IoTDevices.py

Now every minute the function countFunc will be triggered.

(back to top)

Setting IFTT

  1. Go to https://ifttt.com/
  2. Create a new applet.
  3. Click "If This", type "webhooks" and choose the Webhooks service
  4. Select "Receive a web request", write "summary" and create "trigger".
  5. Click Then That, type "email"
  6. Click Send me an email and choosing the topic and the body
  7. Retrive your key and copy it into the summary.py
  8. Zip the file and create the Lambda function
    zip summary.zip  summary.py
    aws lambda create-function --function-name summary --zip-file fileb://summary.zip --handler summary.lambda_handler --runtime python3.6 --role arn:aws:iam::000000000000:role/lambdarole --endpoint-url=http://localhost:4566
  9. Create the event source mapping
    aws lambda create-event-source-mapping --function-name summary --batch-size 5 --maximum-batching-window-in-seconds 60 --event-source-arn arn:aws:sqs:us-east-2:000000000000:Summary --endpoint-url=http://localhost:4566

The output should be more similar to this:

email_output

Usage

  1. Simulate the devices

    python3 IoTDevices.py
  2. Wait or invoke Lambda function manually

  3. Count the total number of people within each shop

    python3 getPeople.py

The output should be more similar to this:

output

(back to top)

Contact

Francesca La Manna - [email protected]

Project Link: https://github.com/LamFra/CountingPeople

(back to top)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.