ラズパイ

【LaMetric API 使い方】Remo Eから取得した電気使用量をLaMetricに表示する方法

どうも、CHASUKEです。

LaMetric Time」と言えば、粗いドットが可愛いスマートデジタル時計

デジタル時計だけでなく、TwitterやYouTubeの通知を表示させたりする機能も備わっており、さまざまな目的で使うことができます。

CHASUKE
人気ユーチューバーさんも使ってる人多いですよね。

 

LaMetricにはAPIが公開されており、コマンドで好きなメッセージを通知させることができます。さらに、LaMetricネイティブアプリを自作すれば、情報の常時表示やボタンを使ったアクションさせることも可能です。

 

今回は、LaMetric API実行し、リアルタイムな電気使用量をLaMetricに通知させる方法を紹介します。以前にツイートした内容です。

 

なお、自宅のスマートメーター電気量を取得するため、「Nature Remo E」を使ってます。こちらもAPIからデータを取得できます。

この記事を読んで、できること

  1. LaMetricのAPIでメッセージを表示する方法(curl/Python)
  2. Remo EのAPIで電力量を取得する方法(curl/Python)

Macやラズパイから試せるようにCurlコマンドやPythonスクリプト例も紹介してますので、気軽にお試しください。

CHASUKE
LaMetricをもっと活用したい!」と思ってる人の参考になれば幸いです。

完成形や必要なものなど

完成イメージはこちら

  1. 今の使用量
  2. 1時間の使用量
  3. 1時間ごとのグラフ
CHASUKE
動画では、上記3つの情報を順番に表示させてます。

 

今回使ったモノ

今回使ったもの

  1. LaMetric Time(今回の主役)
  2. Remo E(スマメ情報が取れるやつ)
  3. Pythonやcurl の実行環境(Macやラズパイ等)

LaMetricもRemo Eも便利ですが、お高い。。。両方持っている人とは仲良くなれる気がするw

LABISTS ラズベリーパイ4B メモリ4GB SDカード32GB
LABISTS
CHASUKE
MacBookでも試せますが、僕は常時起動してる「ラズパイ4」を使ってまーす。

LaMetric APIで任意のメッセージを表示してみる【curlコマンド】

まずは練習がてら、LaMetricに任意のメッセージを表示させる方法を書いていきます。

手順は3ステップ

  1. LaMetricアプリでIPアドレスを取得
  2. LaMetricのAPIキーを取得
  3. メッセージ表示API(Notifications)の実行
CHASUKE
順番に行きますね。

 

専用アプリからIPアドレスを確認

設置済みのLaMetricのローカルIPアドレスを調べます。LaMetricアプリから調べることができます。

CHASUKE
簡単でしたね。

 

LaMetricのAPIキーを取得

APIキーは、APIでどのデバイスを操作するか特定するための鍵みたいなもの。

LaMetric Developerサイトから取得できます。

[My devices] - [DEVICES] - [Api Key]

CHASUKE
これで良しっと。

 

メッセージ表示API(Notifications)の実行

さて、ターミナルからcurlコマンドで、メッセージ表示API(Notifications)を実行してみましょう。

<ローカルIPアドレス>」「<APIキー>」を自分用に書き換えて、ターミナルから実行してみてください。

$ /usr/bin/curl -X POST \
-u "dev:<APIキー>" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
    "model": {
        "cycles": 2,
        "frames": [
            {
                "icon": 5588,
                "text": "HELLO!"
            },
            {
                "icon": 3061,
                "text": "マリオだよ!!"
            },
            {
                "chartData": [ 1, 2, 3, 4, 5, 6, 7 ]
            }
        ]
    }
}' \
http://<IPアドレス>/api/v2/device/notifications

ピカチュウマリオのアイコンが順番に出てきて、最後にグラフが表示されれば成功です。

CHASUKE
表示内容は「frames」に記載してあります。日本語やグラフ表示もできちゃいます。

 

上記以外にも、多くのパラメータが用意されてます。興味のある人は、マニュアル(英語)を見ながら、イジってみるのがおすすめ。楽しいですよ。

電気使用量をLaMetricに表示させる方法【Python】

では完成イメージで紹介した電力使用量の表示をやっていきます。Pythonスクリプトを作成して実行しています。

おさらいですが、下記の3つの情報をLaMetricに表示させています。

  1. 今の使用量
  2. 1時間の使用量
  3. 1時間ごとのグラフ

 

▼まずは、完成形のPythonスクリプトです。下記をタップすると120行のコードが表示されます。

【タップ】スクリプト表示

import requests
import os, pickle, pprint, json

# 6つのパラメータ
LAMETRICAPI="<LaMetricのAPIキー>"
LAMETRICIP="<LaMetricのIPアドレス>"
REMOAPI="<Nature Remo EのAPIキー>"
REMOCNT=7 # 何個目のRemoデバイスか
ZENKAI_PKL="/home/pi/Desktop/lametric/zenkai.pkl" # 積算電力量を一時保存するためのファイル
DATA_PKL="/home/pi/Desktop/lametric/data.pkl" # 1時間ごとの使用量リストを一時保存するためのファイル
 
