Edited at

RubyでECHONET Lite家電を制御する

More than 1 year has passed since last update.


はじめに

ECHONET Lite は家電製品をネットワークで制御するプロトコルです。

今回はRubyでシンプルなECHONET Liteの制御プログラムを載せます。

※ECHONET Lite(ISO/IEC 14543-4-3)国際規格

やりたいことは

1. 家電製品のON,OFF制御

2. 家電機器の動作状態の取得

対象者は

「ECHONET Liteって何ができるの?」「とりあえず動かしてみたい」って人向けです。

※もちろん規格書みたいな堅苦しいことは書きません


環境

● 空気清浄機(ECHONET Lite対応)

   ⇒ Sharp KI-EX100

● Windows

● Ruby v2.2.4


1. 家電製品のON,OFF制御

上記の空気清浄機のON, OFF制御を行うサンプルコードです。

ECHONET Lite入門 スマートハウスの通信技術を学ぼう!」 を参考にしています。

ip = "192.168..." のところはご自身の環境に合せて記入してください。


動作状態をONにする


send.rb

require "socket"

#空気清浄機のIPアドレス
ip="192.168.2.166"

msg=[
0x10,0x81,
0x00,0x00,
0x05,0xFF,0x01,
0x01,0x35,0x01,
0x61,0x01,
0x80,0x01,
0x30
].pack("C*")

u = UDPSocket.new()
u.connect(ip,3610)
u.send(msg,0)
u.close



動作状態をOFFにする


send.rb

require "socket"

//空気清浄機のIPアドレス
ip="192.168.2.166"

msg=[
0x10,0x81,
0x00,0x00,
0x05,0xFF,0x01,
0x01,0x35,0x01,
0x61,0x01,
0x80,0x01,
0x31
].pack("C*")

u = UDPSocket.new()
u.connect(ip,3610)
u.send(msg,0)
u.close


変わったのは msgの配列の中身で(13行目)

0x30 ⇒  0x31

になっただけです。


空気清浄機以外の家電を動かしたかった場合

今回は例として空気清浄機を上げましたが、

エアコンや照明をON,OFF制御したい。。。

って場合があると思います。

そんな時は以下のところを変更してください

#空気清浄機のOFF制御

msg=[
0x10,0x81,
0x00,0x00,
0x05,0xFF,0x01,
0x01,0x35,0x01,
0x61,0x01,
0x80,0x01,
0x31
].pack("C*")

#エアコンのOFF制御

msg=[
0x10,0x81,
0x00,0x00,
0x05,0xFF,0x01,
0x01,0x30,0x01,
0x61,0x01,
0x80,0x01,
0x31
].pack("C*")

照明のOFF制御

msg=[
0x10,0x81,
0x00,0x00,
0x05,0xFF,0x01,
0x02,0x90,0x01,
0x61,0x01,
0x80,0x01,
0x31
].pack("C*")

変わったのは10行目の

空気清浄機の場合

0x01,0x35,0x01, 



エアコン

0x01,0x30,0x01,

照明

0x02,0x90,0x01,

だけです。


2. 家電機器の動作状態の取得

空気清浄機の動作状態を取得したいと思います。

今回の場合はわかりやすいように、

状態取得のリクエストを送信するプログラム

受信プログラム

に分けたいと思います。


送信プログラム

※先ほどのコードと少し変わっています!


send.rb

require "socket"

#空気清浄機のIP
ip="192.168.2.166"

msg=[
0x10,0x81,
0x00,0x00,
0x05,0xFF,0x01,
0x01,0x35,0x01,
0x62,0x01,
0x80,0x00
].pack("C*")

u = UDPSocket.new()
u.connect(ip,3610)
u.send(msg,0)
u.close



受信プログラム


receive.rb

require 'socket'

udps = UDPSocket.open()
port = 3610

udps.bind('0.0.0.0',port)
loop do
data = udps.recv(65535).chomp
puts data.unpack("H*")
end
udps.close


うまいこといけば以下の文字列が表示されるはず!!

ONの時

1081000001350105ff017201800130

OFFの時

1081000001350105ff017201800131


受信できなかったときの原因


  1. 空気清浄機以外の家電でやろうとしている
    ⇒ 上記のサンプルコードは空気清浄機を対象にしています。1の制御プログラムの時にやったmsg内を変更する要領やってくだい

  2. ファイアーウォールの設定  
    ⇒ ECHONET Liteはポート3610 を使用してます。
    ファイアーウォールで3610ポートをブロックしていると機器からのパケットが受信できないのでポートの開放をしてください。


参考資料


  1. ECHONET Lite入門 スマートハウスの通信技術を学ぼう!

  2. HEMS(ECHONET Lite)認証支援センター