はじめに
- 2年ほど前に、自宅状況の見える化という記事を投稿しています。
- 当該記事はRaspberryPi(実際はNanoPiを使用)ベースだったのですが、今年の10連休を利用(完成はしなかったんですが)してM5Stackベースで作り直したので、そのご紹介記事となります。
装置の外観
- 表示内容
- IPアドレス(左上)
- 現在日時(右上)
- 上から順に
- BME280センサーから取得した室温、湿度、気圧
- スマートメーターから取得した瞬時電力、積算電力量(正方向、負方向)
- エコキュートから取得した消費電力、タンク残量
- ダイキンエアコンから取得した消費電力、室温、外気温
M5Stack化のメリット・デメリット
- メリット
- QVGAディスプレイによる視認が可能。
- NanoPiには表示機能がない。
- 電源ON/OFFのストレスがない。
- NanoPiの場合、電源OFFの前にssh接続&シャットダウンを行う必要がある。
- QVGAディスプレイによる視認が可能。
- デメリット
- Pythonに比べて、お手軽さがない。(MicroPythonというものがあるようですが、試したことがありません。)
- Linuxによるマルチプロセスを期待できないので、一つのプログラム内で作り込む必要がある。
- Linuxコマンドが使えない。(curlコマンドなど)
プログラムソース、回路図など
- GitHub(HomeM5)で公開しています。
機能説明
- スマートメーター通信
Serial2.setRxBufferSize(2048);
- 受信電文により、処理を振り分ける。
- データ受信(取得コマンド応答の瞬時電力値、30分毎にスマートメーターから送られてくる積算電力量値)
- イベント受信(EVENTxxは、[無線モジュール](https://www.rohm.co.jp/products/wireless-communication/specified-low-power-radio-modules/bp35c0-product)から送られてくる電文)
- EVENT25…接続完了通知
- 取得コマンド送信可能状態になる。
- EVENT26…切断要求通知
- 切断コマンド(TERM)送信後、接続処理を開始。
- EVENT27…切断成功通知
- 切断コマンド(TERM)送信後、接続処理を開始。
- EVENT28…タイムアウト通知(切断要求に対する応答がなかった)
- 切断コマンド(TERM)送信後、接続処理を開始。
- EVENT29…無線送信禁止通知
- 取得コマンドの送信を止め、EVENT25の受信を待つ
- 取得コマンド送信可能なら、約2分毎に瞬時電力取得コマンドをスマートメーターに送信する。
- 切断要求のハンドリングは重要で、定期的にスマートメーターから送られてくるので、うまく再接続処理してやらないと、いつの間にか通信が止まっているという状況になってしまう。
- NanoPi版で時々接続が切れてしまう事象があって、通信ログを追ったところ、1日に1回くらい切断要求が送られてきていたのを無視していた。
- 無線送信禁止状態が解除されない場合がある(2019/6/12 追記)
- EVENT29を受信した後のEVENT25が、時々受信できない。
- そのため、取得コマンドを送れずに瞬時電力値が得られない。
- スマートメーターとの接続は切れてないので、30分ごとに送られてくる積算電力量は取得できる。
- スマートメータからの受信をMicroSDカードにログを取るようにして稼働させてみたところ、下記の状態になっていることを確認できた。
- 正常(EVENT29が来た後、数秒以内にEVENT25)
```
2019/06/10 18:06:08 EV29
2019/06/10 18:06:08 RXUDP
2019/06/10 18:06:09 RXUDP
2019/06/10 18:06:09 RXUDP
2019/06/10 18:06:09 RXUDP
2019/06/10 18:06:09 EV25
```
- 異常(EVENT29が来た後、ずっとEVENT25が来ない)
```
2019/06/12 08:32:38 EV29
2019/06/12 08:32:42 RXUDP
2019/06/12 08:32:43 RXUDP
- ネットワーク
- 起動時にEthernetがLink状態ならEthernetモジュール(WIZ850io)を使用し、それ以外はM5Stack内蔵のWiFiを使用。
- Echonet通信とNTP取得では、EthernetUDP(または、WiFiUDP)を使用。
- InfluxDB送信は、EthernetClient(または、WiFiClient)を使用。
- BME280センサー
- 起動直後は、気圧が異常な値(極端に小さい値)になることが多かったので、900hPaを超えるまで繰り返し取得するように。
- 約2分毎にライブラリ(BME280_Light)経由で計測値を取得。
- Echonet通信(エコキュート、ダイキンエアコン)
- 起動時に受信タスクを起動し、UDPポート3610でEchonetパケットの受信を待つ。
- 約2分毎に取得要求コマンドを、エコキュートとダイキンエアコンに送信
- NTP取得
- 起動時にNTPサーバーに時刻取得を行う。
- 以降は、millis()値を定期的に取得し、増分(ms)を加算していく。
- 「NTP」ボタンが押されたら、NTPサーバーへの再取得を行う。
- InfluxDB送信
- 上記の各計測値(スマートメーターの瞬時電力、積算電力量、BME280センサー値、エコキュート値、ダイキンエアコン値)の取得タイミングで、InfluxDBサーバに計測値を送信する。
今回、ハマったところ
- InfluxDB送信で、NanoPi版ではcurlコマンドを使用していたので同様にしようと、libcurlの導入を試みたりしました。(これだけで三日くらい費やしている。)
- ふと思い立って、誰かがライブラリを提供しているんじゃないかと検索したところ、ESP8266_Influx_DBに行き着きました。
- コードを読んでHttpClientを使えば良いことがわかりました。
- そのまま当該ライブラリを使ってもよかったんですが、なるべく有線LANでネットワーク接続したかったので、参考にして自作しています。