# Remo Eによるスマートメーター情報の取得
def smame_get():
    url = 'https://api.nature.global/1/appliances'
    headers = {'Authorization': 'Bearer ' + REMOAPI, 'accept':'application/json'}
    appliances = requests.get(url, headers=headers).json()
 
    # 取得した電力データをdictに詰め替え(我が家の場合、7個目)
    list = appliances[REMOCNT]['smart_meter']['echonetlite_properties']
    dict={}
    for item in list:
        key=item['name']
        dict[key]=item['val']
 
    # 返却
    return dict

def make_graph(dict):

    #積算電力量計測値(正方向)(normal_direction_cumulative_electric_energy)
    normal_direction_cumulative_electric_energy = int(dict['normal_direction_cumulative_electric_energy'])

    # (初回起動のみ)前回の積算データ保存ファイルの存在チェック、なければ今回のマイナス1000
    if(os.path.exists(ZENKAI_PKL)):
        with open(ZENKAI_PKL, "rb") as f:
            sekisan_zenkai = pickle.load(f) #読み出し
    else:
        sekisan_zenkai = normal_direction_cumulative_electric_energy - 1000
    
    print('Sekisan_今回:' + str(normal_direction_cumulative_electric_energy))
    print('Sekisan_前回:' + str(sekisan_zenkai))

    with open(ZENKAI_PKL, "wb") as f:
        pickle.dump(normal_direction_cumulative_electric_energy, f) #保存

    #係数(coefficient)
    coefficient = int(dict['coefficient'])

    #積算電力量単位(cumulative_electric_energy_unit)
    cumulative_electric_energy_unit = int(dict['cumulative_electric_energy_unit'])

    #「(⑥積算電力量計測値(正方向) × ①係数) ÷ (10 × ②積算電力量単位)」
    sekisan = ((normal_direction_cumulative_electric_energy - sekisan_zenkai) * coefficient)/(10*cumulative_electric_energy_unit)
    print('sekisan:' + str(sekisan) + "kWh")

    # グラグ作成用データファイルの読み込み、なければ作成
    if(os.path.exists(DATA_PKL)):
        with open(DATA_PKL, "rb") as f:
            sekisan_list = pickle.load(f) #読み出し
    else:
        sekisan_list = [0,0,0,0,0,0,0,0,0,0,0,0]

    del sekisan_list[0]
    sekisan_list.append(sekisan * 10)
    print(sekisan_list)

    # グラフデータの保存
    with open(DATA_PKL, "wb") as f:
        pickle.dump(sekisan_list, f) #保存

    return sekisan_list, sekisan

def lametric(sekisan_list, measured_instantaneous, sekisan):
    headers = {
        # Request headers
        'Accept': 'application/json',
        'Content-Type': 'application/json',
    }
    url = "http://"+LAMETRICIP+":8080/api/v2/device/notifications"
    body = {
        "model": {
            "frames": [
                {
                    "icon":"95",
                    "text": str(measured_instantaneous) + "W"
                },
                {
                    "icon": 5588,
                    "text": str(sekisan) + "kWh"
                },
                {
                    "chartData": sekisan_list
                }
            ],
        }
    }

    # デバッグ 送信内容表示&実行
    ddd = json.dumps(body)
    pprint.pprint(ddd)
    res = requests.post(url, data=ddd, headers=headers, auth=('dev', LAMETRICAPI))

    # デバッグ 実行結果
    print(res.text)

# ここからスタート
if __name__ == '__main__':
 
    # スマートメーター情報取得
    dict = smame_get()

    # デバッグ 瞬時電力計測値(measured_instantaneous)
    measured_instantaneous = int(dict['measured_instantaneous'])
    print('Power_Now:' + str(measured_instantaneous) + "W")

    # 積算電力の取得とグラフデータ保存
    sekisan_list, sekisan = make_graph(dict)

    # LaMetricに通知しておしまい。
    lametric(sekisan_list, measured_instantaneous, sekisan)

基本的には、スクリプト上部の6つのパラメータを自分の環境に合わせて、実行すればOKです。

処理内容は大きく3つ

  1. ①Remo Eで電力情報を取得
  2. ②電力情報を使った計算&グラフ作成
  3. ③LaMetricでメッセージ表示

それでは、順番に補足していきます。

 

Remo Eで電力情報を取得

まずは、スマートメーターから情報取得するために、Remo Eのパラメータ設定が必要です。

▼下記を参考に「APIキー発行」と「Remo Eがデバイスリストの何番目」かを調べてみてください。

 

▼スクリプトの1つ目の関数(smame_get)で電力情報を取得しています。

