taiyoh's memorandum

@ttaiyoh が、技術ネタで気づいたことを書き溜めておきます。

電力モニター「はやわかり」に記録されているデータをgoで吸いだしてmackerelに送ってみる

承前
taiyoh.hatenablog.com
ついに前回のエントリの「hogehogeする」の中身が決まりました。
2年間完全に塩漬けにしてましたが、ふと思い立ったのでやることに。
当時吸い出す部分まで作って止めていたのは2つ理由があって、

  • amd64->armのクロスコンパイルに挑戦しようとしたが、cgoだと相当ハードルが高いということがわかった
  • 得られたデータをどこでどう閲覧・管理するかが決まってなかった

というのがありました。
goの環境についてはraspberry pi上で普通にビルドすればいいじゃん、と思えてきたのと、raspberry piで受け取ったデータをhogehogeする的なのを検索してみると、mackerelに送っているというエントリをいくつか見かけたので、時代はやはりこれだろう、と。実際、mackerel周りの導入はめっちゃ楽でした。
良くも悪くも、当時のコードはgo1.5でもビルドできたんですが、コールバックで渡すのがかっこ悪く見えてきたのと、シグナルのハンドリングはライブラリじゃなくね?とも思えてきたので、その辺を思いっきり書き直しました(どうせ僕しか使わないやつなので)。
また、一日かけて環境を整えていざ動かしてみたら、segmentation faultでホスト毎落ちるというのが見つかりました。参考にしたeagle-owlソースコードをもう一度読みなおしてみたら、大きめのbufferを用意した上でusb_bulk_readをし、返り値のバイト数に応じて小分けにしているという処理があったのを完全に失念していたので、これも追加しました。
で、どうにかこうにか値が取れるように。

f:id:sun-basix:20151229120559p:plain

最初に10Aを超えた値になったのは電子レンジを動かした時で、その直後に15Aを超えてるのは、ケトルでお湯を沸かし始めたからですね。(部屋の中寒いんだよ!)
いい感じで値が取得できるようになったかと。ここから先どうするとかは今後考えよう。。。
実際にraspberry piで動いてるコードは https://github.com/taiyoh/go-cm160/tree/master/example 以下にあります。へっぽこなのでご笑覧ください。
(どれくらいへっぽこだったかというと、昨日時点のコードだとmackerelに無駄にデータを送りまくってて、raspiのCPU使用率が90%を超えてました。大変申し訳ありませんでした!)
因みにこのコードの負荷についてですが、起動時は一瞬80%を超えることがありますがすぐに落ち着き、何かが徐々に上がってるということも今のところ見当たらず、平常時はmackerel-agentとcm160のプロセスを同時に動かしててもトータル12%くらいとなっております。

節電モニター

節電モニター