夜中にPC上のプログラムを実行したかったのだけれど、それだけのためにPCを夜間起動しっぱなしにしたくない(電気食わせているだけだし、、節電)ので、色々設定して、sleep中のPCをTaskSchedulerで起こして、プログラムを実行して再度sleepさせる方法がわかったのでメモ。
★20251123追記:TaskSchedulerのトリガーで、「繰り返し」設定をしても「繰り返ししてsleepからの起動」せず、いうことが分かったので追記。つまり、トリガーで設定した時刻にしかsleepからは起動しない。追記ここまで。
概要

やりたかったことは、通常夜間に行ってエコキュートの湧き上げを、太陽光発電が行われている昼間帯に持ってゆきたい(エコキュートの昼間シフト機能は夜蓄要件の関係?で全部を昼間に持ってゆかない(「EchCuteの制御 そういうことだったんだー、、、→夜蓄要件??」を参照のこと)。システム時計を9時間ずらしてシステムの夜中の3時を昼の12時(+9H)にして強制的に昼間に沸き上げるようにしているのだが、雨の日などの太陽光発電が行われそうもない場合は、深夜帯に沸き上げを行わせたい。そのために次の日の昼間の発電量予測値の確率が高いだろう前日の深夜帯にその情報を取得する、ということをさせたかったわけです。(昼間天気が悪い予報の時に、当日の夜間沸き上げを開始する時刻の直前(午前4時とか5時とか)に当日の予測値で計算させればで良いのかもしれません。どちらにしても結局夜中ですが、、、)
環境
Windows11_home(TaskScheduler,cmd.exe,batch,PowerShell,WSL2,Python)
(PowerShellは実行結果をメールするために使用し、WSL2とPythonは、その上で作ったscriptをbatchで起動したかったのでそのためだけに使っています。それぞれ必須ではありません)
実行するプログラム
実際に動かしたいプログラムは適当に作る。今回私の場合は、JMAから明日の日照予測数値を10時から14時までの取得し、それに我が家の太陽光発電の諸元を勘案して各時刻の発電量を計算。これをWSL2上のPythonで作成。cmd.exeからは、
----
wsl -d Ubuntu-22.04 bash -c "cd ~/python/発電量予測 && python3 Get_JMA予測値.py"
----
のように起動します。このコマンドの意味は、cmd.exeからwslのubuntu-22.04(環境によって変わるので、自分のシステム環境に設定する)のbashを起動して、working directoryに移動してからPythonで書いたGet_JMA予測値.pyを起動する、ということです。WSLでPythonで書いたから必要なだけで、windows11の上のみで終始するプログラムならこんなことをする必要は全く必要ありません、
TaskSchedulerが起動するプログラム
TaskSchedulerで時刻等を設定して、その時刻になったら「TaskSchedulerが起動をするプログラム」で、上記「実行するプログラム」を途中で起動しています。cmd.exe上で動くfoo.batのような名称のbatchファイルです。
----
cd /d "%~dp0"
timeout /t 10 /nobreak
echo %DATE% %TIME% > out.txt
wsl -d Ubuntu-22.04 bash -c "cd ~/python/発電量予測 && python3 Get_JMA予測値.py" >> out.txt 2>> error.txt
echo %CD%
timeout /t 10 /nobreak
powershell -ExecutionPolicy Bypass -File sendmail.ps1
timeout /t 30 /nobreak
rundll32.exe powrprof.dll,SetSuspendState 0,1,0
----
所々にtimeout コマンドを入れてあります。色々やってみたのですが、実行に余裕?が必要なようで、私の環境、プログラムでは少なくとも上記にすれば最後まで動くようです。(最適ではない可能性が大です)
各プログラム/スクリプトが出力する文字列をリダイレクトでout.txtというファイルに出力しています。あとでこれを見れば実行結果がわかります。
あと、Powershellを使っている部分は上記実行結果をメール送信するために使用しており、sendmail.ps1というがそのPowershellの実行ファイルです。(詳細は省きます。)
最後の行が、プログラム実行後、PCを再度スリープさせるための呪文。今回のプロジェクトではとても重要です。
TaskSchedulerの設定
ここからが本番です。
WindowsでTaskSchedulerを起動して右側の操作ペインから、「タスクの作成」を選択。
全般
「名称」をつけて(今回は、「太陽光発電予測」)、
セキュリティオプションは、「タスクの実行時に使うユーザアカウント」を自分に設定(Systemに設定すると動きません)、
「ユーザがログオンしているかどうかにかかわらず実行する」と「最上位の特権で実行する」を選択、
トリガー
「タスクの開始」は「スケジュールに従う」
「設定」は例えば、毎日行うのであれば、「毎日」を選択して、「開始」に開始日時を設定、今回は一日に一回起動と設定、
「詳細設定」は、必要に応じて設定すれば良いと思いますが、今回は、最下段の「有効」のみを設定、
★20251123追記:良い気になって、複数回(例えば1時間毎に)起動しようとしてトリガー項目の「繰り返し」を設定。でも初回しかsleepから起動して動かないし、繰り返しなんだからと、繰り返しの開始日時を過去にしておくとsleepから起動もしない。
``powercfg /waketimes``というコマンド(cmd.exeでもpsでも)で、OSレベルでの「次の」(他にあるtaskも含めて)sleepから起動設定されたものが表示されるが、やはり繰り返し分は反映されない。もしかして、開始、で設定されたものしかsleepから起動しないのか、とCopilotくんに聞くと、今になって「そうだ」という。信用できないので、「裏付けを示せ」と書いたら、MSの資料と、Qiitaの資料を引用してきたのでそういうことなんだろうと納得してやった。
追記のまとめ:TaskSchedulerでsleepからの起動を設定するときには、「繰り返し」は使えない。トリガーを個別に設定すること。
追記終わり。
操作
「操作」はプログラムの開始、
「プログラム/スクリプト」は、参照、から上記のTaskSchedulerが起動するプログラムを選択、引数などがあれば記載(今回のプログラムは引数等は無いので空欄)、
条件
「電源」で「タスクを実行するためにスリープを解除する」を選択、(今回はそれ以外はすべて非選択)
設定
「タスクを要求時に実行する」を選択、今回は他はすべて非選択
これでTaskSchedulerの設定は完了ですが、あともう一つ確認が必要です。「電源プラン」
電源プランの編集
これがわかるまでに苦労しました。
Windows機能の検索から探すのが一番手っ取り早いですが、「電源プランの編集」を開いて、「詳細な電源の変更」を選択、
「電源オプション」の「詳細設定」から「スリープ」というのを探します。
スリープを開くと、「スリープ解除タイマーの許可」というのがあるので、さらにそれを開いて、「バッテリ駆動」、「電源に接続」をどちらも「有効」にします。
これで全部設定ができたので「OK」押して完了です。
あとは、PCをスリープにして、時間が来るのを待って確認です。
ポイント
試験をするのに、なるべく早く結果が見たいので、TaskShcedulerで、トリガー時刻を現在から数分後、に設定したくなりますが、多分数分では失敗します。現在時刻から10分後くらいの余裕を持って設定してスリープさせて下さい。原因はよくわかりませんが、TaskSchedulerの起動チェックがそんなに常時行われているわけではないのかな、と邪推しています、、、。
さいごに
一回は動くが、二回目は失敗する、のようなこともあり、なかなかうまくゆかなかったのですが、なんとか動くようになりました。(上記「トリガー」項目の追記を参照のこと)
TaskSchedulreと電源プランの詳細設定、の2箇所の設定(もしかしたらBIOSのスリープ関連の設定も必要なPCがあるかもしれません)でなんとかなりました。
実はJMAのデータに辿り着く前に、海外のOpenDataから予測値を取っていたのですが、ほとんど使い物にならない、ということがわかって、有料のデータを使うのはなんか違うような、と思って色々と考えていました。そんな中で同じくOpenDataではありますが、気象庁の数値予測モデル(JAMモデル)を解析・再配信しているデータが使えることが分かって、検証するために手動じゃなくて自動でデータを取ってくる方法を試していたのでした。(JAMに関する部分の記載を修正しました。2025/11/16)
今後は、これでしばらく予測値データを取って、実太陽光発電データとの比較をしようと思います。
何かのお役にたてば。