# Remo Eによるスマートメーター情報の取得
def smame_get():
    url = 'https://api.nature.global/1/appliances'
    headers = {'Authorization': 'Bearer ' + REMOAPI, 'accept':'application/json'}
    appliances = requests.get(url, headers=headers).json()
 
    # 取得した電力データをdictに詰め替え(我が家の場合、7個目)
    list = appliances[REMOCNT]['smart_meter']['echonetlite_properties']
    dict={}
    for item in list:
        key=item['name']
        dict[key]=item['val']
 
    # 返却
    return dict
CHASUKE
細かいところは、質問いただければ答えます!

 

積算電力量の計算&グラフ作成

2つ目の関数(make_graph)では、1時間前と後で取得した積算電力量の差を使って、「1時間分の電気使用量」を算出しています。

また、LaMetric側に1時間ごと過去12時間の電力使用量グラフを表示させるために、リストへデータの入れ替えや保存をしています。

def make_graph(dict):

    #積算電力量計測値(正方向)(normal_direction_cumulative_electric_energy)
    normal_direction_cumulative_electric_energy = int(dict['normal_direction_cumulative_electric_energy'])

    # (初回起動のみ)前回の積算データ保存ファイルの存在チェック、なければ今回のマイナス1000
    if(os.path.exists(ZENKAI_PKL)):
        with open(ZENKAI_PKL, "rb") as f:
            sekisan_zenkai = pickle.load(f) #読み出し
    else:
        sekisan_zenkai = normal_direction_cumulative_electric_energy - 1000
    
    print('Sekisan_今回:' + str(normal_direction_cumulative_electric_energy))
    print('Sekisan_前回:' + str(sekisan_zenkai))

    with open(ZENKAI_PKL, "wb") as f:
        pickle.dump(normal_direction_cumulative_electric_energy, f) #保存

    #係数(coefficient)
    coefficient = int(dict['coefficient'])

    #積算電力量単位(cumulative_electric_energy_unit)
    cumulative_electric_energy_unit = int(dict['cumulative_electric_energy_unit'])

    #「(⑥積算電力量計測値(正方向) × ①係数) ÷ (10 × ②積算電力量単位)」
    sekisan = ((normal_direction_cumulative_electric_energy - sekisan_zenkai) * coefficient)*(0.1)
    print('sekisan:' + str(sekisan) + "kWh")

    # グラグ作成用データファイルの読み込み、なければ作成
    if(os.path.exists(DATA_PKL)):
        with open(DATA_PKL, "rb") as f:
            sekisan_list = pickle.load(f) #読み出し
    else:
        sekisan_list = [0,0,0,0,0,0,0,0,0,0,0,0]

    del sekisan_list[0]
    sekisan_list.append(sekisan * 10)
    print(sekisan_list)

    # グラフデータの保存
    with open(DATA_PKL, "wb") as f:
        pickle.dump(sekisan_list, f) #保存

    return sekisan_list, sekisan
CHASUKE
こちらも細かいところは、質問いただければ答えます!

 

LaMetricでメッセージ表示

最後に、LaMetricに送信する情報を作成して、APIを実行します。こちらは事前にやったcurlコマンドの内容をPythonスクリプトにしただけです。

def lametric(sekisan_list, measured_instantaneous, sekisan):
    headers = {
        # Request headers
        'Accept': 'application/json',
        'Content-Type': 'application/json',
    }
    url = "http://"+LAMETRICIP+":8080/api/v2/device/notifications"
    body = {
        "model": {
            "frames": [
                {
                    "icon":"95",
                    "text": str(measured_instantaneous) + "W"
                },
                {
                    "icon": 5588,
                    "text": str(sekisan) + "kWh"
                },
                {
                    "chartData": sekisan_list
                }
            ],
        }
    }
CHASUKE
これでおしまい!

 

▼Pythonでスクリプト実行!

$ python3 xxxxx.py

 

僕はラズパイを使って、このスクリプトを毎時0分に自動起動(クーロン)させてます。

ちなみに、うちは太陽光パネル載せてるのですが、日中の発電中は積算値が増えないため、電力使用量が0kWhになってしまいます。

積算電力量計測値(逆方向)」を加味して、マイナスもグラフ反映させたいところですね。

最後に

LaMetric TimeやNature Remo Eを持っている人はぜひお試しください。電力の見える化は楽しいです。節電意識も高まります。

もう少し初心者でもわかりやすく、丁寧に書きたいところでしたが、少々雑になってしまいました。わからないところがございましたら、気軽にお問い合わせください。わかる範囲で答えます!

LABISTS ラズベリーパイ4B メモリ4GB SDカード32GB
LABISTS

Amazonでお得に買い物



Amazon.co.jpで買い物するならギフト券の購入(チャージ)がおすすめ。チャージごとに最大2.5%分のポイントが付与されます

チャージへGO!!

  • この記事を書いた人
Avatar photo

CHASUKE

IT企業につとめる30代サラリーマンブロガーです。当ブログでは、実際に使ってよかった役立つガジェットや製品をお届けしてます。面白い機能や素敵なデザイン、少し尖ったアイテムが特に好きです。ご質問・ご意見は「お問い合わせ」まで。レビュー依頼もお待ちしております!

© 2022 CHASUKE.com