目的
Nature社が2020年4月28日に発売したNature Remo E liteを使って、自宅の消費電力をモニターし、消費電力が多いときはLINEにメッセージを送るシステムを作ってみたので、その構築手順を紹介したいと思います。
Nature Remo E lite本体に購入に少々お金が掛かりますが、それ以外は基本的にGoogleの無料サービスを使って構築できます。
収集を始めて約3日分のデータが以下の様な感じです。青色グラフの面積が使用した電力なのでうちってテレビの電気代が結構でかいんだなと。あと乾燥機もですかね。今のところ最大ピークが2,000W(20A)なので、電力の契約は30Aほどあれば十分と言うことになるのかな。
現在出来ていることは、
- 自宅の消費電力を1分毎にGoogleスプレッドシートに読み込みデータベース化する(図1参照)。
- 読み込んだデータをGoogle Data Studioを使って消費電力のダッシュボードを作成する(図2参照)。
- 読み込んだデータから毎日の消費電力と電気料金をピボットテーブルで集計する(図3参照)。
- 瞬時消費電力が1,500Wを超えたらLINEにメッセージを通知する(図4参照)。
- 過去30分間の平均消費電力が750Wを超えたらLINEにメッセージを送付する(図4参照)。
という感じです。
データ、ダッシュボード、ピボットテーブルなど、すべて自動的に最新版にアップデートされますし、消費電力が増えたときにLINEに通知が送られてくるので、全く手間がかからず、すごく楽ちんです。
今後は、
- 毎日の消費電力と電気料金
- 消費電力と電気料金の前日比、先週比、先月比
などのLINEへの通知といった機能を追加していく予定です。
またデータがたまってきたら、曜日、気温、季節などを考慮した消費電力の傾向解析や機械学習などにもチャレンジしようと思っています。
スクリーンショット
構築したシステムのスクリーンショットを以下に紹介します。
全部スマホの画面です。モバイル端末でLINEの通知を受けシームレスに状態を確認できることが重要だと思います。
図1 Googleスプレッドシートへのデータ取り込みの様子
早送り⏩️してますが、1分置きにデータが2行目に挿入されていくようにしています。
図2 消費電力のダッシュボード
上記(図1)のGoogle Sheetに接続しGoogle Data Studioを使ってダッシュボードを作成しています。基本的にはスマホでチェックするので縦長のダッシュボードを構築しました。
Googleスプレッドシートのグラフ機能でも描画できるのですが、ダッシュボードとしての機能はData Studioの方が優れていたので今回はこちらを採用しました。
もしPower BIとかを使える環境にあればそちらの方がより細かい設定が出来るかと思います。
なお私の環境では家電を操作するNature Remo(Nature Remo E liteとは別の機器)から室温データを取得しているのでそのグラフ(緑色の線)も表示されています。
図3 消費電力の集計表
Google Data Studioを使って集計表のヒートマップも作っています。以下は日別の集計ですね。計測し始めてまだ1週間程度なのでまだパッとしませんが。。。
以下は時間帯と曜日別の消費電力のヒートマップです。
図4 消費電力増加時のLINEへの通知
以下の条件を満たしたときにLINEにメッセージが送信されるようにしています。
- 瞬間消費電力が1,500Wを超えたとき
- 30分間の平均消費電力が750Wを超えたとき
なおLINEメッセージに上記(図2)のダッシュボードへのURLを添付しすぐにグラフを確認出来るようにしています。
Nature Remo E liteとは?
Nature株式会社が2020年4月28日に発売したNature Remo E liteと言う自宅の消費電力をモニターする機器です。
自宅の玄関付近に設置されている電気のスマートメーターから無線で送信される電波を受信し消費電力をモニターできる仕組みとなっています。
以下は自宅に設置した様子です。電源コンセントに差し込めば、スマホのアプリから簡単にセットアップ出来ました。
玄関の外にスマートメーターがあるので、玄関に一番近いコンセントに差し込んでいます。
スマホのアプリを立ち上げた画面です。約5秒置きにデータが取り込まれているようです。
折れ線グラフが描画されているので、機器本体がデータを蓄積している様子です。
システム構成(データの流れ)
私が構築したシステムの全体構成図をフローチャートで模式してみました。
ごちゃごちゃ描いていますが、ポイントは、中央のGoogle Apps Script(GAS)で、
- GASがAPIを通じてNature Remoからデータを取得
- 取得したデータをGoogle Sheetを書き込んでData Studioでグラフ化する
- 取得したデータが設定した閾値を超えたらAPIを通じてLINEに通知する
と言うのが主な流れです。
システム構築手順とGoogle Apps Script(GAS)コード
以下にシステム構築手順と必要となるGASコードを記します。
- Googleスプレッドシートを新規作成する。
- スプレッドシートの[ツール]→[スクリプトエディタ]からGASコードの入力画面を立ち上げる。
- 下記コードをコピペしてそっくりそのまま入れ替える。
- Nature Cloud APIとLINE Notifyのアクセストークンを取得し、そのトークンをコード内に記した必要箇所に書き込む。
- コードを保存する。
- トリガーボタンを押してトリガー設定画面からトリガーを追加するボタンを押す。
- 以下コード一番上のgetMyHousePowerと言う関数選択し、1分毎に実行する。
これで消費電力の取得とLINEへの通知が完全に自動化されるはずです。
GASは実行時間に制限はありますが、本コードは1回2~3秒で終了しますので、今のところ制限を超える事はなさそうです。
24時間稼働のサーバーが手軽に無料で使えるのは、大変ありがたいです。
function getMyHousePower() {
//Nature Cloud APIへのアクセストークンを入力
var accessToken = "ここにNature Cloud APIへのアクセストークンを貼り付け";
//Nature Cloud APIへのリクエストを送る時に付与するパラメータ
var params = {
"method" : "get",
"headers" : {"Authorization":"Bearer " + accessToken}
};
//Nature Cloud APIのリクエストURL
var requestUrl = 'https://api.nature.global/1/appliances';
//Nature Remo Cloud APIへリクエスト送り取得したJSONデータを変数に格納
var response = UrlFetchApp.fetch(requestUrl, params);
var json = JSON.parse(response.getContentText());
//Google Sheetのシート名を取得(Google Sheetのシート名がデフォルトの"シート1"の場合)
var book = SpreadsheetApp.getActiveSpreadsheet();
var sheet1Data = book.getSheetByName("シート1");
//Google Sheetの2行目に行を挿入する
sheet1Data.insertRows(2,1);
//現在の日時を取得し2行目1列目のセルに日時を入力する
var date = new Date();
var val_time = Utilities.formatDate(date, 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');
sheet1Data.getRange(2,1).setValue(val_time);
//APIから取得したJSON形式のデータから積算電力と瞬間電力の値を抜き出し、
//それぞれを2行目の2列目と3列目に入力する。
//jsonの配列は人によって異なるので適宜調整が必要(*2021/2/25追記)
var val_power1 = json[0]["smart_meter"]["echonetlite_properties"][2]["val"];
var val_power2 = json[0]["smart_meter"]["echonetlite_properties"][5]["val"];
sheet1Data.getRange(2, 2).setValue(val_power1);
sheet1Data.getRange(2, 3).setValue(val_power2);
//取得した瞬間電力が1,500Wを超えた場合はLINEにメッセージを送る(後述のSendMessage1を実行する)
if(sheet1Data.getRange(2, 3).getValue()>1500){
SendMessage1();
}
//取得した瞬間電力30分間の平均電力が750Wを超えた場合はLINEにメッセージを送る(後述のSendMessage2を実行する)
var average = 0
for(let i = 2; i <= 31; i++){
average = average + sheet1Data.getRange(i, 3).getValue();
}
average = average / 30
average = average.toFixed(0)
var val_current = sheet1Data.getRange(2, 3).getValue();
if(average>750){
SendMessage2(average, val_current);
}
}
// ここからはGASからLINEにメッセージを送信するコード
function sendHttpPost(message){
var token = ["ここにLINE Notifyへのアクセストークンを貼り付け"];
var options =
{
"method" : "post",
"payload" : "message=" + message,
"headers" : {"Authorization" : "Bearer "+ token}
};
UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}
function SendMessage1(){
var message="瞬間消費電力が1,500Wを超えました。" ;
sendHttpPost(message);
}
function SendMessage2(average, val_current){
var message="30分間の平均消費電力が750Wを超えました。\n現在は平均" + average + "W。瞬間" + val_current + "Wです。";
sendHttpPost(message);
}
プログラムに不慣れな人が見るとすごく難しく感じるかもしれませんが、たったこれだけのコードでこんなシステムを作れてしまうわけです。
今回はNature Remoのエコシステムとしての将来性を強く感じました。アイデア次第でまだまだいろんな事が出来る(ビジネスチャンスがある)と思います。
補足
今回はGASがメインとなりますが、そもそもGASをどうやって使うのかとか、GASのトリガー設定、APIを使うためのTokenコードの取得方法など、他にも知らないといけないことがあります。
それらについてもこの記事でも順次整理していこうと思っていますが、Qiitaの記事などでも他のみなさまが方がわかりやすく整理して下さっているので、お急ぎの方はまずはそちらをご参照頂ければと思います。
(5/15追記)
と思ったらほぼ同じフローで室温と湿度を監視するシステムを作られている方がいらっしゃいました。トークンコードの取得やGASのコードを書くところまでを丁寧にご説明頂いているので、こちらの方がわかりやすいかも知れません
リビングの環境監視ダッシュボードを60分で作る方法(Nature Remo Cloud APIとGoogleサービス連携)
参考URL
Cloud APIからTokenコードの取得
以下のサイトから取得できます。
https://home.nature.global/
LINE NotifyからTokenコードの取得
以下のサイトから取得できます。
https://notify-bot.line.me/en/