ENGLISH

CodeProject


(ご案内)
CodeProject は、CodeProject が有用で、開発者にとって価値があると考えられた製品およびサービスに関する情報を提供することを目的に公開されているサイトです。

ここでは、Actian 製品に関連した公開情報の一部をお知らせしております。
なお、お知らせしている情報は、すべて CodeProject に著作権等、帰属しています。本サイトは、提供元より了承を得て、エージーテックが翻訳してご紹介しております。記載情報のご利用の際は、オリジナルサイトとあわせご確認ください。

Actian Zen と Python を使用した組み込み IoT データベース

Ryan Peden
Software Developer CodeProject
Canada
12 June 2019


組み込みデータベース、Actian Zen を使って Raspberry Pi にデータを保存して処理する方法を見ていきます。

当記事は、CodeProject においてスポンサー向けに提供する「Product Showcase」セクションにあります。これらの記事は、製品およびサービスに関して、開発者向けに有益と考えられる情報を提供します。


はじめに

かつて、組み込みコンピューティングはソフトウェア開発の世界では小さなニッチ分野でした。ハードウェアは高価で、入手が難しく、ソフトウェアを作成するのはずっと困難でした。この状況は幸いにも変わりつつあります。Raspberry Pi のような安価で使いやすい組み込みデバイスの登場により、IoT コンピューティングが主流になりました。

Raspberry Pi のようなミニ コンピューターは、Arduino や ESP32 をベースにしたデバイスほど小さくはありませんが、そのサイズや消費電力は、気象観測所のようなハードウェア ソリューションに組み込むことができるほど、十分に小さなものとなっています。このことを念頭に置きながら、組み込みデータベース、Actian Zen を使って Raspberry Pi にデータを保存して処理する方法を見ていきます。

組み込みデータベースを使用する理由

Raspberry Pi のような組み込みコンピューターは、さまざまなセンサーと通信できます。この場合、センサーとは、気温、湿度、風速、光源レベル、心拍、運動、加速度、さらには酸素や二酸化炭素などの気体のレベルのようなものを測定できるセンサーです。

組み込みコンピューターは、センサーを継続的に監視すると、大量のデータを生成します。気温、風速、湿度、気圧を測定している気象観測所があるとします。30 秒ごとにセンサーからデータを読み取る場合は、毎日何千もの測定値を記録することになります。

センサーの読み取り値すべてを処理のためセントラル サーバーに転送するよう、組み込みデバイスをセットアップすることもできますが、そうしたくない場合もあります。架空ではありますが、このような気象観測所で使用される組み込みデバイスは、低速で信頼性が低く高価なモバイル インターネット接続を使って、遠隔地で稼働している場合がよくあります。

デバイスがあまり多くのネットワーク帯域幅を使用しないようにし、ネットワークがダウンした場合でも引き続き使用できるようにするには、データを保存して集約する方法が必要です。そこで、Actian Zen の登場です。Raspberry Pi 上に Zen をセットアップし、Python アプリケーションから Raspberry Pi にセンサーのデータを保存する手順を見てみましょう。

前提条件

このチュートリアルではこれ以降、下記を前提として進めます。


セットアップ

最初に、Actian Zen をダウンロードする必要があります。Pi の Web ブラウザーを使って直接ダウンロードすることも、Zen をコンピューターにダウンロードし、USB フラッシュ ドライブを使って Pi に転送することもできます。

『Actian Zen Edge Raspbian Linux 評価/開発版 お申し込み』ページで評価/開発版のお申し込みを行います。
返信メールに記載されている手順に従ってダウンロードページにログインします。
EULA を確認後、[Zen Edge ファイルのダウンロード] をクリックします。
Zen-IoT-Community.jajp-linux-xx.xx-xxx.xxx.armhf.tar.gz ファイルがダウンロードされます。

ダウンロードが完了したら、ターミナルを開きます。Raspbian でこれを行うには、画面上部の近くにある アイコンをクリックします。

次に、Actian Zen をダウンロードしたディレクトリに移動します。Actian Zen を Pi に直接ダウンロードした場合に当該のディレクトリに移動するには、次のコマンドを使用します。


cd ~/Downloads

次のコマンドを実行して Zen を解凍します。


sudo tar -C /usr/local -xvf Zen-IoT-Community.jajp-linux-xx.xx-xxx.xxx.armhf.tar.gz

※上記のxx.xx-xxx.xxxをダウンロードしたファイル名に合わせてください。


Zen のインストール スクリプトは、Zen が /usr/local ディレクトリにあるものと想定しているため、このディレクトリに解凍しました。次に、以下のコマンドを順番に実行します。


sudo apt install unixodbc
cd /usr/local/psql/etc
sudo ./preinstall.sh
sudo ./postinstall.sh

