Python

条件分岐で決まった時間帯にPCの電源モードを変える

Python

[PR]当サイトはアフィリエイト広告を利用しています。

今回は条件分岐の練習です。

プログラムの途中で条件によって処理を分岐させるよ

プログラミングの文法には「条件分岐」というものがあります。例えばすごく原始的な条件分岐は次のようなプログラムです。

a = 1
if a==1:
   print(1)
else:
   print(0)

出力は1です。

これからif文の解説をして、それだけではつまらないので、Windows11のノートパソコンを決まった時間にクラムシェルモードにするプログラムを作っていきます。クラムシェルモードの便利な点についてはこちらもご覧ください。要するにノートパソコンのモニタを閉じた状態でワイヤレスキーボードなどを動かすことです。

if文の初歩的な解説

if文を解説していきましょう。ifの後に「a==1」とあります。これは「aと1が同じかどうか」という意味です。「=」と「==」は意味が違うので注意しましょう。「=」が「右の値を左に入れる」、「==」は「右と左が同じかどうか」という意味です。「==」が実行されると、同じなら「True」、違うなら「False」が返ってきます。試しに次のプログラムを実行してみましょう。

a=1
a==1
a==0

出力は「True」の後に「False」となりますね。「True」は「真」、「False」は「偽」とも言われます。集合論の「真」と「偽」と同じです。上のプログラムではaには1という数値が入っているので、「a==1」は「真」、「a==0」は偽になるわけです。

さてif文に戻りましょう。ifの後にはスペースを一つ入れてから条件式を書きます。条件式は「True」か「False」が返ってくる式です。

a==1はTrueかFalseが返ってくるから条件式だね

このほかにも次のような式も条件式となります。

a = 1
if a>0:
   print(1)
else:
   print(0)

「a>0」は「aが0より大きいかどうか」という条件式です。真ならTrue、偽ならFalseが返ってきます。上のプログラムでは条件式が「True」なので1が出力されますね。

これを次のように書き替えてみます。

a = -1
if a>0:
   print(1)
else:
   print(0)

aは-1ですから、「a>0」は「False」になります。Falseになったときの処理を担当するのが「else:」以下の部分です。ここにFalseになったときの処理を書きます。今回はFalseなので0が出力されますね。

if 条件式:の後と、else:の後にはインデントを入れよう

print(1)とprint(0)の部分は段落が一段下がっていますね。キーボードでは「TAB」キーを押すと入力されます。これをインデントと言います。Pythonはインデントでプログラムの境目を判断しているので、if~:の後とelse:の後にはインデントを入れてから処理を書きます。

コマンドプロンプトでクラムシェルモードにする方法

これからPythonでWindows11をクラムシェルモードにしていくのですが、根幹となるモードの切り替えをまずはGUI(専用のウィンドウ)でやってみます。タスクバーに「電源プラン」と入力して、クリックします。

すると次のような画面が出ます。

「↑」マークをクリックします。

「カバーを閉じたときの動作の選択」をクリック。

ここの設定を「何もしない」に変更して「変更の保存」をクリックします。

これでクラムシェルモードになります。

これをコマンドプロンプトでやってみます。タスクバーに「コマンドプロンプト」と入力してコマンドプロンプトを呼び出してください。

真っ黒な画面のウィンドウだよ

そこに次のように入力します。

powercfg /SETACVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 0

powercfgという命令文で上のGUIでやったことと同じことをしています。実行する際に「LIDACTION 0」を「LIDACTION 1」にすると「スリープ時」に変更されます。0と1の数値を変えてみて、電源オプションの設定項目が変わることを上の設定画面をリロードして確認してみてください。

Pythonでコマンドプロンプトを実行する

Pythonでこの操作を実行できるようにしましょう。Pythonファイル(例えばsample.py)を適当な場所に作って、そこに次のように記述します。

import subprocess
subprocess.call('powercfg /SETACVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 0')
subprocess.call('powercfg /SETDCVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 0')

これを実行してみると「カバーを閉じたときの動作」が「何もしない」になるはずです。「/SETDCVALUEINDEX」がバッテリー時の設定項目、「/SETACVALUEINDEX」が電源に接続したときの設定項目です。DCが直流でバッテリー、ACが交流で電源という意味ですね。

importしたのが「subprocess」というモジュールでコマンドプロンプトの命令文をPythonで実行するためのモジュールです。「subprocess.call(‘実行したい命令文’)」という使い方をします。

でも起動するたびにいちいち手作業で実行していると結局面倒だよね

そこで起動した時間帯で「スリープ時」か「何もしない」かに「条件分岐」するようにするよ。

これがやりたかったからif文を解説したんだね

Pythonで時刻を取得する

