node MCUにESP Easyをインストールして3chリレーを制御

以前、Sonoffを使って1chリレーを作成しました。

今回はその3ch版を作ってみました。

しかも、物理的な押しボタンスイッチからもON/OFFできるようにします。

リビングの3つの電気を、壁のスイッチからも、Webからも操作できるようにするためです。

 

ESP Easyに対応するデバイスはいくつかあります。

ESP Hardware - Let's Control It

私はこの中からNode MCU V2を選びました。

 

 

それと、リレーが必要です。

こちらも完成品がありました。

4ch仕様です。 

サインスマート(SainSmart) 4チャンネル 5V リレーモジュールfor Arduino DSP AVR PIC ARM
 

 さがせば日本語の仕様書も出てくるので大変ありがたいです。

USBの5Vで動きます。

ただし、接点がGNDに落ちるとリレーが動作するタイプです。

まぁ、リレーは3接点回路なので、常閉側に負荷回路を接続すると、5V印加で動作するようになります。

(その代わり、常閉なので、Node MCUの電源が落ちると、付加回路がONになりますが・・・。)

 

ESP Easyのインストールは前回実施したのでここでは割愛。

 

まずは、ジャンパーピンでNode MCUとつなぎますが、つないではいけないGPIOがいくつかあります。

この解説が次のリンク

Configuration - Let's Control It

おいおい!使えないGPIO多過ぎじゃねーかよ!

で、当初GPIO15とリレーを結線しましたが、LOW for bootで、かつ、リレーはLOWで動作。大量の電流が流れるせいか、Node MCUが起動しない、という状況が発生します。

なので、シリアル通信に使うGPIO4と5をシリアル通信用とせず、スイッチ用としました。

どうせ、シリアル通信はしません。

 

というわけで、GPIOを次のように使用しました。

 

GPIO-4 : Switch01 →押しボタン1へ

GPIO-5 : Switch02 →押しボタン2へ

GPIO-12 : Switch03 →押しボタン3へ

GPIO-13 : Relay01 →リレーモジュールの1へ

GPIO-14 : Relay02 →リレーモジュールの2へ

GPIO-16 : Relay03 →リレーモジュールの3へ

他に、Node MCUとリレーモジュールとはVCCとGNDを結線します。

Node MCUにはMicroUSBから5Vを給電、リレーモジュールにはNodeMCUからのVCC5V結線で給電です。

 

Node MCUにUSB電源を供給してからブートしてLAN内からアクセスできるようにするまでは、以前のこの記事を参考にしてください。

gentoolinux.hatenablog.com

ESPEasyで、まずはGPIO-4とGPIO-5に割り当てられているシリアルを解放します。

HardwareのページでSDAとSCLのプルダウンから空白を選びます。

Pin modeもボタン類のGPIO-4,5,12はDefaultで。

逆に、リレーのGPIO-13,14,16はOutput Highにしました。が、あんまり意味なさそう・・・。

f:id:naoyukinagano:20170828232439p:plain

 

さて、ESP Easyのデバイス設定です。

まず、スイッチ側ですが、内部のプルアップ抵抗を使い、スイッチが押されるとGPIOがGNDに落ちるて、ESP Easyにスイッチが押されたことが認識されるようにします。

下記のPull Upにチェックを入れ、Switch typeをSwithに、Switch Button TypeをPush Button Active Lowとします。

f:id:naoyukinagano:20170828231426p:plain

 

リレー側ですが、実は、リレーもほぼ同じです。

あ、Swith Button Typeが違うか。

f:id:naoyukinagano:20170828231430p:plain

 

そうそう、IDXはLAN内のESP Easyで一意の番号をつけましょうとのことです。確か・・・。

 

で、ルールを書いていきます。

ESP Easyのデフォルトでは、Ruleは表示されていません。

Tools → AdvancedからRuleにチェックを入れると出てきます。

f:id:naoyukinagano:20170828232131p:plain

 

Ruleに記入したことを解説しながら示します。

 

On System#Boot do
gpio,13,0
gpio,14,0
gpio,16,0
EndOn

まずはboot時、動作確認も込めてリレーがオンになります。

 

