yotsuba が 2021年05月16日16時58分40秒 に編集
初版
タイトルの変更
ちょっとインテリジェンスなリモコン
タグの変更
obnizIoTコンテスト
スマートホーム
メイン画像の変更
本文の変更
# 概要 ![キャプションを入力できます](https://camo.elchika.com/ea53596a4869e906b41e832f97cc7dfb0586faf7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64623832376631632d613965372d343634302d393366642d3462323838643431663436632f62343063333766612d663131392d343361392d616638302d343639306231636463386434/) ホームインフォメーションサーバーからの情報を表示し契約アンペア数を超えそうな時はエアコン停止してくれるちょっとインテリジェンスなリモコンです。 # 動作デモ @[youtube](https://www.youtube.com/watch?v=sXmHxnk70wY) 撮影の為トリガーを400Wに設定しています。季節的にエアコンがほぼ動かないので劇的に電力が下がったりしていませんが赤外線Ledが発光してエアコンを停止する様子(20秒付近)等システム全体の雰囲気の参考までに。 # 仕組み ![キャプションを入力できます](https://camo.elchika.com/eabd4a6c3e57458b9442a107dcc9d29eb4e088b9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64623832376631632d613965372d343634302d393366642d3462323838643431663436632f30303263323362342d613030392d346136622d386535342d643531653039373234336338/) スマートメーターや環境センサーからの情報をホームインフォサーバーでまとめてWebsocketで配信し、サーバーからの情報をブラウザで受信し表示やobnizへコマンド発行します。 # ブレーカーが落ちるのを防ぐ 我が家のメインブレーカーが落ちる原因は、ほぼエアコンと調理家電の同時使用でエアコンが電流を多く使った時です。なので調理する時、エアコンを停止すればいいのですが忘れてしまいます。そんなうっかりミスを防ぐ為、スマートメーターの瞬時値を監視し、閾値を超えたらエアコンの停止信号をobnizから送信します。 # 赤外線送信回路 ![キャプションを入力できます](https://camo.elchika.com/6594b3db94c6c4a48c6e5c9c2da5c04ac7d9d585/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64623832376631632d613965372d343634302d393366642d3462323838643431663436632f30663131323731362d636466652d343439312d623461622d333962626234333630333636/) Obnizの1A流せるポートを利用しているので増幅回路無しで、赤外線Led2個(エアコン、TV用)直列と制限抵抗のみ。制限抵抗は到達距離を見ながらありものの抵抗を並列に増やして決めました。現在は51Ωが8本並列に繋がってます。 # ソースコード抜粋 ```Javascript < script > var airconStopSignal = [1, 1, 1, 1, 1, 1, 1, 1, 1, //raw data const var airconStopThreshold=2700;//契約アンペア数x90位 var airconStopFlag = false; var airconStopTime; let infraredLed = null; var obniz = new Obniz("Obniz ID"); var ws = new WebSocket('ws://HomeInformationServer address/'); var myfunc = function (button) { ws.send(button.name); }; conststateDisp = () => { if (airconStopFlag) { document.getElementById("status").value = "エアコン停止しました。" + Time; } else { document.getElementById("status").value = "webSocket readyState" + ws.readyState; } }; setInterval(stateDisp, 1000); ws.onmessage = asyncfunction(evt) { var Time = newDate().toLocaleTimeString(); var power = JSON.parse(evt.data)["val1"]; var temperature = "温度 " + JSON.parse(evt.data)["val2"] + " ℃"; var humidity = "湿度 " + JSON.parse(evt.data)["val3"] + " %"; var airPressure = "気圧 " + JSON.parse(evt.data)["val4"] + " hPa"; console.log(evt); document.getElementById("dispMsg").value = "電力 " + power + "W " + powInt + "kWh " + parseInt(amount, 10) + "円"; document.getElementById("dispMsg2").value = temperature + " " + humidity + " " + airPressure; if (power > airconStopThreshold && !airconStopFlag && infraredLed {//エアコン停止単発式 airconStopTime = Time; infraredLed.send(airconStopSignal); airconStopFlag = true; } obniz.display.drawing(false); obniz.display.clear(); obniz.display.setColor('black'); obniz.display.font(null, 16) obniz.display.pos(0, 0); obniz.display.print("電力 " + power + "W"); obniz.display.print(temperature); obniz.display.print(humidity); if (airconStopFlag) { obniz.display.font(null, 15) obniz.display.print("エアコン停止"); document.getElementById("status").value = "エアコン停止しました " + airconStopTime; } obniz.display.drawing(true); }; ws.onclose = function (evt) { console.log("ws: onclose"); ws.close(); }; ws.onerror = function (evt) { console.log(evt); }; ws.onopen = function () { ws.send('Connect ' + newDate()); var result = document.getElementsByClassName("row"); for (vari = 0, len = result.length | 0; i < len; i = i + 1 | 0) { result[i].style.visibility = "visible"; } }; obniz.onconnect = asyncfunction() { infraredLed = obniz.wired('InfraredLED', { anode: 5, cathode: 7 }); $("#off").click(function () { // your value for ON here. infraredLed.send(airconStopSignal) }) } ``` # 電流と電力 今回制御の基になる瞬時値をスマートメーターの瞬時電力値を使用しましたが、本来なら力率分ずれるので電流値を使用するのが正解です。今回電流値を使用しなかった理由は精度と処理速度にあります。精度については仕様上は0.1A単位ですが東京電力管内では1A単位でしか取れない仕様で、単相3線式だと小数点以下四捨五入で最大±1A誤差が出ます。又、処理速度ですが電流と電力の同時取得が上手く出来てなく、順次取得すると合計5秒程度かかってリアルタイム性が失われてしまいます。上記理由と電力は1W単位で取れるので今回は瞬時電力値を使用しました。 # 電気料金 計算は今月の使用電力から計算した正確な電気料金を表示します。サーバーの画面が狭いのと燃料調整費等変化する項目を書き換える為、メンテナンスしやすいJavascriptで再実装しました。今後、スマートメーターの履歴を取得し24時間消費電力等表示予定です。