Skip to main content

M5StickC でスマートメーターから計測値を取得して Amazon Timestream に保存する

概要

M5StickC を使って各家庭に設置されたスマートメーター(電力計)から計測値を取得し、MQTT で AWS IoT に送信、Amazon Timestream に連携して保存します。保存したデータは Grafana などで可視化できます。

概要

必要なもの

ランニングコスト

Amazon Timesteam の料金として約 4 USD/月ほどかかります。

  • 書き込み: 0.625 USD/100 万書き込み
  • ストレージ(マグネティックストア): 0.0375 USD/GB・月

書き込みは 15 秒に 1 回送信した場合で 5,760 回/日、約 18 万回/月なので、月に数十円程度。 ストレージの単価は 0.0375 USD/GB・月 ですが、最低料金として 100 GB ぶん(3.75 GB/月)の料金がかかります。

また可視化のために Amazon Managed Grafana を使用する場合は、別途 9.0 USD/月の固定料金がかかります。

手順

1. B ルートを有効化

参考) M5StickCで家庭用スマートメーターをハックする!

スマートメーターから直接計測値を取得するためには、まずお使いの電力会社に「電力メーター情報発信サービス(B ルートサービス)」に申し込んで B ルートを有効化する必要があります。手続き完了までに数日かかるため、まずは先にやっておきましょう。

認証用の ID とパスワードが発行されます。

2. M5StickC に Wi-SUN モジュールを接続する

参考) M5StickCで家庭用スマートメーターをハックする!

M5StickC にスマートメーターと通信するためのモジュールを装着します。

3. AWS IoT にデバイスを登録

M5StickC から送信されたデータを受信するために、以下の手順でデバイスの設定を作成します。AWS IoT ではこの接続するデバイスのことを「モノ (Thing)」と呼びます。

  1. AWS 管理コンソール > AWS IoT > モノ
  2. 「モノを作成」
  3. 「1 つのモノを作成」
  4. モノのプロパティを指定して「次へ」
    • モノの名前: (例: SmartMeterHub)
  5. 「新しい証明書を自動生成 (推奨)」を選択して「次へ」
  6. ポリシーをアタッチして「モノを作成」
    • ポリシーを作成してアタッチします。(後述)
  7. 以下のファイルをダウンロードする (のちほどデバイスに組み込んで使用します。)
    • デバイス証明書
    • パブリックキーファイル
    • プライベートキーファイル
    • Amazon 信頼サービスエンドポイント

