こんにちは、Tech Samuraiです!
前回の記事「【Pythonで環境シミュレーション】絶対湿度からエアコンの除湿能力まで計算するツールを作った話」では、部屋の湿度を計算するツールを開発しました。今回は、そのプロジェクトをさらに進化させます。
以前作成した計算ロジックを**「計算エンジン」**として再利用し、「この環境で、この洗濯物はあとどれくらいで乾くのか?」という未来を予測する、動的な「洗濯物乾燥シミュレーター」を開発しました。
この記事では、静的な「計算ツール」から、時間の経過と共に状態が変化する「動的シミュレーター」へと、どのようにプログラムを発展させていったのか、その設計思想と実装の裏側を詳しく探検します。
1. 基本構想:計算ツールを「部品」として再利用する
今回のプロジェクトの核心は、前回作成した湿度計算のロジックを、再利用可能な「部品(計算エンジン)」として独立させたことです。
humidity_calculator.py
: 前回のスクリプトをリファクタリングし、絶対湿度の計算やエアコン・除湿機の能力計算といった、静的な計算ロジックを関数群としてまとめました。main.py
: シミュレーターの本体です。ユーザーからの入力を受け付け、humidity_calculator
を道具として使いながら、時間の経過と共に変化する部屋の状態を逐次計算し、未来(洗濯物が乾く時間)を予測する役割を担います。
この「ロジックの分離」により、プログラム全体の見通しが良くなり、将来的な機能拡張も容易になります。
2. `config.toml`:シミュレーションの「設計図」
シミュレーションの前提となる物理係数やデフォルト値を、コードから分離するため**設定ファイル方式**を採用しました。今回はINIファイルより高機能な**TOML (Tom’s Obvious, Minimal Language)** を選択しました。
TOMLは、数値、文字列、リスト、そして[circulation_factors]
のような階層構造を直感的に記述でき、複雑な設定をINIファイルよりも綺麗に管理できるのが魅力です。
# config.toml の一部
# --- シミュレーション係数 ---
# この値を変えるだけで、全体の乾きやすさをチューニングできる
base_evaporation_factor = 0.001
# --- 室内サーキュレーション(送風)係数 ---
[circulation_factors]
circulation_none = 1.0 # なし
circulation_low = 1.8 # 弱
circulation_medium = 2.5 # 中
circulation_high = 4.0 # 強
3. シミュレーターの心臓部:「1分ごと」のループ処理
このシミュレーターの心臓部は、**「1分ごと」**に部屋の状態を更新し続けるループ処理です。このループの中で、乾燥に関わる様々な物理現象をステップごとに計算しています。
- ステップ①:蒸発(洗濯物が乾く)
乾燥の速さは、洗濯物表面の飽和絶対湿度と、部屋の空気の現在の絶対湿度との差によって決まります。この差が大きいほど、水分は洗濯物から空気中へ移動しやすくなります。この基本蒸発量に、送風や布の種類といった係数を掛け合わせ、より現実の状況に近づけます。 - ステップ②:室内湿度の変化
ステップ①で蒸発した水分は、部屋の空気中に放出されます。これにより、部屋全体の水分総量が増加し、室内の絶対湿度(と相対湿度)が上昇します。この「部屋干しをすると部屋がジメジメする」現象をシミュレートしています。 - ステップ③:除湿
ユーザーが有効にした除湿方法(エアコンなど)の能力に基づき、1分あたりに除去できる水分量を計算し、ステップ②で増えた部屋の水分総量から差し引きます。 - ステップ④:換気
設定された換気量に基づき、1分あたりに入れ替わる空気の割合を計算します。この割合に応じて、部屋の温湿度を外気の温湿度に近づけます。これにより「湿度の高い日に換気すると、逆に乾きにくくなる」といった現象も再現できます。 - ステップ⑤:終了判定
洗濯物の水分量が、設定された「乾燥完了」の閾値を下回るまで、①〜④のループを繰り返します。
4. GUIの設計と工夫:フリーズしないアプリを作る
シミュレーションのような重い計算処理をメインの処理で実行すると、計算中にGUIが固まってしまいます(フリーズ)。これを避けるため、以下の設計を行いました。
- バックグラウンド処理 (
QThread
): シミュレーションのループ処理は、QThread`
という別のスレッドで実行します。これにより、計算中もGUIが固まることなく、プログレスバーの更新などがスムーズに行えます。 - シグナルとスロット: バックグラウンドのスレッドは「進捗(%)」や「完了(結果)」といった合図(シグナル)をGUIに送ります。GUI側はそれを受け取ってプログレスバーを動かしたり、結果を表示したりします。この仕組みにより、処理の分離と安全な連携を実現しています。

完成したツールとコード
これらの設計思想と実装を経て完成した「洗濯物乾燥シミュレーター」の全コードは、以下のGitHubリポジトリで公開しています。
- GitHubリポジトリ: moisture_calculator
ぜひ、あなたの環境で動かし、様々な条件でシミュレーションを試してみてください!
コメント