M5StickC と BP35A1、Wi-SUN Hat を組み合わせたスマートメーターモニタ
2016 年からアナログの電力量計からデジタルのスマートメーターへのリプレイスが始まっています。スマートメーターへのアクセスは電力会社が利用する A ルートの他に、申し込めば誰でも使える B ルートが用意されており、申し込みをすれば無料で自宅のスマートメーター にアクセスできます。ただ、スマートメータとの通信は、Wi-SUN(Wireless Smart Utility Network : 特定小電力無線)経由となるため、対応した通信機器が必要になります。
簡易にやるのであれば、Nature Remo E/Nature Remo E liteを購入するだけで、スマホでモニタリングやコントロールができるようになるのですが、やっぱり自分でやって見たいよねと言うことでプロジェクトをはじめました。
調べてみると、先人はたくさんおられ、特にM5StickC で家庭用スマートメーターをハックする!という、M5StickC を使った完成度の高いものが見つかりました。
さっそく、Visual Studio Code で M5StickC の micropython 環境を作り、試したところ、あっという間にスマートメーター の情報が取得できましたが、やはり、車輪は再発明するもの(笑)、新たにコードを書くことにしました。
- 現在の電流、電力の情報を表示します。
- 今月(検針日を起点)の電力量を表示します。
- 今月の電気料金を計算し表示します。また、電気料金計算方法はカスタマイズが可能です。
- A ボタンでで画面の上下をコントロールできます。
- Ambient に電流、電力、電力量、電気料金の情報を送信できます。
まずは、B ルートサービスの申し込みが必要です、東京電力であれば、電力メーター情報発信サービス(B ルートサービス)から、他の電力会社も同様のサービスをしていますので、契約している電力会社を確認してください。
申し込みが完了すると、認証 ID とパスワードが送られてきますので、これでスマートメーターアクセスできるようになります。
M5StickC と BP35A1、BP35A1 をいい感じで M5StickC 用の HAT にしてくれる Wi-Sun HAT キットを用意します。
BP35A1 は 7,500-12,000 円ぐらいするので、総額では Nature Remo E Lite 12,800 円といい勝負になってしまうのが課題です。
git clone https://github.com/miyaichi/SmartMeter.git
cd SmartMeter
curl -o ambient.py https://raw.githubusercontent.com/AmbientDataInc/ambient-python-lib/master/ambient.py
cp SmartMeter.excample.json SmartMeter.json
スマートメーター にアクセスするための「B ルート認証情報」と、利用状況確認のために使う「契約アンペア数」、月間利用状況確認のために使う「検針日」を設定します。また、Ambient にデータを送信するのであれば、Ambient でチャンネル ID を作成し、ライトキーと合わせて設定してください。
Name | Description | Example |
---|---|---|
id | B ルート認証 ID | "000000XXXXXX00000000000000XXXXXX" |
password | B ルート認証 I パスワード | "XXXXXXXXXXXX" |
contract_amperage | 契約アンペア数 | "50" |
charge_func | 電気料金計算関数名 | "tokyo_gas_1" |
collect_date | 検針日 | "22" |
ambient | Ambient のチャンネル情報 | {"channel_id": "XXXXX","write_key": "XXXXXXXXXXXXXXXX"} |
契約アンペアと検針日の情報があれば、おおよその電気料金を計算することができるので、charge.py で料金計算関数を定義できるようにしてあります。東京ガスの料金計算を実装してありますので、必要に応じて追加し、その関数名を SmartMeter.json の charge_func で指定してください(例: "charge_func": "tokyo_gas_1")。関数の実装例は下記です。正確には各種割引とかあるのですが、変化量がわかればいいので、正確な実装ではありません。
def tokyo_gas_1(contract, power):
"""
TOKYO GAS「ずっとも電気1」での電気料金計算
Parameters
----------
contract : str
契約アンペア数
power : float
前回検針後の使用電力量(kWh)
Returns
-------
fee: int
電気料金
"""
fee = {'30': 858.00, '40': 1144.00, '50': 1430.00, '60': 1716.00}[contract]
if power <= 140:
fee += 23.67 * power
elif power <= 350:
fee += 23.67 * 140
fee += 23.88 * (power - 140)
else:
fee += 23.67 * 140
fee += 23.88 * 350
fee += 26.41 * (power - 140 - 350)
return int(fee)
SmartMeter.json で Ambient のチャンネル情報を設定すると、30 秒に一度(1 日に 2,880 回 < Ambient の上限値 3,000)データを送信します。送信するデータと単位は以下の通りです。
Name | Unit | Description |
---|---|---|
データー 1 | A | 瞬時電流計測値(E8) |
データー 2 | kW | 瞬時電力計測値(E7) |
データー 3 | kWh | 当月(前回検針後)の積算電力量計測値(EA) |
データー 4 | 円 | 当月(前回検針後)の電気料金 |
必要なファイルを M5StackC にコピーします。
/flash/apps/
- SMM.py
/flash/
- BP35A1.py
- ambient.py
- charge.py
- ntpdate.py
- SmartMeter.json
ログレベル DEBUG でログが出力されています。M5StickC のシリアルに接続して、動作状況を確認してください。
screen /dev/tty.usbserial-00001214 115200