skip to content
barorin&?

ADRSIRでNECのLEDシーリングライトを操作する

/ 3 min read

はじめに

BitTradeOne の ADRSIR を購入したので、色々とリモコンを記憶させて遊んでいます。
ソニーの TV やパナソニックのエアコンはうまく行ったのですが、NEC の LED シーリングライトはなぜかそのままでは動いてくれませんでした。

そこで色々とググってみると、どうやら ADRSIR の周波数 38khz が原因だったようで、これよりも小さい周波数でサンプリングしないとだめみたいです。
というわけで、任意の周波数に変換するプログラムを書いてみました。(といっても 38000 で割り戻して任意の周波数をかけただけ)
これで良いのかわかりませんが、私の機種だと 37.0khz ~ 37.2khz ぐらいに変換すると動作しました。それでも何故か全灯ボタンは数回に一回しか成功しないので、5 回くらい連続で命令することでカバーしています。

方法

import math

def split\_string(string, n):
  """n桁ずつ区切ったリストを作成する"""
  lst = [string[i: i+n] for i in range(0, len(string), n)]
  return lst

def right(string, n):
  """右からn文字取り出す"""
  return string[-n:]

def left(string, n):
  """左からn文字取り出す"""
  return string[:n]

def convert\_hz(code, hz):
  """
  Args:
  code(str): 変換したいコード
  hz(int): 変換したい周波数
  Return:
  converted\_code(str): 周波数変換後のコード
  """
  lst = split_string(code, 4) # 4桁ずつに区切る

  new_lst = []
  for l in lst:
    tmp = right(l, 2) + left(l, 2) # リトルエンディアンの戻し
    tmp = int(tmp, 16) # 16進数を10進数に変換
    tmp = math.floor(tmp / 38000 * hz) # 周波数の変換(少数点以下切捨て)
    tmp = format(tmp, 'X') # 10進数を16進数に戻す
    tmp = tmp.zfill(4) # 4桁にゼロパディング
    tmp = right(tmp, 2) + left(tmp, 2) # リトルエンディアン
    new_lst.append(tmp)

  converted_code = ''.join(new_lst)
  return converted_code

使い方

# ADRSIRでサンプリングしたコード
code = '123456789ABCDEF'

res = convert_hz(code, 37000) # 37khzに変換した結果を出力
# output: 'B3322B75A3B78EE9'