Nature Remo E でスマートメーターの電力データを自動収集 ─ 瞬時電力・積算電力量を InfluxDBに蓄積

Raspberry Pi

「今この瞬間、家で何ワット使っているのか知りたい」「日々の電気代の推移をグラフで見たい」——そんな要望を Nature Remo E で実現しました。
Nature Remo E をスマートメーターに接続するだけで、瞬時電力(W)・積算電力量(kWh)などのデータをクラウド API 経由で取得できます。
本記事では、Nature Remo E の API を Python で叩いて電力データを取得し、InfluxDB に15秒ごとに蓄積する仕組みを解説します。蓄積したデータは Grafana や他のスマートホームプログラムからリアルタイムに参照できるようになります。

なぜこの機能を作ったのか?

電力会社のアプリでも月単位・日単位の電気使用量は確認できますが、「今まさにどのくらい電力を使っているか」をリアルタイムに把握することはできませんでした。
エアコンをつけたときや電子レンジを使ったときにどのくらい電力が跳ね上がるのかを可視化したいと思い、Nature Remo E を導入してスマートメーターのデータをスマートホームシステムに取り込む仕組みを作りました。
蓄積した瞬時電力のデータは、消費電力に応じてリビングの電球色を変える機能や、ホームステータス表示など様々なスマートホーム機能の入力データとしても活用しています。

家の電力消費をリアルタイムに把握して、スマートホームの入力データとして活用したい!

実現したいこと

  • Nature Remo E の API から瞬時電力(W)と積算電力量(kWh)を取得する
  • 取得したデータを 15 秒ごとに InfluxDB に書き込み、時系列データとして蓄積する
  • 前回取得値との差分(増分)も記録して「直近 15 秒間の消費電力量」を算出できるようにする
  • 蓄積したデータを他のスマートホームプログラムから参照できるようにする
    • 瞬時電力に応じた電球色変更・消費電力表示など
  • crontab で定期実行し、Raspberry Pi 起動時から自動稼働する

この記事でわかること

  • Nature Remo E の Cloud API(GET /1/appliances)で取得できる ECHONET Lite の電力データ項目と意味
  • 取得したリスト形式のレスポンスを辞書(dict)に変換して扱いやすくする方法
  • 積算電力量の前回値と現在値の差分を InfluxDB から取得して「増分」として記録する方法
  • crontab の for+sleep パターンで1分間に複数回(15秒ごと)実行する方法
  • InfluxDB に時系列データを書き込む方法(tags・fields の設計)

必要な準備と用意するもの

ハードウェア
  • Raspberry Pi(例:Raspberry Pi 5)
  • Nature Remo E(または Nature Remo E lite)
    • スマートメーターと Wi-Fi 経由で接続できる機器
  • スマートメーター
    • 電力会社にスマートメーターへの切り替えを申請していない場合は事前に申請が必要
ソフトウェア/サービス
  • Python
    • requests
    • datetime(標準ライブラリ)
  • Nature Remo Cloud API(無料・要アカウント登録)
    • アクセストークンの取得が必要
  • InfluxDB(時系列データの保存先)
  • crontab(定期実行)

完成イメージ

15秒ごとに下記のようなデータが InfluxDB の remo_e メジャーメントに書き込まれていきます。

  • measured_instantaneous(瞬時電力):例 842 W → 今この瞬間 842 W 消費中
  • normal_direction_cumulative_electric_energy(正方向積算電力量):例 123456 → 電力メーターの積算値
  • normal_direction_cumulative_electric_energy_increment(積算電力量の増分):前回取得値との差分 → 15秒間の消費電力量として活用可能
  • reverse_direction_cumulative_electric_energy(逆方向積算電力量):太陽光発電などで売電している場合に増加する

蓄積したデータは Grafana でグラフ表示したり、他の Python プログラムから InfluxDB を参照して電力に応じた制御に活用できます。

システムの仕組み

