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年8月12日月曜日

RaspberryPiでのapache2


暫く他のことをしていたため更新が滞ってしまいました。

外部サーバーにapacheをたててRaspberryPiから外部サーバーに接続してコントロールする構成にしていましたが、たまにコマンドが詰まってしまって外部サーバーのdaemonを再起動しないと動作しなくなってしまう現象が起きていたので接続方法を変えることにしました。

今回は、RaspberryPiにapacheを立てて、ここからha1control daemonをcgi経由で叩くようにしました。
外部との接続は別途作ることにして取り敢えずはLAN内でうまく動作するようにしていきます。

まずはRaspberryPiにapache2とphpをinstallします。phpは将来の拡張用です。

# sudo apt-get install apache2
# sudo apt-get install libapache2-mod-php5
# a2enmod rewrite

/etc/apache2/ports.confを編集してapache2のLAN内でのアクセス方法を設定します。

ServerName hogehoge.jp
NameVirtualHost *:47911
Listen 47911
<IfModule mod_ssl.c>
    Listen 47910
</IfModule>

あとで外部サーバーを立てるときのためにWANとLANで同じアクセスで出来るようにhttps経由にします。
ただRaspberryPiにはSiri-proxyのportもhttpsの443で開けているのでapache2側のhttpsのポートを他のところに移動します。どこでも構わないのですが今回は47910を使いました。
LAN内でのアクセス件debug用に47911にhttpのportも開けておきます。ここを開ける場合はLANのWiFiのSecurityをきちんと設定しないと危険です。

/etc/apaches/site-available/defaultの編集
<VirtualHost *:47911>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Includes ExecCGI FollowSymLinks
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                Options ExecCGI SymLinksIfOwnerMatch
                AllowOverride None
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


/etc/apaches/site-available/default-sslの編集
<IfModule mod_ssl.c>
    <VirtualHost *:47910>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www>
                Options Includes ExecCGI FollowSymLinks
                AllowOverride None
                Order allow,deny
                allow from all
                AuthUserFile /etc/apache2/htpasswd
                AuthName "HA-1 Control authentication"
                AuthType Basic
                require valid-user
                SSLOptions +FakeBasicAuth +StdEnvVars
                SSLRequireSSL
        </Directory>
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                Options ExecCGI SymLinksIfOwnerMatch
                AllowOverride None
                Order allow,deny
                Allow from all
                SSLOptions +StdEnvVars
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined

        SSLEngine on
        SSLCertificateFile    /etc/apache2/ssl/private_ha1server.crt
        SSLCertificateKeyFile /etc/apache2/ssl/private_ha1server.key
        SSLCACertificateFile /etc/apache2/ssl/ha1server_cert.pem
        SSLVerifyClient require
        SSLVerifyDepth  1

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>

   </VirtualHost>
</IfModule>

sslの設定を有効にします。
# a2ensite default-ssl
# service apache2 reload

RaspberryPiのIPアドレスが192.168.0.100だとすると、PCのbrowserで http://192.168.0.100:47911/ を開いた時に'It works!'のメッセージが表示されるのを確認します。

ここまで出来れば、とりあえずhttpアクセスのapacheの動作としてはOKです。
ha1control daemonへの接続とhttpsアクセスの設定についてはまた今度。

2013年6月26日水曜日

メール送信機能の追加


以前から雨センサーと東京アメッシュの情報から自動で電動窓を閉めるようにしていましたが、外出先で雨に気がついた時にちゃんと閉まっているのか不安になることがあり、閉めた時にメールで通知が来るようにしたのですが、たまたま、強い雨が来てメール通知が来たので動作検証出来ました。


アメッシュで強い雨が近づいてきています。そのときに登録したメールが届きました。


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環境に設定をあわせる必要がありそうです。


2013年4月14日日曜日

RP-1/RIR,HA-2/FCモジュールの赤外線リモコン出力制御プログラム

RaspberryPi+RP-1/IR基板でirremoteコマンドで学習させた赤外線リモコンコードファイルをXBee経由でRP-1/RIRモジュールやHA-2/FCモジュールに転送してIRリモコンを出力させるコマンドのソースコードです。

avrxbee.tgz

コマンドの使い方は

 usage : avrxbee <dev> <addrL> [h1on|h1off|h2on|h2off|hstat|<ir-file>]
で
<dev>はXBeeの接続されているuartのデバイスファイル。
RaspberryPi+RP-1/IRの場合は
  /dev/ttyAMA0
です。
<addrL>はリモート側のXBeeの64bitアドレスのうちの下位32bit
赤外線リモコン出力の場合はその次に記録した赤外線リモコンファイルを指定してください。

#define DEBUG
が定義されていると
[7e][00].....
と[]で囲まれているものが送信側のUARTのデータ
<7e><00>...
と<>で囲まれているものが受信側のUARTのデータを表示します。

2013年4月10日水曜日

iPhoneのWebアプリ


iPhoneのWebアプリ用にアイコンを色々と描いてみました。
適当に並べ替えをしやすいように単機能のiPhoneWebアプリをそれぞれ登録して、iPhoneのアプリフォルダの機能を使って整理できるような仕組みにしてみました。

暫くの間これで運用してみます。



2013年4月6日土曜日

HA-2モジュールのAVRマイコンのソースコード

HA-2モジュールのデバッグと動作検証がだいたい完了したのでソースコードを公開しておきます。
開発環境はMacのOS X 10.8.3 MountainLion 上で CrossPack-AVR-20121207とXCode上で開発しています。言語はC++です。Windowsの環境でも多分buildできるかと思います。

AVR_ha2.tgz   (<- gitに移行しました。HA2module)


main.ccはリセット直後に飛んでくるmain()関数からMainScheduler.Loop()を呼び出すだけのコードです。Scheduler classのloop()の中のwhile(1){}がメインループになります。
基本的には10ms周期のTickのタイミングか、何らかの割り込みが発生するまではsleepしています。
起きるとWatchDogをリセットし、PORTD6のHertBeatを1秒毎に点滅させる処理をしてXB.Wakeup()を呼びます。戻ってくるとまたsleepします。

XBee classはXBeeのコマンドの処理をするclassです。
コマンドを受け取るとそれを処理して結果をサーバーに返す処理をしています。
実際の通信処理はUsart classで行ない、取得したデータをQueue classで管理されるバッファに積んでいきます。
Usart classでは通信処理自体は割り込みで処理しSend/ReceiveFIFOでデータを管理します。

XBee classのコマンドで処理されるHA端子の制御はHAControl class, 赤外線リモコンの送信処理はIrOutput classで行います。
HAControl classの方は100ms程度の処理が最小なのでScheduler classでカウントしているTickCountを用いてタイミング管理をしています。
IrOutput classの方は38kHzの搬送波はTIMER0の8bit timerでPWMをfree runさせて作りoutputのみをコントロールします。TIMER1の16bit timerの方で次のon/off処理までの時間を設定し割り込みを発生させます。割り込み処理の中でSequenceNumberを進めながらAEHA, NEC, SONY, Otherの各赤外線リモコンシーケンスを発生させています。

コントロールサーバー側のRaspberryPiの赤外線リモコン記録時のOtherフォーマット用のコマンドバッファの最大値を1KBで作ったため、最大1KBのコマンドがやってくる想定でQueue用バッファを1KBに設定しています。このためstack,bss等も合わせてSRAMが1.5KB程度必要になりATmega328以上でないと動きません。
実際は256byteもいかないと思うのでもっと小さなものでも動くとは思いますが、値段差も数十円なので328を使用しています。