ラベル SiriProxy の投稿を表示しています。 すべての投稿を表示
ラベル SiriProxy の投稿を表示しています。 すべての投稿を表示

2016年2月27日土曜日

HomeBridge改めHAP-nodeJSと接続してsiriで家をコントロール その4

Siriとの会話に疲れてきたので、現状のコードを整理してGitHubに上げました。
とりあえずdemoModeに設定してあるので単独で動いて同じネットワーク上のiPhoneから繋がります。
demoModeではコントロールサーバーにコマンドを投げる所をconsole.logの出力だけ、statusなどを受ける所をダミーデータに置き換えています。

https://github.com/mnakada/HA1HomeBridge.git


動作確認済み環境
 MacBookPro OS-X El Capitan 10.11.3
 RaspberryPi2 RASPBIAN JESSIE LITE kernel 4.1.17
 node.js v4.3.1はnodejs.orgからinstall
 多分v5系でも動くと思います(未確認)。

iPhone側の環境は
 iPhone6S iOS9.3beta4
   (beta3以前の場合、package.sonファイルのhap-nodejsのversion指定を0.2.4にすると動くかもしれません)
 HomeKitアプリはElgato Eve (App Storeでhomekitで検索すると出てきます)

> git clone https://github.com/mnakada/HA1HomeBridge.git
で取得後、
> cd HA1HomeBridge
> nam install
> node .
でHomeKitのBridgeとして起動し、PINを表示します。
あとでこのPINの画面を取り込むのでそのままにしておきます。


iPhoneをWiFi接続にしてElgato Eveを起動
-> アクセサリを追加
-> 自動でホームの名前が入るので適当に修正して右上の次へ
-> アクセサリを選択でHA1HomeBridgeを選択
-> 真ん中のXXX-XX-XXXが囲われているところを選択
-> HomeKitアクセサリを追加のDialogでこのまま追加を選択
-> iPhoneのカメラで先ほどのPINの画面をキャプチャすると自動で接続してくれます。
(もしPINが読み込めないようでしたら、下の方にある手動で登録から登録します)
-> 部屋を選択は後で設定できるので取り敢えず次へ
-> 追加済みのアクセサリで完了
-> ホーム(デフォルトの部屋)を選択するとコントロール画面にたどり着きます。

この状態でアプリからスイッチなどをいじってnode.js側にそれらしいコマンドの表示が出ていれば正常につながっています。

siriで使えるコマンドはclient.uiファイル内でsiriNameのarrayで記述されているものになります。
ここのsiriNameで記述されているものがEveのコントロール画面の項目名として見えていて、siriへの指示はこの項目名に対して指示を出します。
例えば
「玄関の鍵を開けて・閉めて」「風呂のお湯を入れて・止めて」「南側のエアコンを一八度に設定して」「ダウンライトを点けて・消して」「リビングの湿度は?」「寝室の温度は?」
などが動いています。
現状、わかっている問題点は
1.「南側の窓を開けて」は「100%に設定しました」と答えて動くけど「南側の窓を閉めて」も「100%に設定しました」といわれて窓が開いてしまう
シャッター、ブラインドも同様
2.エアコンの温度は設定できるけど、暖房、冷房のモード切替が出来ない、エアコンをoff出来ない
3.「NHKをつけて」はWebの’NHKをつけて’を検索に行ってしまう
と言った感じです。


HomeBridge改めHAP-nodeJSと接続してsiriで家をコントロール その3

コントロールサーバーの動いているRaspberryPi2の上にhomebridgeを動かして、pluginとしてコントロールサーバーと接続しようとしていたのですが、いろいろ実装していく内にhomebridgeの下のレイヤーであるHAP-nodeJSと直接繋ぎこんだ方が良さそうなことがわかってきて繋ぎ方を改めました。
ところが、実装を切り替えて試してみてもEveで初期設定まではうまくいくのですが、接続されたホームの中にAccessoryが何もない状態になってしまいます。
そんなこんなをしている内にHomeBridgeとの接続も同じ状態になってしまい訳がわからなくなってしまいました。
2日ほどわからない状態だったのですが、色々と試している内に最初に試していたdirectoryのイメージを起動するとちゃんと繋がることに気が付きました。
差分を切り分けるために実験していくとHAP-nodeJSのVersionが0.2.4以前ならちゃんと繋がることが分かりました。
どうも0.2.5でHomeKitの最新のプロトコルにupdateされていたようで、自分のiPhoneがiOS9.3beta3だったため繋がらなかったようです。
iOS9.3beta4にupdateして、HAP-nodeJSも0.2.5にしたら無事に繋がるようになりました。
このdebugの過程でdebug情報を色々出していたのですが、何故かAppleTVとの通信をしているlogが残っていました。
AppleのHomeKitのページをよく読むと、うちにある第3世代のAppleTVだとHomeKitの外からのアクセスを中継してくれるようです。
AppleTVのiCloudの設定を再度し直して、LTE回線からiPhoneでEveを起動してみるとちゃんと繋がり、コントロールもできています。
LTE回線経由でもsiriでのコントロールもちゃんとできました。
なかなかいい感じです。

siriとの会話の方は相変わらず実験中で、まだエアコンとシャッター、電動窓、TVはNHKがうまくコントロールできていません。
エアコンは温度設定はできるのですが、暖房、冷房を指定することが出来ません。
エアコンを切ることも出来ていません。
シャッター、電動窓は開くことは出来ても閉じることが出来ません。
「シャッターを開けて」で「100%に設定しました」と言われてシャッターが開きますが、「シャッターを閉めて」でも「100%に設定しました』と言われてしまいます。これはsiriのbugのような気がします。
「NHKをつけて」はNHKをつけてをwebで検索されてしまいます。
もう少し会話の練習が続きそうです。

2016年2月19日金曜日

homebridgeと接続してsiriで家をコントロール その2

homebridgeを使って自宅システムをsiriでコントロール出来るようにするために色々と試しています。
とりあえずざっくりとしたつなぎ込みは出来て、eveというhomekit対応のアプリで接続できるようになりました。

ステータスを取得する方は結構つながってきました。

「リビングの湿度は?」『34%に設定されています』ちょっと日本語が変ですが値は返ってきます。
「寝室の湿度は?」『56%にせっていされています』こちらも日本語がおかしいですが値は返ってきます。
「2階の温度は?」『4.7度から17.6度です』これは全ての温度デバイスの値を読み込んで範囲を回答してます。
「1階の温度は?」->「外の温度は」(文字が勝手に外に置き換わる) -> 自宅周辺の天気予報から温度を答えてくる
「外の気温は?」 -> 同じく自宅周辺の天気予報から回答

制御の方もなんとなく動いてきてます。
「リビングの床暖房をつけて」『デバイスからの応答がありません』eveからは制御できています。
「ダイニングの床暖房をつけて」『デバイスからの応答がありません』こちらもeveからは制御できています。
「風呂のお湯を入れて」-> OK
「冷暖房の自動運転を入れて」-> OK
「テレビを消して」『私には無理です』
「テレビをオフして」->OK
「NHKをつけて」->WebからNHKをつけてに関する情報を表示
「日本テレビをつけて」『よくわかりません』
「Eテレをつけて」->OK
「日テレをつけて」->OK
「TBSをつけて」->OK
「テレビ東京をつけて」->OK
「テレビ朝日をつけて」->OK
「テレ朝をつけて」->OK
「フジテレビをつけて」->OK
「テーブル照明をつけて・消して」->OK
「スポット照明をつけて・消して」->OK
「間接照明をつけて・消して」->OK
「ダウンライトをつけて・消して」->OK
「カウンター照明をつけて・消して」->OK
「南側のエアコンを18度にして」->OK
「南側のエアコンを消して」『デバイスからの応答が有りませんでした』
「西側のエアコンを20度にして」「西川のエアコンを20度にして」(勝手に変換される)『私には出来ません』
「西川のエアコン」も登録するとOK

