2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

IoTデータをClaude 4 sonnetで分析するツールを作ってみた

2
Posted at

はじめに

センサーやデバイスから収集したデータが十分に活用できず、宝の持ち腐れになっているケースをよく見かけます。有効活用が進まない理由として、データ分析には専門的な知識が必要で、そういったスキルを持つ人材が不足していることが挙げられると思います。
今回は、そのような課題を解決するために難しい分析は全て生成AIに任せて、自然言語でIoTデータを分析するツールを作ってみました!

システム構成

image.png

  • フロントエンド: HTML + Chart.js(グラフ描画用ライブラリ)
  • バックエンド: API Gateway + Lambda
  • データベース: DynamoDB
  • AI: Claude API

ユーザーが自然言語で質問すると、Lambda関数がDynamoDBからセンサーデータを取得してClaude APIで分析を実行し、AIが生成した分析結果とグラフをユーザーのブラウザに表示する仕組みです!

ユースケース

室内に設置した温度センサーとエアコンに取り付けた電力センサーのデータから消費電力削減を考えてみます。

センサーデータのフォーマット

DynamoDBに書き込むセンサーデータのフォーマットはJSON形式で以下のように設定しました。

// 温度センサー
{
  "sensor_id": "temperature_sensor_001",
  "timestamp": "2025-07-03T10:30:00",
  "sensor_type": "temperature",
  "value": 25.3,
  "unit": "°C"
}

// 電力センサー
{
  "sensor_id": "power_sensor_001",
  "timestamp": "2025-07-03T10:30:00",
  "sensor_type": "power_consumption",
  "value": 1250.0,
  "unit": "W"
}

Lambda関数の実装

要点を絞って紹介します。

DynamoDBからセンサーデータを取得

Lambda関数でDynamoDBから温度センサーと電力センサーのデータを取得します。

import boto3
import json
from boto3.dynamodb.conditions import Key

# 定数定義
TEMPERATURE_SENSOR_ID = "temperature_sensor_001"
POWER_SENSOR_ID = "power_sensor_001"
SENSOR_DATA_LIMIT = 100

# DynamoDB接続
dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-1')
table = dynamodb.Table('IoTSensorData')

def fetch_optimized_sensor_data():
    try:
        temp_response = table.query(
            KeyConditionExpression=Key('sensor_id').eq(TEMPERATURE_SENSOR_ID),
            ScanIndexForward=False,
            Limit=SENSOR_DATA_LIMIT
        )
        
        power_response = table.query(
            KeyConditionExpression=Key('sensor_id').eq(POWER_SENSOR_ID),
            ScanIndexForward=False,
            Limit=SENSOR_DATA_LIMIT
        )
        
        all_sensor_data = ([convert_item(item) for item in temp_response['Items']] + 
                          [convert_item(item) for item in power_response['Items']])
        
        return all_sensor_data
        
    except Exception as e:
        print(f"データ取得エラー: {str(e)}")
        return []

sensor_data = fetch_optimized_sensor_data()
data_json = json.dumps(sensor_data, ensure_ascii=False)

DynamoDBは数値データをDecimal型で保存するため、Claude APIへのJSON送信時にエラーが発生します。センサーデータ(温度25.3℃など)をDecimal('25.3')からfloat型に変換する処理が、DynamoDBを使ったIoTシステムでは必須です。

プロンプト

Lambda関数内で定義したプロンプトのテンプレートがこちらです。

prompt = f"""タスク: IoTセンサーデータ分析とグラフ生成
データ: {data_json}
質問: {user_message}
指示:
- Chart.jsを使用してグラフを1つ作成
- フォントサイズは全体で統一(14-16px)
- Chart.jsは https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.9.1/chart.min.js を使用
- シンプルなHTML構造、最小限のCSS
出力: グラフ1つと統一されたテキストスタイルのHTML"""

{data_json}:DynamoDBから取得した温度センサーと電力センサーのデータ
{user_message}:webUIから入力した自然言語

グラフを出力させるためにChart.jsを使用するように指示をしています。
レスポンスを早くするための条件もいくつか書いてみました。

WebUIと実行結果

シンプルな質問入力フォームを作成しました。自然言語で質問を入力すると、センサーデータを分析してグラフ付きのレポートを生成します。

image.png

「室温を26℃以下に保ちながら、エアコンの電気代を節約する方法を教えて」と入力したところ、温度センサーと電力センサーの値を分析し、電気代の節約方法を提案してくれました。
設定温度の最適化や運転の仕方を変えることで効果が得られそうですね!

まとめ

今回は、生成AIを活用してセンサーデータを自然言語で分析するツールを作成しました。
データ分析をAIに委ねることで専門知識がなくても、簡単に洞察を得られるので様々なIoTデータを利用して試してみたいですね!
IoTデータの価値を最大化するための第一歩として、ぜひ参考にしていただければと思います!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?