FastAPI + シンプルな HTML/JS だけで、 「センサ値をリアルタイム表示して CSV ダウンロードできるサンプルアプリ」です。
GitHub からクローンして、少しコードを書き換えて自分用に使うことを想定しています。
- 温湿度センサ(シミュレータ / DHT22 / BME280 など)の値をリアルタイムにグラフ表示
- 計測の開始 / 停止、サンプリング周期・バッファ長の変更
- 設定内容を JSON ファイルに自動保存
- 表示中の波形をそのまま CSV ダウンロード
- 単一 FastAPI アプリで API / WebSocket / HTML UI まで完結
前提:
- Python がインストールされていること
- パッケージマネージャーとして uv v0.5 以降を使用
セットアップ:
uv sync
uv run uvicorn backend:app --reloadブラウザで http://localhost:8000/realtime にアクセスすると UI が開きます。
別のフロントエンドを立ち上げる必要はありません。
- ページ右上の設定からサンプリング周期やバッファ長、センサ種別を選ぶ
- 「Start」ボタンで計測開始(グラフがリアルタイム更新されます)
- 「Stop」で計測停止
- 必要に応じて「CSV ダウンロード」で現在の波形データを保存
設定は settings.json に自動保存され、次回起動時に復元されます
(このファイルは .gitignore 済みなのでリポジトリには含まれません)。
主にセンサ構成は環境変数で切り替えます。 代表的なものだけを挙げます。
SENSOR_ID- 既定:
climate(温湿度センサ構成) accelerometerにすると三軸加速度センサ構成になります。
- 既定:
SENSOR_DRIVER- センサごとのドライバ ID。
climate:simulated/dht22/bme280accelerometer:simulated/lis3dh
DHT22_DATA_PIN- DHT22 のデータピン(例:
D4)。
- DHT22 のデータピン(例:
BME280_TEMP_OFFSET,BME280_HUM_OFFSET- BME280 の温度・湿度補正値(数値)。
ACCEL_SIM_NOISE_G- 加速度シミュレータに乗せるノイズ量(単位 g、例:
0.02)。
- 加速度シミュレータに乗せるノイズ量(単位 g、例:
LIS3DH_ADDRESS- LIS3DH の I2C アドレス(例:
0x18)。
- LIS3DH の I2C アドレス(例:
CORS_ORIGINS- 別ホストの Web フロントから叩きたい場合のオリジンリスト(カンマ区切り)。
「ちょっと書き換えて使いたい」場合、まず以下のファイルを見るのがおすすめです。
backend.py- FastAPI アプリ本体。
- 設定 API (
/api/settings/*)、ストリーム API (/api/stream/*)、WebSocket (/ws/sensor)、HTML (/realtime) を提供。
templates/realtime.html- Plotly ベースの UI テンプレート。
- グラフの見た目やボタン配置を変えたい場合はここを編集。
sensor.py/sensors/- センサ抽象化レイヤー。新しいセンサやドライバを追加したいときの入口です。
settings_store.pysettings.jsonへの保存・読み込みまわり。
ブラウザ上のバッファに溜まっているデータを、画面で選んだ時間範囲で切り出して
realtime-log-YYYYMMDD-HHMMSS.csv というファイル名でダウンロードします。
将来的にはサーバー側に /api/logs/export や長期保存用ストレージを追加することを想定しています(仕様書フェーズ 4 に記載)。