SwitchBotWin アプリケーション仕様書

1. 概要

SwitchBotWin は、SwitchBot API v1.1 を利用してスマートホームデバイスをWindows PCから一元管理・操作するためのWPFデスクトップアプリケーションである。

項目内容
フレームワークWPF(.NET 8.0)
言語C# 12
アーキテクチャMVVM(Model-View-ViewModel)
バージョン1.0.0
対象OSWindows 10 / 11
外部依存System.Security.Cryptography.ProtectedData 8.0.0

2. アプリケーション構成

2.1 ディレクトリ構成

SwitchBotWin/
├── Models/              # データモデル
│   └── Enums/           # 列挙型定義
├── ViewModels/          # ビューモデル(MVVM)
├── Views/               # XAML画面・パネル
├── Services/            # ビジネスロジック・API通信
├── Converters/          # WPFバインディング用値変換
├── Helpers/             # ユーティリティクラス
├── Themes/              # ダーク/ライトテーマ定義
└── Assets/              # 効果音ファイル等

2.2 アーキテクチャ図

graph TD
    subgraph View
        MW["MainWindow"]
        DP["DashboardPanel"]
        ACP["AirConditionerPanel"]
        TVP["TvPanel"]
        LP["LightPanel"]
        FP["FanPanel"]
        GRP["GenericRemotePanel"]
        PDP["PhysicalDevicePanel"]
        MEP["MacroEditorPanel"]
        SD["SettingsDialog"]
        AD["AboutDialog"]
        STD["StatsDialog"]
    end

    subgraph ViewModel
        MVM["MainViewModel"]
        ACVM["AirConditionerViewModel"]
        TVVM["TvViewModel"]
        LVM["LightViewModel"]
        FVM["FanViewModel"]
        GRVM["GenericRemoteViewModel"]
        PDVM["PhysicalDeviceViewModel"]
        MEVM["MacroEditorViewModel"]
        SVM["SettingsViewModel"]
        SCVM["SensorCardViewModel"]
    end

    subgraph Service
        API["SwitchBotApiClient"]
        DM["DeviceManager"]
        MM["MacroManager"]
        SM["SettingsManager"]
        TM["ThemeManager"]
        WM["WindowStateManager"]
        SS["SoundService"]
        ASM["AcStatusManager"]
    end

    subgraph External
        SBAPI["SwitchBot API v1.1"]
    end

    MW --> MVM
    MVM --> DM
    MVM --> MM
    MVM --> SM
    MVM --> API
    API --> SBAPI
    DM --> API
    MM --> API

3. 認証・セキュリティ

3.1 API認証

SwitchBot API v1.1 のHMAC認証方式を使用する。

項目内容
認証方式HMAC-SHA256 署名
必要情報Open Token、Secret Key
ヘッダーAuthorization(Token)、sign(HMAC署名)、t(タイムスタンプ)、nonce(UUID)

3.2 認証情報の保存

