Macbookのスリープをpmsetでより最適化させてみる

[スリープ中のMacbookの充電が減ってしまう時の対応まとめ](https://qiita.com/Sak1361/items/a335ca0308ae76d03f9d) よりスリープ時に電力消費が多いと感じる時にすることをまとめました。その中で`pmset`でより詳細に設定できるようなので今回はこの`pmset`についてまとめてみます。
なお、このパラメータ変更について、**アップルサポートでは対応してくれませんでした。** 設定によっては、サポート対象外になる恐れもありますので、自己判断でお願いします。

#### 筆者の環境
- MacBook Pro13 2018 *Touch Bar付き*モデル メモリ16GB
- MacOSバージョン10.14.6 (Mojave)
- 充放電回数 100回程度

# 今の設定はこう言う事（私ver)
現在の私の設定ですとこうなります。

`ディスプレイを閉じる（スリープボタンを押す）`
↓↓↓↓
`電源が50%以下だと30分までスリープ（直前のセッションはメモリに）`→ **30分以内なら即復帰！**
↓↓↓↓
**30分を超えるとスタンバイモードに。**`セッション内容が全てSSDに保存されほぼ電源off状態に
（日持ちする）`
↓↓↓↓
`復帰時にはSSDから読み取るのでチョイ時間かかる。`でも**バッテリー消費は以前より抑えられている！（はず）**

# pmsetて何
Macで設定できる**省エネルギー設定**では設定できない、スリープ等の詳細なパラメータを設定できるコマンドです。記事を探っていると、MacOSの前バージョンのSierraと現行のMojaveでは少しパラメータが異なるようです。
このコマンドでできる事、各項目についてまとめていきます。

# 設定の確認と各項目の意味
まず現在の設定を確認します。

#### オプション

```sh
pmset -g #現在の設定値を出力する
　　　 -b #バッテリー駆動時の設定を変える
　　　 -c #電源接続時の設定を変える
　　　 -u #無停電電源（UPS）時の設定を変える これはMacbookに必要なの？
　　　 -a #全ての設定を変える
```

現在の状態の確認なら`-g`オプションで出力されます。
また、出力時の駆動状態（バッテリーor電源）で表示が変わるので注意して下さい。
`-u`はMacbookの設定では扱わなくても良さそうです（多分

#### 出力例
バッテリー駆動時の出力結果は以下になります。

```sh
 $ pmset -g
System-wide power settings:
Currently in use:
 standbydelaylow      1800
 standby              1
 halfdim              1
 hibernatefile        /var/vm/sleepimage
 proximitywake        0
 powernap             0
 gpuswitch            2
 disksleep            10
 standbydelayhigh     10800
 sleep                10
 hibernatemode        25
 ttyskeepawake        1
 displaysleep         10
 tcpkeepalive         0
 highstandbythreshold 50
 acwake               0
 lidwake              1
```
各項目について、説明していきます。

## standby
スタンバイモードを有効にするかどうか。`1:有効　0:無効`
スタンバイについては[スリープ・スタンバイモードとは](#スリープスタンバイモードとは)の項目へ。

## standbydelay
バッテリー残量が多いか少ないかで設定を変えられる。`high`と`low`があ理、例では`standbydelayhigh 10800`、`standbydelaylow 1800`としています。
この項目では、スリープ状態からスタンバイ状態になるまでの時間を秒単位で決める事ができます。例だと、バッテリー残量が多ければ10800秒でスタンバイ状態に、残量が少ないと1800秒でスタンバイ状態になります。
ここで言うバッテリー残量が多いか少ないかも設定できます。[highstandbythreshold](#highstandbythreshold)で設定可能。
スリープ・スタンバイについては[スリープ・スタンバイモードとは](#スリープスタンバイモードとは) の項目へ。

## halfdim
スリープの前にディスプレイ輝度を半分に下げるかどうか。`1:有効　0:無効`

## hibernatefile

ハイバーネートファイル（スリープイメージ）の保管先。バイナリファイルなので見れません。
スリープからスタンバイになる時に、直前の状態をここに書き出す。

## proximitywake

`1:有効　0:無効`
[Anyone know what pmset's proximitywake option is meant to do?](https://www.reddit.com/r/MacOS/comments/9lnu0d/anyone_know_what_pmsets_proximitywake_option_is/) とかmanを読む限り、同じiCloudIDの端末が近づいたら復帰する？よくわからないから教えて詳しい人。

## powernap 

パワーナップを有効にするかどうか。`1:有効　0:無効`
省エネルギー設定でも変更可能。わざわざコマンド叩いて変更しなくて良さそう。

## gpuswitch 

GPUを複数搭載しているMacに対応している、省エネルギー設定の「グラフィックスの自動切り替え」と同じ。省エネルギー設定に該当欄がないなら飛ばしてどうぞ。
`0:integrated(グラフィックス常時使用)
 1: discrete(使用しない)
 2: auto switch(自動切り替え)`

## disksleep

省エネルギー設定の「可能な場合はハードディスクをスリープさせる」に当たる設定。
オフにすると0になるが、オンにすると10に変更されるので時間を指定できるみたい。10となっているので単位は秒じゃなくて分だと思われるが、実際はその7割程度でスリープしてしまうとの記事もあった。
一応SSD搭載型でも該当項目があるので、HDDだけの設定ではない様子。書き込みを休ませるとかだと思う。

## sleep

多分、スリープに入るまでの時間。単位は`分`
電源接続時の省エネルギー設定「ディスプレイがオフの時にコンピュータを自動でスリープさせない」にチェックを入れると0になるため。スリープに入るまでの時間だと思われる。基本、ディスプレイが切れたらスリープに入るみたい。

## hibernatemode

ハイバーネートモードを設定できる。
`0 or 3 or 25`が推奨らしい（manより）
詳しいことは、[hibernatemodeでバッテリー消費を抑える](#hibernatemodeを変える) で。

## ttyskeepawake

リモートログイン時にスリープするかどうか。`1:有効　0:無効`

## displaysleep

省エネルギー設定の「ディスプレイをオフにするまでの時間」に当たる設定。設定単位は`分`
これも省エネルギー設定から設定可能。

## tcpkeepalive
TCPのキープアライブを有効にするかどうか。`1:有効　0:無効`
多分一般的なTCPのキープアライブの設定だと思われるので、有効にすると、定期的にTCPが有効であるパケットを送信し続けると思われる。バッテリー食いそう。

## highstandbythreshold
[standbydelay](#standbydelay)の`high`と`low`をどこで分けるかを設定できる。例では、50%以上では`high`、50％を下回ると`low`の設定が適用される。

## acwake
バッテリー駆動 ⇆ 電源接続　が切り替わった時に復帰するかどうか。`1:有効　0:無効`
刺したり抜いたりしてその都度起こす必要あるんかいな。

## lidwake 
ディスプレイを開くと復帰するかどうか。`1:有効　0:無効`
開いてかつボタンを押すまでが復帰のルーティーンだと言う方はオフにしましょう。

# 値を変更して、バッテリー持ちを良くしていく
例に挙げているのは初期値ではなく変更後の値になっています。この値に変更した理由も含めて解説します。
ここで説明しなかったものは初期値のままです。
変更したのは、`standbydelay`,`hibernatemode`の２つです。

### 各値の変更方法

```sh
sudo pmset -オプション 変更項目　変更する値 
```
これで変更します。オプションはどの状態の設定を変更するかを決めるものです。[オプション](#オプション)で確認してください。

## standbydelayを変える
[standbydelay](#standbydelay)より
[highstandbythreshold](#highstandbythreshold)は初期値で50のままなので、ここでは50%以上だと**3時間**、50%を切ると**30分**でスタンバイモードに入ります。

### スリープ・スタンバイモードとは
Apple公式のページがあるので置いときます。[Mac のスタンバイ機能について](https://support.apple.com/ja-jp/HT202124)
今回書いた私のイメージとして

スリープ　→ 即復帰できるようにメモリに格納されっぱなしの状態。電力消費そこそこ。
スタンバイ　→ 直前のセッションを別([ハイバーネートファイル](#hibernatefile))で保存して、復帰時にそこから復元する。保持しない分電力消費低！

です。また、どの程度スタンバイさせるかは[hibernatemodeを変える](#hibernatemodeを変える)で決める事ができます。

## hibernatemodeを変える
ハイバーネートの設定については[二度寝スリープでメモリをガッツリ解放しておく](https://zariganitosh.hatenablog.jp/entry/20110712/sleep_twice_free_memory) の記事に詳しく書いてありました。長いのでこちらを参照してください。
要点をおさえる（？）とこんな感じ

- 設定値は0 or 3 or 25 以外はやめとけ
- 規定値は3
- 0だと電源offになる
- 3だとギリギリまで保持するけど電源がやばくなったら電源がoff(?
- 25だと直前のセッションがメモリから外部記憶に全て移され電源off
- 25だと復帰時に時間がかかる（理由は上記だから）

つまりSSDでバッテリー持ちを良くしたいなら25でいいじゃん！なので25にしています。

# 日持ちするようになったのか？
確認しています。実感がでたら具体的な数字を書く予定です。
タイトル最適化になってるけど、最適化か？と思ったけどタイトル思いつかないのでそのままにしますﾊｲ

### 参考
わからない人は参考読んだらわかるかも
[Mojaveにおけるスリープ中のバッテリー消費](https://warexperimental.hatenablog.com/entry/2019/02/19/233340)
[pmset で Mac の電源制御](https://qiita.com/usagimaru/items/70cc39d5b1b0368fe028)   ※記事の情報が少し古いです。
[二度寝スリープでメモリをガッツリ解放しておく](https://zariganitosh.hatenablog.jp/entry/20110712/sleep_twice_free_memory)