THETA SCをPowerShellで操作してみる（THETA API v2.0）

先日購入したRICOHの360度カメラ「THETA SC」がAPI公開されていたので
ちょっと触ってみた記録です。

### 公式サイト
THETA DEVELOPERS
https://developers.theta360.com/ja/

### 実行環境

OS: Windows 10 Pro
Poweshell: ver 5.1.14393.206
THETA API: v2.0

公式サイトをよく読めば書いてありましたが,
明示的にv2.1に切り替えを行わないとAPI v2.0になります。

### PSコマンドの試し方

1. THETA SCを立ち上げ、WIFIをONにする
2. WindowsからTHETAにWIFI接続する（接続時のパスワードは説明書を参照）
3. WindowsのPowerShellを立ち上げPSコマンドを実行

# 実行してみたAPIとPSコマンド
公式サイトみながら適当にAPI (v2.0)実行してみました。
なお、別の環境で実行する場合、コマンド中のsessionID、ファイル名などはお使いの環境に合わせて変更してください。

##【Protocol】Info
カメラに関する基本情報や、サポートしている機能を取得

実行したPSコマンド

```ps1
Invoke-RestMethod -Uri "http://192.168.1.1:80/osc/info" -Method GET
```

実行結果
<pre>
#manufacturer    : RICOH
#model           : RICOH THETA SC   
#serialNumber    : 30102839
#firmwareVersion : 01.00
#supportUrl      : https://theta360.com/en/support/
#apiLevel        : {1, 2}
#endpoints       : @{httpPort=80; httpUpdatesPort=80}
#gps             : False
#gyro            : False
#uptime          : 536
#api             : {/osc/info, /osc/state, /osc/checkForUpdates, /osc/commands/execute...}
</pre>

## 【Protocol】State
カメラの状態を取得

実行したPSコマンド

```ps1
Invoke-RestMethod -Uri "http://192.168.1.1:80/osc/state" -Method POST
```

実行結果
<pre>
#fingerprint state
#---------- -----
#FIG_0004    @{sessionId=SID_0002; batteryLevel=0.33; storageChanged=False; _captureStatus=idle; _recordedTime=0; _re...
</pre>

## 【protocols】checkForUpdates
現在の状態IDを取得し、Stateの状態変化を確認

実行したPSコマンド

```ps1
Invoke-RestMethod -Uri http://192.168.1.1:80/osc/checkForUpdates -Method POST -Body (ConvertTo-Json @{"stateFingerprint"="FIG_0005"}) -ContentType "application/json"
```

実行結果
<pre>
#stateFingerprint throttleTimeout
#---------------- ---------------
#FIG_0004                       1
</pre>

## 【commands】camera.startSession
セッションを開始。セッションIDを発行

実行したPSコマンド

```ps1
Invoke-RestMethod -Uri http://192.168.1.1:80/osc/commands/execute -Method POST -Body (ConvertTo-Json @{"name"="camera.startSession";"parameters"=@{}}) -ContentType "application/json"
```

実行結果
<pre>
#name                state results
#----                ----- -------
#camera.startSession done  @{sessionId=SID_0005; timeout=180}
</pre>

## 【commands】camera.takePicture
静止画撮影を開始

実行したPSコマンド

```ps1
Invoke-RestMethod -Uri http://192.168.1.1:80/osc/commands/execute -Method POST -Body (ConvertTo-Json @{"name"="camera.takePicture";"parameters"=@{"sessionId"="SID_0005"}}) -ContentType "application/json"
```

実行結果
<pre>
#name               state      id progress
#----               -----      -- --------
#camera.takePicture inProgress 1  @{completion=0.00}
</pre>

## 【commands】camera.listImages
静止画ファイルリストを取得

実行したPSコマンド

```ps1
Invoke-WebRequest -Uri http://192.168.1.1:80/osc/commands/execute -Method POST -Body (ConvertTo-Json @{"name"="camera.listImages";"parameters"=@{"entryCount"=50;"maxSize"=160;"includeThumb"="false"}}) -ContentType "application/json"
```

実行結果
<pre>
#StatusCode        : 200
#StatusDescription : OK
#Content           : {"name":"camera.listImages","state":"done","results":{"entries":[{"name":"R0010045.JPG","uri":"100R
#                    ICOH/R0010045.JPG","size":4116645,"dateTimeZone":"2016:11:05 16:18:56+09:00","width":5376,"height":
#                    26...
#RawContent        : HTTP/1.1 200 OK
#                    Pragma: no-cache
#                    Max-Age: 0
#                    X-Content-Type-Options: nosniff
#                    Connection: close
#                    Accept-Ranges: bytes
#                    Content-Length: 4778
#                    Cache-Control: no-cache, no-store, max-age=0, must-revali...
#Forms             : {}
#Headers           : {[Pragma, no-cache], [Max-Age, 0], [X-Content-Type-Options, nosniff], [Connection, close]...}
#Images            : {}
#InputFields       : {}
#Links             : {}
#ParsedHtml        : mshtml.HTMLDocumentClass
#RawContentLength  : 4778
</pre>

## 【commands】camera.getImage
静止画をPCにコピー

実行したPSコマンド

```ps1
Invoke-RestMethod -Uri http://192.168.1.1:80/osc/commands/execute -Method POST -Body (ConvertTo-Json @{"name"="camera.getImage";"parameters"=@{"fileUri"="100RICOH/R0010044.JPG"}}) -ContentType "application/json" -OutFile C:\temp\test.jpg
```

実行結果
<pre>
無し（C:\temp\にtest.jpgが作成されている）
</pre>

# 感想
PowerShellでお気軽にTHETAを操作できるのが新鮮でした。

はまった点はTHETA SCのデフォルトAPIがv2.0だったこと。
発売されたばかりだしとAPIは最新のv2.1だと思い込んでました。
`camera.takePicture`でエラーになり、おもむろにv2.0の引数で試すと成功。
公式サイトをよく読むと`camera.setOptions`をするとv2.1が使えることを発見しましたが、
時間ないのでv2.0で記事書いちゃいました

作業する上で大変だったのは、PCからTHETAにWIFIで接続するとPCでインターネットに接続できないこと。
1台のPCで「調べる＆試す」の繰り返しをしようとすると都度接続先を変えるのが手間です。
自分の場合はPCはTHETAに接続しっぱなしで、調べ物はLAN接続させた7インチのタブレットで行いました。