スマートプラグでバッテリーにやさしい充電をする仕掛け

スポンサーリンク

はじめに

ノートパソコンのリチウムイオンバッテリーを長持ちさせる方法が様々なサイトで紹介されています。その情報を参考にスマートプラグとMacのApple Scriptを使って、自動的にバッテリーにやさしい充電をする環境を構築したので紹介します。
2020年5月26日よりSmart Lifeの機器はIFTTTに対応しなくなったため、本記事の内容は使用できません。代わりにTuya APIを使って実現する方法について記事を書きました。

リチウムイオンバッテリーについて

他のサイトから得たリチウムイオンバッテリーを長持ちさせるためのポイントは概ね以下のようなものです。

  • 常に100%充電状態(電源ケーブルつなぎっ放し)での使用はバッテリーの劣化を早める。
  • 20%〜80%の間で使うのが良い。
  • 充電度合いが少ない状態で使うのが良い。
  • 充電度合いの変動幅は小さい方が良い。

注:バッテリーの専門家ではないため、間違った情報があるかもしれません。また、ニッケル水素バッテリーなど、他のバッテリー種には当てはまりません。

以上を考慮して、50%〜55%の充電状態を自動的にキープする環境を作ることにしました。

スマートプラグの設定

スマートプラグは、家庭のコンセントにつないでインターネット経由で電源の接続/切断を制御できる機器です。

Amazon EchoやGoogle Homeなどのスマートスピーカから制御できるもの、IFTTT経由で制御できるものなどがあります。
今回はIFTTT対応のスマートプラグで充電を制御します。

スマートプラグの説明書に載っていた2次元バーコードをスマホで撮影すると「Smart Life」のアプリダウンロードが表示されたので、インストールしてこのページなどを参考に、メールアドレス登録→家族(自分)を作成→デバイス追加の順に設定しました。

デバイスの追加はアプリの右上にある+マークをタップし、家電製品(Electrical Engeneerings)→コンセント(Socket)へと進み、Wifiのパスワードを登録します。

IFTTTの設定

このページなどを参考にIFTTTのアカウント登録を行います。
New Appletを押して以下のような表示になったら+thisを押します。

次の画面の検索窓にwebと入力して出たWebhooksのマークを押して次に進みます。

Receive a web requestのEvent Nameを”turn_on_power”などとして作ります。

Create triggerを押すと以下のように、先ほどまで+thisだった部分がWebhooksのマークになっているのがわかります。
続いて+thatを押して動作を定義していきます。

検索窓にsmart lifeと入力して出てきたSmart Lifeを押して次に進みます。

Turn onを押します。

Smart Plugが表示されていることを確認してCreate Action→Finishと進みます。

これでAppletができたので、動作確認をします。IFTTTの画面からServicesを開き、Webhooksを選択します。

Documentationsを押します。

以下のようにキーと実行例が表示されます。

Macのコマンドラインから以下を実行してスマートプラグがONになれば成功です。

$ curl -X POST https://maker.ifttt.com/trigger/turn_on_power/with/key/xxxxxxxx

turn_on_powerはEvent Nameで設定した名称であり、xxxxxxxxの部分はWebhooksのDocumentationsで調べたキーを入力します。

同様にTurn offするAppletをEvent Name: turn_off_powerとして作成し、curlコマンドによる動作確認まで行います。

Apple Scriptの作成

画面右上(メニューバー上)の虫眼鏡マーク(Sporlight Search)からScript Editor.appを検索してダブルクリックで起動します。
以下のコードをScript Editorに貼り付けます。

use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
use framework "AppKit"
use scripting additions

global IFTTT_KEY, MIN, MAX, STATUS, AWAKE

set IFTTT_KEY to "(Your IFTTT Key)"
set MIN to 50
set MAX to 55

set STATUS to ""
set AWAKE to true

set aCenter to current application's NSWorkspace's sharedWorkspace()'s notificationCenter()
aCenter's addObserver:me selector:"notifSleep:" |name|:"NSWorkspaceWillSleepNotification" object:(missing value)
aCenter's addObserver:me selector:"notifWaked:" |name|:"NSWorkspaceDidWakeNotification" object:(missing value)

on exeCurl(message)
 if AWAKE and message is not STATUS then
  do shell script "curl -X POST https://maker.ifttt.com/trigger/" & message & "/with/key/" & IFTTT_KEY
  set STATUS to message
 end if
