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 では、スイッチの操作で時間のかかる処理のコマンドで、一部動きがおかしいのもあるけど、スマホ版だと問題なく動くようなので、この画面はあくまで設定用かな。
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 で可能。
ラズパイのインタフェース名
自宅の raspberry-pi の設定を触っていて、何気に raspi-config を起動して設定を確認していたら、適当にポチポチさわってて、Network Options, N3 Network Interface Names の設定を触ったようで、再起動がかかったらネットワークがつながらない。
しかたがないので USBキーボードとHDMI のモニタつなげて、直接設定を触ろうとするものの、HDMI に信号が出てこない。
これでは、設定を触ろうにも何もできない。
raspi-config を使わないで設定を変更
もう raspberry-pi 単独では触りようがないので、micro-SD を外して、母艦のサーバで 起動時の設定を触ることとした。
間違って触った Network Interface Names は、古い eth0 などのインタフェース名でなく、enx112233aabbcc みたいな MAC アドレス を交えた新しいインタフェース名を使うような設定(predictable interface naming)。この機能が動き出したおかげで、インタフェースの初期化に失敗している。この設定を戻さないと。
$ sudo bash ((( raspberry-piの/bootフォルダをマウント ))) # mount -t vfat /dev/sdd1 /mnt デバイス名/sddの部分は要変更 ((( predictable interface naming を無効化 ))) # vi /mnt/cmdline.txt net.ifnames=0 ファイル末尾に追加 ((( sshサーバ機能を有効化 ))) # touch /mnt/ssh ((( HDMI の出力を有効化 ))) # vi /mnt/config.txt hdmi_safe=1 先頭の方のこの行をコメントアウト 低解像度のsafeモードでHDMIを設定 # umount /mnt ((( raspberry-piのrootをマウント ))) # mount -t ext4 /dev/sdd2 /mnt ((( ネットワークの設定ファイルを変更 ))) # vi /mnt/etc/dhcpcd.conf ...
んで、母艦で編集していた micro-SD を raspberry-pi に差し戻して起動。
Raspberry-Pi のファーム壊れた
Raspberry-Pi、ネットワーク越しに rpi-update してた途中でWiFi中継器のネットワークが切れてしまった。おかげでファームウェアの更新に失敗。どうもファームウェアがぶっ飛んだようで、起動しなくなった。タイミング最悪。
その RPi は、ITオンチな1F両親向けに、家族の予定をLED掲示板に表示させてるために使ってた。でも、買い替えるといっても RPi4 買うほどの処理じゃないしな。
難しい話抜きで、Google Nest 買った方が便利かな。でも、OK,Google、使いこなせないだろうしなぁ…
iphoneの検知難しい
大学でアパート住まいの子供が、帰っているのか確認するために、LINE beacon を置いて検知を試したけど、bluetooth を切って既読スルーなヤツなので、ほとんど検知することができない。
そこで、アパートでは無線LANルータを使ってるし Raspberry-Pi で、arpalert を使えば簡単に検知できるだろうと、実験中。でも iPhone はセキュリティ対策なのか、 arp の返答は必要最小限なので同じサブネットとはいえ、そのままでは通信の必要の無い raspberry-pi には、ARP 情報が送られてこない。また ping には返答しないようで、単純に ping で確認も困難。ということで単純な arpalert では検知が難しいなぁ。
定時処理で、”arping -c 1 -I wlan0 IPHONEのIPアドレス” を実行させて、強制的に ARP を送ってもらうか…
家族専用LINEボット
LINE本社で開催されていたハッカソンの引率をする中、自分でも家族専用のLINE-botを作ってみた。
LINEトークのメール転送
自宅では、家族のLINEグループを作っているけど、家に帰るといった連絡を親にも伝えたいことが多かった。しかし、両親そろってネット音痴でスマホを使いこなせないし、LINEを使うなんて無理。一方、我が家では、両親の居間のTVの脇に、LEDメッセンジャーを置いてあり、Raspberry-Pi をつないで家族のその日のスケジュールを表示するようにしてあった。さらに、Raspberry-Pi にメールを送ると、LEDメッセンジャーにメールのタイトル部を表示するようにしてあった。
そこで、今回、Webにあった LINE Messenger API を使った、オーム返しするボットのプログラムを参考に、特定のメッセージを、LEDメッセンジャー用のメールに転送させてみた。
実際に運用して、LINEボット経由で、LEDメッセンジャーに「今から帰る」を送ってみたけど、ちゃんとメッセージが伝わっていた。
LINE Beacon
ハッカソンでは、LINE Beacon を貸してもらえて、これも使ってみた。我が家では、お兄ちゃんが今年から大学でアパート住まいになったけど、慣れてくるとなかなか家に連絡をくれない。ママはアパートにカメラ置こうとか言うけど、それはお兄ちゃんも嫌がるよ。
ということで、大学の行き帰りぐらいが通知で送られてくるだけでも、ありがたい。LINE Beacon であれば、お兄ちゃんのアパートにBeacon を置いて Beacon の Enter イベントで LINE に push 通知すればいい。といっても、ハッカソン終了時に Beacon は返却だったので、早速 LINE Beacon を発注。
うまく活用できるようになったら、一人住まいの義母用にもう1個発注になりそう。
追記 2018/12/24 届いた
追記 2019/01/05 子供のアパートに設置
子供にも安否確認のための設置を理解してもらい、無事アパートに設置。
ただ、LINEをあまり起動しないのか、通知も少ないけど、家の出入りは確認できそう。
暑さの測定
以前購入した、Raspberry-Pi 内蔵の MZ-80C のミニチュアは、温度・湿度・気圧のセンサーを付けて、2Fのトイレに設置していたけど、WiFiが若干不安定だったので、常時サーバで記録はしていなかった。しかし、この暑さなので、エアコンの無い部屋の温度を測定したかったので、改めて設定してみた。
Raspberry-Pi の inetd の echo サーバの所に温度測定スクリプトを記載して、”/usr/bin/nc raspberry-pi 7″ で測定できるように設定し、munin 用のデータ取得スクリプトを書いて設定。このクソ暑い温度を測ってみた。
家の西側の2会のトイレに設置しているので、夕方が最高温度で、家の中でも34℃越え。湿度は、トイレのドアを開放すると、大きく変化するようだ。
cec-clientをhomebridgeから制御
今までは、iOS の HOME 機能を、linux環境で動くフリー実装の homebridge を使って、赤外線リモコンを制御していた。 しかし、AV機器のON/OFFでは、電源ボタンでON⇒OFFなのかOFF⇒ON なのか分からない。このため、ネットワーク対応の機器だし、 ping の結果に応じて 電源ボタン信号を出していた。
ただ、TVなどは、電源OFFの状態でも、EPG情報取得などのために OS が動いているため、OFF 状態の判定に失敗する。
そこで、先日見つけた HDMI 経由から制御信号を送る cec-client を試してみた。cec-client では、機器のON/OFF を判定しているので、 確実に ON/OFF できるはず。cec-client は、サーバ機では使えなかったので、 Raspberry-Pi を使ってみた。
$ echo "on 1" | cec-client -d 1 -s # 1番機器をON $ echo "standby 2" | cec-client -d 1 -s # 2番機器をOFF $ echo "scan" | cec-client -d 1 -s # 機器一覧をスキャン
device #0: TV ← REGZA address: 0.0.0.0 vendor: Toshiba osd string: TV power status: on device #1: Recorder 1 ← VARDIA address: 2.0.0.0← HDMI入力ソース番号 vendor: Toshiba osd string: RD-S502 power status: standby ← 電源状態 device #2: Recorder 2 ← Raspberry-Pi address: 1.0.0.0 vendor: Toshiba osd string: CECTester power status: o device #3: Tuner 1 ← CATV-STB address: 1.0.0.0 vendor: Panasonic osd string: Tuner 1 power status: on device #4: Playback 1 ← PS4 address: 3.0.0.0 vendor: Sony osd string: PlayStation 4 power status: standby
AVソースの切り替え
今までは、赤外線リモコン信号で、ON/OFF を制御していたので、 HDMI 連動設定をしているおかげで、ケーブルTVのチューナーON で、テレビの電源も ON となり、さらにビデオ入力も対象機器に 切り替わる。
ただ、cec-client に切り替えたら、機器の制御信号をだすのが、 別機器なので、TV電源連動や、ビデオ入力切替連動とならない。
しかたがないので、TVのビデオ入力切替信号も出してみる。
echo "tx 2f:82:10:00" | cec-client -d 1 -s # 2番のHDMIデバイス(raspberry-pi)から、 # 全デバイス宛て(f番)の信号で、 # 82 映像切替コマンドを送る。(TOSHIBA REGZAの場合) # 10:00 は、ビデオ切り替えの番号
HDMI経由で機器制御cec-client
最近は、TV操作はケーブルテレビのチューナーで 行うことが増えたけど、以前は入力切替とかが面倒だった。 でも、HDMI 経由で入力切替などの設定を行ったら、 チューナーの電源を入れるだけで、TVの電源ONや、入力切替を やってくれる。
これらの制御は、HDMI の CEC 機能らしい。 この機能を活用したら、赤外線リモコンでTV制御しているのを、 もっとスマートにできるのでは….としらべたら、 linux 環境では cec-client というのがあるらしい。
ということで、サーバのHDMI出力をTV経由で接続すれば、 その他のチューナーやレコーダを制御できるはず。
ただ、linux の グラフィック機能は、Intel のオンボード。 よくよく調べると、Intel は、"Never work"なんて記事も見つかる。
対応手段としては、Raspberry-Pi をつなげて、ラズパイのHDMI 経由で 制御ができるんじゃねぇ?
今日のところは、メモだけ。