はじめに
これまで、我が家の環境モニタリングは主にSwitchBot温湿度計のデータを収集する仕組みをベースに行ってきました。
今回は、Wi-Fi接続が可能なマイコンボード、Raspberry Pi Pico Wを活用し、これに接続したセンサーからのデータを既存のデータベース(sensor_db)に取り込む新たな仕組みを構築します。
この連載記事では、Pico WからHTTP POSTでデータを送信し、それをデータベースに格納するまでの一連の流れを解説していきます。 第一回となる今回は、データを受け取るためのデータベーステーブルの設計と準備を行います。
1.新しいデータ収集のゴール設定
新たな仕組みでは、Pico W側で取得した温度と湿度のデータを、Webサーバーを経由してデータベースに送信・記録することを目標とします。 従来の仕組みと新たな仕組みの比較を下表にまとめました。
| カテゴリ | 従来のデータ収集 | 新たなデータ収集 |
|---|---|---|
| データソース | SwitchBot温湿度計(Bluetooth) | Raspberry Pi Pico W + 接続センサー |
| データ取得方法 | Raspberry PiでBluetoothスキャン&データ解析 | Pico WからHTTP POST |
| 目的 | 広範囲の環境監視 | 特定箇所・高頻度での詳細な環境監視 |
2.データ格納用テーブルの準備
Pico Wから送信されるセンサーデータを格納するために、データベース(sensor_db)に新しいテーブルを作成します。テーブル名はpico_sensor_dataとします。
CREATE TABLE 文
以下のSQL文を実行してテーブルを作成します。
CREATE TABLE pico_sensor_data ( id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, temperature DECIMAL(5, 2) NOT NULL COMMENT '温度データ', humidity DECIMAL(5, 2) NOT NULL COMMENT '湿度データ', recorded_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '記録日時' );
各カラムの解説
| カラム名 | データ型 | NULL可否 | 説明 |
|---|---|---|---|
| id | INT UNSIGNED | NOT NULL | 主キー。レコードを一意に識別するための**自動増分(AUTO_INCREMENT)ID。 |
| temperature | DECIMAL(5, 2) |
NOT NULL |
温度データ。小数点以下2桁、全体で5桁の数値を許容する固定小数点型**。精度が求められるセンサーデータに適しています。 |
| humidity | DECIMAL(5, 2) |
NOT NULL |
湿度データ。温度と同様に、精度の高いDECIMAL型を採用しています。 |
| recorded_at | TIMESTAMP |
NOT NULL |
記録日時。DEFAULT CURRENT_TIMESTAMPを設定しているため、INSERT時に値を省略した場合、自動的に現在の時刻が挿入されます。 |
特にDECIMAL(5, 2)は、FLOATやDOUBLEのような浮動小数点型と異なり、誤差が発生しない固定小数点型であるため、正確な数値記録が必要なセンサーデータとの相性が良いデータ型です。
3.データを挿入するためのSQL例
実際にPico W側からPOSTされたデータを受け取り、サーバーサイドのプログラム(例: Python, PHPなど)でデータベースに接続し、データを挿入する際のSQL文のイメージです。
Pythonのデータベースライブラリ(例: mysql.connector)を使用し、**プレースホルダ(%s)**を用いて安全にデータを挿入します。
# temperature と humidity は Pico W から POST で受け取った値 temperature = 25.50 humidity = 60.35 # 挿入用のSQL文 sql = "INSERT INTO pico_sensor_data (temperature, humidity, recorded_at) VALUES (%s, %s, NOW())" # SQLを実行(%sの部分に(temperature, humidity)のタプルがバインドされる) cursor.execute(sql, (temperature, humidity)) # 最後に cursor.connection.commit() でDBに反映
recorded_atにはNOW()関数を使用していますが、前述の通りカラム定義でDEFAULT CURRENT_TIMESTAMPを設定しているため、SQL文からrecorded_atを省略し、**INSERT INTO pico_sensor_data (temperature, humidity) VALUES (%s, %s)**としても、DB側で自動的に記録時刻が挿入されます。
おわりに
今回は、Raspberry Pi Pico Wからのセンサーデータを受け入れるためのデータベース環境の整備、すなわち専用テーブルの作成とカラム設計を行いました。
DECIMAL(5, 2) を採用することで、精度の高い温湿度データを確実に記録できる基盤が整いました。
次回以降は、このテーブルをターゲットとして、
- Pico WのMicroPythonスクリプトで温湿度データを取得し、HTTP POSTで送信する部分
- Webサーバー側でPOSTデータを受け取り、データベースに挿入するAPI(エンドポイント)の構築
といった具体的なステップに進んでいきます。