GoでシリアルポートからUSBを操作してHEMSを作って電力見える化!

クリスマスイブだというのにQiita書いてます。こんにちは。
記事を書き終わったら子供の枕元にプレゼントを仕込むミッションですね。

ここしばらくGoを書いていないのでちょっとリハビリを兼ねて少し変わった感じの構成でコードを書いてみました。
普段AppengineのWebのプログラミングばかりだったので手ごわかった・・・完成してないけど。

HEMSとは

HEMSとは「Home Energy Management System(ホーム エネルギー マネジメント システム)」の略です。

519cf937-51bf-1bd3-48d8-af8f770fac93.jpg

参考 : http://www2.panasonic.biz/es/densetsu/aiseg/hems/about/index.html

つかったもの

  • Go
  • Mac (本当はラズパイで動かしたいがまだそこまでいってない)
  • GE 富士電機製スマートメータ(家についてるやつ。ついてなかったら東京電力に連絡すればつけてくれるはず)

ce40fc4c-64d5-b6ae-335f-85ecb667f308.jpg

  • ROHM Wi-SUN USBドングル (WSR35A1-00)

3a5f863c-17e2-ecb6-3f54-f076998ef272.png

 たけぇ。。。

事前に用意すること

  • Bルートサービスの開通を「東電パワーグリッド」という会社に申請する。

Bルートとは?

スマートメーターで計測したデータを、お客さま宅内のHEMS機器へ送信するサービスです。

6fa67199-1003-7185-c944-d3033cb0f066.png

goでROHM Wi-SUN USBドングル (WSR35A1-00) を操作し、スマートメータから電力を読み取るコードを書く。

ここ最近goを触っていなかったのと、普段AppengineでのWebアプリケーションばかり書いていたのでいろいろ戸惑いながらそこそこ動くところまで書いたものはこちら。

https://github.com/chidakiyo/hemhem

ハマったところ

  • USBとのやり取りをfor文の中でやるようにしていたら、たまに応答が帰ってこないことがあり、永遠に待ち続けるのでgoroutineで非同期に
    • for文でsleepではなく、tickerを利用する。
  • tickerをselectしているところで同期的に処理するとやっぱりブロックしてしまうのでgoroutineに。
  • 内部的に応答で受け取ったコードが期待する値でない場合には再実行が必要なのでchannelに値が入ったことをトリガに実行するように。
    • 定期実行なんだけど、たまにリトライが必要。
  • 自宅でしか実行できない & 長時間動かしているとなんか応答がおかしくなるなどあってデバッグがしんどい。

まだできていないこと

  • 出力をGASやらGAEに送ってBQなどに投入する。(手元の別ブランチでは動いている)
  • たまに応答が返ってこないというパターンの場合のタイムアウト処理入れてない。

イメージ

2年ぐらい前に作った時点ではこんなグラフが出るようになっていました。
githubに上がっているコードはサーバサイドに投げる処理は抜いてます。

58e511f9-3e22-d9f7-a28e-10d280a8c015.png

さいごに

goのアドベントカレンダーなのに、goのコードを一行も出さなかったけど良かったんだろうか・・・汗
いつもWebアプリケーションのコードばかりなので、たまにはこういうのも刺激になって良いな〜と。