LoginSignup
18
13

More than 5 years have passed since last update.

RubyでECHONET Lite家電を制御する

Last updated at Posted at 2016-10-03

はじめに

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)認証支援センター
18
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13