「Home Assistantでshell commandを実行する方法がわからない」
「Home Assistantでシェルスクリプトを実行したい」
「shell commandで情報取得した内容をセンサー値として保持したい」
このように思っていませんか?
Home Assistantではシェルコマンドを実行することができます。これにより様々な複雑なことを行うことができます。
今回はHome Assistantでシェルコマンドを実行する方法やそのメリットと活用術を紹介します。
Home Assistantでshell commandを実行するメリットと活用術
Home Assistantでシェルコマンドを実行するメリットには以下のようなものがあります。
シェルスクリプトを実行してより複雑な処理の実行
シェルスクリプトを自前で作成し、それをコマンドで実行させることで複雑な処理を実行できます。
複数のセンサー値やファイルから読み取った値、Webから入手した情報などから何か計算を行い、その結果を基にHome Assistantでデバイスを操作するようなことが可能になります。
APIの実行(Webから情報取得)
コマンドを実行できるということはcurlコマンドなどを使用して、APIを実行することもできます。これによりWeb上の様々なデータや情報を取得し、Home Assistantに反映することができます。
センサー値等の履歴の保存し、解析の容易化
センサー値をファイルに書き込むようなコマンドを実行すれば、定期的に任意のセンサー値をファイルに出力することができます。
これにより複数のセンサー値の変化を時系列的に捉えることが可能になり、より複雑な判断ができます。
例えば、照度センサーがあったとします。照度センサーは外光の影響も受けやすく、朝と日中、夜や晴れの日と曇りの日など様々な要因で閾値を一意に決められないことがあります。そのような時に、センサー値をファイルに出力しておけば、センサー値の変動の解析と閾値の決定がしやすくなります。天気によって閾値を変えるということも可能です。
Pythonをフル活用可能
Home AssistantではPythonを実行するインテグレーション(統合)があります。しかし、この統合の場合、Pythonの機能が制限されます。まずモジュールがインポートできません。
しかし、シェルコマンドでPythonスクリプトを実行すれば、モジュールのインポートも可能になります。
このように、Python実行において制約を受けないのは大きなメリットになります。
Home Assistantでshell commandを実行する方法
コマンドを実行するにはconfiguration.yamlを編集する必要があります。
編集方法はアドオンのFile Editorで構いません。
以下は、configuration.yamlに追加する例です。
例えば、Home Assistantのログを別のログファイル「log_test.txt」に出力してみます。(なんて無意味なコマンドというのは置いておいてください・・・)
shell_command:
logcat: cat home-assistant.log >> log_test.txt
ここでlogcatというのはシェルコマンドのHome Assistant上の名前です。Home Assistantで実行するシェルコマンドを指定する場合はこの名前を使用します。(後ほど、実際に実行するときに理解できると思います)
cat home-assistant.log >> log_test.txtが実際に実行するコマンドです。
このコマンドはhome-assistant.logの中身をlog_test.txtに書き込むというコマンドです。
なお、複数のシェルコマンドをconfiguration.yamlに定義する場合は以下のように書きます。この例では、logcatの他に、call_remote, my_scriptという名前のシェルコマンドを定義しています。
shell_command:
logcat: cat home-assistant.log >> log_test.txt
call_remote: curl http://example.com/ping
my_script: bash /config/shell/script.sh
実行とレスポンス
試しに実行してみましょう。
Home Assistant画面から「開発者ツール」→「サービス」と進みます。
サービスの入力バーに「shell」と打ってみると、「Shell Command: logcat」と出てくるはずなので、これを選択します。
(このShell Commandの後のlogcatという文字列がconfiguration.yamlで定義した名前になっていることがわかると思います。)
そして、「サービスの呼び出し」をクリックします。すると実際にコマンドが実行されます。
実行した結果が応答欄に表示されます。このコマンドではファイルに書き込むので、出力は無く、returncode: 0が最終行に出てくれば問題ありません。
通常、実行結果はstdoutに表示されます。また、returncodeは0が正常終了を意味します。
注意点としては以下です。
- コマンドはconfiguration.yamlディレクトリ内で実行されます。
- Home Assistant Operating Systemを使用している場合、コマンドはhomeassistantコンテナのコンテキストで実行されます。
オートメーションで設定する方法
configuration.yamlに追加したシェルコマンドはオートメーションでも使用できます。
手順は以下の通りです。
- オートメーションの編集画面に移動
- アクション欄で「アクションを追加」
- 「その他のアクション」→「サービスの呼び出し」
- サービス欄に「shell」と打ち込み、「Shell Command:○○(configuration.yamlで設定した名前)」を選択
- (オプション)実行結果を変数に格納(後ほどのアクションで使用したいなど)する場合は応答変数にチェックを入れ、任意の変数名を設定
なお、トリガーや条件は必要な設定をしてください。
引数や応答変数の使い方
応答変数を使用する例を紹介します。
例えば、ファイルに保存されている文字列を読み込み、その結果をスマホに通知する例です。
ファイルの読み込みにシェルコマンドを使用します。どのファイルを読み込むかは引数で指定するとします。
最後に読み込んだデータをスマホに通知させます。
読み込むファイルは「todo.txt」とし、configuration.yamlと同じフォルダに事前に作成しておきます。中身は任意の文字列で問題ありません。適当に文字を打って保存しておいてください。
まず、configuration.yamlにシェルコマンドを定義する必要があります。
以下のように編集し、Home Assistantを再起動します。
shell_command:
get_file_contents: "cat {{ filename }}"
コマンドとしてはfilenameのファイルを読み込んでコンソール画面に出力するコマンドです。
次に、オートメーションを設定していきます。
トリガーは今回は例題ということで、1分ごとにオートメーションを実行するようにします。
- 「トリガーを追加」をクリック
- 「時間と場所」→「タイムパターン」
- 分の欄に「/1」と入力(スラッシュも必要です)
次に、本題のアクション欄を設定します。
- 「アクションを追加」をクリック
- 「その他のアクション」→「サービスの呼び出し」
- サービス欄に「shell」と入力すると「Shell Command: get_file _contents」が表示されるので選択
- 応答変数にチェックし、「todo_response」と入力(この「todo_response」にコマンドの結果が格納される)
コマンドが正常に実行されたか、エラーだったかで条件分岐させます。
- 「構成要素を追加」→「もしも(if-then)」
- もし(if)欄で「条件を追加」→「その他の条件」→「テンプレート」
- テンプレートに「{{ todo_response[‘returncode’] == 0 }}」と入力
- ならば(Then)欄の「アクション追加」→「通知」→「Send a notification via mobile_app_○○」(○○はアプリがインストールされているスマホの名前)
- message欄に「{{ todo_response[‘stdout’] }}」と入力
入力すると「この設定では、Visualエディタはサポートされていません。」と表示されますが問題ありません。
これで、todo_response内のreturncodeが0の場合に、スマホに通知するというアクションができました。
todo_responseのreturncodeは0の場合は正常終了を意味し、todo_response[‘stdout’]にコマンドの実行結果が格納されます。そのため、通知のmessage欄にはtodo_response[‘stdout’]と入力しています。
これを{{}}で挟んでいるのは、テンプレートのルールによるもので、{{}}で挟まれたものを変数と認識します。
次に、コマンドを実行してエラーだった場合の記述をしていきます。
- もしくは(Else)欄で、「アクションを追加」→「通知」→「Send a notification via mobile_app_○○」(○○はアプリがインストールされているスマホの名前)
- message欄に「{{ todo_response[‘stderr’] }}」と入力
todo_response内のstdoutがstderrに変わっているのに注意してください。
stderrはエラー内容を格納します。
以上でオートメーションの設定は完了です。
1分ごとにスマホにtodo.txtに記載した内容が通知されていれば成功です。
まとめ
いかがだったでしょうか?
今回はHome Assistantでシェルコマンドを使用する方法を紹介しました。
シェルコマンドで得た値をセンサー値としての使用やスイッチとしてONやOFFの時に特定のコマンドを実行することもできます。
その方法は別途紹介します。
他にもスマートホームやHome Assistantの記事を書いています。
初心者向けの記事や上級者向けの記事も揃えていますので、ぜひこちらもご覧ください。
コメント