Raspberry Piで先取りHomekit 追記

これで終わりと思いきやHomeKitには「シーン」という一言で各リモコンを一括操作できる機能があり、試しに「おはよう」というシーンを作成し電気(照明)と冷房を一括操作させてみた。(アプリ「ホーム」の右上の(+)から「シーンを追加」で追加出来ます。)
予定ではおはようと言うと電気と冷房が付く予定だったが、どちらか片方しか実行できなかった。
おそらく原因は同時に複数の機器に命令してるのでirMagicianが捌ききれないようなので、うまくタイミングをずらせば解決しそう。
アプリ側でディレイ(遅延)を設定できなさそうだし、homebridgeにもディレイの機能は無さそうなので、netbuffaloさんのPythonスクリプトirm.pyを弄ってタイミングをずらすことにした。

$ vi ~/.homebridge/data/irm.py

# -*- coding: utf-8 -*-

import sys
import serial
import time
import json
import argparse
import os

here = os.path.abspath(os.path.dirname(__file__))
#ir_serial = serial.Serial("/dev/ttyACM0", 9600, timeout = 1)
#ir_serial = serial.Serial("/dev/tty.usbmodem01231", 9600, timeout = 1)

def captureIR(path):
  ir_serial = serial.Serial("/dev/ttyACM0", 9600, timeout = 1)
  print "Capturing IR..."
  ir_serial.write("c\r\n")
  time.sleep(3.0)
  msg = ir_serial.readline()
  print msg
  if path and not 'Time Out' in msg:
    saveIR(path)

def playIR(path,delay):
  time.sleep(delay)
  ir_serial = serial.Serial("/dev/ttyACM0", 9600, timeout = 1)
  if path and os.path.isfile(path):
    print ("Playing IR with %s ..." % path)
    f = open(path)
    data = json.load(f) 
    f.close()
    recNumber = len(data['data'])
    rawX = data['data']

    ir_serial.write("n,%d\r\n" % recNumber)
    ir_serial.readline()

    postScale = data['postscale']
    ir_serial.write("k,%d\r\n" % postScale)
    #time.sleep(1.0)
    msg = ir_serial.readline()
    #print msg
    
    for n in range(recNumber):
        bank = n / 64
        pos = n % 64
        if (pos == 0):
          ir_serial.write("b,%d\r\n" % bank)
    
        ir_serial.write("w,%d,%d\n\r" % (pos, rawX[n]))
    
    ir_serial.write("p\r\n")
    msg = ir_serial.readline()
    print msg
    #ir_serial.close()
  else:
    print "Playing IR..."
    ir_serial.write("p\r\n")
    time.sleep(1.0)
    msg = ir_serial.readline()
    print msg
  ir_serial.close()

def saveIR(path):
  ir_serial = serial.Serial("/dev/ttyACM0", 9600, timeout = 1)
  print ("Saving IR data to %s ..." % path)
  rawX = []
  ir_serial.write("I,1\r\n")
  time.sleep(1.0)
  recNumberStr = ir_serial.readline()
  recNumber = int(recNumberStr, 16)
  
  ir_serial.write("I,6\r\n")
  time.sleep(1.0)
  postScaleStr = ir_serial.readline()
  postScale = int(postScaleStr, 10)
  
  #for n in range(640):
  for n in range(recNumber):
      bank = n / 64
      pos = n % 64
      if (pos == 0):
          ir_serial.write("b,%d\r\n" % bank)
  
      ir_serial.write("d,%d\n\r" % pos)
      xStr = ir_serial.read(3) 
      xData = int(xStr, 16)
      rawX.append(xData)
  
  data = {'format':'raw', 'freq':38, 'data':rawX, 'postscale':postScale}

  f = open(path, 'w')
  json.dump(data, f)
  f.close()
  print "Done !"
  ir_serial.close()

if __name__ == "__main__":
  # parse options
  parser = argparse.ArgumentParser(description='irMagician CLI utility.')
  parser.add_argument('-c', '--capture', action="store_true", dest="cap", help="capture IR data", default=False)
  parser.add_argument('-p', '--play', action="store_true", dest="play", help="play IR data", default=False)
  parser.add_argument('-d', '--delay', dest="delay", help="delay for play", type=float, default=0)
  parser.add_argument('-s', '--save', action="store_true", dest="save", help="save IR data", default=False)
  parser.add_argument('-f', '--file', action="store", dest="file", help="IR data file (json)", default=False)
  
  args = parser.parse_args()

  if args.play:
    playIR(args.file,args.delay)

  if args.save and args.file:
    saveIR(args.file)
  
  if args.cap:
    captureIR(args.file)

  # release resources 
  #ir_serial.close()

※とりあえず動いてますがpython詳しくないので間違ってたらコメントください。

それに合わせてconfig.jsonを編集。
$ vi ~/.homebridge/config.json
「-d 秒数」を書き加えられた機器は任意の秒数が経過後に実行されるようになります。

python ~/.homebridge/data/irm.py -p -f ~/.homebridge/data/DLC303V-ON.json

python ~/.homebridge/data/irm.py -p -d 1 -f ~/.homebridge/data/DLC303V-ON.json

後は前回通りコンフィグファイルをコピーしてhomebridgeを再起動して「ホーム」のアクセサリを登録し直すと反映されます。
$ cp ~/.homebridge/config.json /var/homebridge/
$ rm -R /var/homebridge/persist/
$ sudo systemctl restart homebridge
予想通りタイミングをずらすと「おはよう」で一括操作できるようになりました。

siriにはクセが強く指示しても上手く動かない時があります、例えば「電気切って」はOKだけど「テレビ切って」は無理なので「テレビをオフ」と言い換える必要があったり、「おやすみ」というと元々siriに付いてるお休みモードに変更する機能が優先されるので「おやすみなさい」と言い換える必要があります。(「おやすみ」と登録してるのに「おやすみなさい」と言わないと実行してくれない何様仕様)
翌月には改善され「テレビ切って」や「おやすみ」で実行してくれるようになりましたが、「テレビつけて」が効かないので「テレビをオン」と言い換える必要があります。

最後に裸で置くのも危険なのでケースを用意した。定番のフリスクケースも考えたが角度の調整が難しそうなので100円ショップで入りそうなものを物色したところハロウィンの置物が丁度いいサイズと角度だったので内臓(LED照明)を取り出し後ろにドリルでUSBケーブルを通す穴を空けてirMagicianを繋いだ。特に固定はしていない。

Tags: , ,

トラックバック

コメントを書く