赤外線リモコンデータの変換

最終更新時間:2018年04月04日 16時05分47秒

 こちらで紹介されている格安スマートリモコンを作ってみた。半田付けに手こずったが、久々の電子工作はとても楽しかった。
 肝心の使い勝手だが、なぜか照明はダメだったが、テレビやエアコンはうまく学習、制御することができた。
 この学習がなかなか面倒。コンソールから学習のコマンドを実行後、格安スマートリモコンに向けて、学習したいリモコンの登録したいボタンをプッシュ、という作業を行うわけだが、例えばテレビのリモコンを登録しようとすると、ボタンの数だけ、何十回もこの作業を繰り返すことになる。
 どうにか一括して登録作業を行うことができないものかと、ネットを検索していると、以下のビットトレードワンのサイトで、自社の学習リモコンADRSIR向けとして、22社、265の機器のリモコンのコードが記されたCSVファイルが公開されているのを見つけた。

 ラッキー!これを登録すればいいじゃん!と喜んだのもつかの間、CSVファイルの内容は見たことがないものだった。

 同じ東芝のテレビのリモコンのコードで、両者を比較してみる。
 格安スマートリモコンで用いているpigpioのサイトで公開されている、リモコンコードの学習・再生プログラムirrp.pyで保存されるのは以下のようなもの。

"tv:on": [8950, 4440, 585, 529, 585, 529, 585, 529, 585, 529, 585, 529, 585, 529, 585, 1636, 585, 529, 585, 1636, 585, 1636, 585, 1636, 585, 1636, 585, 1636, 585, 1636, 585, 529, 585, 1636, 585, 529, 585, 1636, 585, 529, 585, 529, 585, 1636, 585, 529, 585, 529, 585, 529, 585, 1636, 585, 529, 585, 1636, 585, 1636, 585, 529, 705, 1636, 585, 1636, 585, 1636, 585, 39828, 8950, 2210, 585, 95511, 8950, 2210, 585],

 これに対して、ビットトレードワンで公開されているCSVファイルの内容は以下のようなもの。

"東芝","デジタルテレビ1","電源","5601A900180015001800140018001400190013001900140019001400170040001700150018003F0019003E0018003E0019003F0019003E00170040001800140019003E001800150018003F00180014001800140019003F0018001400170016001700150018003F001800140018003F0018003F001800140019003F0018003F0018003E0019004F03"

 なにこれ!全然違う!

 上記CSVファイルと同じビットトレードワンのサイトで公開されている、ADRSIR用のソフトウェアをいじくっていて、どうやら両者は以下のようなものであることに気づいた。

irrp.pyは、ONとOFFの期間の時間(μs)
「"tv:on": [8950, 4440, 585, 529,...」の場合、最初の「8950」は「ONが8950μS(約9ms)」、次の「4440」は「OFFが4440μS(約4.4ms)」という意味。これは、東芝のテレビが用いている赤外線リモコンのフォーマットであるNEC方式のリーダーコード、ONが9ms、OFFが4.5msにほぼ合致する。
CSVファイルは、ONとOFFの期間のパルスの数
「5601 A900 1800 1500 ...」の場合、最初の「5601」は「0156h」、十進数で「342」で「ONが342」、次の「A900」は「00A9h」、十進数で「169」で「OFFが169」という意味。多くのリモコンの赤外線信号は38kHzで変調されているため、1つのパルスの時間は1/38000=0.000026315秒、約26μsになる。これに最初の値「342」をかけると、342x26=8892、となり、これは、irrp.pyの例の最初の値「8950」とほぼ同じになる。同様に、次の値「169」に26をかけると、169x26=4394、となり、これもirrp.pyの例の二番目の値「4440」とほぼ同じ。
 どうやら、irrp.py=時間、CSVファイル=パルス数、で間違いないようだ。

 そこで、ビットワントレードのADRSIR用ソフトを元に、CSVファイルのデータ(パルス数)を、irrp.py用のデータ(時間)に変換するプログラムを作ってみた。と言っても、バイトオーダーを変えて、26をかけているだけ。
 

#!/usr/bin/python3
#coding: utf-8

#convIrData.py

import sys
import json

def conv_command(command, block):
    str_tmp = ""
    int_tmp = []
    for i in range(int(len(block)/2)):
        str_tmp = block[i*2] + block[i*2+1]
        int_tmp.append( int(str_tmp, 16))

    list = []
    ir_data = {}
    data_numH = 0;
    data_numL = 0;
    for i in range(int(len(int_tmp)/4)):
         data_numH = (int_tmp[i*4+1] * 256 + int_tmp[i*4+0]) * 26
         data_numL = (int_tmp[i*4+3] * 256 + int_tmp[i*4+2]) * 26
         list.append(data_numH)
         list.append(data_numL)

    ir_data[command] = list

    return ir_data

    
while True:
    argvc = sys.argv
    argc = len(argvc)
           
    if  (argc  == 2):
        filename = sys.argv[1]
        f = open(filename, 'r', encoding='utf-8')
        ir_data = {}
        for line in f:
            [command, block] = line.replace("\"","").split(",")
            ir_data.update(conv_command(command, block))

        print(json.dumps(ir_data,sort_keys=True).replace("],","],\n"))
        break   

    if  (argc  == 3):
        command = sys.argv[1]
        block = sys.argv[2]

        ir_data = conv_command(command, block)
        print(json.dumps(ir_data))
        break   

    print("Usage:")
    print(" python3 convIrData.py filename")
    print(" python3 convIrData.py command \"5B0018002E001800...\"")
    break

 使い方は「./convIrData.py filename」とファイル名を与える。ファイルの中身は以下のようにする。

"tv:on","5B0018002E001800..." 
"tv:off","5C0017002F001700..." 

 もしくは「./convIrData.py tv:on 5B0018002E001800...」という風に、コマンド名とCSVファイル記載のバイト列を与える。

 変換後のデータで、テレビやエアコンの制御ができることを確認した。
 東芝のテレビのデータの一括登録に成功し、格安スマートリモコンが快適に使えるようになった。
 エアコンについては、残念ながらCSVファイルに使い勝手のいいコマンドがないため、登録していない。