crontab で毎分起動し、1分間に4回(0秒・15秒・30秒・45秒)に分散して実行されます。

  1. API でアプライアンス一覧を取得:Nature Remo Cloud API の GET /1/appliances を呼び出し、Remo E に接続されたスマートメーターの ECHONET Lite プロパティ一覧を取得する
  2. dict に変換:リスト形式のレスポンスをプロパティ名をキーとした辞書に変換して扱いやすくする
  3. 前回積算値を InfluxDB から取得:直近の normal_direction_cumulative_electric_energy の値を InfluxDB から取得する
  4. 増分を計算して InfluxDB に書き込み:現在値 − 前回値 = 増分を算出し、全電力データとまとめて InfluxDB に書き込む

実装のポイント

API レスポンスの list → dict 変換

Nature Remo E の API が返す ECHONET Lite プロパティは下記のようなリスト形式です。

[
    {"name": "measured_instantaneous",                            "val": "842"},
    {"name": "normal_direction_cumulative_electric_energy",       "val": "123456"},
    {"name": "reverse_direction_cumulative_electric_energy",      "val": "0"},
    {"name": "coefficient",                                       "val": "1"},
    {"name": "cumulative_electric_energy_unit",                   "val": "1"},
    {"name": "cumulative_electric_energy_effective_digits",       "val": "6"}
]

このリストをループで処理して {name: val} の辞書に変換することで、以降のコードで dict['measured_instantaneous'] のようにプロパティ名で直接アクセスできます。

プロパティ追加に強い設計
API が将来的に新しいプロパティを返すようになっても、変換ループを変更する必要がない。新しいキーが自動的に dict に追加される

積算電力量の増分記録

スマートメーターが返す積算電力量は起動からの累計値なので、「今日一日の消費電力量」を計算するには前回値との差分(増分)が必要です。
書き込み前に InfluxDB から前回の積算電力量を取得して差分を計算し、normal_direction_cumulative_electric_energy_increment フィールドとして一緒に記録しています。
これにより InfluxDB 側で SUM(increment) を集計するだけで任意の期間の消費電力量を簡単に算出できます。

集計が簡単になる
今日・今週・今月の消費電力量を InfluxDB の SUM クエリ1本で算出できる。累計値からの差分計算をアプリ側に持つ必要がない

crontab の分散実行パターン

crontab の最小実行単位は1分ですが、for+sleep の組み合わせで1分間に複数回実行を実現しています。

# 1分ごとに起動し、15秒間隔で4回実行(0秒・15秒・30秒・45秒)
* * * * * for i in `seq 0 15 59`; do (sleep ${i}; python /path/to/home_energy_status_record.py >> /path/to/home_energy_status.log 2>&1) & done;

seq 0 15 59 は「0から59まで15刻み」で 0, 15, 30, 45 を生成します。各値を sleep の引数にすることで、バックグラウンドジョブを4つ起動し、それぞれを 0・15・30・45 秒後に実行させます。

crontab だけで15秒間隔を実現できる
別途 systemd タイマーや while ループのデーモンを用意しなくても、1行の crontab エントリだけで15秒間隔の定期実行が完成する

実行が重なった場合の制御ができない
前回の実行がまだ完了していない状態で次の実行が始まる可能性がある。API 応答が遅延した場合に複数プロセスが同時に動くことがあるため、処理が重くなる原因になり得る

事前準備

Nature Remo E のセットアップ

Nature Remo アプリで Remo E をスマートメーターに接続します。接続が完了すると、アプリ上で瞬時電力や積算電力量が確認できるようになります。
スマートメーターへの接続には電力会社へのBルートサービス申請が必要な場合があります(申請から利用開始まで数日〜1週間程度かかります)。

API アクセストークンの取得

Nature Remo のホームページからアクセストークンを発行します。発行したトークンは設定ファイルに保存しておきます。

{
    "remo": {
        "api": "<Nature Remo アクセストークン>",
        "api_url_appliances": "https://api.nature.global/1/appliances",
        "remo_e_no": 2
    }
}