項目内容
暗号化方式Windows DPAPI(DataProtectionScope.CurrentUser
保存形式Base64エンコードされた暗号文をJSON形式で保存
保存先%APPDATA%/SwitchBotWin/settings.json
書き込み方式アトミック書き込み(一時ファイル → リネーム)

3.3 接続テスト

設定ダイアログにて、入力したToken/Secretで一時的なAPIクライアントを生成し、デバイス一覧APIを呼び出すことで接続確認を行う。テスト成功後にのみ保存ボタンが有効化される。


4. デバイス管理

4.1 対応デバイス分類

4.1.1 赤外線リモコンデバイス(InfraredRemoteDevice

SwitchBot Hub経由で制御される赤外線リモコン仮想デバイス。

リモコン種別API値専用ViewModel操作
エアコンAir ConditionerAirConditionerViewModel電源ON/OFF、温度設定(16〜30℃)、モード切替、風量調整、一括送信
テレビTVTvViewModel電源ON/OFF、CH切替、音量、ミュート、チャンネル番号直接入力(1〜12)
照明LightLightViewModel電源ON/OFF、明るさUP/DOWN、色温度UP/DOWN
扇風機FanFanViewModel電源ON/OFF、風量3段階、スイング、タイマー
DVDDVDGenericRemoteViewModel電源ON/OFF + メディアプレーヤーコマンド
セットトップボックスSet Top BoxGenericRemoteViewModel同上
ストリーマーStreamerGenericRemoteViewModel同上
スピーカーSpeakerGenericRemoteViewModel電源ON/OFF + 音量/ミュート
プロジェクターProjectorGenericRemoteViewModel電源ON/OFF
カメラCameraGenericRemoteViewModel電源ON/OFF
空気清浄機Air PurifierGenericRemoteViewModel電源ON/OFF
給湯器Water HeaterGenericRemoteViewModel電源ON/OFF
その他OthersGenericRemoteViewModel電源ON/OFF

4.1.2 物理デバイス(SwitchBotDevice

SwitchBotの物理製品。制御デバイスとデータデバイスに分類される。

制御デバイス:

  • Bot(スイッチ操作)
  • Curtain / Curtain 3(カーテン開閉)
  • Smart Lock / Smart Lock Pro(施錠/解錠)
  • Plug / Plug Mini(JP/US)(電源プラグ制御)
  • Robot Vacuum Cleaner S1 / S1 Plus / S10(掃除機)
  • Hub 2 / Hub 3(ハブ+センサー)

データデバイス(センサー):

  • Meter / MeterPlus / WoIOSensor(温湿度計)
  • MeterPro / MeterPro(CO2)(温湿度+CO2計)
  • Hub 2 / Hub 3(温湿度+照度センサー)
  • Motion Sensor(人感センサー)
  • Contact Sensor(開閉センサー)

4.2 デバイスキャッシュ

項目内容
保存先%APPDATA%/SwitchBotWin/device_cache.json
保存内容物理デバイスリスト、IRリモコンリスト、最終更新日時、デバイス表示順序、カテゴリ表示順序
更新タイミングAPI取得成功時、デバイス状態変更時(エアコン設定送信等)
マージ戦略API更新時に既存キャッシュの最終状態(LastState)を新データにマージ

4.3 デバイス表示順序

ユーザーがドラッグ&ドロップで並び替えた順序はカテゴリごとに保存される。

カテゴリキー内容
remotesIRリモコンデバイス
sensorsセンサーデバイス
physical制御デバイス
macrosマクロ
systemシステム情報

5. エアコン制御

5.1 操作仕様

操作コマンドパラメータ
電源ONturnOndefault
電源OFFturnOffdefault
一括設定setAll温度,モード,風量,電源 (例: 26,2,1,on)

5.2 運転モード(AcMode

enum値モード名備考
1自動デフォルト
2冷房
3除湿
4送風温度設定無効
5暖房

5.3 風量(FanSpeed

enum値風量
1自動(デフォルト)
2
3
4

5.4 温度範囲

  • 最小: 16℃
  • 最大: 30℃
  • デフォルト: 26℃
  • Math.Clamp で範囲制限

5.5 エアコン状態管理

最後に送信したエアコンの設定(温度、モード、風量、電源)を以下の2箇所で永続化する。

  1. デバイスキャッシュ: DeviceManager.UpdateLastState()device_cache.json 内の LastState を更新
  2. ステータステキスト: AcStatusManagerac_status.txt に表示用テキストを保存

6. マクロ機能

6.1 概要

複数のデバイスコマンドを順次実行する自動化機能。条件分岐(センサー値判定)と待機ステップをサポートする。

6.2 マクロモデル(Macro

プロパティ説明
IdstringGUID(一意識別子)
Namestring表示名(デフォルト:「新しいマクロ」)
Iconstringアイコン絵文字(デフォルト: ⚡)
Descriptionstring説明文
StepsList<MacroStep>ステップリスト
IsEnabledbool有効/無効フラグ
CreatedAt / UpdatedAtDateTime作成/更新日時(UTC)

6.3 マクロステップ種別(MacroStepType

種別説明
CommandデバイスにAPIコマンドを送信
Delay指定時間(ミリ秒)待機
Conditionセンサー値を条件判定し、不成立時にスキップまたは中断

6.4 条件分岐(MacroCondition

プロパティ説明
DeviceId判定対象のセンサーデバイスID
Property判定対象プロパティ(temperaturehumiditymoveDetectedopenState等)
Operator比較演算子(==!=><>=<=
Value比較値
Action条件不成立時の動作(Skip: 次のConditionまでスキップ / Abort: マクロ中断)

6.5 マクロ実行フロー

flowchart TD
    Start["マクロ実行開始"] --> Validate["バリデーション:参照デバイスの存在確認"]
    Validate -->|NG| Error["エラーメッセージ返却"]
    Validate -->|OK| Loop["ステップ順次実行ループ"]
    Loop --> Type{"ステップ種別"}

    Type -->|Command| Send["APIにコマンド送信"]
    Send --> Sound["効果音再生"]
    Sound --> Next["次のステップへ"]

    Type -->|Delay| Wait["指定時間待機"]
    Wait --> Next

    Type -->|Condition| Eval["センサー値取得&条件判定"]
    Eval -->|成立| Next
    Eval -->|不成立 + Skip| SkipToNext["次のConditionまでスキップ"]
    Eval -->|不成立 + Abort| Abort["マクロ中断"]

    Next -->|残りあり| Loop
    Next -->|全完了| Done["完了"]

6.6 マクロ保存

項目内容
保存先%APPDATA%/SwitchBotWin/macros.json
形式MacroStoremacros プロパティに全マクロを格納)
保存タイミング作成/更新/削除時に自動保存(デバウンス付き)
排他制御SemaphoreSlim によるロック

6.7 仮想マクロ実行

保存されていない編集中のマクロデータを使用して直接実行する機能。マクロエディタのテスト実行で使用される。


7. センサー監視

7.1 対応センサー情報

デバイス種別取得可能データ
Meter / MeterPlus / WoIOSensor温度、湿度、バッテリー
MeterPro温度、湿度、バッテリー
MeterPro(CO2)温度、湿度、CO2濃度、バッテリー
Hub 2 / Hub 3温度、湿度、照度レベル
Motion Sensor動体検知状態、明るさ、バッテリー
Contact Sensor開閉状態、明るさ、バッテリー

7.2 自動更新

項目内容
更新間隔10分(DispatcherTimer
初回取得アプリ起動時にAPIから全センサーのステータスを取得
手動更新更新ボタン押下時に全デバイス+センサーを再取得

7.3 ダッシュボード表示

  • SensorCardViewModel としてカード形式で表示
  • 温度・湿度・明るさ・CO2・バッテリーを絵文字付きテキストで表示
  • SensorDisplayHelper でセンサー値のフォーマット・日本語変換を行う

8. ダッシュボード

8.1 構成

ダッシュボードはデバイス未選択時に表示されるホーム画面で、以下のセクションから成る。

セクション内容
リモコン登録済みIRリモコンデバイスのカード一覧
センサーセンサーカード(温湿度・CO2・バッテリー等)
デバイス物理デバイス(Bot、カーテン、ロック、プラグ等)
マクロマクロカード(ホバー時に実行/編集ボタン表示)
システム最終更新時刻、API残量、エアコン直近送信状態

8.2 カテゴリ順序管理

  • 各セクションの表示順序はドラッグ&ドロップで変更可能
  • 編集モード(IsEditMode)のON/OFFで切り替え
  • 順序は device_cache.json 内の categoryOrder に保存

8.3 各セクションの折りたたみ

左ペインとダッシュボードそれぞれで独立した展開/折りたたみ状態を保持する。


9. UI仕様

9.1 メイン画面構成

ライトモード

ダークモード

9.2 フィルター機能

左ペインのフィルターは接続中デバイスに基づいて動的に構築される。

フィルター表示対象
全て全デバイス表示
エアコンIRリモコン(Air Conditioner)
テレビIRリモコン(TV)
照明IRリモコン(Light)
扇風機IRリモコン(Fan)
DVD / セットトップボックス / ストリーマー / スピーカー各IRリモコン種別
その他主要種別以外のIRリモコン
温湿度計Meter系センサー
人感センサーMotion/Contactセンサー
ボット / カーテン / ロック / プラグ / ハブ各物理デバイス
マクロマクロのみ

9.3 テーマ

項目内容
テーマ検出Windowsレジストリ(AppsUseLightTheme)からOS設定を読み取り
切り替え方式ResourceDictionary の動的差し替え
リアルタイム追従SystemEvents.UserPreferenceChanged でOS変更を監視
タイトルバーDWM API(DwmSetWindowAttribute)でダークモード対応
テーマファイルDarkTheme.xaml / LightTheme.xaml

9.4 ウィンドウ状態の保存・復元

保存項目デフォルト値
位置(Left, Top)100, 100
サイズ(Width, Height)1000 × 650
最大化状態false
左ペイン幅260px
選択フィルター「全て」
選択デバイスIDnull
各セクション展開状態全てtrue

保存先: %APPDATA%/SwitchBotWin/windowstate.json

9.5 効果音

項目内容
ファイルAssets/pi.wav
再生タイミングコマンド送信成功時
再生方式SoundPlayer.Play()(非同期、UIノンブロッキング)
キャッシュSoundPlayerインスタンスを初回生成後に再利用

9.6 ドラッグ&ドロップ

  • ダッシュボード: カテゴリセクションの並び替え
  • 左ペイン: カテゴリ内デバイスの並び替え
  • DragScrollBehavior: ドラッグスクロールのUX改善(ドラッグ閾値、編集モード連携)

10. API通信

10.1 エンドポイント

操作メソッドエンドポイント
デバイス一覧取得GET/v1.1/devices
コマンド送信POST/v1.1/devices/{deviceId}/commands
ステータス取得GET/v1.1/devices/{deviceId}/status

10.2 リトライ機構

項目内容
最大リトライ回数3回
バックオフ方式エクスポネンシャルバックオフ
リトライ対象HttpRequestExceptionTaskCanceledException、HTTPステータス 429/500/502/503/504

10.3 レート制限管理

項目内容
日次上限10,000回
ヘッダー読み取りX-RateLimit-RemainingX-RateLimit-Limit
ローカルカウンターAPI成功時にインクリメント、日付変更でリセット
永続化ファイル%APPDATA%/SwitchBotWin/api_call_count.json
警告色残り ≤ 100: 赤、残り ≤ 500: 黄

11. データ永続化

11.1 保存ファイル一覧

全ファイルは %APPDATA%/SwitchBotWin/ 配下に保存される。

ファイル名内容管理クラス
settings.jsonDPAPI暗号化済みAPI認証情報SettingsManager
device_cache.jsonデバイス一覧・表示順序・最終状態DeviceManager
macros.jsonマクロ定義MacroManager
windowstate.jsonウィンドウ位置・サイズ・展開状態WindowStateManager
api_call_count.jsonAPI呼び出しカウンターSwitchBotApiClient
ac_status.txtエアコン直近送信ステータスAcStatusManager

11.2 書き込み方式

ファイル破損防止のため、アトミック書き込み(一時ファイル作成 → File.Move でリネーム)を採用。


12. ダイアログ

12.1 設定ダイアログ(SettingsDialog

SwitchBot APIの認証情報(Token/Secret)を設定する。

操作説明
接続テスト入力したToken/Secretでデバイス一覧APIを呼び出しテスト
保存テスト成功後にDPAPI暗号化して保存

12.2 バージョン情報ダイアログ(AboutDialog

アプリケーションのバージョン情報を表示する。

12.3 詳細統計ダイアログ(StatsDialog

API使用状況、デバイス統計、センサー情報などの詳細データを閲覧できる。


13. コンバーター一覧

コンバーター機能
BoolToVisibilityConverterboolVisibility 変換
InverseBoolConverterbool の反転
InverseBoolToVisibilityConverterbool 反転 → Visibility
EnumToBoolConverterenum 値と bool の相互変換
EqualityConverter値の等価比較 → bool
NullToFalseConverternullfalse 変換
RemoteTypeToIconConverterリモコン種別 → アイコン文字列
StringEqualityMultiConverter複数文字列の等価比較

14. エラーハンドリング

14.1 API通信エラー

  • SwitchBotApiException: API固有エラー(HTTPステータスコード付き)
  • HTTPステータス別のエラーメッセージ生成
  • ステータスバーにエラーメッセージを表示

14.2 ファイルI/Oエラー

全てのファイル操作は try-catch でラップし、失敗時はデフォルト値を返す/無視する設計。アプリケーションのクラッシュを防止する。

14.3 マクロ実行時バリデーション

  • 参照デバイスの存在確認(削除されたデバイスを検知)
  • キャンセルトークン対応(実行中のキャンセル可能)
  • ステップ単位のエラーハンドリング

15. テスト

15.1 テスト構成

テストプロジェクトは Tests/ ディレクトリに配置され、[InternalsVisibleTo("Tests")] により内部メンバーへのアクセスが許可されている。


16. 起動・終了フロー

16.1 起動フロー

flowchart TD
    A["アプリケーション起動"] --> B["設定ファイル読み込み"]
    B -->|設定なし| C["設定ダイアログ表示"]
    B -->|設定あり| D["APIクライアント初期化"]
    C -->|保存成功| D
    D --> E["テーマ初期化(OS設定読み取り)"]
    E --> F["キャッシュから同期復元(InitializeFromCache)"]
    F --> G["ウィンドウ状態復元"]
    G --> H["メインウィンドウ表示"]
    H --> I["非同期初期化(InitializeAsync)"]
    I --> J["APIからデバイス一覧取得"]
    J --> K["センサーステータス取得"]
    K --> L["定期更新タイマー開始(10分)"]

16.2 終了フロー

  1. ウィンドウ状態の保存(位置・サイズ・選択状態・展開状態)
  2. APIコールカウンターの保存
  3. テーマ監視の停止
  4. タイマーの停止
  5. リソースの解放(IDisposable

コメントを書く

メールアドレスは公開されません。