[Pebblewatch]スマートウォッチでプレゼン操作する

# [Pebblewatch]スマートウォッチでプレゼン操作する

0. 最初に
1. applescriptを使う
2. Pythonからapplescriptを呼び出す
3. Flaskで簡単なAPIを実装
4. pebbleからURLをたたく

## 最初に
自分が持っているPebbleでプレゼンを操作すればカッコいいんじゃないかと思い、なんとかスライド操作できないもんかなと思っていました。そしてついに今回のApplescriptを用いた手軽な方法に辿り着けたので紹介します。

今回の仕組みは
Pebble -> Smartphone -> Macbook -> applescript -> キー入力
という感じです。

## applescriptを使う
プログラミングでキー入力やプログラムの操作方法としてapplescriptというのがありました。今回はこのMacでapplescriptを使った手法を紹介していきますがWindowsではsendkeyというものがあるみたいです。

- applescriptでPowerpointのプレゼン起動

```
tell application "Microsoft PowerPoint"
	set slideShowSettings to slide show settings of active presentation
	run slide show slideShowSettings
end tell
```

- Powerpointの起動も含めると

```
tell application "Microsoft PowerPoint"
    activate
    open "/Users/Hoge/pppp.ppt"
    set slideShowSettings to slide show settings of active presentation
    run slide show slideShowSettings
end tell
```

- Key 入力

```
tell application "System Events"
	key code 124
end tell
```

キー入力はSystem Eventsに送ります。文字入力は
> keystroke "a"
> keystroke "abc"

Command + f, Control + Command + f, RightArrowなどは
> keystroke "f" using {control down, command down}
> key code 124

などとなります。キーコード124は→キーとなります。
キーコード一覧は[こちら](http://apple.stackexchange.com/questions/36943/how-do-i-automate-a-key-press-in-applescript)
このようにApplescriptを使いこなせればPCを自由に操作することができます。

## Pythonからapplescriptを呼び出す

上で紹介したApplescriptは osascript というコマンドでコマンドラインから呼べます。

```sh
$ osascript -e 'tell application "System Events"
    keystroke "hoge"
    end tell'
```

これをPythonコードにすると

```python
import os
cmd = """
osascript -e 'tell application "System Events"
    keystroke "hoge"
    end tell'
    """
os.system(cmd)
```

> [py-applescript](https://pypi.python.org/pypi/py-applescript/1.0.0)というライブラリもありますが、これを使うとアクティブウィンドウが一度外れちゃうので今回つかいません。

## Flaskで簡単なAPIを実装

Flaskを用いて簡単なAPIサーバをローカルに建てます。
FlaskはPythonの手軽なフレームワークです。

まずはpipコマンドでFlaskをインストールします。

```sh
pip install flask
```

サーバアプリを書きます。

```python
from flask import Flask
import os

# configuration
SECRET_KEY = 'pebbly'

# create our little application :)
app = Flask(__name__)
app.config.from_object(__name__)

# Powerpointで開いているプレゼンのスライドショーを起動する
# /slideshow
@app.route('/slideshow')
def slideshow():
    cmd = """
    osascript -e '
    tell application "Microsoft PowerPoint"
    set slideShowSettings to slide show settings of active presentation
    run slide show slideShowSettings
    end tell'
    """
    os.system(cmd)
    print "Go slideshow"
    return "ok"

# RightArrow入力、スライド進む
# /right
@app.route('/right')
def goright():
    cmd = """
    osascript -e 'tell application "System Events"
    key code 124
    end tell'
    """
    os.system(cmd)
    print "Go right"
    return "ok"

# LeftArrow入力、スライド戻る
# /left
@app.route('/left')
def goleft():
    cmd = """
    osascript -e 'tell application "System Events"
    key code 123
    end tell'
    """
    os.system(cmd)
    print "Go left"
    return "ok"

@app.route('/')
def index():
    return "pebbleFlask server running."

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0")
```

そしてこれを起動するだけでローカルにプレゼンを操作するAPIサーバが立ちます。

```
$ python pebbleFlask.py
 * Running on http://0.0.0.0:5000/
 * Restarting with reloader
```

これでブラウザからもしくはコマンドラインから "localhost:5000/slideshow" にアクセスしてみてください。Powerpointで開いているスライドが全画面になります。
同じネットワーク内なら他のPCやスマホからでもアクセスできます。

```
curl 192.168.x.x:5000/slideshow
curl 192.168.x.x:5000/right
```

# pebbleからURLをたたく

今回はPebbleから自分のローカルのAPIサーバにURLをたたくことでスライドの操作をします。
PebbleにHTTP Requestというアプリをインストールして各ボタンに設定したい機能のURLを打ち込んであげます。
> 例: http://192.168.x.x:5000/right

自分のPebbleとペアリングしているスマホとローカルPCが同じネットワーク内にいないとだめです。

ボタンを設定したらPebbleの上下のボタンでスライド進めたり、戻したりできます。ただネットワークが変わればURLを打ち直す必要があるのが少々手間ですね。

- HTTP Requestアプリ
![HTTP Requestアプリ](https://qiita-image-store.s3.amazonaws.com/0/72566/cfdd0432-9f8d-acd0-2d77-9487158b73ec.png "pebble1.png")

- 設定画面
![設定画面](https://qiita-image-store.s3.amazonaws.com/0/72566/f7556f3d-3e11-9f4e-6fca-3ceb38406968.png "pebble2.png")

# 最後に

これで完成です。applescriptを使えばキー入力やPC操作なんでもできそうです。これをPython FlaskのWebサーバにつなぐことでAPI形式でどんなデバイスからでもアクセスできます。Smartwatch、スマホのブラウザ、他のウェアラブルデバイスでいろいろな操作ができます。

そしてapplescriptの部分を書き換えれば様々なアクションを起こすことができます。みなさんも思いついたアプリを書いてみてください。

# 追記
Gitにコードを公開しました。スマホのブラウザからも操作ができるHtmlページも実装してあります。
https://github.com/giga811/PebbleControl

# 参考URL

- [Applescript キーコード一覧](http://apple.stackexchange.com/questions/36943/how-do-i-automate-a-key-press-in-applescript)
- [Applescript パワポ操作方法](http://stackoverflow.com/questions/8427636/using-applescript-run-powerpoint-slide-show-of-specified-slide-in-the-presentati)
- [Applescript Pythonで走らせる](http://stackoverflow.com/questions/1770312/is-there-a-sendkey-for-mac-in-python) 
- [Applescript スクリプト例](http://www.arcaid.jp/modules/arcaid_lib/index.php/lib_as/lib_as_02_systemevent01.html)