Home Assistant とは、オープンソースのホームオートメーション管理ソフトウェア。
- スマートホームのコントロールセンター(ハブ、コーディネーターなどとも呼ばれる)機能
- Amazon Alexa や Google Assistant と連携できる
- WebベースUI および スマホアプリベースUI
- ローカルのPCやSBC(RaspberryPiなどのシングルボードコンピューター)で実行
- ローカルで動作するのでセキュリティやインターネット障害に強い
- Apache ライセンス
cf., 家電や電気メーターを一元管理し操作の自動化も可能なオープンソースのホームオートメーション「Home Assistant」 - GIGAZINE
https://gigazine.net/news/20210926-home-assistant/
今回は、いろいろ実験をするための基本構成として Raspberry Pi にインストールし、WebベースUIを確認してみます。更に、同じ RaspberryPi のGPIOをコントロールできるようにして、Lチカ(LED点滅)を実現してみます。エンドデバイスを繋ぐ処理をしなくても動作テストができるようになります。
環境
- Raspberry Pi model B
- Raspberry Pi OS Lite
Release date: January 28th 2022
System: 32-bit
Kernel version: 5.10 - Home Assistant 2022.2.1
なお、Home Assistant をRaspberryPiにインストールする方法として、
- Home Assistant Operating System
- Home Assistant Container
- Home Assistant Core
がありますが、
https://www.home-assistant.io/installation/raspberrypi
今回は Docker でインストールする方法の 「Home Assistant Container」にしてみます。
事前準備
RaspberryPi に対し以下の作業は終わっているものとします。
- Raspberry Pi OS Lite インストール
- IPアドレスの同定 (dhcp)
- ssh アクセス設定
作業は ssh で行いました。
Docker インストール
公式ページの情報
「Install Docker Engine on Debian | Docker Documentation」
https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script
および、以下記事を参照しながらインストールしました
「Raspberry PiにDockerをインストール - Qiita」
https://qiita.com/homelan/items/0bb265cf92310d29cb82
$ sudo apt update
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
pi ユーザで docker を動かせるようにして、一旦ログアウトしてログインし直します。
$ sudo usermod -aG docker pi
$ logout
動作確認
$ docker -v
Docker version 20.10.12, build e91ed57
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b921b04d0447: Pull complete
Digest: sha256:507ecde44b8eb741278274653120c2bf793b174c06ff4eaa672b713b3263477b
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm32v5)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
うまく動いているみたいなので、自動起動を設定しておきます。
$ sudo systemctl enable docker
HomeAssistant インストール
設定関係を homeassistant というフォルダを作ってそこに入れることにします。
$ mkdir homeassistant
$ cd homeassistant
以下のコマンドでロード&起動します。
$ docker run -d \
--name homeassistant \
--privileged \
--restart=unless-stopped \
-e TZ=Asia/Tokyo \
-v /home/pi/homeassistant:/config \
--network=host \
ghcr.io/home-assistant/home-assistant:stable
初期設定
http://(IPアドレス):8123 を Web ブラウザでアクセスします。
以下のように設定していきます。
一通り設定が終わったところです
GPIO ポート操作の準備
GPIO17 に LED をつなげておきます。
gpioswitch.sh を以下の内容で作ります。
echo 17 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio17/direction
echo $1 > /sys/class/gpio/gpio17/value
実行権をつけておきます。
$ chmod 777 gpioswitch.sh
以下のようにして ON/OFF できるかどうか確認します。
$ ./gpioswitch.sh 1
./gpioswitch.sh: line 1: echo: write error: Device or resource busy
$ ./gpioswitch.sh 0
./gpioswitch.sh: line 1: echo: write error: Device or resource busy
homeassistant にスクリプトを登録する
「設定」-「オートメーションとシーン」-「スクリプト」-「スクリプトを追加」でスクリプトが登録できるようですが、良くわかりませんでした。
しかしながら「アイコン」で一覧が出るので、良さそうなアイコンをここで確認できます。
UIの説明は見当たらなかったので、yaml ファイルを直接触って設定することにします。
configuration.yaml を以下のように書き足します。
# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:
# Text to speech
tts:
- platform: google_translate
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
↓以下のように追加
# Configure a default setup of Home Assistant (frontend, api, etc)
default_config:
# Text to speech
tts:
- platform: google_translate
automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml
switch: !include gpioswitch.yaml
homeassistant:
customize: !include customize.yaml
gpioswitch.yaml を以下のように作成
- platform: command_line
switches:
switch_gpio:
command_on: "/config/gpioswitch.sh 1"
command_off: "/config/gpioswitch.sh 0"
friendly_name: GPIO0
ここの、switches: は予約語らしく、gpioswitch: にするとエラーが出ました。
customize.yaml を以下のように作成
switch.switch_gpio:
icon: mdi:alarm-light
アイコンは先程確認した、良さそうなアイコンを指定します。
「設定」-「設定」-「サーバーコントロール」-「再起動」で Home Assistant server を再起動します。
再起動したら、「オーバービュー」-「ダッシュボードを編集」
ボタンを押してLEDをON/OFFできることを確認できます。
おまけ
最初は gpioswitch.sh 内で wiringpi を使ってましたが home-assistant からは動きませんでした。おかしーなーと思ったらDocker内に wiringpi が入ってませんでした。
また、何かの都合で homeassistant の実行を終了したときは以下のようにして起動し直します。
$ sudo docker start homeassistant
で起動します。