# スマートメーターから消費電力を取得して、目いっぱいの電力を安心して使った(急) --- ## 経緯 電気が30A契約で ガスコンロをまだ購入していない => すべての調理に電気を用いるため ブレーカーがよく上がる --- ## 経緯 上がるのは晩飯時間 2対地フルメッシュVPNも落ちるし 作業やマルチメディア視聴中の 自作PCの電源も落ちる => とてもつらい UPSは買いたいけど他にも買いたいものがあるし サーバーは実家なので我慢 --- ## 経緯 この家電はつけて良いのか => 今何W使っているか分かれば 自信をもって使える --- ## 経緯 実装に七転八倒したり 途中で入院したりで やっと最低要件を満たすものが完成 --- ## 申し込み 電力メーター情報発信サービス (Bルートサービス) 無料でスマートメーターにしてくれる (既にスマートメーターの場合 接続用情報をくれる) http://www.tepco.co.jp/pg/consignment/liberalization/smartmeter-broute.html --- ## 仕入れ ただし、対応機器(ECHONET Lite規格)は高い スマートーメーターとスマートホームの関係で 手軽な機器があまりない => やすいのほしい --- ## 仕入れ USBのシリアルポートで操作可能な 無線通信モジュール(ドングル)が¥8,000で手に入る https://www.tessera.co.jp/rl7023stick-d_ips.html => 自分でつくろう --- ## 仕様 これら2つの規格に準拠して作る * 通信モジュールのメーカーのPDF (購入者のみ閲覧可) * ECHONET 規格 https://echonet.jp/spec_g/ --- ## 実装 モジュールとはシリアル通信だけれど、 イベントや応答が順序をシャッフルされて飛んでくる => イベント駆動とまではいかないが、 リアクティブに状態管理したい --- ## 実装 ![](https://i.imgur.com/051CV0i.png) --- ## 実装の感想 シリアルポートからの行毎イベント発火で、 受信する形になっていれば、 よほど変な言語でない限り 普通に書けたかもしれない --- ## JS実装の壁 シリアル通信でStringとしてコマンドを流していた ところが、途中でStringで扱えない、 バイナリを埋め込む必要が出てきた たとえばこんなの ``` \x10\x81\x12\x34\x05\xFF\x01 \x02\x88\x01\x62\x01\xE7\x01\x01 ``` --- 更に、バイト列の途中 `\x12\x34`はトランザクションID せめてカウントアップして変えていく必要がある 接続先機器は重複した トランザクションIDに対し、 4回までしか応答しない仕様 つまり、固定値を使うことはできない --- 途中連結方法を間違えたり、 Bufferにエンコーディングが設定されて UTF-16扱いされたりして 何がともあれ出力が化けまくった --- `String.prototype.charCodeAt()`とか `String.fromCharCode()`とか `Buffer`の`encoding`指定はかしこいなぁ 取り扱い間違えると死ぬけど :innocent: --- ## 解決方法 Uint8ArrayでASCII文字列部分とバイナリ部分を 分けて作ってガッチャンコして解決 出来上がりがシンプルだが仕様と睨めっこで その形に辿り着くまでやや時間がかかる --- ```javascript var tid_high = Math.floor(transaction_id/256), tid_low = transaction_id%256, data = Uint8Array( [0x10, 0x82, tid_high, tid_low, 0x05, 0xFF, 0x01, ..., 0x01]), data_length = data.byteLength .toString(16).padStart(4, '0'), header = Uint8Array( `HEADER BYTE LENGTH ${data_length}`.split('') .map(c => c.charCodeAt(0))), trailer = Uint8Array('\r\n'.split('') .map(c => c.charCodeAt(0))) transaction_id++ serial.write(Buffer.concat([header,data,trailer])) ``` --- ## デモ こんなふうに取れます --- # 成果 冷凍蕎麦の解凍は電子レンジ 冷凍アジフライの調理はノンフライヤー 同時にやってブレーカーが落ちていた **瞬間消費電力を見ながら調整し 同時調理を可能に** 上限は3000W(30A) --- ![](https://i.imgur.com/aGKTOFo.png) --- 1. ノンフライヤーがついた状態で開始。 2. 電子レンジの定格入力 1150W(最大出力700W時)と仮定 単純比例で500Wでは850W前後と推測 3. 換気扇、空調をOFF 4. 電子レンジをON 5. ノンフライヤーのヒーターON/OFF制御、 電子レンジの入出力のゆらぎで3022Wを記録 6. 無事調理終了 --- # 成果物 うまい。揚げたて、解凍したて。 --- ![](https://i.imgur.com/LESJSV8.jpg) --- このあと、めんつゆで美味しくいただきました。 --- # 今後の展望 Alexaのスキルにしたり データベースにデータを貯留したり Muninでお手軽に監視したり (あとはIoT系の事例とあまり変わらないので割愛)
{"metaMigratedAt":"2023-06-14T23:12:18.238Z","metaMigratedFrom":"Content","title":"スマートメーターから消費電力を取得して、目いっぱいの電力を安心して使った(急)","breaks":true,"contributors":"[{\"id\":\"f84a6e1e-6572-4468-8171-83431c5937a5\",\"add\":5236,\"del\":2539}]"}
    1000 views