RaspberryPi に Home Assistant 入れて Lチカするまで


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

エラーは出ますが、LEDを ON/OFF できます。

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 を再起動します。

再起動したら、「オーバービュー」-「ダッシュボードを編集」

「カードを追加」で「GPIO0」を選びます

保存して UI 編集モードを終了とします。

ボタンを押してLEDをON/OFFできることを確認できます。

おまけ

最初は gpioswitch.sh 内で wiringpi を使ってましたが home-assistant からは動きませんでした。おかしーなーと思ったらDocker内に wiringpi が入ってませんでした。

また、何かの都合で homeassistant の実行を終了したときは以下のようにして起動し直します。


$ sudo docker start homeassistant

で起動します。