About this Project
Ubuntu PCにGeneric ESP32-C3を統合し、スマートホーム規格「Matter」に対応させるプロジェクトです。 Google Home / Nest Hubからの音声操作や自動化でPCの電源をON/OFFできます。 以前に行った案件のリベンジです。 PCの電源状態を他の家電と同様にシームレスに管理・操作することを目指しています。
Video
実装ステップ
| ステップ | 内容 | 状態 |
|---|---|---|
| Step 1 | Matter ON/OFF 制御(電源ボタン押下) | ✅ 実装済み |
| Step 2 | PC電源状態監視 + Matter 属性同期 | ✅ 実装済み |
機能
Step 1 — 電源制御
| 機能 | 手段 |
|---|---|
| 電源ON | メカリレー → 電源ボタン短押し(500ms) |
| 電源OFF | メカリレー → 電源ボタン短押し(500ms)+ Ubuntu ACPI設定でシャットダウン |
| ファクトリーリセット | GPIO9 長押し(3秒) |
- WoL(Wake on LAN)は不採用 — このPCは設定したつもりでも、成功しなかった為
- ESP32ー ○○コマンド→PCで電源OFF — そもそもPCを操作するのと変わらないため検討外
- 電源OFF: リレーで電源ボタンを短押しし、Ubuntuの ACPI
設定(
HandlePowerKey=poweroff)が正常シャットダウンを開始する
Step 2 — 電源状態監視
| 機能 | 手段 |
|---|---|
| 電源状態検出 | PC817 経由で電源 LED を GPIO 入力(アクティブLOW) |
| 乖離検出 | 2秒ポーリング、3回連続で確定 |
| Matter 属性同期 | 乖離確定時に attribute::update() で OnOff 属性を実態に合わせる |
| ユーザー通知 | Matter サブスクリプション経由(Google Home 等が自動受信) |
フェイルセーフ原則: 乖離を検出してもシステムは自動での ON/OFF 操作を行わない。実態を Matter 属性に反映してユーザーへ委ねる。
ハードウェア構成
主要部品
- マイコン: Generic ESP32-C3
- ホストPC: Ubuntu
- 電源制御: シングルチャンネルリレーモジュール(ASIN: B0G4C9GMVH)でマザーボードの PWR SW ピンを短絡
- 電源状態検出: PC817 フォトカプラ経由で電源 LED を読み取る
- コントローラー: Google Nest Hub / Androidスマートフォン
- 給電: PCのUSBポートからの常時給電
GPIO 割り当て
| GPIO | 役割 | 回路 |
|---|---|---|
| GPIO 20 | OUTPUT: PWR SW制御 | メカリレー経由 |
| GPIO 4 | INPUT: PWR LED検出 | PC817 フォトカプラ経由(アクティブLOW) |
| GPIO 9 | INPUT: ファクトリーリセット | 内部プルアップ、LOW=押下 |
回路図
PWR SW(GPIO 20 → メカリレー → マザーボード)
PWR LED(マザーボード → PC817 → GPIO 4)
極性は pc_control.c の PWR_SW_ACTIVE_HIGH ソースコードで切り替え可能。
主な材料費
| 部品 | 価格 |
|---|---|
| Generic ESP32-C3 | 539円 |
| リレーモジュール | 464円 |
| PC817 フォトカプラ | 388円 |
| 合計 | 1,391円 |
待機電力(推測値)
| 機器 | 状態 | 推測消費電力 |
|---|---|---|
| Generic ESP32-C3 | Wi-Fi 常時接続・待機 | 約 0.3〜0.5W |
| リレーモジュール | 非作動時(コイル OFF) | 約 0.01W 以下 |
| フォトカプラ | 非作動時 | 約 0.01W 以下 |
| USBアダプタ損失 | 変換効率 80% 想定 | +10〜20% |
| 合計 | 約 0.4〜0.6W |
上記は推測値。スマートフォン充電器の待機電力(0.1〜0.3W)と同程度であり、実用上は安心できるレベル。
ソフトウェアスタック
| レイヤー | 名称 | バージョン |
|---|---|---|
| OS / SDK | ESP-IDF | 5.4.1 |
| Matter ラッパー | esp-matter | $ESP_MATTER_PATH で指定 |
| Matter 本体 | ConnectedHomeIP (CHIP) | esp-matter サブモジュール |
Matter デバイスタイプ: On/Off Plug-in Unit
ビルド
WiFi 認証情報の設定
main/wifi_creds.h を作成してSSIDとパスワードを記載します(.gitignore 済み):
#define WIFI_SSID "your-ssid"
#define WIFI_PASSWORD "your-password"
ビルド & フラッシュ
. $IDF_PATH/export.sh
. $ESP_MATTER_PATH/export.sh
export _PW_ACTUAL_ENVIRONMENT_ROOT
idf.py set-target esp32c3
idf.py build
idf.py -p /dev/ttyACM0 flash
Matter コミッショニング
フラッシュ後、シリアルモニタにQRコードとセットアップPINが出力されます。Google Home アプリ等でスキャンしてデバイスを登録してください。
開発・テスト段階ではテスト用DAC(Device Attestation Certificate)を使用します。
| 項目 | 値 |
|---|---|
| Manual Pairing Code | 34970112332 |
| Setup PIN | 20202021 |
| Discriminator | 3840 |
設計上の判断
BLE無効化・WiFiオンリーコミッショニング
sdkconfig.defaults で BLE を完全に無効化しています(CONFIG_BT_ENABLED=n,
CONFIG_ENABLE_CHIPOBLE=n)。
理由: store_wifi_credentials()
でWiFi認証情報をハードコードしているため、デバイスは起動と同時にWiFi接続を試みます。
この状態でCHIPoBLE(MatterのBLEアドバタイズ)が動作すると、BLE/WiFi無線の競合によりWiFi接続が阻害される可能性があります。
WiFi認証情報を事前に埋め込む設計においては、BLEを無効化してIPネットワーク経由コミッショニング(kOnNetwork)に統一しています。
フェイルセーフ原則(乖離検出時の動作)
Matter 仕様の前提は「実態が確定的に判定できていること」。乖離時の自動 ON/OFF は誤動作リスクを生みます。
安全な方向 = 操作しない。判断はユーザーに委ねる。
乖離確定(3回連続ポーリングで不一致)時の動作:
attribute::update()で OnOff 属性を実態に同期- Matter サブスクリプション経由でコントローラー(Google Home 等)へ通知
- 本システムは、得られた情報があっても電源を操作しない
既知の問題 / 課題
mDNS 競合(解消済み)
旧実装(Ping ベースの死活監視)では ESP-IDF mdns_init() と Matter 内部 mDNS がポート 5353 で競合していました。
現在は GPIO による電源 LED ポーリングに置き換えたため、mDNS は不使用。問題は解消済みです。
フリーズ自動回復(未実装)
電源 LED が ON のまま PC が応答しない(フリーズ)ケースは、現状では検出していません。 手動対応が必要です。ユーザーはシステムを理解し、適切な対応を行う必要があります。
制限事項
- 本プロジェクトは自宅の一般的な家庭用ルーター環境を前提にしています。
- 認証サーバーで厳重に管理されているネットワークや、セキュリティ管理が十分にされていないネットワークでは、 Matterの利用が制限される可能性があります。
ライセンス
本プロジェクトのアプリケーションコード(main/)は Apache License 2.0 です。使用している依存コンポーネントも同ライセンス(一部 MIT)です。
実機
入力側のフォトカプラを配線した写真は取り忘れました。
Resources
ソースファイル、資料はGitHubで公開しています。個人の学習や小規模なプロジェクトでの再利用を歓迎します。
View on GitHub