Edited at

IoT 家中の赤外線リモコン製品をpythonから操作する。


赤外線リモコン付きの家電製品をIoT化する。

私は、この製品を中華黒豆(美味しそう)と呼んでいる。ハッカーの中では、ブラックビーンと呼ばれている。

image.png

この製品は、中華通販で2000円程度で入手できる。スマートホンからWifi経由でコマンドを与え、赤外線リモコンを制御することができる製品である。IoT制御するための学習には、もってこいの製品である。

テレビやエアコン・照明機器・コンポステレオなど赤外線リモコン制御できるものならほとんど使用できる。


準備(接続)

wifiから制御するためにssid/passwordをセットする

image.png


ライブラリを導入します。

pip install broadlink

https://github.com/mjg59/python-broadlink


上記にwifi設定する方法が述べられています。


discover.py

import broadlink

broadlink.setup('myssid', 'mynetworkpass', 3)
dev = broadlink.discover(timeout=5)
net=[]
for d in dev:
d.auth()
n=dict(type=d.get_type(),ip=d.host[0],port =d.host[1],
mac = "-".join([format(x,"02x") for x in [x for x in reversed(d.mac)]]),
timeout = d.timeout)
net.append(n)
print(net)


mac=...の行は、byte列のエンディアン変換を行い、かつ、文字列に変換を一行で行いました。「Pythonの立場でコーディンク」

myssidとmynetworkpassに無線ルータのidとpasswordをセットし実行すると下記のように出力される。

出力結果

result.py

[{'type': 'RM2', 'ip': '192.168.1.102', 'port': 80, 'mac': '78-xx-77-xx-xx-xx', 'timeout': 10}]


リモコンの赤外線コードの取得

image.png


制御に必要な赤外線リモコンのボタンを表示する。これらをデータベース化すれば制御するためのデータとなる。ボタンを押し続けると赤外線コードを出し続けるのでオペレーションするときに注意する。


getCode.py

import broadlink,pyperclip,netaddr,time,binascii,json,sys

net={'type': 'RM2', 'ip': '192.168.1.102', 'port': 80, 'mac': '78-xx-xx-xx-xx-xx', 'timeout': 10}
lb,text='ontv','OnTv'
RM3 = broadlink.rm((net["ip"], net["port"]),netaddr.EUI(net["mac"]),net["timeout"])
RM3.auth()
RM3.enter_learning()
while True:
cmd= RM3.check_data()
if cmd is None: continue
else:
break
d={"IR":cmd.hex(),"name":text,"lb":lb}
print(json.dumps(d))


赤外線リモコンのボタンを押すと下記の結果が得られる。


result.py

{"IR": "260002017438110c0f0d1029102a100c102a100c100d100c102a100c100d1029100d1029100d0f2a100d0f0d1029110c100c100d100c100d

100c102a0f0d102a0f2a100d0f0d1029100d1029102a1029102a100c100d100009a77438100d100c102a0f2a100d0f28130c0f0d100d0f2a100c100d
1029100d1029100d1029100d100c102a0f0d100d0f0d100d0f0d100c1028120c102a1029100d100c102a100c102a0f2a102a0f2a100d0f0d100009a6
7737100c100c11291128110c1128100d110b110c1128110c100c1129110b1129100c1128110c110c1029110b110c110c100c110c100c1128110c1128
1129110b110c1128110b1129112811291128120b110c10000d05000000000000", "name": "OnTv", "lb": "ontv"}

IRの部分が赤外線リモコンのコードとなる。


コンピュータからテレビの電源をONする。

上記のデータをRM3に送る。(IR:の部分)

image.png


sendIR.py

import broadlink,pyperclip,netaddr,time,binascii,json,sys

cmd={"IR": "260002017438110c0f0d1029102a100c102a100c100d100c102a100c100d1029100d1029100d0f2a100d0f0d1029110c100c100d100c100d100c102a0f0d102a0f2a100d0f0d1029100d1029102a1029102a100c100d100009a77438100d100c102a0f2a100d0f28130c0f0d100d0f2a100c100d1029100d1029100d1029100d100c102a0f0d100d0f0d100d0f0d100c1028120c102a1029100d100c102a100c102a0f2a102a0f2a100d0f0d100009a67737100c100c11291128110c1128100d110b110c1128110c100c1129110b1129100c1128110c110c1029110b110c110c100c110c100c1128110c11281129110b110c1128110b1129112811291128120b110c10000d05000000000000", "name": "OnTv", "lb": "ontv"}
net={'type': 'RM2', 'ip': '192.168.1.102', 'port': 80, 'mac': '78-0f-77-1a-31-a0', 'timeout': 10}
RM3= broadlink.rm((net["ip"], net["port"]),netaddr.EUI(net["mac"]),net["timeout"])
RM3.auth()
RM3.send_data(bytearray.fromhex(cmd['IR']))

どうでしょう簡単に制御できました。


気に入ったら「いいね」してね。