on Switch01#State1 do
If [Switch01#State1] = 1
event Switch01On
else
event Switch01Off
endif
endon

on Switch02#State2 do
If [Switch02#State2] = 1
event Switch02On
else
event Switch02Off
endif
endon

on Switch03#State3 do
If [Switch03#State3] = 1
event Switch03On
else
event Switch03Off
endif
endon

ここは、GPIO-4,5,12である、それぞれSwith01から03までのボタンが押され、GNDに落ちたときの動作を記述しています。

まずは、現在ONなのかOFFなのかのステイタスの判定をします。

1がOFF、0がONの状態です。

ステイタスが1なら、eventであるSwitch01Onを実行、それ以外ならSwitch01Offを実行です。

で、そのeventの定義を続けてRuleに記載します。

 

on Switch01On do
inputswitchstate 0,0
gpio,13,0
endon

on Switch01Off do
inputswitchstate 0,1
gpio,13,1
endon

on Switch02On do
inputswitchstate 1,0
gpio,14,0
endon

on Switch02Off do
inputswitchstate 1,1
gpio,14,1
endon


on Switch03On do
inputswitchstate 2,0
gpio,16,0
endon

on Switch03Off do
inputswitchstate 2,1
gpio,16,1
endon

最初の4行を見ましょう。

まず、ここからevent であるSwitch01Onですよという定義です。

inputswitchstateはDeviceにあるValuesを変更する命令です。

inputswitchstate 0,0は、Deviceにかかれた1行目のデバイスのValues(ここではSwitch01)を0にするという意味です。

0が1つめですね。

この命令を入れないと、Valuesが変わらないため、物理スイッチでON/OFFした状態とLAN上でON/OFFした状態が一致しない状況になります。

で、3行目がGPIO-13を0、つまりLOWにしましょうと言うことです。

リレーはLOWでリレーONですから、通電状態になります。

4行目がeventの終了です。

あとは、そのONとOFFパターンとスイッチ3回路で6パターンのイベントが書かれています。

 

このルールが試行錯誤だったので、一番時間かかりました。

 

設定等が終わったら、ケースに収めます。

下駄が高すぎて、NodeMCUはフタが閉まりません(T_T)

f:id:naoyukinagano:20170828231433j:plain

 

一つに収まるちょうど良いケーズがなかったので、リレーモジュールも別体のケースに。

f:id:naoyukinagano:20170828231436j:plain

 

ちなみに、このケースは見えないように壁の中に埋め込みます。

ということは、ケースの高さは壁の中の厚み未満に、横幅はコンセントの穴の幅未満に。今回は2列用のプレートを使うため、穴の幅は約100mm(正確には97mm)。高さもコンセントの穴の高さ未満で、穴の高さは95mmです。

 

あとは壁に埋め込みます。

ここからの作業は有資格者でなければ出来ません。

私はこのようなコンセント作業を自分で出来るよう、第二種電気工事士を持っています。

 

上部の6つスイッチのうちよく使う右3つのスイッチをIOT化します。

拙宅のスイッチはすべて神保電器のJ-WIDEシリーズですが、このシリーズには押しボタンというのがありません。

なので、パナソニックのコスモWIDE21のスクエアタイプに変更しました。

これなら押しボタンが用意されているのです。

f:id:naoyukinagano:20170828231439j:plain

 

仕上がりです。

下のコンセントの横にあるスイッチは、Node MCUに電源を供給するUSB電源のAC側スイッチになっています。

何かあって電源再起動の際も、いちいち壁面を開けずにOFF/ON出来ますし、ステイタスランプも付いていますので、不具合時の切り分けにもなります。

 

我ながらうまく収めました。

f:id:naoyukinagano:20170828231442j:plain

 

で、HomeBridgeにはnpmからhomebridge-httpをインストールします。

 

gentoo # npm install -g homebridge-http

 

config.jsonは、前回のsonoffを含めて下記の通り。

ただし、ESPEasyはGPIOステイタスをJSONで返すのに対し、homebridge-httpの現状版は0か1でステイタスを受け取るような仕様です。

(将来的にはjson対応するようで、githubにはJSON対応の最新版がありました。が、インストールしても正しく動かない・・・)

そうすると、Apple HOMEアプリ上のステイタスの取得に時間がかかったり、正しくなかったりします。

いつかMQTTとかに移行しないとダメなのかしら・・・。

 

{
"bridge": {
"name": "Homebridge",
"username": "00:00:00:00:00:00",
"port": 51826,
"pin": "031-45-154"
},

"description": "dummy",

"accessories": [
{
"accessory": "SonoffBasicESPEasy",
"name": "寝室の電気",
"ip": "192.168.0.151"
},
{
"accessory": "Http",
"name": "SnowBall",
"switchHandling": "yes",
"http_method": "GET",
"on_url": "http://192.168.0.152/control?cmd=event,Switch01On",
"off_url": "http://192.168.0.152/control?cmd=event,Switch01Off",
"status_url": "http://192.168.0.152/control?cmd=status,gpio,13",
"status_on": {
"log": "",
"plugin": 1,
"pin": 13,
"mode": "output",
"state": 0
},
"status_off": {
"log": "",
"plugin": 1,
"pin": 13,
"mode": "output",
"state": 1
},
"service": "Light",
"brightnessHandling": "no",
"brightness_url": "",
"brightnesslvl_url": "",
"sendimmediately": "",
"username" : "",
"password" : ""
},
{
"accessory": "Http",
"name": "PH5 Plus",
"switchHandling": "yes",
"http_method": "GET",
"on_url": "http://192.168.0.152/control?cmd=event,Switch02On",
"off_url": "http://192.168.0.152/control?cmd=event,Switch02Off",
"status_url": "http://192.168.0.152/control?cmd=status,gpio,14",
"status_on": {
"log": "",
"plugin": 1,
"pin": 14,
"mode": "output",
"state": 0
},
"status_off": {
"log": "",
"plugin": 1,
"pin": 14,
"mode": "output",
"state": 1
},
"service": "Light",
"brightnessHandling": "no",
"brightness_url": "",
"brightnesslvl_url": "",
"sendimmediately": "",
"username" : "",
"password" : ""
},
{
"accessory": "Http",
"name": "Spot & Bracket Light",
"switchHandling": "yes",
"http_method": "GET",
"on_url": "http://192.168.0.152/control?cmd=event,Switch03On",
"off_url": "http://192.168.0.152/control?cmd=event,Switch03Off",
"status_url": "http://192.168.0.152/control?cmd=status,gpio,16",
"status_on": {
"log": "",
"plugin": 1,
"pin": 16,
"mode": "output",
"state": 0
},
"status_off": {
"log": "",
"plugin": 1,
"pin": 16,
"mode": "output",
"state": 1
},
"service": "Light",
"brightnessHandling": "no",
"brightness_url": "",
"brightnesslvl_url": "",
"sendimmediately": "",
"username" : "",
"password" : ""
}

]
}