まず、unixodbc パッケージをインストールします。unixodbc は、UNIX および UNIX ライクなオペレーティング システム用の Open Database Connectivity(ODBC)ドライバーです。ODBC は、アプリケーションがデータベースに接続するための標準的な方法を提供します。ここでは、ODBC を使って、Python アプリケーションから Zen にアクセスします。

次に、Zen を解凍した psql ディレクトリに移動します。最後に、Zen の preinstall スクリプトと postinstall スクリプトを実行します。preinstall は、インストールしようとしている Zen のバージョンの要件をシステムが満たしているかどうかを確認します。Zen の Raspbian ビルドをダウンロードしている場合には、問題は発生しません。postinstall により、魔法が掛けられます。つまり、新しい psql ユーザーの作成、Zen のセットアップ、Zen デーモンの起動、DEMODATA データベースの作成、そしてデモ データベースへのサンプル データの投入がすべて行われます。

次に、Zen を ODBC 経由でアクセスできるようにするために、スーパーユーザーとしてさらにいくつかのコマンドを実行する必要があります。注意:スーパーユーザーとして実行することには危険が伴います。ファイル システム全体を削除するコマンドを誤って実行した場合でも、Raspbian は警告を発行することなく削除を行います。入力したコマンドは、実行する前に必ず再確認してください。


sudo su
cd /etc
cat /usr/local/psql/etc/odbc.ini >> ./odbc.ini
cat /usr/local/psql/etc/odbcinst.ini >> ./odbcinst.ini
exit

上記で行ったことは、Zen の ODBC 構成データをシステム全体の ODBC 構成ファイルに追加したことにほかなりません。構成をコピーすることで、アプリケーションが ODBC 経由で Zen を特定して接続できるようになります。最後の exit コマンドにより、あなたはスーパーユーザーではなくなります。

次のもう 1 つのコマンドを実行する必要があります。


cat /home/psql/.bashrc >> ~/.bashrc

最後に、psql ユーザーの Bash 構成ファイルからユーザーとしての自分の Bash 構成ファイルにデータを追加します。これにより、ユーザーのライブラリ ロード パスに Zen の共有ライブラリが追加されます。この手順がないと、Python アプリケーションは Zen に接続するために必要なライブラリを特定できなくなります。

Python アプリケーション

15 秒ごとに CPU の温度データをサンプリングして Zen に書き込む Python 3 アプリケーションを作成します。このアプリケーションでは、Zen から集計データを照会する方法も示します。これは、データをセントラル サーバーに送信する準備として、まさにあなたがやりたいことです。

アプリケーションの作成を開始する前に、Python が ODBC データベースに接続できるようにするパッケージをインストールしておく必要があります。ターミナルで、次のコマンドを実行してください。


sudo apt install python3-pyodbc

このコマンドにより、pyodbc パッケージのビルド済みバージョンがインストールされます。インストールされたら、アプリを作成する準備が完了です。

はじめに、任意のテキスト エディターを開きます。Raspbian には、軽量の Python IDE である Thonny が同梱されています。何を使うべきかよくわからない場合は Thonny を選択することをお勧めします。ただし、どのエディターが使用されるかについては想定していませんので、Thonny 以外のエディターでも自由にご使用いただいて構いません。

次に、新しいアプリ用のディレクトリを作成します。私は通常、ホーム ディレクトリの下にプロジェクト ディレクトリを作成し、そこに自分のプロジェクトを保存しています。そうする方法を以下に示します。


mkdir ~/projects
mkdir ~/projects/zen-iot
cd ~/projects/zen-iot


上記のコマンドは、アプリケーション用の新しいディレクトリを作成してから、現在のディレクトリを新しいアプリケーション ディレクトリに移動しています。このターミナル ウィンドウは開いたままにしておきます。このウィンドウは、アプリを実行するために使用するからです。

テキスト エディターで新しいファイルを作成し、setup.py としてアプリケーション ディレクトリに保存します。ファイルには以下のコードを記述します。


import pyodbc

conn_str = "Driver={Pervasive ODBC Interface};server=localhost;DBQ=demodata"
db = pyodbc.connect(conn_str)
c = db.cursor()

print("Setting up database...")
c.execute("DROP TABLE IF EXISTS cpu_data")
c.execute("CREATE TABLE cpu_data (id identity, timestamp bigint, temperature real)")
c.execute("CREATE INDEX cpu_data_time on cpu_data (timestamp)")

まず pyodbc ライブラリをインポートします。次に、ODBC 接続文字列を作成します。ODBC の全容はこのチュートリアルの範囲を超えていますが、OBDC と Zen についてはここで読むことができます。 Zen がインストール中に作成した既存のデータベース demodata が、接続文字列の中で使用されていることに気づかれるでしょう。プロダクション アプリでは、ユーザーが作成したデータベースを指定してください。