なかなか難しいです。
『デバイスからの応答が有りません』系は何かプログラムに問題がある気がするのでもう少し検討ですね。
他の勝手に違う単語に置き換えられる系はその単語も登録してしまう作戦で行くことにします。
もう少しSiriとの会話?戦い?は続きそうです。

2016年1月30日土曜日

homebridgeと接続してsiriで家をコントロール

最近homebridgeというopen sourceのHomeKitのブリッジソフトが流行っているようなので、自宅のシステムと仮接続してみました。
とりあえず、まだTVのon/offだけですが動作させることが出来ました。
ただ、siriがどんなコマンドを受け付けてくれてサービスをどう登録するのかがよく判りません。
「テレビをonして」「テレビをoffして」は動きますが「テレビをつけて」はダメでした。
放送局とかを指定したりボリュームをコントロールするには何と言えばいいんですかね?

とりあえず、呼び出される関数の中でhomebridge.hap.Serviceをdumpすることで
     AccessoryInformation: { [Function] super_: [Circular] },
     AirQualitySensor: { [Function] super_: [Circular] },
     BatteryService: { [Function] super_: [Circular] },
     BridgingState: { [Function] super_: [Circular] },
     CarbonDioxideSensor: { [Function] super_: [Circular] },
     CarbonMonoxideSensor: { [Function] super_: [Circular] },
     ContactSensor: { [Function] super_: [Circular] },
     Door: { [Function] super_: [Circular] },
     Fan: { [Function] super_: [Circular] },
     GarageDoorOpener: { [Function] super_: [Circular] },
     HumiditySensor: { [Function] super_: [Circular] },
     LeakSensor: { [Function] super_: [Circular] },
     LightSensor: { [Function] super_: [Circular] },
     Lightbulb: { [Function] super_: [Circular] },
     LockManagement: { [Function] super_: [Circular] },
     LockMechanism: { [Function] super_: [Circular] },
     MotionSensor: { [Function] super_: [Circular] },
     OccupancySensor: { [Function] super_: [Circular] },
     Outlet: { [Function] super_: [Circular] },
     SecuritySystem: { [Function] super_: [Circular] },
     SmokeSensor: { [Function] super_: [Circular] },
     StatefulProgrammableSwitch: { [Function] super_: [Circular] },
     StatelessProgrammableSwitch: { [Function] super_: [Circular] },
     Switch: { [Function] super_: [Circular] },
     TemperatureSensor: [Circular],
     Thermostat: { [Function] super_: [Circular] },
     Window: { [Function] super_: [Circular] },

     WindowCovering: { [Function] super_: [Circular] } } }
といったサービスの種類があることは分かりました。
現状はSwitchにTVのon/offを接続しているだけなのですが、少しずつ他のWindowとかDoorやLightあたりを掘っていってみようかと考えています。

2014年12月19日金曜日

エコキュートの制御 その2

変換コネクタを作ったので繋いでみました。
これは裏側から見た写真です。

こちらは表側

この状態で制御してみると、ちゃんと動作しました。
HA端子のon/offで「ふろ自動」ボタンが制御されます。
HA端子のステータスも「ふろ自動」ボタンのLEDに連動して読み出せます。


とりつけました。


最後にカバーを付けて完成です。
これで風呂の給湯制御が出来るようになりました。
でも、風呂の栓と蓋を自動で出来ないのでいまいちだなぁ。
せめて栓と蓋がされていることを確認出来るようにできないか考えています。
ちょっと難しそうですが。



2013年9月20日金曜日

iOS7でのsiri-proxy

iOS7にupdateしたところ、siriproxyが動かなくなりました。
色々パケットを見ているのですが、難しいかもしれません。
なにか判ったら、また書きます。

2013年9月10日火曜日

落雷対策


落雷で壊れてしまったHA-2モジュールはFETが2つショートモードで故障していました。
静電対策部品のバリスタをスイッチを制御している3個のFETのD-S間に付けて暫く様子を見てみようと思います。
バリスタとは両端の電位差が規定値を超えると電流を流してくれる部品で、今回は30V品を付けてみました。

また、雨センサーの方も調べてみたところ雨センサーの値を読み取っていたXBeeのADのポートが3.3Vに張り付いてしまってました。
これも雨センサー部からノイズが入って壊してしまっているようです。
さらに雨センサーのGND側の電極部分が電食で腐食してしまってました。
直流で電位をかけて中間部分をADで読み取る構造のため乾燥していないと電流が流れて腐食してしまってるようです。
こちらもAD測定時のみパルス状に正・負の電位差をかけて読み取るようにすることで電食対策にし、AD部分と電位を掛けるためのポート部分にバリスタを追加して様子を見ることにします。

次に近所に落雷があったらまた報告します。

2013年9月8日日曜日

落雷


先週、うちの近所は雷がものすごかった晩があったのですが、すぐ近くに落ちて光と音と振動が来た直後から北側の窓が動作する音が聞こえ始めて止まらなくなりました。
HA-2/SWモジュールで制御しているのですが窓を閉めるスイッチにつながっているFETがショートモードに故障していたようで閉ボタンが押されっぱなしの状態になっていました。

取り敢えず取り外していますが、不便なので雷対策を追加して再度取り付けようと思っています。

同時に南側の雨センサーのADもちょっとおかしな値を指しているのですが、こちらはまだ故障原因を見ていません。雨が強かったので雨センサーの防水している部分に雨が染みこんでしまったのか、落雷時に雨センサー部から飛び込んだ静電気でADが壊れたのかどちらかかと思います。後者なら何らかの雷対策が必要そうです。

2013年9月1日日曜日

iPhoneからのweb accessのレイアウト

/root/ha1control/ha1access/icon.listで登録したものをiPhoneで自由にレイアウトする方法です。

icon.listの初期状態は

#command                        title           icon
tv_on                           電源on          av
tv_off                          電源off         av_off
tv_1                            NHK          av
tv_2                            教育テレビ      av
tv_4                            日本テレビ      av
tv_5                            テレビ朝日      av
tv_6                            TBS          av
tv_7                            テレビ東京      av
tv_8                            フジテレビ      av
tv_9                            MXTV        av
tv_vup                          音量+          av
tv_vdn                          音量ー          av
tv_chup                         CH+          av
tv_chdn                         CHー          av
となっています。

最初にiPhoneのDNSサーバーのIP変更です。
iPhoneのWiFi設定で自宅LANのWiFiを選択するとこのような画面になります。


ここでDNSの192.168.0.1の部分をタップすると変更できますので、RaspberryPiのIPアドレスに変更します。ここでは192.168.0.100に変更しています。




その後、SafariでRaspberryPiのserver.urlに設定したURL(ここではhogehoge.or.jp)のport 80にhttpsでアクセスします。
Safariのアドレス部分にhttps://hogehoge.or.jp:80/と入力すると下のようなページが開きます。



