homebridge-cmdswitch2 の state_cmdとpollingの意味
Homebridge-cmdswitch2のconfig.jsonに、on_cmdとoff_cmdとstate_cmd、polling と interval が設定できる。
on_cmd, off_cmd, state_cmdとは
on_cmd : iphone「ホーム」アプリで、機器をON操作された時に実行するコマンド
off_cmd : iphone「ホーム」アプリで機器をOFF操作された時に実行するコマンド
state_cmd : テレビなど操作したい機器がONかどうかを確認するためのコマンド
{
"platform": "cmdSwitch2",
"name": "cmdSwitch2",
"switches": [
{
"name": "ワールド",
"on_cmd": "bash /home/rak/source/ir_remote/nhkworld.sh",
"off_cmd": "bash /home/rak/source/ir_remote/inputsource2tv.sh",
"state_cmd": "bash /home/rak/source/ir_remote/ping2firestick.sh",
"polling": true,
"interval": 15
}
]
}inputsource2tv.sh
bash ping -c 2 -W 1 192.168.11.38 | grep -i '2 received'
state_cmdでpingを実行する理由は、機器の電源がONならpingが返ってくるので、機器の電源が入っているとみなせるため。
Amazon fire stick TVなど、電源を基本的にオフにしないデバイスにpingを実行すると、必ずON状態を返すのでstate_cmdには不適。(ホームアプリでOFFにしても、機器の電源は入っているのでアプリ上の表示が勝手にONに戻ってしまう)
■ ping -c 2 -W 1 の意味
-c 回数:指定した回数分のパケットを送る
-W 秒数:タイムアウトを指定する(-W 1と設定すると、pingを送っても機器にたどり着けない時は1秒でタイムアウトさせる)
■ grep -i '2 received'の意味
-i 検索正規表現
大文字と小文字を関係なく、''内に一致する行を抜き出す。
(上記なら2 receivedが含まれている行を抜き出す)
pollingとintervalとは
polling:機器がONかどうか確認するstate_cmdを定期的に実行すること
interval:定期的に実行する間隔
timeoutとは
Homebridgeを再起動した時など、「ホーム」アプリとラズパイが通信できなくなっても、timeoutで設定した時間は「応答なし」と表示しない
シェルの中のexit 0とexit 1の意味
config.jsonに以下を設定し、
"state_cmd" : "bash /home/rak/source/.../alwaysoff.sh",
"polling" : true,
"interval" : 1alwaysoff.shに exit 1 と書いて保存する。
exit 1
exit 1:「ホーム」アプリのスイッチをoffに切り替える
exit 0: onに切り替える
一般的には、exit 1はコマンド実行した結果が失敗、exit 0は成功を意味する。
1秒ごとにstate_cmdで設定したalwaysoff.shが呼び出され、「ホーム」アプリのスイッチをoffに切り替える。
よって、「ホーム」アプリからスイッチをonに切り替えても、すぐにoffに戻る。
Raspberry Pi SDカードのバックアップ
ここまで環境構築できたところで、SDカードをバックアップしておく。
PCにSDカードのイメージを保存する方法もあるが、PCの容量を圧迫することと、イメージの未使用領域を圧縮するにはひと手間かかるので、直接新しいSDカードにバックアップする方が簡単と思う。microSDは最近安価だし。
新しいSDカードをラズパイのUSBポートに挿入する。左側のmicroSDアダプタで当初試したが、"Could not create partition"エラーが出て途中で止まったり、"Copy complete."と表示されコピー後のSDカードでは起動しなかった。右側のUSBアダプタでは正常にコピーできた。


ラズパイアイコン → アクセサリ → SD Card Copier を起動する。

New partition UUIDsにチェックを入れておく。
理由:Raspbian Stretch以降のバージョンでは、同じUUIDで2つのパーティションをマウントできないため、複製元のディスクから起動したときに、複製されたSDカードをマウントできません。これを行う必要がある場合は、コピーする前に[新しいパーティションUUID]チェックボックスをオンにしてください。
- Copy From Device:ラズパイにコピー元のmicro SDカード /dev/mmcblk0
- Copy To Device:USBポートに挿したコピー先のmicro SDカード /dev/sda
Startをクリックすると、This will erase all content on the device 'Mass Storage Device'. Are you sure?と聞かれるので、USBポートに挿したmicro SDカードの中身が空であることを確認して Yes を選択する。

容量が小さいせいか、Copy completeと表示され数分でコピー完了。コピー後のSDカードで起動できることを確認しておきましょう。
Raspberry Pi 外付けデバイスなしのフルリモート インストール方法(1)
ラズパイを最初に買ったのは2014年頃。モニターを運んできてキーボードとマウスを準備して小さなラズパイに繋ぐまでが面倒で、結局使うのをやめてしまいました。
その後、電源だけラズパイに繋げば、Wi-Fi経由でいつも使っているPC、キーボードとマウスでラズパイがリモートで動作することを知り、ハードルが一気に下がりました。
ケーブル接続なしで使うことをヘッドレスというようで、「ラズパイ ヘッドレスインストール」でググると色々出てきます。

