Transcript
Page 1: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

Web エンジニアのためのスマートホームハックNode.js で家電と Arduino を操作2016 年 9 月 3 日 ( 土 )

HTML5 Conference 2016

有限会社 futomi 代表取締役

株式会社ニューフォリア 取締役 最高技術責任者

羽田野 太巳(はたの ふとみ)

@futomi futomi.hatano

Page 2: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

自己紹介

2

マークアップ解説本 API 解説本 API チュートリアル本Windows 8API 解説本

有限会社 futomi 代表取締役株式会社ニューフォリア 取締役 最高技術責任者

Page 3: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

日経 SYSTEMS 連載2015 年 4 月号~ 2016 年 3 月号:こんなに変わった Web 開発 /HTML5 の基本テクニック

3

Page 4: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

4

日経 SYSTEMS コラム

• そろそろ IoT に触れてみませんか• マイコンボードを使って大気圧と気温を取得• Web ブラウザーから制御  MIDI でサーボを動かす• Node.js で家電を操作 赤外線を利用しよう• ECHONET Lite で家電をコントロール• スマホから機器を制御「デバイスコネクト WebAPI 」• 電池交換が不要に 無線技術「 EnOcean 」に注目• ...

IoT で火が付く IT エンジニア魂: 2016 年 4 月号~ 2017 年 3 月号 ( 予定 )

Page 5: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

5

GitHub と npm

https://www.npmjs.com/~futomi https://github.com/futomi

Page 6: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

6

IoT で話題の通信方式PAN から LPWAN まで

Page 7: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

話題の無線方式

Personal Area Network Home Area Network Low Power Wide Area Network

Bluetooth

Wi-SUN

Wi-Fi

EnOcean

LoRa

SigFox

NB-IoT

Wi-Fi HaLow

Zigbee 特定小電力無線

サブギガ帯(920MHz 帯 ) Z-Wave

DECT

Page 8: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

8

機器操作プロトコル例

Wi-SUN

UDP UDP TCP

HTTP

SOAP

UPnP

SSDP

IP

Wi-FiEthernet

Wi-FiEtherne

t

IP

UDP TCP

HTTP

SOAP

ONVIF

WS-Discover

y

IP

Wi-FiEthernet

SOAP

ECHONET Lite家電 / センサーセンサー AV/NW 機器家電 / センサー CCTV カメラ

EnOcean Z-Wave

Page 9: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

9

Web 屋でも試せる条件

• USB ドングルとデバイスがネットで 1 個から手に入る• まとめ買い前提はつらい ...• 野良ディベロッパーはお呼びでないメーカーが多い ...

• 技適が通っている• 電波を使う以上、避けては通れない ...• 海外で普及していても日本では使えないものが多い ...

• 通信仕様が無料で一般公開されている• 標準化団体によっては会員でないと仕様が公開されていない• 非会員には有料で売っている団体もある

• 機器種別ごとのプロファイルが規定されている• 低レイヤだけ規定されてても上位レイヤが規定されていないと事実上メーカー独自

規格と同じで野良ディベロッパーは扱えない

技適マーク

Page 10: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

もくじ

• IoT で話題の通信方式• Arduino 編• EnOcean 編• ECHONET Lite 編• UPnP 編• まとめ

10

Page 11: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

11

Arduino 編JS で Arduino にアクセスする方法

Page 12: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

12

Web 屋の Arduino

そんなワガママな貴方 ( 私も ) のために ...

• はんだ付けなんてやりたくない• 電気回路に興味はない• 抵抗のカラーコードなんて分からない• ブレッドボードも使いたくない• C 言語なんてできる限り使いたくない• やっぱり JavaScript で

Page 13: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

13

Arduino Shield Kit

FaBohttp://fabo.io/

seeed studio - Grovehttps://www.seeedstudio.com/

Page 14: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

Chrome + Web MIDI API + Moco• Midi Firmware for Arduino Uno (Moco) で Arduino の USB ファーム

を書き換えて、 Arduino を MIDI デバイスとして認識されるようにするhttp://morecatlab.akiba.coocan.jp/lab/index.php/aruino/midi-firmware-for-arduino-uno-moco/

• 残念ながらスケッチは C 言語で書くが、 Arduino MIDI Library が便利http://playground.arduino.cc/Main/MIDILibrary

