# スマートメーターから消費電力を取得して、目いっぱいの電力を安心して使った(急)
---
## 経緯
電気が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/
---
## 実装
モジュールとはシリアル通信だけれど、
イベントや応答が順序をシャッフルされて飛んでくる
=> イベント駆動とまではいかないが、
リアクティブに状態管理したい
---
## 実装

---
## 実装の感想
シリアルポートからの行毎イベント発火で、
受信する形になっていれば、
よほど変な言語でない限り
普通に書けたかもしれない
---
## 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)
---

---
1. ノンフライヤーがついた状態で開始。
2. 電子レンジの定格入力
1150W(最大出力700W時)と仮定
単純比例で500Wでは850W前後と推測
3. 換気扇、空調をOFF
4. 電子レンジをON
5. ノンフライヤーのヒーターON/OFF制御、
電子レンジの入出力のゆらぎで3022Wを記録
6. 無事調理終了
---
# 成果物
うまい。揚げたて、解凍したて。
---

---
このあと、めんつゆで美味しくいただきました。
---
# 今後の展望
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}]"}