<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Siri | ウダ2Blog</title>
	<atom:link href="https://uda2.com/blog/tag/siri/feed/" rel="self" type="application/rss+xml" />
	<link>https://uda2.com/blog</link>
	<description>大阪でフリーランスとしてWEB制作している管理人が気になった技術をメモったり、作ったツールの紹介などを綴っているブログです。</description>
	<lastBuildDate>Thu, 16 Nov 2023 04:21:12 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>Raspberry Piで先取りHomekit 新</title>
		<link>https://uda2.com/blog/homekitre/</link>
					<comments>https://uda2.com/blog/homekitre/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Thu, 16 Nov 2023 04:21:12 +0000</pubDate>
				<category><![CDATA[制作日記]]></category>
		<category><![CDATA[Homekit]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Siri]]></category>
		<guid isPermaLink="false">https://uda2.com/blog/?p=2739</guid>

					<description><![CDATA[<p>先日ウチのホームサーバー（Raspberrypi4）にnode.jsを新しいバージョンすると反応しなくなる問題を解決すべく半日試行錯誤したあげくaptが動かなくなってしまい、仕方なくOSの再インストールする事となりました</p>
The post <a href="https://uda2.com/blog/homekitre/">Raspberry Piで先取りHomekit 新</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>先日ウチのホームサーバー（Raspberrypi4）にnode.jsを新しいバージョンすると反応しなくなる問題を解決すべく半日試行錯誤したあげくaptが動かなくなってしまい、仕方なくOSの再インストールする事となりました。<br>Raspbianはwheezy（7）からbullseye（11）までは順繰り使ってたけど、ホームサーバーにはbuster（10）を入れてたので最新のBookworm（12）にすると二世代違うので各所で色々と違いがあり手こずりました。以前投稿した<a href="https://uda2.com/blog/homekitxx/" target="_blank" rel="noreferrer noopener">Raspberry Piで先取りHomekit 追記</a>のスクリプトも使えなくなったので修正していきます。</p>



<span id="more-2739"></span>



<p>Pythonは未だにあまり触って無いので下のようにChatGPTに投げたら修正したコードを返してくれました。<br>「<strong>下記のコードをpython3でも動作するように修正して下さい。</strong>」<br>厳密には全ての問題点を修正はしてくれなかったので直ってはないのですが同様に変更点を全て反映すると直すと動作しました。<br>色々修正してくれたのですが動作しない問題は「主な変更点」としてChatGPTが書いてくれた「<strong>ir_serial.write の引数を bytes オブジェクトに変更しました。</strong>」が原因でした。<br>具体的には<br>「<strong>ir_serial.write(&#8220;I,1\r\n&#8221;)</strong>」を「<strong>ir_serial.write(b&#8221;I,1\r\n&#8221;)</strong>」にしたり<br>「<strong>ir_serial.write(&#8220;n,%d\r\n&#8221; % recNumber)</strong>」を「<strong>ir_serial.write((&#8220;n,%d\r\n&#8221; % recNumber).encode())</strong>」<br>にする感じで修正漏れを埋めると動作しましたので再掲載させて頂きます。</p>



<p><strong>$ vi ~/.homebridge/data/irm.py</strong></p>



<pre class="wp-block-code"><code># -*- 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(b"c\r\n")
  time.sleep(3.0)
  msg = ir_serial.readline().decode()
  print(msg)
  if path and not 'Time Out' in msg:
    saveIR(path, ir_serial)
  ir_serial.close()

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&#91;'data'])
    rawX = data&#91;'data']

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

    postScale = data&#91;'postscale']
    ir_serial.write(("k,%d\r\n" % postScale).encode())
    #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).encode())

        ir_serial.write(("w,%d,%d\n\r" % (pos, rawX&#91;n])).encode())

    ir_serial.write(b"p\r\n")
    msg = ir_serial.readline().decode()
    print(msg)
    #ir_serial.close()
  else:
    print("Playing IR...")
    ir_serial.write(b"p\r\n")
    time.sleep(1.0)
    msg = ir_serial.readline().decode()
    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 = &#91;]
  ir_serial.write(b"I,1\r\n")
  time.sleep(1.0)
  recNumberStr = ir_serial.readline()
  recNumber = int(recNumberStr, 16).decode()

  ir_serial.write(b"I,6\r\n")
  time.sleep(1.0)
  postScaleStr = ir_serial.readline().decode()
  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).encode())

      ir_serial.write(("d,%d\n\r" % pos).encode())
      xStr = ir_serial.read(3).decode()
      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()</code></pre>



<p>詳しい設置方法は下記をご覧下さい。</p>



<ul class="wp-block-list">
<li><a href="https://uda2.com/blog/homekit1/">Raspberry Piで先取りHomekit Vol.1</a></li>



<li><a href="https://uda2.com/blog/homekit2/">Raspberry Piで先取りHomekit Vol.2</a></li>



<li><a href="https://uda2.com/blog/homekit3/">Raspberry Piで先取りHomekit Vol.3</a></li>



<li><a href="https://uda2.com/blog/homekitxx/">Raspberry Piで先取りHomekit 追記</a></li>
</ul>



<p>　</p>The post <a href="https://uda2.com/blog/homekitre/">Raspberry Piで先取りHomekit 新</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/homekitre/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Piで先取りHomekit 追記</title>
		<link>https://uda2.com/blog/homekitxx/</link>
					<comments>https://uda2.com/blog/homekitxx/#respond</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Sun, 25 Sep 2016 06:15:35 +0000</pubDate>
				<category><![CDATA[うだうだ]]></category>
		<category><![CDATA[Homekit]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Siri]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=2073</guid>

					<description><![CDATA[<p>これで終わりと思いきやHomeKitには「シーン」という一言で各リモコンを一括操作できる機能があり、試しに「おはよう」というシーンを作成し電気（照明）と冷房を一括操作させてみた。（アプリ「ホーム」の右上の（＋）から「シー</p>
The post <a href="https://uda2.com/blog/homekitxx/">Raspberry Piで先取りHomekit 追記</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>これで終わりと思いきやHomeKitには「シーン」という一言で各リモコンを一括操作できる機能があり、試しに「おはよう」というシーンを作成し電気（照明）と冷房を一括操作させてみた。（アプリ「ホーム」の右上の（＋）から「シーンを追加」で追加出来ます。）<br />
予定ではおはようと言うと電気と冷房が付く予定だったが、どちらか片方しか実行できなかった。<br />
おそらく原因は同時に複数の機器に命令してるのでirMagicianが捌ききれないようなので、うまくタイミングをずらせば解決しそう。<br />
アプリ側でディレイ（遅延）を設定できなさそうだし、homebridgeにもディレイの機能は無さそうなので、netbuffaloさんのPythonスクリプト<a href="http://netbuffalo.doorblog.jp/archives/4872290.html" target="_blank">irm.py</a>を弄ってタイミングをずらすことにした。<br />
<span id="more-2073"></span><br />
<strong>$ vi ~/.homebridge/data/irm.py</strong></p>
<pre><code># -*- 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()</code></pre>
<p>※とりあえず動いてますがpython詳しくないので間違ってたらコメントください。</p>
<p>それに合わせてconfig.jsonを編集。<br />
<strong>$ vi ~/.homebridge/config.json</strong><br />
「-d 秒数」を書き加えられた機器は任意の秒数が経過後に実行されるようになります。</p>
<pre><code>python ~/.homebridge/data/irm.py -p -f ~/.homebridge/data/DLC303V-ON.json</code></pre>
<p>↓</p>
<pre><code>python ~/.homebridge/data/irm.py -p -d 1 -f ~/.homebridge/data/DLC303V-ON.json</code></pre>
<p>後は前回通りコンフィグファイルをコピーしてhomebridgeを再起動して「ホーム」のアクセサリを登録し直すと反映されます。<br />
<strong>$ cp ~/.homebridge/config.json /var/homebridge/</strong><br />
<strong>$ rm -R /var/homebridge/persist/</strong><br />
<strong>$ sudo systemctl restart homebridge</strong><br />
予想通りタイミングをずらすと「おはよう」で一括操作できるようになりました。</p>
<p><del datetime="2016-11-16T09:03:56+00:00">siriにはクセが強く指示しても上手く動かない時があります、例えば「電気切って」はOKだけど「テレビ切って」は無理なので「テレビをオフ」と言い換える必要があったり、「おやすみ」というと元々siriに付いてるお休みモードに変更する機能が優先されるので「おやすみなさい」と言い換える必要があります。（「おやすみ」と登録してるのに「おやすみなさい」と言わないと実行してくれない何様仕様）</del><br />
翌月には改善され「テレビ切って」や「おやすみ」で実行してくれるようになりましたが、「テレビつけて」が効かないので「テレビをオン」と言い換える必要があります。</p>
<p><img fetchpriority="high" decoding="async" src="http://uda2.com/blog/wp-content/uploads/2016-09-24-23.01.jpg" alt="" width="240" height="220" class="alignleft size-full wp-image-2096" />最後に裸で置くのも危険なのでケースを用意した。定番のフリスクケースも考えたが角度の調整が難しそうなので100円ショップで入りそうなものを物色したところハロウィンの置物が丁度いいサイズと角度だったので内臓（LED照明）を取り出し後ろにドリルでUSBケーブルを通す穴を空けてirMagicianを繋いだ。特に固定はしていない。</p>The post <a href="https://uda2.com/blog/homekitxx/">Raspberry Piで先取りHomekit 追記</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/homekitxx/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Piで先取りHomekit Vol.3</title>
		<link>https://uda2.com/blog/homekit3/</link>
					<comments>https://uda2.com/blog/homekit3/#comments</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Fri, 23 Sep 2016 23:16:22 +0000</pubDate>
				<category><![CDATA[うだうだ]]></category>
		<category><![CDATA[Homekit]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Siri]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=2072</guid>

					<description><![CDATA[<p>前回までに、iPhoneのsiriで命令した事をRaspberry Piのhomebridgeを使って赤外線リモコン経由（irMagician）し家電を操作と一通り出来ましたが。 毎回コンソールを立ち上げhomebrid</p>
The post <a href="https://uda2.com/blog/homekit3/">Raspberry Piで先取りHomekit Vol.3</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>前回までに、iPhoneのsiriで命令した事をRaspberry Piのhomebridgeを使って赤外線リモコン経由（irMagician）し家電を操作と一通り出来ましたが。<br />
毎回コンソールを立ち上げhomebridgeを起動するのは間抜けなので、今回はhomebridgeをバックグラウンドで自動起動するようにします。<br />
<span id="more-2072"></span><br />
やり方は前回も参考にした<a href="https://github.com/nfarina/homebridge/wiki/Running-HomeBridge-on-a-Raspberry-Pi" target="_blank">Running HomeBridge on a Raspberry Pi</a>の「Running Homebridge on Bootup (systemd)」に書かれています。<br />
説明ではhomebridgeを操作するだけのユーザーhomebridgeを作るとなってますが、色々と煩わしいのでログインしてるユーザーを使う事にします。ここではログインしてるユーザー名を<strong>hoge</strong>としておきます。</p>
<p>まずは/var/homebridgeのフォルダを作って設定ファイルを移動します。<br />
<strong>$ sudo mkdir /var/homebridge</strong><br />
<strong>$ sudo chown hoge:hoge /var/homebridge/</strong><br />
<strong>$ cp ~/.homebridge/config.json /var/homebridge/</strong><br />
<strong>$ sudo chown -R hoge:hoge /var/homebridge</strong></p>
<p>次にバックグラウンド起動時に先程移動した設定ファイルを読むようにします。<br />
<strong>$ sudo vi /etc/default/homebridge</strong><br />
<strong>HOMEBRIDGE_OPTS=-U /var/homebridge</strong></p>
<p>そしてバックグラウンド起動の設定ファイルも作成します。<br />
Userの値は各自書き換えてください。<br />
<strong>$ sudo vi /etc/systemd/system/homebridge.service</strong></p>
<pre><code>[Unit]
Description=Node.js HomeKit Server
After=syslog.target network-online.target

[Service]
Type=simple
User=hoge
EnvironmentFile=/etc/default/homebridge
ExecStart=/usr/local/bin/homebridge $HOMEBRIDGE_OPTS
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target</code></pre>
<p><strong>$ sudo systemctl daemon-reload</strong><br />
<strong>$ sudo systemctl enable homebridge</strong><br />
<strong>$ sudo systemctl start homebridge</strong></p>
<p>これで自動起動は完了しました。</p>
<p>なお、説明によると設定が反映しない場合は「persist」フォルダを削除してhomebridgeを再起動すると良いらしいです。<br />
<strong>$ rm -R /var/homebridge/persist/</strong><br />
<strong>$ sudo systemctl restart homebridge</strong></p>
<p>iPhoneで確認すると一見正常に動作してるように見えたのですが、数分するとアクセス出来なくなりました。<br />
再起動するとしばらく動いてるのですが再び反応しなくなります。</p>
<p>ログ確認を確認するも特に以上は見られません。<br />
<strong>$ sudo journalctl -u homebridge</strong></p>
<p>約一日作業で原因を調査したところポートを塞いでたのが原因と分りました。指定されたポート51826は空けてたので十分と思い込んでいたですが、システムログを見るとiPhoneから5353というポートにもアクセスを試みてる事が分った。<br />
<strong>$ tail /var/log/syslog</strong><br />
ポート番号5353を調べてみるとBonjourのポートらしくLinux用の代替ソフト（avahi）もインストールもされてるようだ<br />
<strong>$ avahi-daemon -v</strong><br />
念の為動作してるか見てみたがソフトの方はちゃんと起動もしてるようだ。<br />
<strong>$ service &#8211;status-all</strong><br />
という事はポートが閉じてるので動作してないだけだろうとポートを空けてみると継続的にアクセス出来る様になりました。</p>
<p><a href="http://uda2.com/blog/homekitxx/">Raspberry Piで先取りHomekit 追記</a>に続く</p>The post <a href="https://uda2.com/blog/homekit3/">Raspberry Piで先取りHomekit Vol.3</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/homekit3/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Piで先取りHomekit Vol.2</title>
		<link>https://uda2.com/blog/homekit2/</link>
					<comments>https://uda2.com/blog/homekit2/#comments</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Fri, 23 Sep 2016 00:18:32 +0000</pubDate>
				<category><![CDATA[うだうだ]]></category>
		<category><![CDATA[Homekit]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Siri]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=2071</guid>

					<description><![CDATA[<p>前回、Raspberry Piから赤外線リモコン経由（irMagician）して家電の操作ができましたが今回はHomokitに対応させるためHomeBridgeをインストールしていきます。 HomeBridgeのインスト</p>
The post <a href="https://uda2.com/blog/homekit2/">Raspberry Piで先取りHomekit Vol.2</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>前回、Raspberry Piから赤外線リモコン経由（irMagician）して家電の操作ができましたが今回はHomokitに対応させるため<a href="https://github.com/nfarina/homebridge" target="_blank">HomeBridge</a>をインストールしていきます。<br />
<span id="more-2071"></span><br />
HomeBridgeのインストール方法は<a href="https://github.com/nfarina/homebridge/wiki/Running-HomeBridge-on-a-Raspberry-Pi" target="_blank">Running HomeBridge on a Raspberry Pi</a>にRaspberry Pi専用の解説があるので指示通りすすめていきます。<br />
まずは念の為アップデート<br />
<strong>$ sudo apt-get update</strong><br />
<strong>$ sudo apt-get upgrade</strong></p>
<p>次にgitをインストール（makeは既にあったので飛ばしました）<br />
<strong>$ sudo apt-get install git</strong><br />
（私の環境はJessieなのでC++の項目も飛ばします）</p>
<p>HomeBridgeはnode.jsで作られてるのでまずはRaspberry PiにNode.jsの環境をインストール。（armv7lはRaspberry Pi2の場合です）<br />
<strong>$ wget https://nodejs.org/dist/v4.0.0/node-v4.0.0-linux-armv7l.tar.gz</strong><br />
<strong>$ tar -xvf node-v4.0.0-linux-armv7l.tar.gz</strong><br />
<strong>$ cd node-v4.0.0-linux-armv7l</strong><br />
<strong>$ sudo cp -R * /usr/local/</strong><br />
<strong>$ node -v</strong><br />
<strong>$ npm -v</strong><br />
<strong>$ cd ~</strong><br />
<strong>$ rm -R node-v4.0.0-linux-armv7l</strong><br />
<strong>$ rm node-v4.0.0-linux-armv7l.tar.gz</strong><br />
4.0.0と記述を見つけて「4.0.0をインストールしなきゃ」と思い込んでましたが、よく読むと新しいバージョンでもよさそうなのでnode.jsをアップデートすることにした。<br />
（こんな事なら普通にapt-getからインストールした方が良かった・・・）<br />
まずはnode.js自身のパッケージ管理をするn packageをインストール<br />
<strong>$ sudo npm install n -g</strong><br />
最新版に更新（今回latest：最新版とstable：安定版は同じでした）<br />
<strong>$ sudo n latest</strong><br />
npm（Node.js製パッケージマネージャ）をアップデート<br />
<strong>$ sudo npm cache clean -f</strong><br />
<strong>$ sudo npm update -g npm</strong></p>
<p>avahiのライブラリとscreenをインストール<br />
<strong>$ sudo apt-get install libavahi-compat-libdnssd-dev screen</strong></p>
<p>準備は整ったのでようやくHomebridgeのインストール（インストールは割と時間がかかります。）<br />
<strong>$ sudo npm install -g homebridge</strong><br />
続いてHomebridgeからコマンドを実行する為のプラグインをインストール。<br />
（コマンド実行以外にも<a href="https://www.npmjs.com/browse/keyword/homebridge-plugin" target="_blank">npm</a>に多数のプラグインが用意されています。）<br />
<strong>$ sudo npm install -g homebridge-cmd</strong></p>
<p>起動してみると設定していないので色々怒られるのでCtr+Cで終了させる。<br />
<strong>$ homebridge</strong><br />
すると関連ファイル（.homebridgeフォルダ）が作られる。<br />
昨日作った「DLC303V-ON.json」と「DLC303V-OFF.json」とnetbuffaloさんの「irm.py」をdataフォルダに直す。<br />
<strong>$ mkdir ~/.homebridge/data</strong><br />
<strong>$ mv ~/DLC303V-ON.json ~/.homebridge/data</strong><br />
<strong>$ mv ~/DLC303V-OFF.json ~/.homebridge/data</strong><br />
<strong>$ mv ~/irm.py ~/.homebridge/data</strong><br />
自動生成されたconfig.jsonを編集する。<br />
<strong>$ vi ~/.homebridge/config.json</strong></p>
<pre><code>{
    "bridge": {
        "name": "Homebridge",
        "username": "CC:22:3D:E3:CE:30",
        "port": 51826,
        "pin": "031-45-154"
    },
    "description": "irMagcian Control",
    "platforms": [],
    "accessories": [
        {
            "accessory": "CMD",
            "name": "電気",
            "on_cmd": "python ~/.homebridge/data/irm.py -p -f ~/.homebridge/data/DLC303V-ON.json",
            "off_cmd": "python ~/.homebridge/data/irm.py -p -f ~/.homebridge/data/DLC303V-OFF.json"
        }
    ]
}</pre>
<p></code>（ポート51826とあるのでiptablesでフィルタリングしてる場合は許可する必要があります。）<br />
そして再度homebridgeを起動する。<br />
<strong>$ homebridge</strong><br />
「WARNING」というメッセージがいくつか出て不安になるが公式によると気にする事は無いらしい。<br />
あとはiPhoneのアプリ「ホーム」を起動して「アクセサリを追加」から追加し、スイッチをタップしてON/OFFしてみる。<br />
アプリから操作できることを確認したら次は<strong>「Hey Siri」</strong>と言ってsiriを立ち上げ<strong>「電気をつけて」</strong>と言うと電気が付いて<strong>「電気を消して」</strong>というと電気が消えた。<br />
ｷﾀ━━━━ヽ(ﾟ∀ﾟ )ﾉ━━━━!!!!<br />
未来を体験してる気分です。<br />
なお、config.jsonを変更するだけでは反映されず。config.jsonの「username」の値を変更し別の機器として「ホーム」に改めて追加する必要があります。（nameも変えた方が新旧分りやすいです。）</p>
<p><a href="http://uda2.com/blog/homekit3/">Raspberry Piで先取りHomekit Vol.3</a>に続く</p>The post <a href="https://uda2.com/blog/homekit2/">Raspberry Piで先取りHomekit Vol.2</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/homekit2/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Raspberry Piで先取りHomekit Vol.1</title>
		<link>https://uda2.com/blog/homekit1/</link>
					<comments>https://uda2.com/blog/homekit1/#comments</comments>
		
		<dc:creator><![CDATA[uda2]]></dc:creator>
		<pubDate>Thu, 22 Sep 2016 07:47:33 +0000</pubDate>
				<category><![CDATA[うだうだ]]></category>
		<category><![CDATA[Homekit]]></category>
		<category><![CDATA[Raspberry Pi]]></category>
		<category><![CDATA[Siri]]></category>
		<guid isPermaLink="false">http://uda2.com/blog/?p=2062</guid>

					<description><![CDATA[<p>先日のiOSのアップデートで「ホーム」というアプリが追加されました。 このアプリは一昨年ぐらいからアップルが進めてるスマートホームの規格HomeKit用のアプリでsiri経由でエアコンや照明など家電を操作する事ができます</p>
The post <a href="https://uda2.com/blog/homekit1/">Raspberry Piで先取りHomekit Vol.1</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></description>
										<content:encoded><![CDATA[<p>先日のiOSのアップデートで<strong>「ホーム」</strong>というアプリが追加されました。<br />
このアプリは一昨年ぐらいからアップルが進めてるスマートホームの規格HomeKit用のアプリでsiri経由でエアコンや照明など家電を操作する事ができます。<a href="http://www.apple.com/jp/shop/iphone/iphone-accessories/home-automation?page=1&amp;fh=458c%2B4559#!&amp;" target="_blank">対応商品が殆ど無く</a>話題に上る事も少なかったのですが、今回のアプリの強制追加で流行るかもしれません。（Passbookの時は鳴かず飛ばずでしたが・・・）<br />
数年前に<a href="http://netakiri.net/diary/archives/486.html" target="_blank">ルームリモコン Kotoshiro</a>の存在知ってから声で家電を動かしたいという野望を抱いていた私は対応機器が少ない現状でも出来ないか調べてみると赤外線モジュールをRaspberry Piにくっつけてhomebridgeとやらを使いHomeKit的な事を実現してる方を見かけたので試してみました。<br />
<span id="more-2062"></span><br />
Raspberry Piは以前購入していたRaspberry Pi 2 Model B（5,184円）のがあるので赤外線モジュールを探した。人気なのは<a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00H91KK26/bekopannews-22/ref=nosim" target="_blank">IRKit</a>で7,700円程でWifi経由で指示を出す赤外線リモコンだが売り切れだったので他を探すことにした。<br />
ビットトレードワンのUSB接続<a href="https://www.amazon.co.jp/exec/obidos/ASIN/B00AXVHQLC/bekopannews-22/ref=nosim" target="_blank">赤外線リモコンKIT</a>は2,551円と安いけど距離が短く設置が困難で上位機種の<a href="https://www.amazon.co.jp/exec/obidos/ASIN/B013JG0WSG/bekopannews-22/ref=nosim" target="_blank">赤外線リモコンアドバンス</a>は3,974円でLEDが3つも付いていい感じだがLinuxでの作例が少ない。<br />
そこで作例もいくつかあり赤外線も2～3mと及第点な<a href="http://www.omiya-giken.com/?page_id=837" target="_blank">irMagician</a>（3,980円）を試す事にした。</p>
<p>netbuffaloさんの<a href="http://netbuffalo.doorblog.jp/archives/4872290.html" target="_blank">小型赤外線（IR）リモコン irMagician ファースト・インプレッション</a>によると、接続する前に/boot/cmdline.txtから「console=serial0,115200」を除外する必要があるらしい。<br />
知らずに接続してしまったのですが直ぐに<br />
<strong>$ sudo vi /boot/cmdline.txt</strong><br />
として「console=serial0,115200」を削除し編集して再起動した。（/etc/inittabは無かったのスルー）<br />
おそるおそる確認してみたが問題無くデバイスが見つかった。<br />
<strong>$ ls /dev/ttyACM*</strong><br />
その後もnetbuffaloさんの書かれてる通りpyserialライブラリとやらをインストール。<br />
pyserialライブラリはPythonのライブラリでPIP（Python製パッケージマネージャ）が無かったのでまずはPIPをインストール<br />
<strong>$ sudo apt-get install python-pip</strong><br />
続いてPIPでpyserialライブラリをインストール<br />
<strong>$ sudo pip install pyserial</strong><br />
スクリプトもnetbuffaloさんのirm.pyをお借りしてコピペで配置し<br />
<strong>$ vi irm.py</strong></p>
<p>コマンドを実行し直ぐに照明のリモコン操作する。（失敗してもまた同じコマンドでやり直せばOK）<br />
<strong>$ python irm.py -c</strong><br />
記憶してるリモコン操作を再生する。<br />
<strong>$ python irm.py -p</strong><br />
全く問題無く動作した。</p>
<p>そしてそのリモコンの情報をJSONファイルに保存し<br />
<strong>$ python irm.py -s -f DLC303V-ON.json</strong><br />
JSONファイルから実行<br />
<strong>$ python irm.py -p -f DLC303V-ON.json</strong><br />
こちらも全く問題無く動作した。</p>
<p>今回試したのはエアコン（AYS28YSC）、照明（DLC303V）、テレビ（LC32F5）でいずれも問題ありませんでした。</p>
<p><a href="http://uda2.com/blog/homekit2/">Raspberry Piで先取りHomekit Vol.2</a>に続く</p>The post <a href="https://uda2.com/blog/homekit1/">Raspberry Piで先取りHomekit Vol.1</a> first appeared on <a href="https://uda2.com/blog">ウダ2Blog</a>.]]></content:encoded>
					
					<wfw:commentRss>https://uda2.com/blog/homekit1/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
