Python で Sony Camera Remote API を試す (その1: 接続編)

# はじめに

Python から Sony のカメラ (α / Cyber-shot) を制御したい motivation があったので、その際の作業メモとして記述しています。

## 環境

### カメラ

* [α7M2 (ILCE-7M2)](http://www.sony.jp/ichigan/products/ILCE-7M2/)
![](http://www.sony.jp/products/picture/ILCE-7M2K.jpg)

### 開発環境

* Windows10 Pro Fall Creators Update (1709)
  * PowerShell 5.1.16299.98
* Python 3.6.4 (Anaconda 上に構築)
* [Sony Camera Remote API beta SDK](https://developer.sony.com/ja/develop/cameras/) v 2.40

# カメラと PC の接続

まずは、カメラと開発環境となる PC を WiFi で接続します。

## α7M2 の場合

1. カメラの `MENU` を開く
2. 設定項目一覧から、`アプリ一覧` を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58399/9c055ecf-9c97-cafb-fffd-6fc001846020.png)
  * 「内蔵版」のアプリが表示される場合は、一旦スマートリモコンアプリのアップデートを推奨
  * 「内蔵版」の場合、APIから利用できる機能が制限される
3. アプリ一覧から `スマートリモコン` を選択
4. カメラの画面上に表示される SSID/パスワード のアクセスポイントへ PC を接続
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58399/a08b0779-1e2e-3755-b623-ae5c9110c12a.png)
   * ※ 画像は「内蔵版」の場合
   * 画面上に QR コードが表示されている場合は、カメラの削除ボタン (C4) を押すことでパスワード表示画面へ切り替わる
5. カメラの表示が `接続中` に切り替われば、カメラと PC の接続が完了
![image.png](https://qiita-image-store.s3.amazonaws.com/0/58399/44091250-9a6c-930f-fa0b-7f5639a497eb.png)

# REST API の動作確認

Python 上から API を叩く前に、まずは基本機能をコマンドライン上から実行し、動作確認をしてみます。
以下、PowerShell 上で実行する場合の手順を記載しますが、`curl` コマンド等からも同等の手順が行えるはずです。

## 共通事項

* 接続先の URL は、 http://192.168.122.1:8080/sony/camera を利用する
  * API のリファレンスには SSDP を利用してカメラを探索する手順が記載されていますが、カメラと PC を1対1で接続する場合は不要です。
* 原則 HTTP の `POST` メソッドを使用する
  * `GETP 等では `501 Not Implemented` が返りエラーとなります。

## カメラを撮影モードに切り替える

`startRecMode` API を実行すると、カメラが撮影モードへ切り替わります。
通常、カメラと PC の接続を確立したら、まずはこれを実行しましょう。
カメラ側の画面がライブビューの映像に切り替われば成功です。

```powershell
> Invoke-WebRequest -Uri http://192.168.122.1:8080/sony/camera -Method POST -Body '{"method":
 "startRecMode", "params": [], "id": 1, "version": "1.0"}'


StatusCode        : 200
StatusDescription : OK
Content           : {"result":[0],"id":1}
RawContent        : HTTP/1.1 200 OK
                    Connection: close
                    Content-Length: 21
                    Content-Type: application/json

                    {"result":[0],"id":1}
Forms             : {}
Headers           : {[Connection, close], [Content-Length, 21], [Content-Type, application/json]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 21
```

## 写真を撮影する

`actTakePicture` API を実行すると、現在の設定で写真が1枚撮影されます。
復帰値の `"result"` に格納された URL へアクセスすると、撮影画像を取得することができます。

```powershell
> Invoke-WebRequest -Uri http://192.168.122.1:8080/sony/camera -Method POST -Body '{"method":
 "actTakePicture", "params": [], "id": 1, "version": "1.0"}'


StatusCode        : 200
StatusDescription : OK
Content           : {"result":[["http:\/\/192.168.122.1:8080\/postview\/memory\/DCIM\/100MSDCF\/DSC0XXXX.JPG?size=Scn"]
                    ],"id":1}
RawContent        : HTTP/1.1 200 OK
                    Connection: close
                    Content-Length: 108
                    Content-Type: application/json

                    {"result":[["http:\/\/192.168.122.1:8080\/postview\/memory\/DCIM\/100MSDCF\/DSC0XXXX.JPG?size=Scn"]
                    ],"id":1}
Forms             : {}
Headers           : {[Connection, close], [Content-Length, 108], [Content-Type, application/json]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 108
```

## ホワイトバランスを変更する

`setWhiteBalance` API を実行すると、撮影時のホワイトバランスを変更することができます。
プリセットされたシーンの他、色温度を直接指定することもできます。

```powershell
> Invoke-WebRequest -Uri http://192.168.122.1:8080/sony/camera -Method POST -Body '{"method":
 "setWhiteBalance", "params": ["Color Temperature", true, 2500], "id": 1, "version": "1.0"}'


StatusCode        : 200
StatusDescription : OK
Content           : {"result":[0],"id":1}
RawContent        : HTTP/1.1 200 OK
                    Connection: close
                    Content-Length: 21
                    Content-Type: application/json

                    {"result":[0],"id":1}
Forms             : {}
Headers           : {[Connection, close], [Content-Length, 21], [Content-Type, application/json]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 21
```

# 次回

実際に Python 上から API を実行してみます。