証明書にアタッチするポリシーは、例として以下のように設定します。

  • モノ SmartMeterHub の接続のみ許可
  • トピック SmartMeterHub/measured へのパブリッシュを許可
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:(リージョン):(アカウントID):client/SmartMeterHub"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "arn:aws:iot:(リージョン):(アカウントID):topic/SmartMeterHub/*"
}
]
}

4. スマートメーターから計測値を取得して MQTT に送信するファームウェアを作成する

yh1224/M5SmartMeterHub - GitHub からソースをダウンロードし、手順に従ってインストールします。

  1. src/config.h.template を参考に、src/config.h を作成します。

    • WIFI_SSID : 接続する Wi-Fi アクセスポイントの SSID を指定
    • WIFI_PASS : 接続する Wi-Fi アクセスポイントのパスワードを指定
    • WISUN_MODULE : 使用する Wi-SUN モジュールを指定 (BP35A または BP35C)
    • BROUTE_ID : 電力会社から発行された B ルート ID を指定
    • BROUTE_PASSWORD : 電力会社から発行された B ルートパスワードを指定
    • MQTT_HOST : MQTT ブローカーのホスト名として、AWS IoT の「デバイスデータエンドポイント」を指定 (AWS アカウントごとに異なり、AWS IoT の「設定」から確認します。)
    • MQTT_CLIENT_ID : AWS IoT に登録した「モノの名前」を指定
    • MQTT_TOPIC : 計測値の送信先トピックを指定 (例: SmartMeterHub/measured)

    その他の設定は、必要に応じて変更します。

  2. data/ ディレクトリ配下に以下のファイルを配置し、

    • ca.pem.crt : AWS IoT からダウンロードした「Amazon 信頼サービスエンドポイントの証明書」
    • certificate.pem.crt : AWS IoT からダウンロードした「デバイス証明書」
    • private.pem.key : AWS IoT からダウンロードした「プライベートキーファイル」

    デバイスのファイルシステム (SPIFFS) にアップロードします。

    pio run -t uploadfs
  3. ファームウェアをビルドして、デバイスにアップロードします。

    pio run -t upload

5. Amazon Timestream データベースを作成

AWS 管理コンソール > Amazon Timestream から、データベースおよびテーブルを作成します。

  • データベース
    • 名前: (例: SmartMeter)
  • テーブル
    • データベース名: 作成したデータベースを選択 (例: SmartMeter)
    • テーブル名: (例: measured)
    • パーティションキー設定: デフォルトパーティショニング

6. AWS IoT から Timestream に連携

AWS 管理コンソール > AWS IoT > メッセージのルーティング > ルール から、ルールを作成します。

  • ルール名: (例: smartMeter)
  • SQL ステートメント: SELECT * FROM 'SmartMeterHub/measured'
  • アクション: Timesteam table
    • データベース名: (例: SmartMeter)
    • テーブル名: (例: measured)
    • ディメンション
      • ディメンション名: deviceId
      • ディメンション値: ${topic(1)}
    • タイムスタンプ値: ${timestamp}
    • タイムスタンプの単位: SECONDS
    • IAM ロール: 作成して選択する
      • データベースへの書き込みパーミッションが自動的に設定されます。 例)

        {
        "Version": "2012-10-17",
        "Statement": [
        {
        "Effect": "Allow",
        "Action": ["timestream:WriteRecords"],
        "Resource": "arn:aws:timestream:(リージョン):(アカウントID):database/SmartMeter/table/measured"
        },
        {
        "Effect": "Allow",
        "Action": ["timestream:DescribeEndpoints"],
        "Resource": "*"
        }
        ]
        }

7. Grafana で可視化

Grafana 自体のセットアップについて詳細は割愛しますが、IAM Identity Center を使用している場合は Amazon Managed Grafana を使用して以下の手順で簡単に連携することができます。

  1. AWS 管理コンソール > Amazon Managed Grafana
  2. 「ワークスペースを作成」
  3. ワークスペース名を入力して「次へ」
  4. 認証アクセス情報に「AWS IAM ID センター」を選択して「次へ」
  5. データソースに「Amazon TimeStream」を選択して「次へ」
  6. 「ワークスペースを作成」
  7. AWS IAM ID センターの「新しいユーザーまたはグループの割り当て」
  8. アクセスするユーザーを選択して「ユーザーとグループを割り当て」
  9. 割り当てたユーザーを選択して「アクション」→「管理者を作成する」
  10. 「Grafana ワークスペース URL」にアクセスして管理者でログイン
  11. Administration > Data sources から「Add data source」→「Amazon Timestream」をクリック

ダッシュボードへの表示例

表示例

設定

例) 瞬時電力計測値をグラフ化する

SELECT measure_value::bigint, time
FROM SmartMeter.measured
WHERE measure_name = 'instantaneous'

例) 30 分ごとの電力使用量をグラフ化する

SELECT (MAX(measure_value::double) - MIN(measure_value::double)) AS value, MIN(time)
FROM SmartMeter.measured
WHERE measure_name = 'cumulative'
GROUP BY bin(time, 30m)

処理詳細

Wi-SUN モジュールによるスマートメーターとの通信

Wi-SUN モジュールとのシリアル通信により、スマートメーターとの認証・接続・通信をおこないます。Wi-SUN モジュールのインタフェース仕様は以下からダウンロードできます。

接続シーケンス (BP35A1 の場合)

接続シーケンス (BP35C1-J11-T01 の場合)

スマートメーターからのデータ取得

スマートメーターのインタフェース仕様は、エコーネットコンソーシアム により ECHONET Lite として規定されています。「低圧スマート電力量メータ・HEMSコントローラ間 アプリケーション通信 インタフェース仕様書」を参照します。

瞬時電力および積算電力量を取得する

以下のプロパティを使用して、現時点の瞬時電力および積算電力量を取得します。

プロパティ名EPCGet/Setサイズ備考
積算電力量計測値 (正方向計測値)0xE0Get4計測開始からの現在の累積の電力量 (単位は「積算電力量単位」による)
積算電力量単位0xE1Get1積算電力量の単位
瞬時電力計測値0xE7Get4取得した瞬間の電力量 (単位:W)

「積算電力量単位」は以下の値を取り、「積算電力量計測値」の単位を示します。例えば積算電力量計測値が 9999 で積算電力量単位が 0x01 の場合、9999 × 0.1 kWh = 999.9 kWh となります。

  • 0x00: 1 kWh
  • 0x01: 0.1 kWh
  • 0x02: 0.01 kWh
  • 0x03: 0.001 kWh
  • 0x04: 0.0001 kWh
  • 0x0A: 10 kWh
  • 0x0B: 100 kWh
  • 0x0C: 1,000 kWh
  • 0x0D: 10,000 kWh

積算電力量の履歴を取得する

スマートメーター内には 30 分ごとの積算電力量が記録されており、以下のプロパティを使用して、その履歴を取得することができます。

プロパティ名EPCGet/Setサイズ備考
積算電力量単位0xE1Get1積算電力量の単位
積算電力量計測値履歴1 (正方向計測値)0xE2Get19430 分ごとの積算電力量計 (単位は「積算電力量単位」による)
積算履歴収集日10xE5Get/Set1積算履歴を取得する対象の日付を指定

「積算履歴収集日1」に何日前を取得するか指定(当日の場合は 0)してから、「積算電力量計測値履歴1」を取得します。

「積算電力量計測値履歴」のデータは先頭 2 バイトがサイズで 0x00C0 (192) 固定、その後 00:00 から 30 分ごとの積算電力量計測値が 4 バイトずつ 48 コマ続きます。