UbuntuなMacbookair(2011)、WiFi動かず
以前に愛用していたMacbook Air(2011)だけど、性能不足からUbuntuを入れていたけど、ちょい Terminal として使おうと起動させたら、Ubuntuは立ち上がるけど、WiFiがつながらない。色々再起動もかけたけど、やっぱり起動せず。限界かなぁ…
どうも、アップデートでインストール時に入っていた WiFi のドライバが消えたみたい。macbookair の WiFi ドライバは、別途入れる必要があるみたいだな。
$ sudo aptitude install firmware-b43-installer bcmwl-kernel-source
ということで、無事 WiFi が復活。まだまだ、使い倒そう。
homebridge-gsh と cec-client
homebridge-gshで、google-homeからHomeKit(homebridge)を制御
自宅で homebridge-config-ui-x で、家電制御の設定が楽になり、homebridge-gsh にて、Google Home から Apple の HomeKit の制御を呼び出せるようにしてみた。今までは赤外線リモコンベースなので、テレビのON/OFFがトグル動作で怪しかったが、HomeKit 経由だと、TVにつなげた HDMI 接続のRaspberry-Pi から HDMI 接続の他の機器に、ON/OFF を明示的に制御ができるようになる。
cec-client で 電源ON/OFF ができなくなった
無事、homebridge-gsh が動き出したのに、CATVSTB の電源が ON/OFF できない。入力切替は正しく動いているのに…
cec-client の動作状況を表示させながらうごかすと、定番の 「echo “on 1” | cec-client -s」で動かない。メッセージを見ると、対象機器がうまく選べないのが原因みたい。
CEC では、物理機器番号と論理機器番号で管理されていて、物理機器番号が決まらないのに on はできない…といったのが原因みたい。cec-client のバージョンがあがり、その辺がいいかげんなコマンドが送れないようになったようだ。
しかたがないので、CEC-O-MATIC のページにて、他の方法を試すと、以下のコマンドなら、正しく電源のON/OFFができた。
$ echo "tx 26:36" | cec-client -s # チューナーをけす Recording2 → Tuner2 standby $ echo "tx 26:44:6C" | cec-client -s # Recording2 → Tuner2 User Control Pressed Power Off $ echo "tx 26:44:6D" | cec-client -s # Recording2 → Tuner2 User Control Pressed Power On
ということで、cec-client を呼び出す処理を、上記のコマンドを使うようにして、無事 google-home から HomeKit 呼び出しに成功。
google-home に、”NHK をつける” と話しかけると、homebridge-gsh 経由で homebridgeが呼び出され、「地デジ切替と1チャンネルの赤外線信号」をだすし、”チューナーを消す”と言えば、cec-client 経由でtx 26:44:6c を送ってチューナーの電源が切れる。超便利。
(追記)
“tx 2X:44:6D” による電源ONは、HDMIの電源連動機能が動かないみたい。”on Y” だと、(TVで連動ON設定が必要だけど)チューナーの電源を入れれば、TVも連動してONになっていた。しかし、”tx 2X:44:6D”ではテレビがつかない。TV側の連動機能を知らないうちにOFFにしたのかと思ったけど、リモコンでチューナーをつければテレビ付くし。
ということで、cec-client を使って電源操作するシェルスクリプトに、TVの電源ON動作を行う機能を追加しておいた。
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 では、スイッチの操作で時間のかかる処理のコマンドで、一部動きがおかしいのもあるけど、スマホ版だと問題なく動くようなので、この画面はあくまで設定用かな。
IFTTT利用を最小限に
IFTTT が 有料のIFTTT Pro のサービスに移行となり、無料契約だとアプレットを3つまでしか使えない。早々に、IFTTT からの警告メールが届き、10/7 までに契約すれば月額費用は、自分で決められるといった内容。
自宅では、Raspberry-Pi で動かしている機能や、赤外線リモコンを Google Home から制御するために、IFTTT にかなり依存していた。最近は Netflix とか Hulu とか、色々と契約しているし、出費とならないようにIFTTT 依存から脱却を図ろう。
arpに169.254.x.xが出てくる
自宅サーバの状況を見ていたら、169.254.185.142 という IP アドレスが ARP の一覧に出てくる。
MACアドレスを見ると、設置している Raspberry-Pi と同じ。
リンクローカルアドレス
以前にも同様のエントリーが出てきたことがあったので、改めて原因をしらべると、こちらに該当すると思われる解説記事。
DHCPの異常で、アドレスが得られない時に、暫定で割り振るIPアドレスみたい。その他の原因も考えられると説明があるが、実際数日間に DHCP の設定を触っていたから、出てきてもしかたがないかな。
間違ったARPエントリを消す
“arp -d 169.254.x.x”で、エントリーを消そうと思うがうまく消えてくれない。深く考えてもキリがないので、夜中にサーバの再起動させよう。
うまく消えないので、色々調べながら、以下のコマンドで消せた。
“ip -4 neigh del 169.254.x.x lladdr yy:yy:yy:yy:yy:yy dev eth0″
サーバダウン
朝起きて、”OK, Google” と叫んでも、”WiFiが繋がっていない”とのエラー。確認すると、サーバが落ちている。サーバでDHCPも動かしているので、サーバが落ちると家の中のネットワークが全部動かなくなる。それらしい時間 2020/08/20,01:15 頃の syslog などを確認するが、心配な log もあるけど、通してみると定常的な spam 系のアクセスっぽいので、原因不明。
サーバもそれなりに長期間運用しているので、新たに /var/log/trouble というフォルダを作って、syslog, messages, access.log, error.log などをコピーしておく。
WordPress 5.5 を適用
WordPressを触っていたら、version 5.5 が公開となったみたい。
新しい機能なのか、編集画面に URL 張り付けただけで、↓うまく引用してくれらぁ。
Google Home セットアップ中はiPhoneのProxyはオフ
Google Home アプリの設定を確認していたら、ファームウェアの更新みたいな表示が出たので Google Home mini の初期化(本体裏のスイッチ長押し)を行う。
# たぶん、これもproxy経由が原因だったんだろうな。
Google Home 初期化に失敗
普通に初期化を行うが、最終段階でエラーの表示で「…セットアップされているようですが、iPhoneからの通信に応答しませんでした。Google Home mini と iPhone が相互に通信出来ないネットワークに接続されている可能性があります…」といったエラーが表示され、初期化に失敗する。いろいろと試したが、失敗するが、ふと自宅内で Squid の キャッシュProxyサーバを運用しているのを思い出した…。
Proxyをオフにしたら、無事接続成功となった。
Proxy 自動設定Scriptの適用
他にも色々と試すと、Proxy設定がONだと、iPhone から Google Home mini へのストリーミングもできなくなっている。
最終的には、iPhone の WiFi 設定で、Proxy 設定の自動化で、Proxy設定のJavaScript(proxy.pac: 同じサブネット内は 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" ) ; ?>