remo_e_no は Nature Remo API の appliances レスポンスの中で Remo E が何番目(0始まり)に返ってくるかを示すインデックスです。家庭ごとに異なるため、後述の動作確認手順で実際のレスポンスを確認して適切な値を設定してください。

必要なライブラリのインストール

pip install requests

実装方法

電力データ収集プログラムの作成

# -*- coding: utf-8 -*-
import sys
import requests
import datetime
from influx.v2 import client as influx_client

# 設定
REMO_API_TOKEN  = '<Nature Remo アクセストークン>'
REMO_API_URL    = 'https://api.nature.global/1/appliances'
REMO_E_INDEX    = 2    # appliances レスポンス中の Remo E のインデックス(0始まり)
INFLUX_MEASUREMENT = 'remo_e'

def smame_get() -> dict:
    """Nature Remo E API からスマートメーターの ECHONET Lite プロパティを取得して dict に変換する。"""
    headers = {
        'Authorization': 'Bearer ' + REMO_API_TOKEN,
        'accept': 'application/json'
    }
    appliances = requests.get(REMO_API_URL, headers=headers).json()

    # 指定インデックスの Remo E からプロパティリストを取得
    prop_list = appliances[REMO_E_INDEX]['smart_meter']['echonetlite_properties']

    # リスト → 辞書に変換 {name: val}
    result = {}
    for item in prop_list:
        result[item['name']] = item['val']

    return result

def insert_energy_data(dict_elc: dict):
    """電力データを InfluxDB に書き込む。増分フィールドも合わせて記録する。"""

    # InfluxDB から直近の積算電力量を取得(増分計算に使用)
    res = influx_client.query_dict_by_influxql(
        INFLUX_MEASUREMENT,
        {'normal_direction_cumulative_electric_energy'},
        query_mode=influx_client.QueryMode.LAST
    )
    if res:
        prev_cumulative = int(res[0].get('normal_direction_cumulative_electric_energy'))
    else:
        prev_cumulative = 0

    current_cumulative = int(dict_elc['normal_direction_cumulative_electric_energy'])

    # InfluxDB への書き込みデータを構築
    json_point = {
        'measurement': INFLUX_MEASUREMENT,
        'tags': {
            'deviceType':  'Remo E lite',
            'deviceModel': 'Nature Remo E lite',
        },
        'fields': {
            # 瞬時電力(W)
            'measured_instantaneous':
                int(dict_elc['measured_instantaneous']),
            # 正方向積算電力量(電力会社から買った電力の累計)
            'normal_direction_cumulative_electric_energy':
                current_cumulative,
            # 逆方向積算電力量(太陽光などで売電した電力の累計)
            'reverse_direction_cumulative_electric_energy':
                int(dict_elc['reverse_direction_cumulative_electric_energy']),
            # 係数・単位・有効桁数
            'coefficient':
                int(dict_elc['coefficient']),
            'cumulative_electric_energy_unit':
                int(dict_elc['cumulative_electric_energy_unit']),
            'cumulative_electric_energy_effective_digits':
                int(dict_elc['cumulative_electric_energy_effective_digits']),
            # 前回からの増分(今日の消費電力量計算に使用)
            'normal_direction_cumulative_electric_energy_increment':
                current_cumulative - prev_cumulative,
            'timestamp': datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S.%f')
        }
    }

    influx_client.write(json_point)

if __name__ == '__main__':
    try:
        dict_elc = smame_get()
        insert_energy_data(dict_elc)
        print('正常に完了しました。')
    except Exception as e:
        print(f'エラー: {e}')
        sys.exit(1)

crontab への登録

下記コマンドで crontab を編集し、15秒ごとの定期実行を設定します。

