# Object detection using AWS Greengrass + QIoT Suite Lite + QuAI using Raspberry Pi Camera (English)
You need to prepare :
1. AWS Accont
2. Raspberry Pi
3. USB webcam
## Scenario-1
* Camera --> AWS Greengrass IoT device --> AWS Greengrass Core --> QIoT Suite Lite --> QuAI --> AWS Greengrass Core Lambda --> AWS Cloud --> AWS S3 bucket

### Step-1 : Prepare AWS Greengrass Core
1. Install AWS Greengrass App in QNAP NAS from App center

2. Setup your AWS Greengrass Group & Core in QNAP AWS Greengrass App. Please refer this link for more details :
https://www.qnap.com/en/how-to/tutorial/article/how-to-setup-aws-greengrass-on-qnap-nas/
3. Create **"SendGGImageToQIoT"** & **"QIoTIntegration"** AWS Greengrass Lambda functions as shown below. For this Demo we are using Node.js based Lmabda function. You should also update it's configuration setting's Memeory limit and timeout. Please find Demo Lambda source codes inside this folder [AWS_Greengrass_Lambda](https://github.com/qnap-dev/qnap-qiot-sdks/tree/master/projects/AWSGreengrass-Integration-Scenarios/Greengrass_device_QIoT_QuAI/AWS_Greengrass_Lambda). (建立Lambda function請參考AWS說明文件 : https://docs.aws.amazon.com/greengrass/latest/developerguide/create-lambda.html)


4. Create a new device inside Greengrass Group Devices section as shown in the below image. Reference : [https://docs.aws.amazon.com/greengrass/latest/developerguide/device-group.html](https://docs.aws.amazon.com/greengrass/latest/developerguide/device-group.html)
**<font color=red># Notes : Please keep your device certificates, unzip it and upload to your Raspberry Pi.</font>**

5. Prepare following 3 subscriptions lists
* Greengrass IoT Device to **"SendGGImageToQIoT:9"** Lambda for Image Prediction. Setting infomation :
* Source --> **GG_Camera**
* Target --> **SendGGImageToQIoT**
* Topic --> **cameraImage**
* **"QIoTIntegration"** Lambda function to IoT Cloud for upload predicted image to S3 Bucket. Setting infomation :
* Source --> **QIoTIntegration**
* Target --> **IoT Cloud**
* Topic --> **#**
* Greengrass IoT Device to **"QIoTIntegration:16"** Lambda is trigger Lambda to start. Setting infomation :
* Source --> **GG_Camera**
* Target --> **QIoTIntegration**
* Topic --> **triggerLambda**
Please refer the following image for these 3 subscriptions list source, destination and topic details

6. Deploy the Greengrass Group.
</span>
7. Verify Greengrass core daemon status in QNAP Greengrass App

8. Trigger the QIoTIntegration Lambda function to receive QIoT Suite Lite message. So that, you have to download AWS IoT Python SDK --> [**basicDiscovery.py**](https://github.com/aws/aws-iot-device-sdk-python/blob/master/samples/greengrass/basicDiscovery.py) and execute the following command. Please use **GG_Camera** device certificate files to trigger this Lambda function
9. Run this Command :
```bash
python basicDiscovery.py -e <youtiothostname>.iot.<region>.amazonaws.com -r root-ca.pem -c XXXXXXXX.cert.pem -k XXXXXXXX.private.key -n GG_Camera -m publish -t triggerLambda -M "{'status':'start'}"
```
- **-e** : Aws IoT Endpoint (In **IoT Core** home page, under **Settings**, make a note of the value of **Endpoint**.)
- **-r** : Root CA Path (In here : https://docs.aws.amazon.com/iot/latest/developerguide/managing-device-certs.html)
- **-c** : Thing Ceritificate Path
- **-k** : Thing Private key Path
- **-n** : Thing Name
### Step-2 : Setup AWS Greengrass IoT Device
Install **AWSIoTPythonSDK** package in your Raspberry Pi **(Refer to the instructions here for installation : https://docs.aws.amazon.com/greengrass/latest/developerguide/IoT-SDK.html)** and deploy the **"send_image_AWSGG.py"** source code from this folder [**RaspberryPi_side**](https://github.com/qnap-dev/qnap-qiot-sdks/tree/master/projects/AWSGreengrass-Integration-Scenarios/Greengrass_device_QIoT_QuAI/RaspberryPi_side) to Raspberry Pi and install capture software. Command is :
```bash
sudo apt update && sudo apt install fswebcam
```
### Step-3 : Setup Demo QuAI
1. 開啟NAS上的Container Station
2. 切換到 **Crtare** 頁面,於搜尋列搜尋 **"qeekdev/aipredict"**
3. 點選 **Install** 進行安裝

4. 點擊 **Advanced Settings** 進入進階設定頁面

5. 切換到 **Network** 頁面設定Port,參考下圖設定(若您有服務與此Port相衝突到,請自行更換),完成後請點擊 **Create** 建立容器 :

4. 建立完成後,位於左邊的 **Overview** 功能項目裡,可檢視剛建立完成的新容器,該容器功能為AI辨識照片的服務。


5. 瀏覽器進入 http://\<IP\>:8082/api/v1/ 進行測試,操作結果如下 :


***其他佈署資訊可參考Dockerhub上的頁面 : https://hub.docker.com/r/qeekdev/aipredict/***
### Step-4 : Setup QIoT Suite Lite
Create a new IoT Application in QIoT Suite Lite from the Application template file [**LiveDemo.json**](https://github.com/qnap-dev/qnap-qiot-sdks/tree/master/projects/AWSGreengrass-Integration-Scenarios/Greengrass_device_QIoT_QuAI/QIoT_IoT_App) import to QIoT Suite Lite or you may create a new IoT Application by yourself. To do so, please follow following steps
**<font color=red># Notes : You need to install “[node-red-contrib-file-upload](https://flows.nodered.org/node/node-red-contrib-file-upload)” module to your QIoT Suite Lite Rule, Reference to : [How to install other modules in QIoT Suite Lite NodeRED?](https://www.qnap.com/go/how-to/tutorial/article/how-to-install-other-modules-in-qiot-suite-lite-nodered)</font>**
1. Create an IoT App and 2 Things : **"cameraPi"** and **"AWSgreengrass"**

2. And create Thing Resource : **cameraPi-->"image"** and **AWSgreengrass-->"resolve"**


3. Import [**rulesJson.json**](https://github.com/qnap-dev/qnap-qiot-sdks/tree/master/projects/AWSGreengrass-Integration-Scenarios/Greengrass_device_QIoT_QuAI/QIoT_IoT_App) in Node-Red rule engine using Rules tab --> Import --> Clipboard option. After import you can see the following 2 rules flow


4. Verify your dashboard
* 點擊下圖紅框處測試 Dashboard 、 AI Sample Container 和 AWS Greengrass是否有正常運作

* 觀看右側Debug欄位是否有出現正常log

* 切換到Dashboard頁面是否有呈現數值及照片

### Step-5 : Setup AWS cloud S3 bucket & Rules
1. Create **MoveImageToS3** Node.js Lambda function in AWS Lambda service. **(Please find Demo Lambda source codes inside this folder [AWS_Greengrass_Lambda](https://github.com/qnap-dev/qnap-qiot-sdks/tree/master/projects/AWSGreengrass-Integration-Scenarios/Greengrass_device_QIoT_QuAI/AWS_Greengrass_Lambda))**(建立Lambda function請參考AWS說明文件 : https://docs.aws.amazon.com/greengrass/latest/developerguide/create-lambda.html)
2. Create a new S3 bucket **"qiotquaiggdemo"** in AWS S3 service (建立S3 bucket請參考AWS說明文件 : https://aws.amazon.com/s3/getting-started/?nc1=h_ls)
3. 參考下圖修改Lambda Function中的S3 Bucket設定,依據您的AWS IAM及S3上的設定填入accessKeyId、secretAccessKey、Bucket等資訊:

4. Create a Act(rule) in AWS IoT to upload Image to S3 bucket using Rule's action **"Invoke a Lambda function passing the message data"**


5. Declare **MoveImageToS3** in the function name drop down and update the changes


### Step-6 : Start the demo
Setup the camera in Raspberry Pi device and start the program by executing the following command :
```bash
python send_image_AWSGG.py -e <host>.iot.<region>.amazonaws.com -r root.ca.pem -c <GG_Camrea_Cert_pem_file> -k GG_Camrea_Cert_private_key_file -n GG_Camera -m publish -t "cameraImage"
```
- **-e** : Aws IoT Endpoint (In **IoT Core** home page, under **Settings**, make a note of the value of **Endpoint**.)
- **-r** : Root CA Path
- **-c** : Thing Ceritificate Path
- **-k** : Thing Private key Path
- **-n** : Thing Name
### Step-7 : Verify the demo
1. In QIoT Suite Lite Dashboard :

2. In AWS IoT Cloud :

3. In AWS S3 :

## Scenario-2
* Camera --> QIoT Suite Lite IoT device --> QIoT Suite Lite --> QuAI --> AWS Greengrass Core Lambda --> AWS Cloud --> S3 bucket

The steps in this scenario are same as Scenario-1, just that the application running on Raspberry Pi is different. Please refer **[QIoT_device_QuAI_Greengrass](https://github.com/qnap-dev/qnap-qiot-sdks/tree/master/projects/AWSGreengrass-Integration-Scenarios/QIoT_device_QuAI_Greengrass/)** section to setup the device.
參考步驟 :
1. Install dependency library and software
```bash
pip install paho-mqtt
sudo apt update && sudo apt install fswebcam
```
2. Follow in **Scenario-1**--> **"Step-1"** to **"Step-5"**
3. Upload **[RaspberryPi_side](https://github.com/qnap-dev/qnap-qiot-sdks/tree/master/projects/AWSGreengrass-Integration-Scenarios/QIoT_device_QuAI_Greengrass/RaspberryPi_side)** floder to Raspberry Pi
4. Download **"resourceinfo.json"** from QIoT Suite Lite **cameraPi** thing and put **resourceinfo.json** under the "/res" folder
5. Run command :
```bash
python main.py
```
6. Follow in **Scenario-1**--> **"Step-7"**
###### tags: `Tutorial`