FeedMyFurBabies – Storing Historical AWS IoT Core MQTT State data in Amazon Timestream
Tags: aws, awsiot, awscdk, amazontimestream
Published: 2024-02-25 10:19:37

In my code examples I shared in the past, when I sent and received IoT messages and states to and from AWS Core IoT Topics, I only implemented subscribers to react to perform a functionality when an MQTT message is received on a Topic; while that it was useful when my FurBaby was feed in the case when the Cat Feeder was triggered to drop Temptations into the bowls, however, we did
not keep a record of the feeds or the State of the Cat Feeder into some form of data store over time - this meant we did not track when or how many times food was dropped into a bowl. 

# Solution
In this blog, I will demonstrate how to store the data in the MQTT messages sent to AWS IoT Core and ingest the data into Amazon Timestream database; Timestream is a serverless time-series database that is fully managed so we can leverage with worrying about maintaining the database infrastructure.

# Architecture
![Architecture](https://raw.githubusercontent.com/chiwaichan/blog-assets/main/images/feedmyfurbabies-cdk-iot-timestream/iot-rules-timestream/feedmyfurbabies-iot-timestream.png)

In this architecture we have two AWS IoT Core Topics, where each IoT Topic has an IoT Rule associated with it that will send all the data from every MQTT message receieved from that Topic - there is an ability to filter the messages but we've not using to use it, and that data is ingested into a corresponding Amazon Timestream table.

# Deploying the reference architecture
```
git clone git@github.com:chiwaichan/feedmyfurbabies-cdk-iot-timestream.git
cd feedmyfurbabies-cdk-iot-timestream
cdk deploy

git remote rm origin
git remote add origin https://git-codecommit.us-east-1.amazonaws.com/v1/repos/feedmyfurbabies-cdk-iot-timestream-FeedMyFurBabiesCodeCommitRepo
git push --set-upstream origin main
```

Here is a link to my GitHub repository where this reference architecture is hosted: [https://github.com/chiwaichan/feedmyfurbabies-cdk-iot-timestream](https://github.com/chiwaichan/feedmyfurbabies-cdk-iot-timestream)

# Simulate an IoT Thing to Publish MQTT Messages to IoT Core Topic
In the root directory of the repository is a script that simulates an IoT Thing and it will constantly publish MQTT messages to the "cat-feeder/states" Topic; ensure you have the AWS CLI installed on your machine with a default profile as it relies on it, and ensure the Access Keys used by the default profile has the permission to call "iot:Publish".

It sends a random number for the "food_capacity" that ranges 0-100 to represent the percentage of food that is remaining in a cat feeder, and a values for the "device_location" as we are scaling out with the number of cat feeders placed around the house. Be sure to send the same JSON structure in your MQTT message if you decide to not use the provided script to send the messages to the Topic. 

![publish mqtt messages script](https://raw.githubusercontent.com/chiwaichan/blog-assets/main/images/feedmyfurbabies-cdk-iot-timestream/iot-rules-timestream/publish-mqtt-messages-script.png)

# Query the data stored in the Amazon Timestream Database/Table

Now lets jump into the AWS Console, then jump into the Timestream Service and go into the "catFeedersStates" Table; then click on "Actions" to show the "Query table" option to go to the Query editor.

![timestream table](https://raw.githubusercontent.com/chiwaichan/blog-assets/main/images/feedmyfurbabies-cdk-iot-timestream/iot-rules-timestream/timestream-table.png)

The Query editor will show a default query statement, click  "Run" and you will see in the Query results the data from the MQTT messages that was generated by the script; where the MQTT messages was ingested from the IoT Topic "cat-feeder/states".

![timestream table query](https://raw.githubusercontent.com/chiwaichan/blog-assets/main/images/feedmyfurbabies-cdk-iot-timestream/iot-rules-timestream/timestream-table-query.png)