ラズパイのヘッドレスインストール方法は、いろんなブログやwebに紹介されていますが、自分への備忘録として残しておきます。
事前準備
- microSD 16GBを準備
後々SDカードの中身をバックアップする時に、新しいSDカードにコピーする場合は32GBでもOKです。注1:もしPCにバックアップする場合は、ハードディスクにSDカード分の空き容量が必要なので、PCの容量を圧迫します。
注2:32GB以上のSDカードをフォーマットする場合は、FAT32形式を選択してください。(参考) - donchanさんのブログに書かれている「機器を接続してRaspberry Piを起動する」までを実行します。「ログインパスワードを変更する」以降は、最新版のRaspberry Pi Imagerでは画面が異なるため、以下の手順で進めます。
ログインパスワードの変更、言語設定、リモート接続有効化、解像度設定
Macからターミナルを起動し、sudo raspi-config と入力します。
パスワードは後でも設定画面が出てきますが、初期パスワード(raspberry)は脆弱なので、早めに新しいパスワードを設定しておきましょう。
1 System Options を選択

S3 Password を選択
You will now be asked to enter a new password for the pi user
という画面が表示されるので、< Ok > を選択
New password: と表示が出たら、新しいパスワードを入力し、確認用にもう一度入力します。すると以下のようにパスワードが変更されました。

5 Localisation Options → L1 Locale を選択

ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8 の2つにチェックを入れ、< Ok > を選択

ja_JP.UTF-8 を選択し、< Ok > を選択

3 Interface Options を選択

P3 VNC を選択

Would you like the VNC Server to be enabled? と聞かれるので、< Yes > を選択します。
このままでは、Macからリモート接続した時に、エラーメッセージ "Cannot currently show the desktop" が表示されるので、合わせて解像度も設定しておきましょう。
2 Display Options > D1 Resolution > DMT Mode 85 1280x720 を選択(お好みで)

以上でRaspi-configによる設定は終了なので、< Finish >を選択します。再起動するか聞かれますが、続いて設定すべき項目があるので、< No >を選択します。
コマンドプロンプトに戻るので、ifconfig と入力し、ラズパイのipアドレスを調べておきます。Wi-Fiの場合はwlan0のinetの右側 192.168.xx.xx がラズパイのIPアドレスです。

続いて(macのターミナルからssh経由でラズパイにログインした状態で)以下を実行します。viエディタはカーソルの使い方が独特なのでnanoを使用していますが、viでももちろん構いません。
$ sudo nano /root/.vnc/config.d/vncserver-x11

Authentication=VncAuth を末尾に追加し、Ctrl-O → Enter → Ctrl-Xで保存して終了します。
続いて、以下を実行し、画面共有接続用のパスワードと確認用パスワードを入力します。
$ sudo vncpasswd -service
Successfully set "Password" VNC parameter in /root/.vnc/config.d/vncserver-x11 と表示されればOKです。
次に、sudo rebootと入力してラズベリーパイを再起動します。
pi@raspberrypi:~ $ sudo reboot
Connection to raspberrypi.local closed by remote host.
Connection to raspberrypi.local closed.
と表示されますので、Macのターミナルは閉じておいてください。
Raspberry Piへのリモート接続と初期設定の続き
数分経ってラズパイが再起動した頃に、Macで、command + K で「画面共有」を開き、 以下のようにvnc://raspberrypi.local/ または、vnc://192.168.xx.xx/ (先ほどifconfigで調べたIPアドレスを入力)し、接続します。

パスワードを聞かれたら、先ほどvncpasswdで設定したmacの画面共有接続用パスワードを入力すると、次の画面が表示されリモート接続が完了します。
初期設定と更新プログラムのアップデート
Next を押すと、Set Countryの画面が表示されるので、
Country: Japan
Language: Japanese
Timezone: Tokyo
を確認し、Nextを押下します。
次にパスワードの設定画面に映りますので、先ほどRaspi-configで設定したパスワードを入力しておきます。
この時、Ctrl + Spaceを押して、Macからの入力文字が「英字-かな入力」であることを確認しておいてください。(Hide characterのチェックを外すと、入力したパスワードが確認できます)

WiFi Networkの選択画面が表示されるので、先ほどdonchanさんのブログに従って設定した家庭内WiFiが選択されていることを確認し、Nextを押します。
Update Softwareが表示されますので、Nextを選択します。

タイムゾーンの設定やアップデートを実行しておきます。(アップデートにはRaspberry Pi 4でも数十分かかります。System is up to date が表示されたら終了です)
Setup Completeと表示されるので、Restartを選んで再起動しておいてください。

日本語フォントの変更
- フォントの変更
デフォルトでは「直」「反」などが中国語になっているので、変更します。Fabshopの記事を参考に、フォントをGoogleからダウンロードしてインストールします。
左上のラズパイアイコン→設定→外観の設定

システム→フォント から Noto Sans CJK JP Lightの10ポイントに変更する

タスクバー→サイズ から 中(24x24) を選択する
続いて、LX Terminalのフォントも変更する
LX Terminalを開き、編集(E) → 設定(S) を開き、PalleteでTangoを選び、背景色を白に変更。全景色を黒に近いグレーに設定。合わせてフォントもNoto Mono Regularの10ポイントに変更する。(お好みで)

変更後のイメージはこちら