このページをブックマーク登録して使ってもいいのですが、レイアウトを変えるのにはweb pageの方を編集しなくてはならず面倒なので、それぞれのコマンドをiPhoneのアプリとして登録していきます。
まずは電源onを選択してください。
リモコンからTVの電源onのコードが出力され、下記の画面に遷移します。














ここでicon.listに登録したアイコンとタイトルが表示されるので、そのまま「追加」ボタンを押します。

ちょっと大変ですが、この登録を全てのコマンドに対して行います。
すべて登録すると下のような状態になります。

あとは通常のアプリの配置変更と同様にどれかアイコンを長押しして配置変更モードにはいります。

アイコン同士を重ねてフォルダにして

名前を付けて

ジャンルごとに配置すると

こんな感じになります。


















この画面で一番下の真ん中のボタンを押すと登録画面が開きます。
登録画面でブックマーク登録ではなく「ホーム画面に追加」を選びます。




2013年8月30日金曜日

raspbian-siriproxy-ha1controlのSDカードイメージ


install作業が結構大変なのでSDカードのイメージファイルを作りました。
重複する部分がありますがまとめページとしてそのまま書いておきます。

一応、注意書きも重複しますが書いておきます。
以下、web pageはhttpsで接続してますが、クライアント認証はしてないのでLAN内での使用に限定してください。
TVのリモコン制御程度ならば家の外にTVのリモコンを置きっぱなしにしてる程度の危険度ですが、玄関の鍵などを繋ぎこむと玄関の前に鍵をぶら下げてるくらい危険です。

■SDカードの作成

イメージファイルをダウンロードし、zipを展開
raspbian-siriproxy-ha1controlのSDカードイメージ

SHA1(2013-08-29-ha1control.img.zip)= 67596ea282b6aa014101d90db65a95aed6541204

※すみません。bugがあったので置き直します。
既にダウンロードしてしまった場合は、root権限でloginして

# cd /root/ha1control
# git pull https://github.com/mnakada/ha1control.git
# cd ha1access
# make webpage
を実行してください。


raspbian-siriproxy-ha1controlのSDカードイメージ


SHA1(2013-08-31-ha1control.img.zip)= 15560e96c809fee415479c331d69b2e9f574c0b7


4GB/class 4以上のSDカードを用意

SDカードをセットしdfコマンドでmountされているデバイス名を確認。(Mac OSX上。Windowsでも構わないがやり方は調べてください)
# df                                
Filesystem                        512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk1                         466560312 294498768 171549544    64% 36876344 21443693   63%   /
devfs                                    403       403         0   100%      700        0  100%   /dev
map -hosts                                 0         0         0   100%        0        0  100%   /net
map auto_home                              0         0         0   100%        0        0  100%   /home
/dev/disk4s1                          114576     37888     76688    34%      512        0  100%   /Volumes/Untitled
ここでは/dev/disk4なので
# diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
# sudo dd if=2013-08-29-ha1control.img of=/dev/rdisk4 bs=1m
Password:
1850+0 records in
1850+0 records out
1939865600 bytes transferred in 109.201742 secs (17764054 bytes/sec)

書き込み完了するとMacの場合勝手にmountされると思います。されない場合は手動で再mount
# vi /Volumes/Untitled/interfaces
でaddressの行〜gatewayの行までを自分の環境に合わせて設定して下さい。
# vi /Volumes/Untitled/resolv.conf
でDNSサーバの指定を変更する。
nameserver 8.8.8.8 (googleのpublic DNS)
nameserver 8.8.4.4
が入っているのでそのままでよければ何もしない。
routerなどを使う場合は環境に合わせて設定して下さい。
# vi /Volumes/Untitled/server.url
でwebアクセスするためのURLを指定して下さい。
hogehoge.or.jp
が入ってるので、適当に書き換えて下さい。

# diskutil eject /dev/disk4
でunmountされSDカードが出来上がったのでRaspberryPiにセットして起動
1分程度で起動しているので
# ssh pi@192.168.0.100 <-- 上でinterfacesに設定したアドレス
password: raspberry
でlogin

■基本設定 (以下はsshで入っているRaspberryPiのshell)
# sudo su
# passwd
でrootパスワード
# passwd pi
でpiのパスワードを設定

# raspi-config
expand_rootfsを実行。(2G用のイメージになってるのでパーティションを広げる)
設定し終了。rebootする。

ssh pi@ 192.168.0.100
passwd: 設定したもの
でlogin
# sudo su
でroot権限に。

■ 仮の証明書が入ってますが、危険なので自分用にsiriproxyやwebaccess用の証明ファイルを作成
# cd /root/ha1control/Certs
# make install
/var/ha1/ha1privateca.crtをiPhoneへメール等で転送しinstall

■ web pageの生成
# cd /root/ha1control/ha1access
# make webpage
/boot/server.urlで指定されたサーバー名でindex.htmlと関連のhtmlファイルを/var/www/以下に生成する

ここまで設定したらもう一度reboot
# init 6

■iPhone側の設定
先ほど作成したha1privateca.crtをiPhoneにメール等で転送しinstallする。
設定->Wi-Fi->ネットワークを選択し右側の>マークを選択する。
中のDNSの設定をタップし設定値をRaspberryPiのIPアドレスに変更し閉じる。

まずはweb accessの確認
 iPhoneのSafariから'http://hogehoge.or.jp:47910/' 'https://hogehoge.or.jp:80/'(hogehoge.or.jpは/boot/server.urlファイルに設定した名前)を開いてみる。エラーが出ずにいくつかのアイコンが表示されていれば取り敢えずOK。