end exeCurl

on idle
 set per to (do shell script "pmset -g batt | grep % | sed 's/[%;]/ /' | awk '{print $3}'") as number
 if per ≤ MIN then
  exeCurl("turn_on_power")
 else if MAX ≤ per then
  exeCurl("turn_off_power")
 end if
 return 60
end idle

on quit
 exeCurl("turn_off_power")
 continue quit
end quit

on notifSleep:aNotif
 exeCurl("turn_off_power")
 -- display notification "System will sleep"
 -- say "System will sleep"
 set AWAKE to false
end notifSleep:

on notifWaked:aNotif
 -- display notification "System did wake"
 -- say "System did wake"
 set AWAKE to true
end notifWaked:

スクリプトの解説

(Your IFTTT Key)の箇所は、Webhooks Documentationsで調べたキーで置き換えてください。
MIN, MAXの値を変えればお好みの充電範囲にすることができます。

on idle, return 60 として60秒毎にバッテリーの充電度合いを確認し、MIN以下なら充電開始、MAX以上なら充電停止するようにしています。

当初は、on idle部のみで充電を制御しようとしていたのですが、電源ON状態でシャットダウンするとそのまま充電され続けてしまうため、on quitでシャットダウン時のApplication停止を検知して充電を停止するようにしました。

その後、電源ON時にスリープモードに入った場合も充電され続けてしまうことに気づき、notificationCenterの記述とon notifSleep:aNotifを追加し、スリープモードに入る通知を取得して充電を止めるようにしました。

ところが、スリープモードでもスクリプトは動作しているようでMIN以下になるとon idleの機能が働いて電源がONになります。そのまま少し経つとディープスリープモードに移行してスクリプトが停止し、充電し続けてしまうので、スリープと復帰の両方の通知を検知して、現在スリープモード中かどうかを把握し、スリープモード中は電源ON/OFFを変更しないようにしました。
これで、スリープ状態に入るときに電源をOFFにし、スリープから復帰するまで電源OFFをキープするようにしました。

スクリプトの保存

Script Editor上部のツルハシのような絵が付いているボタンを押すとスクリプトが解釈されてキーワードに色が付き、見やすくなります。
File→Saveから保存します。このとき、File FormatをApplicationにし、オプション:ハンドラの実行後に終了しない(Stay open after run handler)にチェックを入れます。

今回、PowerManager.appという名前で保存しました。

続いて、このApple Script ApplicationをMac起動時に自動的に立ち上がるように設定していきます。
Appleマークからシステム環境設定(System Preferences)→ユーザーとグループ(Users & Groups)→ログイン項目(Login Items)から+マークを押すと選択画面が出るので、作成したPowerManager.appを選択します。

Macを再起動して、充電度合い50〜55%をキープするように自動的にスマートプラグがON/OFFされ、シャットダウン時やスリープモード移行時にスマートプラグがOFFになれば成功です。

追加情報

本Apple ScriptをDockに表示させたくない場合は、以下を実行することで非表示になりました。(以下はPowerManager.appの保存場所がDocuments/scriptsの場合の例)

$ cd Documents/scripts
$ plutil -insert 'LSUIElement' -bool true PowerManager.app/Contents/Info.plist

インターネットにつながらない場所では、1分おきにcurlコマンドに失敗したとのダイアログボックスが出てしまいますが、ダイアログボックスのEditボタンの方を押してScript Editorを立ち上げると、以降はダイアログボックスが出なくなります。

このページのblife.shは、バッテリーに関する情報をまとめて表示してくれるので便利です。

$ blife.sh 
[2019-06-15 00:08:05]
Your MacBook's Battery status is
Charge Remaining 2127(mAh)
State of Charge  50%
Cycle Count  21
Cycle Count Remaining 979
Full Charge Capacity 4175(mAh)
State of Health  96.8%

お断り

充電度合いの測定には誤差があるためか、設定した充電範囲を多少越えることがあります。
別の観点として、常に充電状態にしておく方が充放電回数(Cycle Count)が進みづらいと書いているサイトもあるようなので、バッテリー劣化より充放電回数を重視する(売却時に参考されるため)場合、本サイトの内容は適さない可能性があります。
本サイトの内容に従って、何らかの損害が発生しても責任を負いかねますので、あくまで自己責任でお願いします。

参考文献

タイトルとURLをコピーしました