0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MacOSXでバッテリーに優しく。Pythonで過充電アラートを実装してみた。

Last updated at Posted at 2020-05-03

(追記)
Macの場合、残量については気にしないで良いそうです。
参考: https://apple-no-kajirikata.com/902/#8020
コンセントに繋いで100%の状態でも問題ないとの情報もあります。
従って、この情報を信頼するならば、本記事の方法は取る必要がなさそうです。ご参考までに。

[経緯 ~どうでもいい話~]

常時使っていたMacbookを修理に出す関係で、昔のMacbookを引っ張り出しました。
すると、充電の割合表示がバグっていて、13%とかなっているのに、実は90%充電できていたり、、、バグ?よくわからない状態でした。

再起動してもSMCリセット?みたいなのをしても直らなかったので、いつものMacbookで使っていた充電アラートを入れようとしたのです。
バッテリーの寿命を伸ばすため、充電状況を管理するものです。

「Battery Heroより未然に過充電を防げると思うCharge Check使ってみる」
https://jitenshatoryokou.com/chargecheck-14199.html

が、充電アラートのChargeCheckのダウンロードサイト(*)が「403 Forbidden」エラーとなっていました。
*http://blog.macorz.com/2338.html

GoogleにもIndexされていないようで、困ったのでPythonで作ってみました。

[Code]

PC : MacBook Pro (Retina, 13-inch, Early 2015)
OS : OSX High Sierra 10.13.6

1. python コードを作成


# coding: utf-8
SetMaxThreshold = 0.79  #  上限の閾値を設定(これ以上なら充電しない) 推奨は80%らしいので、直前の079で
SetMinThreshold = 0.41  #  下限の閾値を設定(これ以下なら充電) 推奨は40%らしいので、直前の041で

import subprocess
import sys
import re
import os

cmd = "/usr/sbin/ioreg -l | /usr/bin/grep Capacity"
res =subprocess.check_output(cmd, shell=True).decode('utf-8').strip().split('\n')

Max = 0
Current = 0

for st in res:
    ar = st.split('=')
    key = re.sub('^(.*?")','',ar[0]).replace('" ','')
    if (key=='MaxCapacity'):
        Max = ar[1].strip()
    elif key=='CurrentCapacity':
        Current = ar[1].strip()


cmd = "/usr/sbin/ioreg -l | /usr/bin/grep ExternalChargeCapable"
chk =subprocess.check_output(cmd, shell=True).decode('utf-8').strip().split('=')[1].strip()
isCharge = True if (chk=='Yes') else False
Notify = False
rate=0
if (int(Max) > 0 and int(Current) > 0):
    rate  =float(Current)/float(Max)
    if rate <= SetMinThreshold and not isCharge:
        os.system("/usr/bin/osascript -e 'display notification \"充電してください!\"' && /usr/bin/osascript -e 'beep 5'")
        Notify = True

    elif rate >= SetMaxThreshold and isCharge:
        os.system("/usr/bin/osascript -e 'display notification \"充電を止めてください\"' && /usr/bin/osascript -e 'beep 5'")
        Notify = True
    else:
        print('No Nofied  = '+str(rate))


print('Notified:'+str(Notify)+' | Rate:'+str(rate)+' |Info : isCharge = '+str(isCharge) + ' | Max ='+str(Max) + ' | Current ='+str(Current))

ポイントは、コマンドを絶対パスで書くこと。

2. crontab に登録

crontab -e

作成したPython を保存し、絶対パスで登録

* * * * * python /Users/{user_name}/tool/monitoringMacCharge.py> /dev/null

crontab -l で登録を確認

"> /dev/null" で 標準出力時のメール送信を回避
参考:https://ips.nekotype.com/2407/

できました。

おまけ 充放電回数の確認

Apple_と_Menubar.png

optionを押しながら、リンゴマークをクリックして、システム情報を表示

MacBook_Pro_と_「MacOSXでバッテリーに優しく。Pythonで過充電アラートを実装してみた。」を編集_-_Qiita.png

電源 > 状態情報 > 充放電回数

Macbook Pro 13inch だと1000回でバッテリー交換時期とのこと。ここを抑えたい。

(追記)
Macの場合、残量については気にしないで良いそうです。
https://apple-no-kajirikata.com/902/#8020
コンセントに繋いで100%の状態でも問題ないとの情報もあります。
従って、本記事の方法は取る必要がなさそうです。Macは賢くてよかったです。

*こちら、確かに体感値では、以前のMacbookはこのような使い方をしていて、バッテリーに特に大きな影響はありませんでした。

以上

0
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?