• データは MIDI フォーマットに載せてオレオレフォーマットで送る

Page 15: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

15

実験

・ Seeed 社の Grove を使って超音波距離センサー , LED, サーボを Arduino に接続・距離センサーの結果をリアルタイムに取得して表示・ブラウザー上のスライダーでサーボを操作・サーボ操作のコマンドを受け付けたら LED点灯

Page 16: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

16

ビデオ

https://youtu.be/d7S5Mqelf08

Page 17: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

17

オレオレ MIDI フォーマット

1メッセージ値 チャネル番号

ステータスバイト

0

データバイト 1

0

データバイト 2

ノート番号0 ~ 127

ベロシティ0 ~ 127電子ピアノなら

PC → Arduino

Arduino → PC 超音波距離センサーが計測した距離 (cm)データバイト 1 + データバイト 2 (0 ~ 180)

サーボの角度 (deg)データバイト 1 + データバイト 2 (0 ~ 254)

Page 18: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

18

Node.js + Johnny-Five + Firmata• Johnny-Five• USB 経由で Firmata を使って Arduino と通信する Node.jsモジュー

ル• さまざまな Arduino互換ボードとセンサーに対応

• Firmata• PC とマイコンの間でやり取りするためのプロトコル• ライブラリは Arduino の IDE に付属• Arduino に Firmata をビルド転送するだけ• 実際の通信は Johnny-Five に任せプロトコルを知る必要はない

Page 19: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

19

Johnny-Five

http://johnny-five.io/ http://johnny-five.io/api/multi/

Page 20: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

20

実験

FaBo 社の FaBo を使って気圧センサー (Barometer I2C Brick: MPL115A2) を Arduinoに接続温度と気圧を取得したら高度 (理論値 ) を計算して表示

Page 21: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

21

Node.js のコードvar five = require("johnny-five");var board = new five.Board();

