LoginSignup
12
9

More than 1 year has passed since last update.

Homebridge-CMD4の使い方

Last updated at Posted at 2019-10-01

Homebridge-CMD4とは?

homebridge-cmd4 - npm

Homebridge-CMD4とは、任意のコマンドをHomekitアクセサリのように登録し、実行可能になるプラグインです。
特長としては、Homekitのほぼすべてのアクセサリに対応しており、Homekitによって提供されるSiriでのコントロールなどの恩恵を最大限受けることが可能です。
Homekit_screenshot.png

インストール

Homebridge本体は既にあるものとします。

Step1 Homebridge-CMD4のインストール

State.jsについては後ほど解説します。

sudo npm install -g --unsafe-perm homebridge-cmd

Step2 State.jsのインストール

mkdir $HOME/.homebridge

mkdir $HOME/.homebridge/Cmd4Scripts

cp /usr/lib/node_modules/homebridge-cmd4/Extras/Cmd4Scripts/State.js $HOME/.homebridge/Cmd4Scripts/

cp /usr/lib/node_modules/homebridge-cmd4/Extras/Cmd4Scripts/CheckYourScript.sh $HOME/.homebridge/Cmd4Scripts/

chmod 700 .homebridge/Cmd4Scripts/State.js

Homebridge-CMD4の基本概念

config.jsonの記述

Homebridge-CMD4も他のHomebridgeプラグインと同じように、config.jsonに設定を記述することで利用できます。
公式ページに載っているPS4の例を用いてこのプラグインの利用の基本について解説します。
こちらがそのconfig.jsonです。

config.json
  ...
   {
      "platform": "Cmd4",
      "name": "Cmd4",
      "accessories":
      [
         {
             "type": "Switch",
             "name": "PS_4",
             "on": false,
             "state_cmd": "bash .homebridge/Cmd4Scripts/PS4.sh"
             "polling": true,     <OR>
             "polling": [{"on": false, "interval": 5, "timeout": 4000}
                        ],
             "interval": 5,
             "timeout": 4000,
          }
      ]
   }
   ...

platform及びnameはHomebridgeの基本動作に必要なものですからそには触れずに、accessories以下にどんどん書き加えて増やしていく形になります。
利用可能なアクセサリー一覧はこちらにあります。
そして、このconfig.jsonで重要なのはstate_cmdのみです。
デバイス上からHomekitアクセサリを実行した時、実行されるのは上記の例ではbash .homebridge/Cmd4Scripts/PS4.shだけです。

つまり、このプラグインではstate_cmdに設定したシェルスクリプトに、引数によってONにするかOFFにするかを与え、シェルスクリプト 内のif文によって実行するコマンドを変化させるのです。

state_cmdについて

ではサンプルのPS4.shを見てみます。

PS4.sh
#!/bin/bash 

# Notes 
# 1) This script is called as defined by the config.json file as: 
#    "state_cmd": "bash .homebridge/Cmd4Scripts/PS4.sh" 
#    $1 = 'Get' 
#    $2 = <Device name>    DO NOT USE SPACES IN DEVICE NAME. It causes problems parsing the command line. 
#    $3 = <Characteristic> 
#    $4 = <Device option> 
# 
# 2) For a set of On, the command issued would be: 
#    bash $HOME/.homebridge/Cmd4Scripts/PS4.sh Set PS_4 On false 
#       or 
#    bash $HOME/.homebridge/Cmd4Scripts/PS4.sh Set PS_4 On true 
# 
# 3) For a Get of On, the command issued would be: 
#    bash $HOME/.homebridge/Cmd4Scripts/PS4.sh Get PS_4 On  
#   
#    Homebridge-cmd4 will interpret the result of false to be 1 
#    and true to be 0 so either 0/1  or true/false can be returned. 


# echo "\$1='$1' \$2='$2' \$3='$3' \$4='$4'" 

# This is only here for the first run. 
if [ ! -f "/tmp/fileVariableHolder" ]; then
   echo "0" > "/tmp/fileVariableHolder"
fi

if [ "$1" = "Get" ]; then
   # This line is commented out and would be 
   # interchangeable with ps4-waker. It is here 
   # as an example 
   # ps4-waker search | grep -i '200 Ok' 
   cat /tmp/fileVariableHolder
   rc=$?
   if [ "$rc" = "0" ]; then
      exit 0
   else
      echo "failed"
      exit -1
   fi
fi

if [ "$1" = "Set" ]; then
   if [ "$3" = "On" ]; then
      if [ "$4" = "true" ]; then
         # This line is commented out and would be 
         # interchangeable with ps4-waker. It is here 
         # as an example 
         # ps4-waker 
         echo $4 > /tmp/fileVariableHolder
         exit $?
      else
         # This line is commented out and would be 
         # interchangeable with ps4-waker. It is here 
         # as an example 
         # ps4-waker standby 
         echo $4 > /tmp/fileVariableHolder
         exit $?
      fi
   fi
fi


exit -1

Notesに書いてあることが全てです。

実際にどのようにこのシェルスクリプトが呼ばれるかというと、例えば、
PS4をONにする時、

./PS4.sh Set My_PS4 On true

OFFにする時

./PS4.sh Set My_PS4 On false

また現在の状況を得る時は

./PS4.sh Get My_PS4 On

のような形で実行されます。

config.jsonstate_cmdに設定されたPS4.shが実行された時、まず最初の引数としてGetまたはSetが渡されます。
Getは特に頻繁に呼び出され、現在の状況を返します。
起動時などに必ず実行されます。
Setはステータスを変化させる際に呼ばれます。

その次の引数はデバイスの名前です。あまり気にしなくても良いかと。

三番目のOnについてですが、ここでは必ずOnになっています。
Set My_PS4 on Set My_PS4 offとした方が分かりやすいのにこれでは冗長です。
ここの値はcharacteristicと呼ばれていて、今回はPS4の電源を切るかつけるかの二つしかないのでこうなりましたが、例えば明るさを変更できる照明のコントロールをする時などは、

./light.sh Set My_Dimmable_Light Brightness 40

のように、characteristicBrightnessが与えられてるのがわかると思います。
これを踏まえると、ここにOnがあるのは自然な事であることが分かります。

Getされた時のコマンドと、Setされた時のコマンドをONとOFFで2パターン用意して、if文の中にif文入れてつらつら書いていけばいいです。

また、処理に成功したか失敗したかは必ず返すようにしましょう。
ここはちゃんとみられているので、ちゃんと返さないとデバイス上からは応答なしとか言われちゃいます。

さらに、先ほどの明るさを変更できる照明のコントロールをする時

./light.sh Set My_Dimmable_Light Brightness 40

だと、終了するexit 0の前に、echo 40をなどを実行して、ちゃんと設定したその値も返してあげないといけません。

終わりに

PS4を例に取った基本的な概念の解説は以上になります。
ここでようやくインストールしたStare.jsの解説なのですが、ここにはすべてのcharacteristicとその使用法が記述されています。
これを読んで、state_cmdで呼び出されるプログラムを書いて実行する、というのが基本です。
また感の良い方や公式のドキュメントに目を通した方は気づいているかもしれませんが、このPS4.shなどは別にシェルスクリプトである必要は全くありません。
python3 ~/.homebridge/Cmd4Scripts/PS4.pyみたいなんでもOKです。

私が作った冷房をコントロールするためのプログラムをこちらに置いとくので、参考になるかは全く分かりませんが、もしよければご活用ください.
改善したらなんかかんか投げつけてください。

本日はお読みいただきありがとうございました。

12
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9