バッテリーの詳細な状態を取得する

Recipe ID: hw-016

ラップトップやタブレットのバッテリー残量や充電状態を取得します。battery クレートを使用します。

1. 依存関係の追加

src-tauri ディレクトリで以下を実行します。

cargo add battery

2. 実装コード

use battery::units::time::second;
use battery::Manager;

#[derive(serde::Serialize)]
struct BatteryStatus {
    state: String,     // Charging, Discharging, Full, etc
    percentage: f32,   // 0.0 - 100.0
    time_to_full: Option<u64>, // 秒
    time_to_empty: Option<u64>, // 秒
}

#[tauri::command]
fn get_battery_info() -> Result<Vec<BatteryStatus>, String> {
    let manager = Manager::new().map_err(|e| e.to_string())?;
    
    let mut results = Vec::new();

    for maybe_battery in manager.batteries().map_err(|e| e.to_string())? {
        if let Ok(battery) = maybe_battery {
            results.push(BatteryStatus {
                state: format!("{:?}", battery.state()),
                percentage: battery.state_of_charge().value * 100.0,
                time_to_full: battery.time_to_full().map(|t| t.get::<second>() as u64),
                time_to_empty: battery.time_to_empty().map(|t| t.get::<second>() as u64),
            });
        }
    }

    Ok(results)
}

3. 変化の監視

バッテリーの状態はそれほど頻繁には変化しないため、イベントリスナで監視するよりも、定期的に(例えば 1分ごとに)ポーリングしてフロントエンドに emit するアプローチが効率的で一般的です。