次にSiriを起動してみる。
RaspberryPiにloginし
# tail -f /var/ha1/siriproxy.log
を実行した出力に
[Info - Plugin Manager] Plugins loaded: HA1Control
[Info - iPhone] Received Object: LoadAssistant
[Info - iPhone] Received Object: SetRestrictions
[Info - iPhone] Received Object: ClearContext
[Info - iPhone] Received Object: SetBackgroundContext
[Info - iPhone] Received Object: StartSpeechRequest
[Info - iPhone] Received Object: SetRequestOrigin
[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: SpeechPacket
.....
と出てくれば正常に繋がっています。

■リモコンの登録
リモコンを登録する名前を決める。ここでは仮にhogehogeとする
# telnet 127.0.0.1 47900 (RaspberryPiからtenet, security的な懸念もあるのでRaspberryPi自信からしかtelnetを受け付けません)
irrec hogehoge
を実行後すると
Ackと返ってくる
10秒以内にRaspberry piの赤外線受光部に向けてリモコンを送信
正常に受けられれば
irrec hogehoge : OK
と返ってくる
タイムアウトしたりちゃんと記録できなかった場合
irrec hogehoge : Error IR-Remote Record Error
とエラーになるので、再度登録
hogehoge
で登録したリモコンコードを送出するので、正しく反応しているか動作確認する
全てを登録したら
exit
で抜ける

次にwebpageにアイコンを登録する。
# cd /root/ha1control/ha1access
# vi icon.list
hogehoge    ほげほげ ha1
などと追加する。
iconを変えたい場合は/root/ha1control/ha1access/icon/以下に適当に作って置く。
# make webpage
を実行すると/var/www/以下のwebpageを更新する。

SiriProxy-HA1Controlのinstall
# cd /root
# git clone https://github.com/mnakada/SiriProxy-HA1Control.git
  登録したリモコンコードに対応する部分を編集するので/root/SiriProxy-HA1Control/に展開する
# cd /root/SiriProxy-HA1Control/lib
# vi siriproxy-ha1control.rb
で編集する
listen_for /.../ do
から
request_competed
end
までのひとかたまりを適当にコピーして
listen_forの行に目的の言葉を正規表現で記述
ha1commandの行を送信するリモコンの名前
 res = ha1command("hogehoge")
に変更
sayの行は正常終了時の応答、異常終了時の応答をそれぞれ記述する

# cd /root/ha1control/SiriProxyDaemon
# vi config.yml
で18行目の
    - name: 'HA1Control'
      git: 'git://github.com/mnakada/SiriProxy-HA1Control.git'

    - name: 'HA1Control'
      path: '/root/SiriProxy-HA1Control'
に変更(この時pathの位置をnameの位置と同じにしないとエラーになるようです)して
# make install
# make restart

# tail -f /var/ha1/siriprxy.log

[Info - Server] SiriProxy up and running.
の行がでたらiPhoneのsiriを起動して登録した言葉を話してみてください。
滑舌によっては違う言葉になってしまうので正規表現で適当に解釈を広げて下さい。

2013年8月29日木曜日

web access対応のイメージ作成


今回はapache2とcgiも組み込んだRaspberryPiのSDイメージの作成手順です。
出来上がったSDカードのイメージからの手順は次回書きます。

以下、web pageはhttpsで接続してますが、クライアント認証はしてないのでLAN内での使用に限定してください。
web pageを外からアクセス可能にするのは、TVのリモコン制御家の外にTVのリモコンを置きっぱなしにしてる程度の危険度ですが、玄関の鍵などを繋ぎこむと玄関の前に鍵をぶら下げてるくらい危険です。

■Raspbianの書き込み(Mac OSX上。Windowsでも構わないがやり方は調べてください)
4GB/class 4以上のSDカードを用意
http://www.raspberrypi.org/downloadsからRaspbian "wheezy"のイメージをダウンロード
SDカードをセットしdfコマンドでmountされているデバイス名を確認。
# df                                
Filesystem                        512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk1                         466560312 294498768 171549544    64% 36876344 21443693   63%   /
devfs                                    403       403         0   100%      700        0  100%   /dev
map -hosts                                 0         0         0   100%        0        0  100%   /net
map auto_home                              0         0         0   100%        0        0  100%   /home
/dev/disk4s1                          114576     37888     76688    34%      512        0  100%   /Volumes/Untitled
ここでは/dev/disk4なので
# diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
# sudo dd if=2013-07-26-wheezy-raspbian.img of=/dev/rdisk4 bs=1m
Password:
1850+0 records in
1850+0 records out
1939865600 bytes transferred in 109.201742 secs (17764054 bytes/sec)
# diskutil eject /dev/rdisk4

SDカードが出来上がったのでRaspberryPiにセットして起動

■sshでのlogin
※以下gateway 192.168.0.1, netmask 255.255.255.0, DHCPで配られたアドレス 192.168.0.27, RaspberryPiに設定する固定アドレス 192.168.0.100として説明する。

HDMIにTVを接続してIP Addressを確認するかdhcp server側で固定IPにすることでRaspberryPiのIPを取得する。
もしくはWiFi routerがDHCPサーバーになっている場合にWiFi接続しているか、自分自身がDHCPサーバーになっているなど、DHCPサーバーとの間にSwitchingHubなどのが入っていないネットワークの構成ならtcpdumpでdhcp/arpのパケットをみてb8:27:eb:xx:xx:xxのMACAddrを引っ掛けてIPアドレスを特定することも可能。
# sudo tcpdump -i en1 'arp[8:4] & 0xffffff00 = 0xb827eb00'
(en1はMacのRaspberryPiと同じLANにつながるポート)
を仕掛けておいてRaspberryPiを起動すると、しばらくして
11:33:47.965431 ARP, Request who-has 192.168.0.1 tell 192.168.0.27, length 46
などとDHCPサーバーが配ったアドレスが拾える。

ssh pi@ 192.168.0.27
The authenticity of host '192.168.0.27 (192.168.0.27)' can't be established.
RSA key fingerprint is xxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
と聞かれるのでyesとし
passwd: raspberry
でlogin

■基本設定 (以下はsshで入っているRaspberryPiのshell)
# sudo su
# passwd
でrootパスワード
# passwd pi
でpiのパスワードを設定

■固定IPへの変更(DNSサーバーとして動作するので固定IPにしないと変化するたびにiPhoneの設定を変える必要がある。sshで入るのにも固定の方がやりやすい)
# cp /etc/network/interfaces /boot
# mv /etc/network/interfaces /etc/network/interfaces.org
# ln -s /boot/interfaces /etc/network/interfaces
とし、interfacesファイルをFAT32のpartitionに移動し/boot/interfacesを編集
これは後からSDカードのFAT32 partiotionをMacでmountしてネットワーク設定を変更出来るようにするため。
/boot/interfaces変更前
iface eth0 inet dhcpの行を削除
/boot/interfaces変更後
iface eth0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
を追加

# cp /etc/resolv.conf /boot
# mv /etc/resolv.conf /etc/resolv.conf.org
# ln -s /boot/resolv.conf /etc/resolv.conf
こちらもDNSサーバの指定をFAT32のpartitionに異動し/boot/resolv.conを編集
nameserver 8.8.8.8 (googleのpublic DNS。routerを使う場合は192.168.0.1)
nameserver 8.8.4.4


# vi /boot/server.url

webアクセスするためのURLを指定
hogehoge.or.jp
など。


# raspi-config
expand_rootfsを実行。
3.Enable Boot to DesktopをDisable
4 Internationalisation Options
  I1 Change Locale
     ja_JP.UTF-8 UTF-8  をEnable
     Default Languageをja_JP.UTF-8に設定
4 Internationalisation Options
  I2 Change Timezone
     Asia->Tokyo
8 Advanced Options
  A3 Memory Splitを16M
を設定しrebootする。

再度sshでlogin。今度は設定した固定IP
ssh pi@ 192.168.0.100
passwd: 設定したもの
でlogin
この時何度も条件を変えたりしながらloginを繰り返していると
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
などと出てloginできなくなることがあるが、これは~/.ssh/known_hostsに同じIPアドレスの他の公開鍵が登録されているためなので、このファイルを編集して192.168.0.100の行を削除すればlogin出来るようになる。

再びroot権限で作業
# sudo su

■不要なpackageの削除
# df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs           1804128 1460364    252116  86% /
/dev/root        1804128 1460364    252116  86% /
devtmpfs          216132       0    216132   0% /dev
tmpfs              44880     216     44664   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs              89740       0     89740   0% /run/shm
/dev/mmcblk0p1     57288   18984     38304  34% /boot

packageのupdate
# apt-get update
# apt-get upgrade

HA1Control daemonに必要なものを追加
# apt-get install libcurl4-openssl-dev libgif-dev telnet ruby1.9.3 dnsmasq gawk apache2 libapache2-mod-php5

不要なものを削除
# apt-get --purge remove xserver* libxdmcp* libxfont* xkb-data alsa-* cups-* dbus plymouth cifs-* samba-* smbclient dphys-swapfile desktop-file-utils libxml2* bind9-host* dnsutils* libbind9-80* libdns88* libisc84* libisccc80* libisccfg82* liblwres80* libxml2* libxml2-dev* libxslt1-dev* libxslt1.1* shared-mime-info* console-setup-linux geoip-database libgeoip1 libtalloc2 libtdb1 libwbclient0 sgml-base xml-core x11-* xbitmaps libxdmcp6 libxcb* libxau* rsync libfont* libfreetype* libqt* lxde-* lxmenu* libmenu* libgnome* gconf* gnome* gsettings* gsfonts hicolor-icon* penguinspuzzle
# apt-get --purge autoremove

aptのcacheを削除
# apt-get clean

上でswapを止めたのでswapファイルを削除
# rm /var/swap

■ntpdの設定
RaspberryPiはバッテリーバックアップのRTCを持っていないのでNICTのntpサーバーを設定、他をコメントアウト
# vi /etc/ntp.conf

#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst

pool ntp.nict.jp iburst

# vi /etc/default/ntp

NTPD_OPTS='-g -c /etc/ntp.conf'

■ttyとUARTの設定を変更
# vi /etc/inittab
1:2345:respawn:/sbin/getty --noclear 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
...
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
を行頭に#をつけてコメントアウト

UARTをXBee接続用に空けるためconsoleから外すため起動optionを変更するけど、
raspbianのkernelにdefaultで埋め込まれているもので十分なので/boot/cmdline.txtを削除

# rm /boot/cmdline.txt

■SiriProxyのinstall
# gem install bundler
# gem install siriproxy

■HA1Control daemonなどのinstall
# cd /root
# git clone https://github.com/mnakada/ha1control.git
# cd ha1control
# make install
でha1control, ha1accessのinstallとsiriproxy, apache2の各種設定を行う
最後に出来上がった/var/ha1/ha1privateca.crtファイルをiPhoneへメール等で転送しinstallする。

■念のためrestart
# sync
# init 6

数十秒で再起動しているはずなので

ssh pi@ 192.168.0.100
passwd: 設定したもの
で再度login

# ps aux | grep ha1control
root      1669  0.0  0.1  10012   892 ?        Ss   14:51   0:00 /usr/local/bin/ha1control -d -p /var/run/ha1control.pid /var/ha1/ha1control.conf
root      1671  0.3  0.4  10140  2364 ?        S    14:51   0:00 /usr/local/bin/ha1control -d -p /var/run/ha1control.pid /var/ha1/ha1control.conf
と2つ動いているのが正常(1つはWatchDogDaemon)
# ps aux | grep siriproxy
root      1859 62.3  3.4  23452 17400 ?        Sl   14:51   0:08 /usr/local/bin/siriproxy_daemon                                      
こちらは1つ動いているのが正常
# tail -f /var/ha1/siriproxy.log
start : 2013-05-15 14:51:04 +0900
WARN: Unresolved specs during Gem::Specification.reset:
      rake (>= 0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
[Info - Configuration] Loading plugins -- If any fail to load, run `siriproxy bundle` (not `bundle install`) to resolve.
[Info - Server] Starting SiriProxy on 0.0.0.0:443...
[Info - Server] SiriProxy up and running.
と待ち受けている状態

■iPhone側の設定
先ほど作成したha1privateca.crtをiPhoneにメール等で転送しinstallする。
設定->Wi-Fi->ネットワークを選択し右側の>マークを選択する。
中のDNSの設定をタップし設定値をRaspberryPiのIPアドレスに変更し閉じる。

まずはweb accessの確認
 iPhoneのSafariから'http://hogehoge.or.jp:47910/'  'https://hogehoge.or.jp:80/'(hogehoge.or.jpは/boot/server.urlファイルに設定した名前)を開いてみる。エラーが出ずにいくつかのアイコンが表示されていれば取り敢えずOK。

次にSiriを起動してみる。
RaspberryPiにloginし
# tail -f /var/ha1/siriproxy.log
を実行した出力に
[Info - Plugin Manager] Plugins loaded: HA1Control
[Info - iPhone] Received Object: LoadAssistant
[Info - iPhone] Received Object: SetRestrictions
[Info - iPhone] Received Object: ClearContext
[Info - iPhone] Received Object: SetBackgroundContext
[Info - iPhone] Received Object: StartSpeechRequest
[Info - iPhone] Received Object: SetRequestOrigin
[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: SpeechPacket
.....
と出てくれば正常に繋がっています。

■リモコンの登録
リモコンを登録する名前を決める。ここでは仮にhogehogeとする
# telnet 127.0.0.1 47900 (RaspberryPiからtenet, security的な懸念もあるのでRaspberryPi自信からしかtelnetを受け付けません)
irrec hogehoge
を実行後すると
Ackと返ってくる
10秒以内にRaspberry piの赤外線受光部に向けてリモコンを送信
正常に受けられれば
irrec hogehoge : OK
と返ってくる
タイムアウトしたりちゃんと記録できなかった場合
irrec hogehoge : Error IR-Remote Record Error
とエラーになるので、再度登録
hogehoge
で登録したリモコンコードを送出するので、正しく反応しているか動作確認する
全てを登録したら
exit
で抜ける

次にwebpageにアイコンを登録する。
# cd /root/ha1control/ha1access
# vi icon.list
hogehoge    ほげほげ ha1
などと追加する。
iconを変えたい場合は/root/ha1control/ha1access/icon/以下に適当に作って置く。
# make webpage
を実行すると/var/www/以下のwebpageを更新する。

SiriProxy-HA1Controlのinstall
# cd /root
# git clone https://github.com/mnakada/SiriProxy-HA1Control.git
  登録したリモコンコードに対応する部分を編集するので/root/SiriProxy-HA1Control/に展開する
# cd /root/SiriProxy-HA1Control/lib
# vi siriproxy-ha1control.rb
で編集する
listen_for /.../ do
から
request_competed
end
までのひとかたまりを適当にコピーして
listen_forの行に目的の言葉を正規表現で記述
ha1commandの行を送信するリモコンの名前
 res = ha1command("hogehoge")
に変更
sayの行は正常終了時の応答、異常終了時の応答をそれぞれ記述する

# cd /root/ha1control/SiriProxyDaemon
# vi config.yml
で18行目の
    - name: 'HA1Control'
      git: 'git://github.com/mnakada/SiriProxy-HA1Control.git'

    - name: 'HA1Control'
      path: '/root/SiriProxy-HA1Control'
に変更して
# make install
# make restart

# tail -f /var/ha1/siriprxy.log

[Info - Server] SiriProxy up and running.
の行がでたらiPhoneのsiriを起動して登録した言葉を話してみてください。
滑舌によっては違う言葉になってしまうので正規表現で適当に解釈を広げて下さい。

2013年8月28日水曜日

ha1controlへのcgiアクセス


ha1controlのツリーにha1controlのsocketポートにアクセスするcgiを追加しました。

git clone https://github.com/mnakada/ha1control.git

で取得するとha1control/Certs,ha1control/ha1access/のディレクトリが出来ます。
Certsの方はwebアクセス用の証明書とsiriproxy用の証明書を作成するためのdirectoryです。
ha1accessの方はapace2のwebアクセス用のcgiとweb pageを生成するscriptです。
ここにあるicon.listを編集してコマンドを登録し、make installすると/var/www/以下にアクセス用のページを生成します。

webへのアクセスは、LAN内でDNSをRaspberryPiに指定していれば/boot/server.utlに登録した名前でアクセスできます。
例えばhogehoge.or.jpとserver.urlに登録しておけば
iPhoneのsafariでhttps://hogehoge.or.jp:47910/で開くことが出来ます。
ここでhttps:のportを443にしていないのはsiri-proxyとぶつかっているためです。

細かい設定が色々合って大変なのと、以前書いた時から随分と変化しているので、次回に最初からの設定詳細をもう一度書くことにします。

2013年5月26日日曜日

raspbian-siriproxy-ha1controlのSDカードイメージ

SDカードイメージを更新しました。

raspbian-siriproxy-ha1controlのSDカードイメージ
の方を見てください。

----------------------

install作業が結構大変なのでSDカードのイメージファイルを作りました。
5/18のRaspberryPiのSiriProxyと赤外線リモコンの接続の説明と同じものが出来上がります。
イメージ作成用にexpand_roofsとpasswd設定、gencertsを行ってないイメージになります。
5/18と説明が重複する部分がありますが、こちらだけ見て作れるようにそのまま書いておきます。

■SDカードの作成
4GB/class 4以上のSDカードを用意

下記zipイメージファイルをダウンロードし解凍してください。
2013-05-25-siriproxy-ha1control.imgが出来上がります。

2013-05-25-siriproxy-ha1control.img.zip
SHA-1 : 33538f4d92207e5ba127c54fa17d600a91d6331f

SDカードをセットしdfコマンドでmountされているデバイス名を確認。(Mac OSX上。Windowsでも構わないがやり方は調べてください)
# df                                
Filesystem                        512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk1                         466560312 294498768 171549544    64% 36876344 21443693   63%   /
devfs                                    403       403         0   100%      700        0  100%   /dev
map -hosts                                 0         0         0   100%        0        0  100%   /net
map auto_home                              0         0         0   100%        0        0  100%   /home
/dev/disk4s1                          114576     37888     76688    34%      512        0  100%   /Volumes/Untitled
ここでは/dev/disk4なので
# diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
# sudo dd if=2013-05-25-siriproxy-ha1control.img of=/dev/rdisk4 bs=1m
Password:
1850+0 records in
1850+0 records out
1939865600 bytes transferred in 109.201742 secs (17764054 bytes/sec)

書き込み完了するとMacの場合勝手にmountされると思います。
# vi /Volumes/Untitled/interfaces

addressの行〜gatewayの行までを自分の環境に合わせて設定して下さい。
ここでは192.168.0.100に設定したとします。

# diskutil eject /dev/disk4
でunmountされSDカードが出来上がったのでRaspberryPiにセットして起動
1分程度で起動しているので
# ssh pi@192.168.0.100 <-- 上でinterfacesに設定したアドレス
password: raspberry
でlogin

■基本設定 (以下はsshで入っているRaspberryPiのshell)
# sudo su
# passwd
でrootパスワード
# passwd pi
でpiのパスワードを設定


# raspi-config
expand_rootfsを実行、rebootせずに抜ける。


■ siriproxyの証明書作成
# cd /root/ha1control/SiriProxyDaemon
# make gencerts

ca.pemをiPhoneへメール等で転送しinstall

restart
# sync
# init 6

数十秒で再起動しているはずなので

# ssh pi@192.168.0.100

で再度login

passwd: 設定したもの
で再度login

# ps aux | grep ha1control
root      1669  0.0  0.1  10012   892 ?        Ss   14:51   0:00 /usr/local/bin/ha1control -d -p /var/run/ha1control.pid /var/ha1/ha1control.conf
root      1671  0.3  0.4  10140  2364 ?        S    14:51   0:00 /usr/local/bin/ha1control -d -p /var/run/ha1control.pid /var/ha1/ha1control.conf
と2つ動いているのが正常(1つはWatchDogDaemon)
# ps aux | grep siriproxy
root      1859 62.3  3.4  23452 17400 ?        Sl   14:51   0:08 /usr/local/bin/siriproxy_daemon                                      
こちらは1つ動いているのが正常
# tail -f /var/ha1/siriproxy.log
start : 2013-05-15 14:51:04 +0900
WARN: Unresolved specs during Gem::Specification.reset:
      rake (>= 0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
[Info - Configuration] Loading plugins -- If any fail to load, run `siriproxy bundle` (not `bundle install`) to resolve.
[Info - Server] Starting SiriProxy on 0.0.0.0:443...
[Info - Server] SiriProxy up and running.
と待ち受けている状態

■iPhone側の設定
先ほど作成したca.pemをiPhoneにメール等で転送しinstallする。
設定->Wi-Fi->ネットワークを選択し右側の>マークを選択する。
中のDNSの設定をタップし設定値をRaspberryPiのIPアドレスに変更し閉じる。
ここまで設定したらSiriを起動してみる。
RaspberryPiのtail -f /var/ha1/siriproxy.logの出力に
[Info - Plugin Manager] Plugins loaded: HA1Control
[Info - iPhone] Received Object: LoadAssistant
[Info - iPhone] Received Object: SetRestrictions
[Info - iPhone] Received Object: ClearContext
[Info - iPhone] Received Object: SetBackgroundContext
[Info - iPhone] Received Object: StartSpeechRequest
[Info - iPhone] Received Object: SetRequestOrigin
[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: SpeechPacket
.....
と出てくれば正常に繋がっています。

■リモコンの登録
リモコンを登録する名前を決める。ここでは仮にhogehogeとする
# telnet 127.0.0.1 47900 (RaspberryPiからtenet, security的な懸念もあるのでRaspberryPi自信からしかtelnetを受け付けません)
irrec hogehoge
を実行後すると
Ackと返ってくる
10秒以内にRaspberry piの赤外線受光部に向けてリモコンを送信
正常に受けられれば
irrec hogehoge : OK
と返ってくる
タイムアウトしたりちゃんと記録できなかった場合
irrec hogehoge : Error IR-Remote Record Error
とエラーになるので、再度登録
hogehoge
で登録したリモコンコードを送出するので、正しく反応しているか動作確認する
全てを登録したら
exit
で抜ける
SiriProxy-HA1Controlのinstall
# cd /root
# git clone https://github.com/mnakada/SiriProxy-HA1Control.git
  登録したリモコンコードに対応する部分を編集するので/root/SiriProxy-HA1Control/に展開する
# cd /root/SiriProxy-HA1Control/lib
# vi siriproxy-ha1control.rb
で編集する
listen_for /.../ do
から
request_competed
end
までのひとかたまりを適当にコピーして
listen_forの行に目的の言葉を正規表現で記述
ha1commandの行を送信するリモコンの名前
 res = ha1command("hogehoge")
に変更
sayの行は正常終了時の応答、異常終了時の応答をそれぞれ記述します。

# cd /root/ha1control/SiriProxy
# vi config.yml
で18行目の
    - name: 'HA1Control'
      git: 'git://github.com/mnakada/SiriProxy-HA1Control.git'

    - name: 'HA1Control'
      path: '/root/SiriProxy-HA1Control'
に変更して
# make install
# make restart

# tail -f /var/ha1/siriprxy.log

[Info - Server] SiriProxy up and running.
の行がでたらiPhoneのsiriを起動して登録した言葉を話してみてください。
滑舌によっては違う言葉になってしまうので正規表現で適当に解釈を広げて下さい。

2013年5月18日土曜日

iTamaHomeのCMに触発されて。。。

うちはタマホームではないですがiTamaHomeのコマーシャルに触発されてビデオを撮ってみました。

家電と住宅設備の音声コントロール SiriProxy-HA1Control


RaspberryPiのSiriProxyと赤外線リモコンの接続


rubyの初心者なので色々とトライを繰り返して訳がわからなくなってしまったのでもう一度最初からやってみました。

RaspberryPiで赤外線リモコンを送受信可能にする回路で一番シンプルなのは

RaspberryPiにIRリモコンの送受信を追加


です。


Raspberry Piの赤外線リモコンのほうが基板化した回路ですがやっていることは同じです。



■Raspbianの書き込み(Mac OSX上。Windowsでも構わないがやり方は調べてください)
4GB/class 4以上のSDカードを用意
http://www.raspberrypi.org/downloadsからRaspbian "wheezy"のイメージをダウンロード
SDカードをセットしdfコマンドでmountされているデバイス名を確認。
# df                                
Filesystem                        512-blocks      Used Available Capacity  iused    ifree %iused  Mounted on
/dev/disk1                         466560312 294498768 171549544    64% 36876344 21443693   63%   /
devfs                                    403       403         0   100%      700        0  100%   /dev
map -hosts                                 0         0         0   100%        0        0  100%   /net
map auto_home                              0         0         0   100%        0        0  100%   /home
/dev/disk4s1                          114576     37888     76688    34%      512        0  100%   /Volumes/Untitled
ここでは/dev/disk4なので
# diskutil unmountDisk /dev/disk4
Unmount of all volumes on disk4 was successful
# sudo dd if=2013-02-09-wheezy-raspbian.img of=/dev/rdisk4 bs=1m
Password:
1850+0 records in
1850+0 records out
1939865600 bytes transferred in 109.201742 secs (17764054 bytes/sec)
# diskutil eject /dev/rdisk4

SDカードが出来上がったのでRaspberryPiにセットして起動

■sshでのlogin
※以下gateway 192.168.0.1, netmask 255.255.255.0, DHCPで配られたアドレス 192.168.0.27, RaspberryPiに設定する固定アドレス 192.168.0.100として説明する。

HDMIにTVを接続してIP Addressを確認するかdhcp server側で固定IPにすることでRaspberryPiのIPを取得する。
もしくはWiFi routerがDHCPサーバーになっている場合にWiFi接続しているか、自分自身がDHCPサーバーになっているなど、DHCPサーバーとの間にSwitchingHubなどのが入っていないネットワークの構成ならtcpdumpでdhcp/arpのパケットをみてb8:27:eb:xx:xx:xxのMACAddrを引っ掛けてIPアドレスを特定することも可能。
# sudo tcpdump -i en1 'arp[8:4] & 0xffffff00 = 0xb827eb00'
を仕掛けておいてRaspberryPiを起動すると、しばらくして
11:33:47.965431 ARP, Request who-has 192.168.0.1 tell 192.168.0.27, length 46
などとDHCPサーバーが配ったアドレスが拾える。

ssh pi@ 192.168.0.27
passwd: raspberry
でlogin

■基本設定 (以下はsshで入っているRaspberryPiのshell)
# sudo su
# passwd
でrootパスワード
# passwd pi
でpiのパスワードを設定

■固定IPへの変更(DNSサーバーとして動作するので固定IPにしないと変化するたびにiPhoneの設定を変える必要がある。sshで入るのにも固定の方がやりやすい)
# cp /etc/network/interfaces /boot
# mv /etc/network/interfaces /etc/network/interfaces.org
# ln -s /boot/interfaces /etc/network/interfaces
とし、interfacesファイルをFAT32のpartitionに移動し/boot/interfacesを編集
これは後からSDカードのFAT32 partiotionをMacでmountしてネットワーク設定を変更出来るようにするため。

/boot/interfaces変更前
iface eth0 inet dhcpの行を削除
/boot/interfaces変更後
iface eth0 inet static
address 192.168.0.100
netmask 255.255.255.0
gateway 192.168.0.1
を追加

DNSサーバの指定は/etc/resolv.conf を変更する。
nameserver 8.8.8.8 (googleのpublic DNS。routerを使う場合は192.168.0.1)
nameserver 8.8.4.4


# raspi-config
expand_rootfsを実行。
change_timezoneをAsia->Tokyo
memory_splitを16M
boot_behaviourをdesktop->Disable
を設定しrebootする。

再度sshでlogin。今度は設定した固定IP
ssh pi@ 192.168.0.100
passwd: 設定したもの
でlogin
# sudo su

■不要なpackageの削除
# df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs           1804128 1460364    252116  86% /
/dev/root        1804128 1460364    252116  86% /
devtmpfs          216132       0    216132   0% /dev
tmpfs              44880     216     44664   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs              89740       0     89740   0% /run/shm
/dev/mmcblk0p1     57288   18984     38304  34% /boot

rubyを追加すると溢れそうなので不要なものを削除(必要に応じて)
# apt-get update
# apt-get --purge remove xserver* libxdmcp* libxfont* xkb-data alsa-* cups-* dbus triggerhappy plymouth cifs-* samba-* smbclient dphys-swapfile desktop-file-utils libxml2* bind9-host* dnsutils* libbind9-80* libdns88* libisc84* libisccc80* libisccfg82* liblwres80* libxml2* libxml2-dev* libxslt1-dev* libxslt1.1* shared-mime-info* console-setup-linux geoip-database libgeoip1 libtalloc2 libtdb1 libwbclient0 sgml-base xml-core

HA1Control daemonに必要なものを追加
# apt-get install libcurl4-openssl-dev libgif-dev telnet git-core ruby1.9.3 dnsmasq gawk

X関連がrubyに紐付いているのであとから削除(こちらも必要に応じて)
# apt-get --purge remove x11-* xbitmaps libxdmcp6 libxcb* libxau* rsync libfont* libfreetype* libqt* lxde-* lxmenu* libmenu* libgnome* gconf* gnome* gsettings* gsfonts hicolor-icon* penguinspuzzle
# apt-get upgrade

上でswapを止めたのでswapファイルを削除
# rm /var/swap

■ntpdの設定
RaspberryPiはバッテリーバックアップのRTCを持っていないのでNICTのntpサーバーを設定、他をコメントアウト
# vi /etc/ntp.conf

#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst

pool ntp.nict.jp iburst

■ttyとUARTの設定を変更
# vi /etc/inittab
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
...
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
を行頭に#をつけてコメントアウト

UARTをXBee接続用に空けるためconsoleから外すため起動optionを変更するけど、
raspbianのkernelにdefaultで埋め込まれているもので十分なので/boot/cmdline.txtを削除

# rm /boot/cmdline.txt

■SiriProxyのinstall
# gem install bundler
# gem install siriproxy

■HA1Control daemonのinstall
# cd /root
# git clone https://github.com/mnakada/ha1control.git
# cd ha1control
# make install
   /var/ha1以下に設定ファイルなどをコピーし、起動ファイルを設定している
  /usr/local/binにha1controlをinstall
  /etc/init.d/にha1control.rcをinstallしrc?.dに設定
  /etc/logrotate.d/にha1control.rotateをinstall
# cd SiriProxyDaemon
# make install
  /var/ha1/siriproxy以下にsiriproxy実行時のroot dirを設定し起動用ファイルを設定している
   /etc/init.d/にsiriproxy.rcをinstallしrc?.dに設定
    /etc/logrotate.d/にsiriproxy.rotateをinstall
  /etc/network/if-up.d/にsiriproxy.if-upをコピーする
   これはeth0起動時に自分のIPアドレスをdnsmasqの設定ファイル
   (/etc/dnsmasq.d/siriproxy)に設定するためのscriptで
   address=/guzzoni.apple.com/192.168.0.100という内容を書き出す
   幾つかファイルがないと怒られるが、次でinstallされるので問題ない。
# make gencerts
 実体はsiriproxyのgencertsを呼んでいる。gencertsはssl通信用のオレオレ証明書、サーバー鍵の生成して/var/ha1/siriproxy/.siriproxyに設定
# make bundle
  daemon-spawnとsiriproxyのbundle関連のinstall
  この時一緒にsiriproxy-ha1controlもinstallされる
# make restart
 siriproxyとifplugd,dnsmasqを再起動

ca.pemをiPhoneへメール等で転送しinstall

■最後に不要な物を削除
# apt-get --purge autoremove

■restart
# sync
# init 6

数十秒で再起動しているはずなので

ssh pi@ 192.168.0.100
passwd: 設定したもの
で再度login

# ps aux | grep ha1control
root      1669  0.0  0.1  10012   892 ?        Ss   14:51   0:00 /usr/local/bin/ha1control -d -p /var/run/ha1control.pid /var/ha1/ha1control.conf
root      1671  0.3  0.4  10140  2364 ?        S    14:51   0:00 /usr/local/bin/ha1control -d -p /var/run/ha1control.pid /var/ha1/ha1control.conf
と2つ動いているのが正常(1つはWatchDogDaemon)
# ps aux | grep siriproxy
root      1859 62.3  3.4  23452 17400 ?        Sl   14:51   0:08 /usr/local/bin/siriproxy_daemon                                      
こちらは1つ動いているのが正常
# tail -f /var/ha1/siriproxy.log
start : 2013-05-15 14:51:04 +0900
WARN: Unresolved specs during Gem::Specification.reset:
      rake (>= 0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
[Info - Configuration] Loading plugins -- If any fail to load, run `siriproxy bundle` (not `bundle install`) to resolve.
[Info - Server] Starting SiriProxy on 0.0.0.0:443...
[Info - Server] SiriProxy up and running.
と待ち受けている状態

■iPhone側の設定
先ほど作成したca.pemをiPhoneにメール等で転送しinstallする。
設定->Wi-Fi->ネットワークを選択し右側の>マークを選択する。
中のDNSの設定をタップし設定値をRaspberryPiのIPアドレスに変更し閉じる。
ここまで設定したらSiriを起動してみる。
RaspberryPiのtail -f /var/ha1/siriproxy.logの出力に
[Info - Plugin Manager] Plugins loaded: HA1Control
[Info - iPhone] Received Object: LoadAssistant
[Info - iPhone] Received Object: SetRestrictions
[Info - iPhone] Received Object: ClearContext
[Info - iPhone] Received Object: SetBackgroundContext
[Info - iPhone] Received Object: StartSpeechRequest
[Info - iPhone] Received Object: SetRequestOrigin
[Info - iPhone] Received Object: SpeechPacket
[Info - iPhone] Received Object: SpeechPacket
.....
と出てくれば正常に繋がっています。

■リモコンの登録
リモコンを登録する名前を決める。ここでは仮にhogehogeとする
# telnet 127.0.0.1 47900 (RaspberryPiからtenet, security的な懸念もあるのでRaspberryPi自信からしかtelnetを受け付けません)
irrec hogehoge
を実行後すると
Ackと返ってくる
10秒以内にRaspberry piの赤外線受光部に向けてリモコンを送信
正常に受けられれば
irrec hogehoge : OK
と返ってくる
タイムアウトしたりちゃんと記録できなかった場合
irrec hogehoge : Error IR-Remote Record Error
とエラーになるので、再度登録
hogehoge
で登録したリモコンコードを送出するので、正しく反応しているか動作確認する
全てを登録したら
exit
で抜ける
SiriProxy-HA1Controlのinstall
# cd /root
# git clone https://github.com/mnakada/SiriProxy-HA1Control.git
  登録したリモコンコードに対応する部分を編集するので/root/SiriProxy-HA1Control/に展開する
# cd /root/SiriProxy-HA1Control/lib
# vi siriproxy-ha1control.rb
で編集する
listen_for /.../ do
から
request_competed
end
までのひとかたまりを適当にコピーして
listen_forの行に目的の言葉を正規表現で記述
ha1commandの行を送信するリモコンの名前
 res = ha1command("hogehoge")
に変更
sayの行は正常終了時の応答、異常終了時の応答をそれぞれ記述します。

# cd /root/ha1control/SiriProxy
# vi config.yml
で18行目の
    - name: 'HA1Control'
      git: 'git://github.com/mnakada/SiriProxy-HA1Control.git'

    - name: 'HA1Control'
      path: '/root/SiriProxy-HA1Control'
に変更して
# make install
# make restart

# tail -f /var/ha1/siriprxy.log

[Info - Server] SiriProxy up and running.
の行がでたらiPhoneのsiriを起動して登録した言葉を話してみてください。
滑舌によっては違う言葉になってしまうので正規表現で適当に解釈を広げて下さい。

2013年5月3日金曜日

SiriProxyとコントロールサーバーの接続.....の前にruby,etcのinstall

iPhoneのsiriでガレージのシャッターや照明を制御できるSiriProxyというものがあるのを知り、ぐぐってみるとHoneywellの室温コントローラやiRemoconなどを接続するplug-inが公開されていました。これならRaspberryPi上のコントロールサーバーに接続してsiri経由で窓やシャッターを開閉したり、TVやエアコンを制御したり出来そうです。

SiriProxyはrubyで書かれているのですが、rubyを使ったことがないので色々とトライしながらRaspberryPiに入れてみました。
RaspberryPiはraspbianを入れてますが、手持ちのSDカードが2GB品しかなかったのでX関連など使わないパッケージを削除しています。
最初apt-getでruby1.9.3を入れようとしたのですが、X-Window関連に紐付いているようで色々とinstallしようとして容量オーバーして止まってしまいました。
仕方がないので他の方法を検索してみたところrvmというrubyのversion管理ツール経由でinstallする方法がある事がわかりました。
色々と試した結果よさそうなやり方をメモしておきます。

RaspberryPiにsshでloginし
# sudo su
でrootになって実行
# cd

うちのRaspberryPiにはすでにコントロールサーバーで使用するためにcurlが入れてありますが、ない場合はinstall
# apt-get install curl

# curl -L https://get.rvm.io | bash -s stable --ruby
ruby自体のcompileが走るようでrubyで実行すると2時間強かかりました。最初、メッセージが途中で止まってウンスン状態になったので不安になりましたが、途中経過は/usr/local/rvm/log/ruby-2.0.0-p0/にlogファイルが作られているようでtail -f で見ていると一応動いていることは確認出来たので暫く放置しておいたら出来上がってました。

# rvm install 2.0.0
# rvm use 2.0.0 --default
ここで/bin/bash --loginで入ってからやれと言われたので調べてみると
/root/.bash_profileが作られてpathの追加がされていました。
sudoで入った時に環境が違うのが嫌なので.bashrcの最後に追加して再度実行します。

SiriProxyは改造するかもしれないのでgitからとってきます。
その前にgitのinstall
# apt-get install git-core

SiriProxyのclone
# git clone https://github.com/plamoni/SiriProxy.git

SiriProxyのgitのページに書かれているとおりにinstallして確認してみると取り敢えずiPhoneのsiriからSiriProxyのテストコマンドが実行できました。

ここまで出来たのであとはコントロールサーバーとのつなぎ込みと、うちのLAN環境に設定をあわせる必要がありそうです。