crontab -e
# 1分ごとに起動し、15秒間隔で4回実行
* * * * * for i in `seq 0 15 59`; do (sleep ${i}; /home/<username>/Projects/venv/bin/python /home/<username>/Projects/smarthome/core/record/energy/home_energy_status_record.py >> /home/<username>/Projects/smarthome/logs/crontab/home_energy_status.log 2>&1) & done;

コードの解説

取得できる ECHONET Lite プロパティ一覧

Nature Remo E から取得できる主要な ECHONET Lite プロパティをまとめます。

  • measured_instantaneous(瞬時電力計測値):現在の消費電力(単位:W)。家全体の消費電力をリアルタイムに把握できる
  • normal_direction_cumulative_electric_energy(正方向積算電力量):電力会社から購入した電力の累計値。メーターの表示値に相当する
  • reverse_direction_cumulative_electric_energy(逆方向積算電力量):太陽光発電などで電力会社に売電した電力の累計値。売電していない家庭では 0 のまま
  • coefficient(係数):積算電力量の生の値に乗算するとメーターの実際の値になる倍率
  • cumulative_electric_energy_unit(積算電力量単位):積算電力量の単位(1 = 0.1 kWh など。値の意味はスマートメーターの仕様による)
  • cumulative_electric_energy_effective_digits(積算電力量有効桁数):積算値の有効桁数

InfluxDB への書き込みデータ設計

InfluxDB への書き込みは tags(タグ)と fields(フィールド)に分けて設計しています。

  • tags:デバイスの属性情報(デバイス種類・モデル名)。検索・フィルタリングに使う
  • fields:実際の計測値。数値演算(SUM・平均など)の対象になるデータ

特に normal_direction_cumulative_electric_energy_increment(増分)フィールドは後から日付単位の集計を行いやすくするための工夫です。
Grafana などで「今日の合計消費電力量」を表示するには SUM(increment) を集計するだけで算出できます。

動作確認

API レスポンスの確認と remo_e_no の特定

まず curl で API のレスポンスを確認して、Remo E が何番目(0始まり)のインデックスに入っているかを確認します。

curl -X GET "https://api.nature.global/1/appliances" \
  -H "Authorization: Bearer <アクセストークン>" \
  -H "accept: application/json" | python3 -m json.tool | grep -E '"type"|"smart_meter"' | head -20

smart_meter キーが含まれているオブジェクトのインデックス(0始まり)を remo_e_no に設定してください。

プログラムの単体実行テスト

python home_energy_status_record.py

「正常に完了しました。」が表示され、InfluxDB に remo_e メジャーメントのデータが書き込まれていれば成功です。

crontab 登録後のログ確認

tail -f /home/<username>/Projects/smarthome/logs/crontab/home_energy_status.log

15秒ごとに「正常に完了しました。」のログが追記されていれば定期実行が正常に動いています。

Nature Remo Cloud API にはレート制限(1分間あたりの呼び出し回数制限)があります。他のプログラムでも Nature Remo API を呼び出している場合は合計呼び出し回数が制限を超えないよう注意してください。超過するとエラーレスポンスが返り、データが欠損します。

まとめ

この記事では、Nature Remo E の Cloud API を使ってスマートメーターの電力データを15秒ごとに収集し、InfluxDB に蓄積する仕組みを実装しました。

  • Nature Remo API から瞬時電力・積算電力量などの ECHONET Lite プロパティを取得
  • リスト形式のレスポンスを dict に変換してプロパティ名で直接アクセス可能に
  • 積算電力量の増分をリアルタイムに計算して記録し、日次集計を InfluxDB の SUM 一本で実現
  • crontab の for+sleep パターンで1分間に4回(15秒ごと)の分散実行を実現
  • 蓄積データを他のスマートホーム機能(電球色変更・消費電力表示など)の入力データとして活用可能

一度セットアップすれば電力データが自動的に蓄積され続けます。Grafana でグラフ表示したり、消費電力に応じたスマートホーム制御の入力データとして活用したりと、様々な応用が広がります。ぜひ試してみてください。

タイトルとURLをコピーしました