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

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をつけて’を検索に行ってしまう
と言った感じです。


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月4日月曜日

node.js foreverをRaspberryPi起動時に自動起動するように設定する

node.jsをRaspberryPiでnvm管理下で使っていたのですが、サービスを常時動かしておこうとするとforever等で管理することになります。
ところが、foreverはinit.dに登録されているわけではないのでRaspberryPiを再起動すると自動で動いてくれません。
最初nvmを使ってnode.jsをinstallしていたのですが、nvmだと自分のアカウントのhomeの.nvmというディレクトリ以下に色々とinstallされてしまいシステムの起動スクリプトに記述するには気持ち悪い事になってしまいます。(まぁ、そこはそういうものだと割りきってしまっても良いのですが)
nvmは開発用の環境であって運用のための環境ではないということかと思います。
次に考えたのはapt-getでnode.jsをinstallすることですが、versionが0.10.29と古いため結局試行錯誤の末node.js自体はnodejs.orgのDOWNLOADSのLTSのv4.2.4を入れることにしました。
今回は/usr/local/にダウンロードしてきたイメージを展開して/usr/local/nodeにシンボリックリンクを張って運用しています。
ダウンロードの実体は/usr/local/node-v4.2.4-linux-armv7l/以下に展開されて、そこに/usr/local/nodeからシンボリックリンクされているという形です。
$ PATH=/usr/local/node/bin/:$PATH
とpathを通してから
$ npm install -g forever
でforverをinstallします。
これでnode, npm, foreverが準備出来たので、次に/etc/init.d/に起動スクリプトを用意します。

以下の例は/etc/init.d/ha1observerという名前で/var/ha1/ha1observer.jsにパラメータを付けて起動するためのものです。

-----
#!/bin/sh

### BEGIN INIT INFO
# Provides:          ha1observer.js
# Required-Start:    $network $syslog
# Required-Stop:     $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: forever running ha1observer.js
### END INIT INFO

USER=ha1observer
SCRIPT=/var/ha1/EventValidate.js
PIDFILE=/var/run/ha1observer.pid
LOGFILE=/var/ha1/ha1observer.log
PATH=/usr/local/node/bin:$PATH
FOREVER=/usr/local/node/bin/forever
NODE=/usr/local/node/bin/node
NODEAPP=/var/ha1/HA1Observer/ha1observer.js

start() {
  $FOREVER start --pidFile $PIDFILE -l $LOGFILE -a -d -c "$NODE $NODEAPP -u $USER -f $SCRIPT"
  RETVAL=$?
}

restart() {
  $FOREVER restart $NODEAPP
  RETVAL=$?
}

stop() {
  $FOREVER stop $NODEAPP
  RETVAL=$?
}

status() {
  $FOREVER list
  RETVAL=$?
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    restart
    ;;
  *)
    echo "Usage:  {start|stop|status|restart}" >&2
    exit 1
    ;;
esac
exit $RETVAL

-----

ha1observer.jsは起動後に-uで渡されたユーザーにprocess.setuid()で切り替えて実行されます。
init.dからはrootで実行されるのでsetuidしないと色々と危険です。
これを準備したあと
$ update-rc.d ha1observer defaults 3 1
を実行することでrc?.dにシンボリックリンクが張られます。
再起動して
$ ps aux | grep ha1observer
で確認するときちんと実行されていることが分かります。