ふらふらぶろぐ

くだらないものを作ってます。

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" : 1

alwaysoff.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の画面共有接続用パスワードを入力すると、次の画面が表示されリモート接続が完了します。

↓ ラズパイの画面が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を選んで再起動しておいてください。


日本語フォントの変更

  1. フォントの変更
    デフォルトでは「直」「反」などが中国語になっているので、変更します。

    Fabshopの記事を参考に、フォントをGoogleからダウンロードしてインストールします。

    左上のラズパイアイコン→設定→外観の設定

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

    タスクバー→サイズ から 中(24x24) を選択する

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

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