IFTTT & D-Link Smart Plug – MacBook Pro battery charging management

2015年に購入して愛用し続けているMacBook Pro 13インチ。随分使ってきたのでバッテリーでの稼働時間が短くなってきました。2018年頃までは職場でも頻繁に使っていたので充電と放電を然るべきサイクルで行っていましたが、2018年からはデスクトップ感覚で自宅に常設して使っているため常にACアダプターがつながった状態でした。既に稼働時間が短くなったバッテリーはもとに戻らないのですが、ずっと自宅に置いておくとしても充電しっぱなしは避けたいと思い手元にあったD-LinkのスマートプラグとIFTTTを使って充電を制御してみることにしました。

目標は

  • バッテリーの残量がある閾値を下回ったらACアダプターへの電源を供給して充電を開始する
  • バッテリーの残量がある閾値を上回ったらACアダプターへの電源供給を止めて充電を終了する
  • システムがシャットダウンする際にはACアダプターへの電源供給を止める

を実現することです。

まずはD-LinkのスマートプラグをmyDlinkというスマートフォンアプリでセットアップしてWiFiに接続して、IFTTTで利用するための準備を済ませます。

具体的なアプローチはMacBook Pro上で常にAppleScriptを動かしてバッテリーの残量を監視してその結果に応じてIFTTTを通じてスマートプラグをON・OFFすることにしました。IFTTTのWebhooksを利用することで、MacBook Pro上のAppleScriptからcurlコマンドでトリガーをかけます。

mydlinkとWebhooksサービスをIFTTTに追加し、Webhooksに適当なイベントネーム(mbp_charger_onやoffなど)を指定して、対象のD-LinkスマートプラグをON・OFFするように設定しています。

Webhooksサービスのドキュメンテーションを確認すると自分のアカウントに割り当てられたユニークなキーを確認できます。Webブラウザを使って、イベント名を先程のトリガーで設定した値、と自分のキーで構成したURLにアクセスすればD-Linkのプラグを操作できるはずです。

MacBook Pro側ではScript Editorを使って新しいApple Scriptを書きます。オンラインのいくつかの情報を参考にしながら以下のスクリプトで上手く動いています。もし使われる方がいらっしゃいましたらキーとトリガー名は置き換えてお使いください。

use AppleScript version "2.4"
use framework "Foundation"
use framework "AppKit"
use scripting additions

delay 10

global IFTTT_KEY, MIN, MAX, STATUS, AWAKE

set IFTTT_KEY to "<<Your Key>>"
set MIN to 20
set MAX to 80

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("mbp_charger_on")
	else if MAX ≤ per then
		exeCurl("mbp_charger_off")
	end if
	return 60
end idle

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

on notifSleep:aNotif
	exeCurl("mbp_charger_off")
	set AWAKE to false
end notifSleep:

on notifWaked:aNotif
	set AWAKE to true
end notifWaked:

最近は在宅勤務が多くてMacBook Proも大活躍。完全にバッテリーが故障してしまうことがないようにこのスクリプトも活用して使い続けています。将来新しいモデルに新調した際にも使い続けられるセットアップかな、と思っています。

Macで上手くいったのでWindows 10のPCでも同じことをやってみました。まだシステム終了時の処理がうまくいっていませんのでもう少し調整してからご紹介できればと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください