pmset で Mac の電源制御

## 基本オプション

- `-g`：設定値を出力
- `-a`：すべてを対象
- `-b`：バッテリーを対象
- `-c`：電源接続中を対象
- `-u`：UPSを対象

## 設定値を出力

```
$ pmset -g
```

```:例
System-wide power settings:
Currently in use:
 standbydelay         10800
 standby              1
 womp                 0
 halfdim              1
 hibernatefile        /var/vm/sleepimage
 powernap             0
 gpuswitch            2
 networkoversleep     0
 disksleep            10
 sleep                10
 autopoweroffdelay    28800
 hibernatemode        3
 autopoweroff         1
 ttyskeepawake        1
 displaysleep         10
 acwake               0
 lidwake              1
```

## 関連ファイル

pmset コマンドによる設定は以下のファイルに書き込まれる。
`/Library/Preferences/SystemConfiguration/com.apple.PowerManagement.plist`

また、起動予定などのスケジュールは以下のファイルに書き込まれる。
`/Library/Preferences/SystemConfiguration/com.apple.AutoWake.plist`

ハイバーネートファイル（スリープイメージ）は一般に以下のファイルである。
`/var/vm/sleepimage`

## Mac の起動原因を出力する

```
$ syslog |grep -i “Wake reason”　
```