board.on("ready", () => { var multi = new five.Multi({controller: "MPL115A2"}); multi.on("change", () => { // 温度 (摂氏 ) var tmp = this.temperature.celsius; // 大気圧 (kPa を hPa に変換 ) var prs = this.barometer.pressure * 10; // 高度 ( メートル ) : 日本の場合 var alt = ((Math.pow(1013.25/prs, 1/5.257) - 1) * (tmp + 273.15)) / 0.0065; // 結果表示 ... });});

Page 22: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

22

EnOcean 編電源要らずの IoT

Page 23: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

23

EnOcean の特徴

• エナジーハーベスティング• バッテリーレス無線発信技術• 電磁誘導や太陽光発電などで電池要らず• 主にビルオートメーションなどの業務用に活用される• 近年はスマートホームも視野に

• 周波数はサブギガ帯• 日本では 928MHz• ローム社が日本市場向け無線モジュールを扱っている

• 製品• 各種センサー ( 温度 , 湿度 , CO2, ドア開閉など )• ロッカースイッチ

Page 24: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

24

製品例

Page 25: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

25

仕様書

• EnOcean GmbH. が一般無料公開• https://www.enocean.com/en/knowledge-base/

• 仕様書の種類• EnOcean Serial Protocol (ESP) 3

• テレグラムのフォーマット仕様

• EnOcean Radio Protocol (ERP) 2• テレグラムのデータ部の仕様

• EnOcean Equipment Profiles (EEP) 2.6.5• 機器種別ごとの仕様• EnOcean アライアンスにて策定

Page 26: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

EnOcean のプロトコル体系

26

Page 27: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

27

EnOcean Equipment Profiles (EEP)• デバイス種別ごとに EEP が割り振られている

• A5-02-05: Temperature Sensor Range 0℃ to +40℃• A5-07-01: Occupancy with Supply voltage monitor• A5-09-04: CO2 Sensor• F6-02-04: Rocker Switch, 2 Rocker, Light and blind control

• EEP の把握の仕方• EnOcean デバイスの説明書に記載されている ( はず )• 記載されてなければ販売元に聞くしかない• 4BS というカテゴリの EEP なら Learn ボタンが用意されており、それを押すと自

分自身の EEP を通知するテレグラムを飛ばしてくれる• ただし、製品によっては間違っていたりする ...

Page 28: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

28

Learn ボタン

Page 29: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

29

node-enocean-utils• EnOcean を扱うための Node.jsモジュール

• https://github.com/futomi/node-enocean-utils

• 依存関係• Node.js 4.4 以上• serialportモジュール

• インストール$ npm install node-enocean-utils

Page 30: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

30

EnOcean デバイスの登録 (teach-in)var enocean = require('node-enocean-utils');

// EnOcean デバイスの登録enocean.teach({ 'id' : '00 00 00 2C 86 5C', 'eep' : 'F6-02-04', 'name': 'ESM210R Rocker Switch Single'});enocean.teach({ 'id' : '00 00 04 01 31 95', 'eep' : 'A5-02-05', 'name': 'STM 431J Temperature Sensor'});

Page 31: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

31

EnOcean デバイスのモニター// モニター開始enocean.startMonitor({'path': 'COM7', 'rate': 57600});

// data-known イベントのリッスンenocean.on('data-known', (telegram) => { var message = telegram['message']; console.log(message['device']['name'] + ': ' + message['desc']);});

ESM210R Rocker Switch Single: B0 pressedESM210R Rocker Switch Single: B0 releasedESM210R Rocker Switch Single: BI pressedESM210R Rocker Switch Single: BI releasedSTM 431J Temperature Sensor: 28.2℃STM 431J Temperature Sensor: 28.4℃

出力例

Page 32: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

32

ECHONET Lite 編家電とスマートメーターを操作

Page 33: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

33

ECHONET Lite の特徴

• 家電の種別ごとにクラス定義• エアコン , 空気清浄機 , スマートメーターなど

• 通信の下位層はなんでもアリ• TCP, UDP, Bluetooth, Wi-SUN など• セキュリティーも下位層任せ

• 製品• エアコン , シーリングライト , 空気清浄機 , スマートメーターなど• エアコンは別途ネットワークモジュールを購入する必要あり• メーカーによってはホームゲートウェイも購入する必要あり

Page 34: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

34

製品例

ダイキン 新うるさら 7

Page 35: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

35

ネットワークアダプタ

Page 36: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

仕様書

• ECHONET コンソーシアムが一般無料公開• http://echonet.jp/spec/

• 仕様書の種類• ECHONET Lite 規格書 Ver.1.12

• http://echonet.jp/spec_v112_lite/• プロトコルの概要および共通部分の仕様

• APPENDIX ECHONET 機器オブジェクト詳細規定 Release H• http://echonet.jp/spec_object_rh/• 機器種別ごとの仕様

36

Page 37: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

37

node-echonet-lite• ECHONET Lite を扱うための Node.jsモジュール

• https://github.com/futomi/node-echonet-lite

• 依存関係• Node.js 4.4 以上• serialportモジュール (Wi-SUN ルート B を扱う場合 )

• インストール$ npm install node-echonet-lite

Page 38: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

38

初期化// モジュールのロードvar EchonetLite = require('node-echonet-lite');

// EchonetLite オブジェクトを生成var el = new EchonetLite({'type': 'lan'});

// EchonetLite オブジェクトを初期化el.init((err) => { // ここで機器発見});

Page 39: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

39

機器発見el.startDiscovery((err, res) => { var device = res['device']; var address = device['address']; // 機器の IP アドレス var eoj = device['eoj'][0]; // EOJ var group_code = eoj[0]; // グループコード var class_code = eoj[1]; // クラスコード

// 家庭用エアコンかどうかを判定 if(group_code === 0x01 && class_code === 0x30) { // 機器発見プロセスを停止 el.stopDiscovery(); // ここからあれこれエアコン操作 ... });}

Page 40: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

40

エアコン ON/OFFvar epc = 0x80; // ON/OFF を表すプロパティコード

// ON か OFF かを調べるel.getPropertyValue(address, eoj, epc, (err, res) => { // ON だったなら true, OFF だったなら false var status = res['message']['data']['status']; // ON なら OFF に , OFF なら ON にする var edt = { 'status': !status }; // EDT オブジェクト el.setPropertyValue(address, eoj, epc, edt, (err, res) => { if(!err) { console.log('成功 '); } });});

Page 41: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

41

Wi-SUN ルート B 用の USB ドングル

http://www.tessera.co.jp/rl7023stick-d_dss.html

テセラ・テクノロジーRL7023 Stick-D/DSS

http://www.rohm.co.jp/web/japan/news-detail?news-title=2014-10-02_news&defaultGroupId=false

ローム /JorjinWSR35A1-00

Page 42: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

42

B ルートの申し込み (東電の場合 )• 電力メーター情報発信サービス

( B ルートサービス)http://www.tepco.co.jp/pg/consignment/liberalization/smartmeter-broute.html

• 申し込みが終わると後日勝手にメータが交換される (停電なし )• その後「認証 ID 」が郵送• さらにその後メールでパスワード

が通知

Page 43: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

43

我が家のスマートメーター

Page 44: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

44

Wi-SUN B ルートの実際のやり取り> SKSENDTO 1 FE80:0000:0000:0000:0000:0000:0000:0000 0E1A 2 000E 1081001A05FF0102880162019E00

EVENT 21 FE80:0000:0000:0000:0000:0000:0000:0000 00OK

ERXUDP FE80:0000:0000:0000:0000:0000:0000:0000 FE80:0000:0000:0000:0000:0000:0000:0001 0E1A 0E1A 001C64000334809F 1 0012 1081001A02880105FF0172019E040381E5ED

> SKSENDTO 1 FE80:0000:0000:0000:0000:0000:0000:0000 0E1A 2 000E 1081001B05FF0102880162019F00

EVENT 21 FE80:0000:0000:0000:0000:0000:0000:0000 00OK

※ 実際にはテキストとバイナリが混在したコマンドとレスポンスで ECHONET Lite パケット部はバイナリ

ECHONET Lite パケット部分

ECHONET Lite パケット部分

Page 45: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

45

ビデオ ( 非公開 )

Page 46: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

46

node-echonet-lite Wi-SUN B ルート初期化

var EchonetLite = require('node-echonet-lite');var el = new EchonetLite({ 'lang' : 'ja', 'type' : 'wisunb', 'adapter': 'bp35a1', 'path' : 'COM8', 'id' : '0123456789ABCDEF0123456789ABCDEF', 'pass' : 'ABCDEFGHIJKL', 'baud' : 115200});

・以降は UDP を扱う場合と同じ・ただし、機器発見は時間がかかる(我が家の環境では 20秒ほど)・基本的にレスポンスは遅い

Page 47: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

47

UPnP 編テレビなどの AV 機器にアクセス

Page 48: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

48

UPnP の特徴

• 機器発見と録画映像再生制御など• SSDP, M-Search• HTTP POST で SOAP をリクエスト

• 対応機器• ほとんどのテレビが対応• ただし UPnP で規定されていない操作はメーカー独自• パケットキャプチャーすればある程度は分かる ( かも )

Page 49: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

49

node-upnp-utils• UPnP を扱うための Node.jsモジュール

• https://github.com/futomi/node-upnp-utils

• 依存関係• Node.js 4.4 以上• xml2jsモジュール

• インストール$ npm install xml2js$ npm install node-upnp-utils

Page 50: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

機器発見var upnp = require('node-upnp-utils');

// added イベントのリスナーupnp.on('added', (device) => { // 欲しいデバイスが見つかれば発見処理を停止 upnp.startDiscovery(); // あとはお好きなように ... ...

});

// 機器発見開始upnp.startDiscovery();

Page 51: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

51

アクション送信var upnp = require('node-upnp-utils');

var soap = '';soap += '<?xml version="1.0" encoding="utf-8"?>';soap += '<s:Envelope ...>...</s:Envelope>';

var params = { 'url' : 'http://192.168.10.4:20003/MediaServer/ContentDirectory/Control', 'soap': soap};

upnp.invokeAction(params, (err, obj, xml, res) => { ...});

Page 52: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

52

ビデオ ( 非公開 )

Page 53: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

53

まとめWeb 屋でも IoT

Page 54: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

Web 屋でも IoT• Web ディベロッパーでも関われる分野はある

• Arduino, Wi-SUN, EnOcean, etc..• IoT はモノだけでなく見える化も重要、そこは Web 屋の得意分野

• ハードは専門家に任せよう• ドットメイクのブームもあるがそんな簡単じゃない• ハルロック読みましょう

Page 55: Webエンジニアのためのスマートホームハック ~ Node.js で家電とArduinoを操作 ~

ご清聴ありがとうございました

有限会社 futomi 代表取締役

株式会社ニューフォリア 取締役 最高技術責任者

羽田野 太巳(はたの ふとみ)

@futomi futomi.hatano


Top Related