メインコンテンツへスキップ
見出し画像

自宅サーバー構築記録④──Home Assistant導入

    DockerでHome Assistantを構築し、SwitchBot連携とCloudflare Tunnel公開を設定した記録です。

    はじめに

    自宅のスマートホーム機器を一元管理するためにHome Assistantを導入しました。

    SwitchBotのハブが複数あり、それぞれのアプリで管理するのが面倒になってきたため、Home Assistantで統合することにしました。

    この記事では以下を構築します。

    • Home AssistantをDockerコンテナで起動(既存のOpenCloudと共存)

    • SwitchBot Cloud APIで全デバイスを連携

    • Cloudflare Tunnelで外部からHTTPSアクセス

    • WireGuard VPN経由でのLANアクセスも可能

    前提:

    • Ubuntu 24.04サーバーが稼働していること

    • Dockerと /opt/opencloud/docker-compose.yml がセットアップ済み(記事③参照)

    • Cloudflare TunnelとDDNSが設定済み(記事②③参照)


    なぜDockerの network_mode: host を使うか

    Home AssistantをDockerで動かす場合、通常の bridge ネットワークモードではなく network_mode: host を使います。

    理由は2つです。

    1. mDNS(マルチキャストDNS) ── 同一LAN上のスマートホームデバイスをHome Assistantが自動検出するために必要

    2. デバイス直接アクセス ── 一部のデバイス統合でホストのネットワークインターフェースに直接アクセスする必要がある

    network_mode: host の場合、ポートマッピング(ports:)の記述は不要です。コンテナがホストのポートを直接使います。


    ステップ1:docker-compose.yml にHome Assistantを追加

    既存の /opt/opencloud/docker-compose.yml に追記します。

    services:
      opencloud:
        # 既存の設定(変更なし)
        ...
    
      homeassistant:
        image: ghcr.io/home-assistant/home-assistant:stable
        container_name: homeassistant
        restart: unless-stopped
        privileged: true
        network_mode: host
        volumes:
          - /opt/homeassistant/config:/config
          - /etc/localtime:/etc/localtime:ro
    

    privileged: true はBluetooth等のデバイスアクセスに使われますが、SwitchBot Cloud連携のみなら不要です。念のため設定しています。


    ステップ2:起動

    sudo mkdir -p /opt/homeassistant/config
    
    cd /opt/opencloud
    sudo docker compose up -d homeassistant
    
    # ログ確認
    sudo docker logs homeassistant --tail 50
    

    初回起動時はHome Assistantの初期化に1〜2分かかります。


    ステップ3:初期セットアップ

    ブラウザでLANから http://192.168.10.138:8123 にアクセスします(サーバーのLAN IPに置き換えてください)。

    1. アカウント作成 ── ユーザー名とパスワードを設定

    2. 位置・タイムゾーン設定 ── タイムゾーンは Asia/Tokyo

    3. デバイス検出 ── LAN内のスマートホームデバイスが自動検出されることがあります


    ステップ4:Cloudflare Tunnel経由のアクセスに必要な設定

    Cloudflare Tunnelを使う場合、Home AssistantはリバースプロキシのIPを「信頼できる送信元」として認識する必要があります。この設定がないと 400: Bad Request エラーが発生します。

    /opt/homeassistant/config/configuration.yaml の末尾に追記:

    http:
      use_x_forwarded_for: true
      trusted_proxies:
        - 127.0.0.1
        - ::1
    

    YAMLのインデントに注意: http: はインデントなし(ルートレベル)、その下は2スペースずつです。インデントミスがあるとHome Assistantが起動しなくなります。

    追記後に再起動:

    cd /opt/opencloud
    sudo docker compose restart homeassistant
    

    ステップ5:Cloudflare TunnelにHome Assistantを追加

    /etc/cloudflared/config.yml を更新:

    tunnel: YOUR_TUNNEL_ID
    credentials-file: /home/your-username/.cloudflared/YOUR_TUNNEL_ID.json
    
    ingress:
      - hostname: ha.your-domain.com
        service: http://localhost:8123
      - hostname: cloud.your-domain.com
        service: http://localhost:80
      - service: http_status:404
    

    Cloudflare Dashboard → DNS → レコード追加:

    タイプ: CNAME
    名前: ha
    内容: YOUR_TUNNEL_ID.cfargotunnel.com
    プロキシ: オン(オレンジ雲)
    

    cloudflaredを再起動:

    sudo systemctl restart cloudflared
    

    ブラウザで https://ha.your-domain.com にアクセスできれば成功です。


    ステップ6:UFWのポート設定

    Home AssistantはLAN内アクセス用にポート8123を開放します。ただし外部公開はCloudflare Tunnel経由のため、LAN内のみに制限します。

    sudo ufw allow from 192.168.10.0/24 to any port 8123
    sudo ufw reload
    

    ステップ7:SwitchBot連携

    SwitchBot APIキーの取得

    1. SwitchBotアプリを開く

    2. プロフィール → 設定(右上の歯車)

    3. アプリバージョンの表示部分を10回連続タップ

    4. 「開発者向けオプション」が現れる

    5. トークンとシークレットをメモ(この2つが必要)

    Home AssistantでSwitchBot連携を設定

    1. Home Assistant → 設定 → デバイスとサービス

    2. 右下「+ インテグレーションを追加」

    3. 検索欄に「SwitchBot」と入力

    4. 「SwitchBot Cloud」 を選択(ローカル版とは別です)

    5. トークンとシークレットを入力 → 送信

    正常に連携されると、SwitchBotハブに接続された全デバイス(スイッチ・カーテン・温湿度計・エアコンリモコン等)が自動的に検出されます。

    SwitchBot Cloud vs ローカルAPI: SwitchBot Hub 2以降はローカルAPIも利用可能です。アプリ → Hub設定 → 「ローカルネットワークから制御」をONにしてから「SwitchBot」(Cloudなし)を選ぶとCloud不要でアクセスできます。


    アクセス方法まとめ

    • 外部(Cloudflare Tunnel): https://ha.your-domain.com ── どこからでも

    • LAN内: http://192.168.10.138:8123 ── 自宅ネットワーク内

    • VPN経由(WireGuard): http://10.0.0.1:8123 ── 外出先からLAN的に


    サービス管理コマンド

    # 起動・停止・再起動
    cd /opt/opencloud
    sudo docker compose up -d homeassistant
    sudo docker compose stop homeassistant
    sudo docker compose restart homeassistant
    
    # ログ確認
    sudo docker logs homeassistant --tail 50
    
    # イメージ更新
    sudo docker compose pull homeassistant
    sudo docker compose up -d homeassistant
    

    トラブルシューティング

    外部からアクセスすると「400: Bad Request」

    Cloudflare Tunnelのリバースプロキシを信頼するhttp設定が抜けています。

    /opt/homeassistant/config/configuration.yaml に以下を追記:

    http:
      use_x_forwarded_for: true
      trusted_proxies:
        - 127.0.0.1
        - ::1
    

    再起動:

    sudo docker compose restart homeassistant
    

    Home Assistantが起動しない

    YAMLのインデントエラーが多いです。ログを確認します:

    sudo docker logs homeassistant --tail 30
    

    configuration.yaml をYAMLバリデーターで確認するか、追記した部分を削除してデフォルト状態で起動を確認します。

    SwitchBotデバイスが検出されない

    • SwitchBotアプリでハブがオンラインになっているか確認

    • トークンとシークレットの入力ミスがないか確認

    • 一度インテグレーションを削除して再追加してみる


    バックアップについて

    Home Assistantの設定・履歴・自動化はすべて /opt/homeassistant/config/ に保存されています。このフォルダをrsyncのバックアップ対象に追加しておくことを推奨します。

    /usr/local/bin/backup-data.sh がある場合、同様の形式で追加:

    rsync -av --delete /opt/homeassistant/config/ /media/Backup/homeassistant/config/
    

    まとめ

    Home Assistantの導入でよく詰まるポイントは以下の3つです。

    • network_mode: host ── LAN上のデバイス自動検出に必要

    • http: trusted_proxies ── Cloudflare Tunnel経由で400エラーを防ぐために必須

    • SwitchBotはTokenとSecretの2つが必要 ── Tokenだけでは動かない

    このシリーズを通じて、格安の古いPCをベースに、クラウドストレージ・スマートホーム・VPNが統合された自宅サーバー環境を構築できました。

    同じような構成を検討している方の参考になれば幸いです。


    シリーズ一覧

     
     

    Sone

     
     
    新しいことを試すのが好きな趣味人。自宅サーバ構築やガジェット弄りなど、気になったらとりあえず手を動かしてみるタイプ。学んだことをここに残していきます。

    あなたへのおすすめ