Using SiriDB for IoT applications
Tags: iot, timeseries, database, opensource
Published: 2022-03-30 10:45:28

The Internet of Things has long been one of the most popular technology trends and for good reason. It offers many possibilities and advantages. This includes monitoring data, such as the temperature or air quality in a home. But this data must be stored somewhere for later use. Preferably by using a very efficient solution, because IoT devices often do not have a lot of computing power. An extremely suitable solution that can be used for this is SiriDB. A super fast and very robust time series database.

In this post, we'll show you how to easily build a weather station that uses SiriDB as the database for all its measurements. For this weather station we use a Raspberry Pi (3 Model B) in combination with a Sense HAT.

---

## Prerequisites

**Hardware**

- Raspberry Pi
- Sense HAT

**Software**

You will need the [latest version of Raspberry Pi OS](https://www.raspberrypi.org/downloads/), which already includes the following software packages:

- Python 3
- Sense HAT for Python 3

If for any reason you need to install the Sense HAT package manually, execute the following command on your Raspberry Pi:

`$ sudo apt-get install sense-hat`

---

## Set up

Now that our Raspberry Pi is ready to go, we need to follow a few steps to install SiriDB.

First, install the required SiriDB dependencies:

`$ sudo apt install libcleri-dev libpcre2-dev libuv1-dev libyajl-dev uuid-dev`

Download the source code of SiriDB:


`$ wget https://github.com/SiriDB/siridb-server/archive/refs/tags/2.0.46.zip`

> **Note**: Change the version in the URL to get the latest version of SiriDB.

Now unzip the downloaded ZIP file:


`$ unzip 2.0.46.zip`

After that, compile the source code:

```bash
$ cd siridb-server-2.0.46/Release/
$ make clean
$ make
```

Then install SiriDB:

`$ sudo make install`

Finally, install the [SiriDB Connector for Python](https://pypi.org/project/siridb-connector/) with pip (recommended), which will be used in a later step:

`$ pip install siridb-connector`

---

## Configuration

Great! SiriDB is now installed. But in order for SiriDB to start automatically on startup, the file below named `siridb-server.service` needs to be added to the `/etc/systemd/system` folder:

```
[Unit]
Description=SiriDB Server
After=network.target

[Service]
Environment="SIRIDB_HTTP_API_PORT=9020"
ExecStart=/usr/bin/siridb-server
StandardOutput=journal
LimitNOFILE=65535
TimeoutStartSec=10
TimeoutStopSec=300

[Install]
WantedBy=multi-user.target
```

> **Note**: The environment variable `SIRIDB_HTTP_API_PORT` must be added because if the HTTP API port is not set (or 0), the API service of SiriDB will not start. Checkout the [documentation](https://docs.siridb.net/getting_started/configuration/) for more information about using environment variables with SiriDB.

Now we need to reload the daemon, to make the system aware of the newly added service:

`$ sudo systemctl daemon-reload`

Let’s enable our service so that it doesn’t get disabled when the Raspberry Pi restarts:

`$ sudo systemctl enable siridb-server.service`

And now let's start our service:

`$ sudo systemctl start siridb-server.service`

The SiriDB server is now running in the background. 

The only thing left to do in terms of configuration is to create a database in SiriDB. For this we use the [SiriDB HTTP API](https://docs.siridb.net/connect/http_api/). SiriDB has a default [service account](https://docs.siridb.net/overview/service_account/) with the username `sa` and password `siri`, which we will use. For our tutorial we only need a second precision database. We also select a [shard](https://docs.siridb.net/shards/) duration of 6 hours for this database because our measurement interval will be only a few seconds. Sometimes you may want to store one value per measurement per hour or even per day. In that case, your database will perform better by using a larger shard duration.

Create the database on the SiriDB server running on port 9020 using cURL with basic authentication:

```bash
$ curl --location --request POST 'http://localhost:9020/new-database' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic c2E6c2lyaQ==' \
--header 'Content-Type: text/plain' \
--data-raw '{
    "dbname": "iot",
    "time_precision": "s",
    "buffer_size": 8192,
    "duration_num": "6h",
    "duration_log": "3d"
}'
```

> **Note**: The value passed to the header parameter `Authorization`, is the word Basic word followed by a space and a base64-encoded string `username:password`. See the [documentation](https://docs.siridb.net/connect/http_api/#authentication) for more information about authentication in SiriDB.

---

## Collecting data

To collect the data we use Python 3 together with the Sense HAT package.

The Python script below called `sense.py` contains the minimal code necessary to collect some key measurements using the Raspberry Pi Sense HAT and then write them to SiriDB:

```python
import asyncio
import time

from sense_hat import SenseHat
from siridb.connector import SiriDBClient


async def collect_data(siri):

    # Start connecting to SiriDB.
    await siri.connect()

    # Initialize the Raspberry Pi Sense HAT.
    sense = SenseHat()

    try:
        # Make sure the script runs indefinitely.
        while True:

            # Get the current temperature and round it to 2 decimal places.
            temp = round(sense.get_temperature(), 2)

            # Get the current humidity and round it to 2 decimal places.
            humi = round(sense.get_humidity(), 2)

            # Get the current pressure and round it to 2 decimal places.
            pres = round(sense.get_pressure(), 2)

            # Show the current temperature on the Sense HAT.
            sense.show_message('%s C' % temp)

            # Get the current time in seconds since the Epoch.
            ts = int(time.time())

            # Add the collected data to the SiriDB serie: "temperature".
            await siri.insert({'temperature': [[ts, temp]]})

            # Add the collected data to the SiriDB serie: "humidity".
            await siri.insert({'humidity': [[ts, humi]]})

            # Add the collected data to the SiriDB serie: "pressure".
            await siri.insert({'pressure': [[ts, pres]]})

            # Wait 10 seconds before retrieving new measurements.
            await asyncio.sleep(10)

    finally:
        # Close all SiriDB connections.
        siri.close()

# Initialize the SiriDB client.
siri = SiriDBClient(
    username='iris', # Default username
    password='siri', # Default password
    dbname='iot', # The name of the database we created earlier
    hostlist=[('localhost', 9000)],  # Multiple connections are supported
    keepalive=True 
)

loop = asyncio.get_event_loop()
loop.run_until_complete(collect_data(siri))
```

Add the script    to your Raspberry Pi and start it with:

`$ python sense.py`

To verify that everything is working properly you should now see a message on your Sense Hat every 10 seconds:


![Raspberry Pi weather station](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zanjdil55zkzf81rk4os.jpg)

> **Note**: Our camera couldn't capture the message from the LED matrix well, but it does show the correct temperature. (Assuming you believe us of course 🙂)

---


## Visualization

That was all! Some key measurements are now automatically collected every 10 seconds and written to SiriDB.

However, it would be even more valuable if some insights could also be obtained from this data. This can be done using a visualization application such as Grafana, for which SiriDB has made a ready-to-use plugin: [grafana-siridb-http-datasource](https://github.com/SiriDB/grafana-siridb-http-datasource).

How Grafana can be used in combination with SiriDB is explained [here](https://siridb.com/blog/update-example-grafana-using-siridb-http-api/). But below you can already see what the measured data would look like in this application:


![Grafana dashboard](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5c6w20oqdq46n00pm4h8.png)

---

## Conclusion

In this blog post we have shown step by step how easy and effective it is to deploy SiriDB for IoT applications. Now you have enough information to get started with SiriDB yourself!

If you want to learn more about SiriDB, you can visit the official documentation page at <https://docs.siridb.net>.