homebridge-config-ui-x を入れる
Appleの家電制御のためのHomeKitと互換性のあるソフト homebridge だけど、以前より家電の赤外線リモコンで活用しているが、google home との連携もさせたくって、homebridge-gsh を入れようとしたが、nodejs のバージョンが古く、インストールに失敗していた。
Google Home Mini で家電を制御するために、iPhone に eRemote 用のアプリを入れて、制御もしているけど、テレビなどの電源ボタンがトグル動作で、ON/OFF を正しく認識しないので、操作性が悪い。homebridge では、テレビにつけた Raspberry-Pi から、cec-client を使って、電源操作や入力切替操作が行えるので、基本は homebridge ベースに切り替えたい。
インストール
今回、nodejs のリポジトリを nodejs の本家を使うように設定して、nodejs を最新の 12.x に上げる。合わせて、設定ユーザインタフェースが便利な、homebridge-config-ui-x を入れてみた。
# リポジトリを登録 $ curl -sL https://deb.nodesource.com/setup_12.x | sudo bash - $ sudo aptitude update ; sudo aptitude safe-upgrade # Node.js のインストール $ sudo aptitude install -y nodejs $ sudo npm install -g npm # homebridge-config-ui-x のインストール $ sudo npm install -g homebridge-config-ui-x
config-ui-x を使えば、config.json の編集機能があるし、その編集も各モジュール単位で編集もできるので便利。一部のモジュールは、config.json で触る必要があって、その切り分けで手間取った。
この Web-UI では、スイッチの操作で時間のかかる処理のコマンドで、一部動きがおかしいのもあるけど、スマホ版だと問題なく動くようなので、この画面はあくまで設定用かな。
WatchOS7のx-callback-urlの検証
うーむ、WatchOS7の x-callback-url って上手く動かないのかな。
iOSであれば、ショートカット機能で x-callback-url を実行して、実行先で
header( "Location shortcuts://x-callback-url/run-shortcut?name=ショートカットの名前" ) ;
を実行すると、指定したショートカットを起動するし、
header( "Location shortcuts://x-callback-url/open" ) ;
を実行すれば、ショートカットに戻ってくれる。
かといって、「ショートカットの終了」が起動するように、別のショートカットを作っても、起動していたショートカットを終わらせることにはならないみたいだな。
でも、WatchOS7 だと、上記を実行しても、Webを開く画面を表示して何も表示されない画面のまま。いちいち「閉じる」を押さないとダメ。
ということで、Safari の URL を開く+ショートカットの終了の合わせ技にしておくのが一番無難なのか。
Watch OS 7 のWeb表示
Watch OS 7になって色々試しているけど、何気にiPhoneで起動しているショートカットをApple Watchで動かしたら、それなりに JavaScript 入っている自作ページだけど動くじゃん。
# 下に追記したけど、Webページの閲覧機能(クイックルック)をショートカットから呼出すのは避けるべきとのことであった。
家電リモコン操作が、Apple Watchで使えるぞぉ… (^_^;
コンプリケーションにショートカットを設定すれば、簡単にアプリ起動やらページ閲覧やらを起動できるので、ランチャとして使える。
問題点の追記(2020/09/30)
ショートカットを使って、LINEに固定メッセージを送る実験をしていると、メッセージが2回送られている。同じショートカットをiPhoneで動かすと1回だけ。LINEにメッセージを送るプログラム側の問題かと思ったけど、一番シンプルなページアクセスのショートカットを使ってWebサーバのログを確認したら、やっぱり2回連続してページアクセスをしている。
色々と調べていたら、「複雑なショートカットのショートカットアクションについて」を見ると、ショートカットからクイックルック機能を呼出すのは「避けるように」とのことであった。なるほど、不具合ではないのか。Web閲覧とクイックルックは別機能だな。
2回の連続アクセスだったら一方を無視させようと、flock() とかを使ってみたが、1回目のアクセスの完了を待ってから2回目のアクセスを行っているみたいで、なかなか面倒。
WatchOS7は x-callback-url が違う?
WatchOS7 が公開されて、Apple Watch単独でショートカットを実行できるということなので、自分用に動かしているショートカットを試してみた。ただ、どれも動かなかった。
職場の中で自分のサーバに http:// で動くショートカットだけど、reverse-proxy の内側なので、SSL公開鍵が使えないため、http は危ないから…ということでダメ。
自宅で動かしているショートカットは、https:// で呼び出した後、x-callback-url でショートカットに戻るようにしてあるけど x-callback の仕組みが違うのか、制御がショートカットアプリに戻ってくれない。ショートカットが終了扱いにならないので、使い辛いなぁ…
Microsoft Authenticator が Apple Watch でうまく認証ができず内部エラーが発生するけど、この辺も同じような理由なんだろうなぁ…
Apple WatchのProxyダメだな
最近、少しでもキャッシュの効果が出ることもあるかと、squid のキャッシュproxyを動かしていた。
また、自宅内アクセス時に、proxyがかかると、不都合もあったので proxy.pac の自動設定を設定したけど、その頃からApple Watchの天気のコンプリケーションが表示されなくなった。
どうもproxy.pacをうまく処理できないのか現在地情報がとれないようで、天気情報が出てこない。
ということで、iPhoneでApple Watch使うなら、proxyは使っちゃダメだな。
IFTTTのwebhooksトリガーでLINEメッセージ送信
家に帰る時に、家族のLINEに「今から帰る」とメッセージを送りたいんだけど、iOSのショートカットだと、メッセージ文面をいちいち入力する必要がある。そこで、LINEのメッセージ送信は、IFTTT に任せることにして、スマホでショートカットなり、ショートカットのオートメーションから、LINEメッセージ送信を起動したい。
また、IFTTTの JSON形式を返すWebhook trigger だと、safari が開いたままになるので、webhook trigger を起動し、x-callback-url を返す trigger ページを作ってみた。
<?php // IFTTTのwebhookトリガを呼出す // x-callback-url の機能で呼び出し側(shortcut)に戻る // ifttt webhook url $ifttt_webhook = "https://maker.ifttt.com/trigger/%s/with/key/xxxxxxxxxxxxxxxxx_xxxxxx" ; $mykey = "yyyyyyyyyyyyyyyyyyyyyy" ; // パラメータを読み込む $key = isset( $_GET[ "K" ] ) ? $_GET[ "K" ] : "" ; $command = isset( $_GET[ "C" ] ) ? $_GET[ "C" ] : "" ; $json = file_get_contents( "php:input" ) ; // 想定外の接続は無視 if ( $_SERVER['HTTPS'] != 'on' || $key != $mykey ) exit( 1 ) ; // 時間によるwebhook呼出し制限の前処理 $localtime = localtime( time() , true ) ; $l_hour = $localtime[ "tm_hour" ] ; $l_week = $localtime[ "tm_wday" ] ; // webhookの呼出し function post_webhook( $trigger , $json ) { global $ifttt_webhook ; $url = sprintf( $ifttt_webhook , $trigger ) ; $opts = array( 'http' => array( 'method' => 'POST' , 'header' => 'Content-type: application/json; charset=UTF-8' , 'content' => $json ) ) ; $context = stream_context_create( $opts ) ; header( "Content-Type: application/json; charset=utf-8" ) ; // x-callback-urlで処理後はショートカットに戻す header( "Location: shortcuts://" ) ; // IFTTTのtriggerを呼出す print file_get_contents( $url , false , $context ) ; } // GETパラメータで呼び出しするwebhookを切り替え if ( $command == "go_home" ) { // ショートカットからの呼出し用 // go_homeリクエストを中継 post_webhook( "go_home" , $json ) ; } else if ( $command == "go_home_time" ) { // オートメーションからの呼出し用 // 平日の帰宅時間のみ中継 if ( 17 <= $l_hour && $l_hour < 21 && 1 <= $l_week && $l_week <= 5 ) post_webhook( "go_home" , $json ) ; else exit( 0 ) ; } else { exit( 1 ) ; } header( "Content-Type: application/json; charset=utf-8" ) ; ?>
homebridge-peopleの設定
homebridgeの記事を探していたら、homebridge-people を見つける。ping の結果を、人感センサーの ON/OFF 情報として扱うことができる。ping のホスト名をスマホのIPアドレスを指定すれば、自宅に居る/居ないとして把握できる。
$ sudo npm install -g homebridge-people
$ emacs .homebridge/config.json "platforms": [ { "platform": "People", "threshold" : 15, "anyoneSensor" : false, "nooneSensor" : false, "webhookPort": 51828, "cacheDirectory": "./.node-persist/storage", "pingInterval": 10000, "ignoreReEnterExitSeconds": 0, "people" : [ { "name" : "斉藤徹", "target" : "iphonex-tsaitoh", "threshold" : 15, "pingInterval": 10000, "ignoreReEnterExitSeconds": 0 } ] } ]
本当は、ホームハブを導入することで、Home のオートメーションと連動させて、○○が家に帰ったら、○○するといったことができるんだけど、ホームハブが無いのでできない。そうなってくると、HomePod が欲しくなってくる。
HomeKit/homebridgeをラズパイで再開
一時期、google home notifier のインストールで削除した Siri を使うための HomeKit 互換の homebridge を raspberry-pi の上に再インストールを行った。
Google Home Mini を喋らせるためにインストールした google home notifier では、node.js を使うため(あとで問題がないと分かったけど)に、一旦機能を止めていたけど、機能の競合の起こりにくい raspberry-pi に暇つぶしも兼ねて homebridge を入れる。
インストールにあたり、赤外線リモコンの制御の python-broadlink を raspberry-pi にインストールしたので、単独でテレビのON/OFF/ビデオ入力切替の cec もあるから、サーバを活用しなくても済む。
手順は、過去の自分のインストールメモを参考。ちょっと手間取ったけど。
ということで、
- テレビ,チューナー,PS4のON/OFF
- 2つの照明のON/OFF
- 室内/室外の温度計の表示
が、Hey, Siri で可能。