[セーフスリープさせない（MacBook AirのSSDをいたわる　その2）](http://sawayakatrip.com/mac-macbookair-ssd-care-2)

## MacBook 向けに電源制御を変更してみる

2016年末から MacBook Pro 2016 / macOS Sierra を使い始めたが、使い終わったらいつものように Mac のフタを閉じてスリープ、翌日起こしてみたらバッテリーが完全に消耗している上にセーフスリープの復元が走るということが度々起こっていた。こうなると Touch ID ログインも iPhone 再起動時のようにリセットされパスワード入力必須になってしまって手軽さなんてありゃしない。なんだ、新しい MacBook Pro のバッテリーダメダメやん、と疑いもしたが、pmset で電源設定を変えることでこのようなことは起こりづらくなった。もし MacBook Pro 2016 の電池消耗やセーフスリープが気になるようなら以下の設定を試してみてほしい。各設定の詳しい解説は以降に続く。

```bash:現在のモードを出力
$ pmset -g
System-wide power settings:
Currently in use:
 standbydelay         28800
 standby              1
 womp                 0
 halfdim              1
 hibernatefile        /var/vm/sleepimage
 powernap             0
 gpuswitch            2
 networkoversleep     0
 disksleep            10
 sleep                60
 autopoweroffdelay    28800
 hibernatemode        3
 autopoweroff         1
 ttyskeepawake        1
 displaysleep         10
 acwake               0
 lidwake              1
```

USB-C で電源に繋いでいれば外部電源の設定、外せば内部電源の設定を出力する。

- `standby`: 1
スタンバイモードを有効。（初期値のまま）

- `standbydelay`: 28800
スリープから8時間後にスタンバイモードに移行。（初期値では3時間後なので短すぎる）

- `womp`: 0
Wake on Demand を無効。そもそも内部電源では機能しないので電池の消耗には影響を与えないだろうが、スリープ中に Bonjour サービスが実行されなくても良いので無効化。

- `powernap`: 0
バッテリーでは Power Nap を無効。いつのまにか電池が消失していたのはおそらく Power Nap が原因。これを無効化してやると復帰時に電池残量ゼロ状態やプログレスバー表示になりにくくなる。

- `hibernatemode`: 3
ハイバーネートモードは利便性を考え MacBook 初期値の 3 のままにしておく。

`standbydelay` `powernap` の変更がかなり効果的に出ており、一晩明けたらいつのまにか電池が消失しているとかセーフスリープに移行しているとかが起こりにくくなった。

**その他：**

Apple 純正の USB-C アダプタは電力を消費するらしいので、使わないときには外しておくと良い。
[AppleのThunderbolt/USB-Cアダプタ類を買う前に確認しておきたい注意点。](http://applech2.com/archives/20161130-be-careful-before-you-buy-apple-adapter.html)

## ハイバーネートモード：`hibernatemode`

スリープのモードには3種類ある。3種類以外のモード（値）は推奨されない。

### スリープ：`hibernatemode=0`

メモリの内容をストレージにコピーしない。つまりバッテリー含め電源が完全に切れるとメモリデータが揮発する。デスクトップ Mac では初期値。

### セーフスリープ：`hibernatemode=3`

メモリの内容をストレージにコピーする。スリープ中にメモリに電源が供給されていればメモリから復元、そうでなければハイバーネートイメージから復帰する。ポータブル Mac では初期値。

[Mac のスリープを解除したときにプログレスバーが表示される場合](https://support.apple.com/ja-jp/HT201635)

### ディープスリープ：`hibernatemode=25`

メモリの内容をストレージにコピーし、メモリへの電源供給を断つ。つまり電源が完全に切れるスリープモード。システムはハイバーネートイメージから復帰する。バッテリー寿命的には一番最適なモードだが、復帰が低速になる。`pmset` コマンドでのみ設定可能なモード。

このモードだとメモリを解放するので、その意図で利用すると良いらしい。

より詳しい記事：
[二度寝スリープでメモリをガッツリ解放しておく](http://d.hatena.ne.jp/zariganitosh/20110712/sleep_twice_free_memory)


## スタンバイモード

> Mac ノートブックおよびデスクトップコンピュータには、省電力のためのスタンバイ機能が備わっています。以前のモデルでは通常のスリープ状態が 1 時間継続した後でスタンバイになりますが、2013 年以降に製造された Mac コンピュータは、スリープ状態になってから 3 時間後にスタンバイ状態になります。スタンバイ中は、コンピュータの状態がフラッシュストレージ (SSD) に保存された後、スタンバイの継続時間を延ばすためにハードウェアサブシステムへの電力が遮断されます。たとえば、スタンバイ中は RAM メモリや USB バスに電力が供給されません。
スタンバイ状態になると、ノートブックコンピュータのバッテリー駆動時のスリープ継続時間も延びます。バッテリーが完全に充電されたノートブックコンピュータであれば、AC 電源に接続しなくてもスタンバイ状態を最長 30 日間維持可能です。 
[Mac コンピュータ：スタンバイモードについて](https://support.apple.com/ja-jp/HT202124)

standby と autopoweroff の違いは不明……。

### `standby`

スリープ状態が指定時間(standbydelay)続くと自動的に休止させる。
ハイバーネートモードが `3`, `25` の時にのみ有効。（メモリの状態がストレージに保存される設定でなければならない）

### `standbydelay`

standby を実施するまでの時間（秒）。

### `autopoweroff`

欧州エネルギー関連製品指令（ErP指令）ロット6のためのモード。

スリープ状態が指定時間(autopoweroffdelay)続くとメモリの状態をハイバーネートファイルに書き込み、停電力チップセットスリープに移行する。（？）
この状態からの起動は時間がかかる。

### `autopoweroffdelay`

autopoweroff を実施するための時間（秒）。

## `lidwake`

- `0`: 無効
- `1`: 有効

MacBook のモニターを開いた際に復帰するモード。

## `halfdim`

- `0`: 無効
- `1`: 有効

スリープの前にディスプレイ輝度を半分に下げる。

## `acwake`

- `0`: 無効
- `1`: 有効

電源が変更されたら復帰するモード。（AC/バッテリー）

## `autorestart`

- `0`: 無効
- `1`: 有効

電源消失したら再起動するモード。（停電後に再起動）

## `ttyskeepawake`

- `0`: スリープする
- `1`: スリープしない

リモートログイン最中はスリープしないモード。

## `powernap`

- `0`: 無効
- `1`: 有効

Power Nap を指定する。

Power Nap は、スリープ中にTime Machine をバックアップしたり、メール取得、カレンダー同期、iCloud 同期を定期的に実施する。

## `womp`

- `0`: 無効
- `1`: 有効

Wake on Demand の設定値。

[Wake on Demand および Bonjour Sleep Proxy について](https://support.apple.com/ja-jp/HT201960)
> Mac コンピュータがスリープモードになっているときも、iTunes および iPhoto のライブラリ共有、プリンタ共有、ファイル共有、画面共有などの共有サービスは引き続き利用できます。

システム環境設定でいう、「Wi-Fiネットワークアクセスによるスリープ解除」に対応している。

<img width="648" alt="スクリーンショット 2017-01-16 0.16.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/3603/7bb4e7e0-8248-e012-ae54-4a4bc5129702.png">

電源に繋いだ状態でなければならない。
MacBook ならモニターを開いた状態でスリープしなければならないらしい。
[スリープに関する知識まとめ](http://d.hatena.ne.jp/zariganitosh/20110706/about_sleep)

## `networkoversleep`

システムがスリープ中に提供するネットワークサービスに影響を与える設定。
この設定の変更は推奨されない。

## `gpuswitch`

- `0`: integrated
- `1`: discrete
- `2`: auto switch

「グラフィックスの自動切り替え」モードと思われる。Mac が GPU を複数搭載している場合に有効。

[MacBook Pro でグラフィックスのパフォーマンスを設定する](https://support.apple.com/ja-jp/HT202043)

## `destroyfvkeyonstandby`

- `0`: 保持
- `1`: 破壊

スタンバイモードに入ったら File Vault キーを破壊する。（初期設定では保持する）
キーが破壊されると、ユーザーはスタンバイモードから復帰した際にパスワードの入力が求められる。

セキュリティを高めるための機能と思われる。