今回は帰宅した時間を夕方18時として、そこからはクラムシェルモード、翌日の朝8時以降なら通常モードにするようにします。

これを実現するには「パソコンを開いているときの現在時刻」が必要になります。現在時刻は次のプログラムで取得できます。

import datetime
dt_now = datetime.datetime.now()
print(dt_now.hour)

これで現在が何時かが出力されます。datetimeをimportすることで時間を取得するモジュールをインポートします。続いて「datetime.datetime.now()」で現在時刻を取得します。それをdt_nowに格納。

そしてdt_now.hourで取得した現在時刻から「24時間のうちの何時か」というデータを取得します。

時間帯によって条件分岐する

いよいよ条件分岐を組み込みます。次のようにプログラム(sample.py)を書きます。

import datetime
import subprocess

dt_now = datetime.datetime.now()

if dt_now.hour>18:
   subprocess.call('powercfg /SETACVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 0')
   subprocess.call('powercfg /SETDCVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 0')
elif dt_now.hour<8:
   subprocess.call('powercfg /SETACVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 0')
   subprocess.call('powercfg /SETDCVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 0')
else:
   subprocess.call('powercfg /SETACVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 1')
   subprocess.call('powercfg /SETDCVALUEINDEX SCHEME_CURRENT SUB_BUTTONS LIDACTION 1')

「elif ~:」の部分ですが、これは「エルスイフ」という構文で、ifが「False」だったときにelifが実行され、elifの条件式が「True」ならこの下のプログラムが実行されます。ifもelifも「False」だったときにelse以下が実行されます。今回の条件式を図解すると次のようになります。

まず夜を見て、夜じゃないなら朝を見て、それでも違うなら通常モードにしているね

Windowsのタスクスケジューラに登録

Windowsで決まった時間に何らかのプログラムを実行するときに手軽なのは「タスクスケジューラ」を使うことです。タスクバーに「タスクスケジューラ」と入力して、タスクスケジューラを開きましょう。

「タスクスケジューラライブラリ」で右クリック「新しいフォルダー」をクリック。

好きな名前をフォルダーにつけます。そうしたら右側の「基本タスクの作成」をクリックします。

  • 名前:「pysample202306」と入力(何でもいいです)
  • トリガー:ログオン時
  • 操作:プログラムの開始
  • プログラム / スクリプト:Python本体のフルパス
  • 引数の追加:実行したいPythonプログラムのフルパス
  • 開始(オプション):実行Pythonファイルのあるフォルダへのパス

Python本体のフルパス」はエクスプローラーを開いて、そこのアドレスに「C:\Users\ユーザー名\AppData\Local\Programs\Python」と入力して移動した先で「Python39」などとバージョンが書かれたフォルダを開きます。そこの「python.exe」ファイルを右クリックして「パスのコピー」をクリックしてコピーしたアドレスを「Python本体のフルパス」に貼り付けます。

実行したいPythonプログラムのフルパス」には実行したいプログラム(ここではsample.py)を右クリックして「パスのコピー」でパスをコピーして、フルパスに貼り付けます。

実行Pythonファイルのあるフォルダへのパス」は上のパスの「\sample.py」を削除したフォルダへのパスを記入します。

注意点としては、パスのコピーでコピーしたパスを貼り付けると「"パス名"」という具合にダブルクォーテーションが入った文字列が入力されてしまうので、このダブルクォーテーションを削除してください。

またこのままの設定ではバッテリー稼働時にタスクが実行されません。そこで次のようにしてみてください。作成したタスクを右クリックして「プロパティ」を開きます。

そうしたら「条件」タブで「コンピューターをAC電源で使用している場合のみタスクを開始する」「タスクを実行するためにスリープを解除する」のチェックを外します。そして「OK」をクリックします。

まあ「タスクを実行するためにスリープを解除する」はお好みで。私は解除しなくていいのでチェックを外しています。

あとはログオンしたらプログラムが実行されます。電源管理から確認してみましょう。

ログオンして項目が変わっていたら成功だよ

まとめ

今回は条件分岐を使ってノートパソコンをクラムシェルモードにしたり、通常モードに切り替えたりするプログラムを作成しました。

条件分岐を使えば色々なことができるようになります。条件分岐を覚えて、プログラミングの幅を広げましょう。

if, elif, elseだよ!

当ブログ(シルルスのコードおきば)ではPython入門用の記事を他にも執筆しています。参考になりましたら幸いです。

●Pythonでは日本語変数も使える【変数基礎】

●【繰り返し】でトマトの収穫時期を予想する

●定型処理は関数にまとめる【自動クラムシェルモードにするプログラム】

●補数を使って引き算【原理的なところも解説】