contentmrubyでスマートメーターmrubyIoTおうちハックスマートメーターの情報を最安ハードウェアで引っこ抜くが以前から興味があったネタだったのと、ちょうど自宅がメータ交換でスマートメータに変わったので、自分もmrubyを使って試してみました。東京電力は三菱電機、GE富士電機メーター、東光東芝メーターシステムズの三社からメーターを調達しているようだが、こちらの自宅には東光東芝メーターシステムズのメーターが取り付けられている。最終的にはFreeBSDで動いているデバイスで動かす事を考えているのですが、いきなり組み込みで動かすのは手間がかかるのでMacで試してみる事にしました。今日の午前中に書いたメモはこれを試すための用意でした。BP35A1は3.3V系なのでMacとの接続はストロベリーリナックスのFT2232Hなモジュールで接続しました。FTのモジュールはMPSSE/BitBangで利用する事もあるので、私はkextはシステムにはインストールせずに利用する時にkextloadコマンドでロードしてます。build_config.rbに以下を追加してmrubyをビルドしておきます。'iij/mruby-pack'mrubyのシリアルサポートのためのライブラリはいくつかあるようだが、違いは確認してません。rukihenaさんのpythonのコードをmrubyにポートしてみました。power:430[W]"バイナリーフォーマットのERXUDPを処理する部分にちょっとひっかかりましたが、iij/mruby-packを利用する事で解決できました。当初ERXUDPのデータをchop!していたら、最終バイトがCRになったときに削られてしまい、おかしな数値になっていたので、chopしないようにしました。ERXUDPをsplitていたところ、最終バイトが改行コードになってしまったときに取られてしまい変な値になっていたので、オフセットでバイナリを抜くようにしました。仕様書読めってことかもしれませんが、シーケンスがテキストベースなのに、データにバイナリが入ってきた上に、改行が末尾にあるという仕様は、上のようにバグを作り込む要因になってしまうのではないでしょうか。追記:アスキーフォーマットにもできるみたいです。バグ作り込んでいたのですが、シリアルのライブラリのデフォルトがSOFTフォローでバイナリ部分からXON(0x11)が消えてしまって不正なデータになってしまっていました。フォローをNONE(0)にしました。当初SerialPortのread_timeoutを設定していたのですが、canonicalなので意味が無いようです。実際に動かしているとたまにレスポンスが返ってこなくなり、止まってしまう事があるので、とりあえずkillして止めるようにしています。余談ですがiijさんもスマートメーターに対応した機器を作ってますが、内部はNetBSDでmrubyとかで動いてるのかな?半日くらいで試す事ができたのは、rukihenaさんの記事のおかげで、感謝してます。スマートメーターから拾える値は、上の例のその時点での利用量(W)とメータの値(kWh)、および30分毎の使用量のようです。30分毎のデータは見た目には分かりやすいですが、現実的なアクションにつながりづらく、前者二つをいかにうまく伝えるかを考えるのが良い様な気がします。おまけBP35A1はコマンドでスリープモードに入り、ピンのレベル変化でウエイクアップできます。消費電力がかなり押さえられるようなので、FreeBSD/mipsにつないだBP35A1で試してみました。起動後にU-Bootと干渉しないようにGPIO制御のバッファをかましていて、GPIOの制御線をそのまま変換基板のBP35A7AのWKUPに接続します。スリープに入るには、SKDSLEEPコマンドを使います。1すると復帰して、TX,RXも有効になります。10mAくらいの節約なので、びびたるものですが。後日追記:170日くらい動かしたところ、1日以上スキャンしても見つからない状態になってしまいました、BP35A1のつなぎなおしたら、復帰したので、ハードウエアリセットが必要だったようです。このためGPIOはウエイクアップではなくRESETに接続して見つからなくなった時はリセットをかけることにしました。FON2405が最初ネットワークが使えなくなり再起動したらその時は起動しましたが、じきに完全に起動しなくなり、壊れてしまったのでFON2412に代えました。今年の夏は暑い日が続いているので、熱による影響が考えられるのですが、これらのFONはSOCが基板裏に実装されているので、上下逆さまに置いたほうが空気の対流がスムーズな気がします。底面にはスリットも入っているので空気が抜けやすいと考えられます。FON2412は解析してuartfのTX(GPIO8)がR118でプルアップされていることがわかり、二つuartが使えるので良いです。upLoginユーザーは見つかりませんでした。