次に、データベースに接続して 3 つの SQL コマンドを発行します。テーブルが既に存在する場合に削除するコマンド、テーブルを作成するコマンド、およびテーブルにインデックスを追加するコマンドです。タイムスタンプに設定するインデックスは重要です。タイムスタンプによって気温を照会するためと、インデックスによって検索が高速になるためです。

タイムスタンプを格納するのに、SQL の date 型でなく bigint を使用していることに注意してください。こうするのは、タイムスタンプを UNIX 時刻として格納するためです。

次に、アプリ ディレクトリに write.py という名前のファイルを作成します。次のコードを追加してください。


import time
import sys
import subprocess
import pyodbc
	 
def get_cpu_temperature():
  output = subprocess.check_output(["cat","/sys/class/thermal/thermal_zone0/temp"])
  temp_value = float(output) / 1000
  return temp_value

def main():
  conn_str = "Driver={Pervasive ODBC Interface};server=localhost;DBQ=demodata"
  db = pyodbc.connect(conn_str)
  c = db.cursor()
  insert_command = """INSERT INTO cpu_data VALUES (0, ?, ?)"""

  while True:
    current_temp = get_cpu_temperature()
    print("Saving temperature: {0}".format(current_temp))
    timestamp = int(time.time())
    c.execute(insert_command, (timestamp, current_temp))
    c.commit()
    c.execute("SELECT COUNT(*) FROM cpu_data")
    row = c.fetchone()
    if row:
      print('Total temperature records:', row[0])
    time.sleep(30)

    
  return 0
   
if __name__ == "__main__":
  sys.exit(main())

まず、pyodbc と Python 標準ライブラリのいくつかの部分をインポートします。

次に、CPU の温度を読み取る関数を作成します。Linux はシステム情報をファイル システムの一部として公開するので、/sys/class/thermal/thermal_zone0/temp ファイルを読み取るために cat コマンドを使用します。このファイルには、現在の CPU 温度が 1000 分の 1℃単位で含まれています。℃に変換するために、1000 で除算しています。

次に、main 関数にあるアプリケーションの核心について説明します。接続文字列とデータベース接続は setup.py 内にあるものと同じです。次に、データベースに新しいレコードを挿入するための SQL コマンドを作成します。

最後に、「現在の温度を取得し、それをデータベースに書き込んでから 30 秒待機する」というループを開始します。これにより、30 秒毎にデータベースに CPU の温度を記録する、永久に実行されるアプリケーションが得られます。実稼働の IoT Linux アプリでは、通常、アプリケーションを systemd サービスとしてセットアップします。これにより、IoT デバイスが起動すればアプリケーションが自動的に起動し、IoT デバイスがクラッシュすればアプリケーションが自動的に再起動するようにする設定を簡単に行うことができます。

追加するコードがもう 1 つあります。アプリ ディレクトリに read.py という名前のファイルを作成し、次のコードを入力します。


import pyodbc
import time

conn_str = "Driver={Pervasive ODBC Interface};server=localhost;DBQ=demodata"
db = pyodbc.connect(conn_str)
c = db.cursor()

five_mins_ago = int(time.time()) - 300
query = "SELECT AVG (temperature) FROM cpu_data WHERE timestamp > ?"
result = c.execute(query, (five_mins_ago,))
row = result.fetchone()

if row:
    print("Average temperature over past 5 minutes: {0}".format(row[0]))


ここでは、データベースに接続し、5 分前の UNIX タイムスタンプを計算してから、過去 5 分間の平均 CPU 温度をフェッチするための SQL コマンドを実行します。その後、この値をターミナルに出力します。

実際の IoT アプリケーションでは、このデータをクラウドまたはプライベート サーバーに送信する必要があるでしょう。先に説明したように、データを集中管理できる場所に送信する前に集計して必要な計算を実行できることが、IoT アプリケーションで Zen のようなデータベースを使用する必要がある理由です。

作成したアプリを実行するには、アプリのディレクトリから次のコマンドを実行します。


python3 setup.py
python3 write.py

これを 5 ~ 10 分間実行して、温度データを Zen に保存します。その後、Ctrl キーを押しながら Z キーを押してアプリを終了します。

最後に、以下のコードを実行します。


python3 read.py


Raspberry Pi の過去 5 分間の平均 CPU 温度が表示されます。

これで稼働させることができました。より複雑なセンサー データを Raspberry Pi に保存して処理するには、Zen を使用することを検討してください。どこから始めればよいかわからない場合は、安価なセンサー キットが数多く市販されています。面白いセンサーが豊富にあるので、きっと素晴らしいアイデアを思いつくことでしょう!

ライセンス

当記事および関連するソース コードとファイルは、The Code Project Open License (CPOL) に基づいてライセンスされます。

Contactお問い合わせ

お気軽にお問い合わせください。

お問い合わせ

    必須会社名

    個人のお客様は「個人」と入力してください。

    必須お名前
    必須メールアドレス
    必須メールアドレス(確認)
    必須ライセンス ありなし
    ダウンロード目的