Room Navigatorとパソコンでジングルベルを演奏してみた

こんにちは、みなさん！
12月といえば、街はクリスマスムード全開ですよね。ツリーやイルミネーションが輝く中、自宅やオフィスにちょっとユニークなギミックを加えたくありませんか？今回は、CiscoのRoom Navigatorというデバイスと、Macで動くPythonスクリプトを組み合わせて、ジングルベルを演奏しながらLEDをピカピカさせるという、ちょっと変わった（でも面白い）ハックに挑戦してみましょう。

## なにをするの？
* **Cisco Room NavigatorのLED制御** : 本来はミーティングやルームブッキングのインターフェイスとして使われるNavigatorですが、実はウォールマウントモデルにはLEDがついていて遠くからでもLEDの色で部屋の状態を確認できます。さらになんと、LEDの色はプログラムから制御できます。
* **ドレミ音階のAIFFファイルでリアルなメロディ演奏：**
短いAIFF音源を使って、ジングルベルの冒頭フレーズを再現。
たとえば、C.aiff、D.aiff、E.aiff、G.aiffのようなファイルを用意し、それぞれの音程に対応させます。
* **LEDと音を同期**: LEDを点滅させるタイミングとビープ音のタイミングを合わせて、あたかもRoom Navigatorが音楽に合わせて光っているような雰囲気を出していきます。


まさにIoT＋クリスマス＋音楽＋Pythonといった、カオスな要素満載の小ネタです。

## 準備するもの

1. **Cisco Room Navigator Wallmountタイプ**
Room NavigatorはTableに置くタイプとWallmountタイプがあります。LEDがついているのはWallmountタイプのみなのでWallmountタイプを用意ください。手元に準備できたらIPアドレスやAPI利用が可能な環境を用意します（ネットワークアクセス、xAPI利用設定などが必要です）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/905342/1c722317-a9b7-f71c-a5fa-4933d6d1c5cb.png)

2. **MacOS + Python環境**
MacにはデフォルトでPython3が入っていることが多いので、python3コマンドが実行できるか確認します。
WindowsとMacでPythonを使用してビープ音を出力する仕組みがことなるためあえてMacと書いています。
3. **Cisco xAPIアクセス用トークン・ユーザ/パスワードなど**
Room Navigatorを制御する場合は、エンドポイントデバイス（例: Cisco Room Barなど）と連動している場合が多いので、そのデバイスに対してxAPIでLED制御コマンドを送る準備が必要です。
StandaloneのRoom Navigatorも対応しているのでエンドポイントデバイスは必須ではありません。
4. **AIFF音源ファイル**
「C.aiff」「D.aiff」「E.aiff」「G.aiff」など、ジングルベル冒頭フレーズに必要な音を準備します。

## LED制御とビープ音再生のアイデア
Macでビープ音を出すには色々方法がありますが、一番シンプルなのはターミナルのベル文字\a（BEL）を使ったり、print('\a')を使うなどが考えられます。ただ、システム設定によっては音が鳴らないこともあるので、一例としてos.system('afplay /System/Library/Sounds/Ping.aiff')のような方法で短い音を再生することもできます。ここでは簡易的にビープ音とします。

LEDは、CiscoのxAPIを利用して特定のLEDコマンドを発行することで色や点灯状態を変えることができます。たとえば以下のようなイメージです。
```javascript
    <Command>
      <UserInterface>
        <LedControl>
          <Color>
            <Set>
              <Color>{color}</Color>
            </Set>
          </Color>
        </LedControl>
      </UserInterface>
    </Command>
```
実際にはこれをPythonのrequestsライブラリでPOSTします。

### コード例
ここではかなりシンプルに示します：

* **手順**
1. ジングルベルのメロディー（リズム）に合わせて、「音をならす、LEDを色変える」を繰り返す。
2. 「♪ジングルベル ジングルベル ～」の最初のフレーズの音のパターンを配列にしておき、各音に対応してLEDの色をセット。

以下はあくまでサンプルコードで、実際には適宜IPや認証情報を書き換えてください。また、requestsモジュールとネットワーク環境が適切に設定されていることが前提です。
```python
import time
import os
import requests
from requests.auth import HTTPBasicAuth
import warnings
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# InsecureRequestWarningを無視
warnings.simplefilter('ignore', InsecureRequestWarning)

# Room Navigator（または連動するWebexデバイス）の設定
ROOM_DEVICE_IP = "192.168.1.1"
USERNAME = ""
PASSWORD = ""

music_path = ""

# LED制御用の関数
def set_led(color="Green"):
    url = f"https://{ROOM_DEVICE_IP}/putxml"
    xml = f"""
    <Command>
      <UserInterface>
        <LedControl>
          <Color>
            <Set>
              <Color>{color}</Color>
            </Set>
          </Color>
        </LedControl>
      </UserInterface>
    </Command>
    """
    # SSL証明書チェックを無視（デモ用）
    response = requests.post(url, data=xml, auth=HTTPBasicAuth(USERNAME, PASSWORD), verify=False)
    return response.status_code

# ビープ音再生用関数
def play_sound(sound_file):
    # サウンドを再生
    os.system(f"afplay /{music_path}/{sound_file}.aiff")

# LEDカラーはOffで消灯、Red, Green, Blue, Yellowなどで発光
# ジングルベル冒頭風の音の並び (ミミミーミミミーミソドーレミー)
notes = [
    ("E", "Red"),    # ミ
    ("E", "Green"),  # ミ
    ("E", "Red"),   # ミ
    ("E", "Green"), # ミ
    ("E", "Red"),   # ミ
    ("E", "Green"),# ミ
    ("E", "Red"),  # ミ
    ("G", "Cian"),   # ソ
    ("C", "White"),   # ド
    ("D", "Blue"), # レ
    ("E", "Red"),  # ミ
]

print("Jingle Bellsスタート！")

for (sound, color) in notes:
    set_led(color)
    play_sound(sound)

# 終了時にLEDをOffに
set_led("Off")
print("演奏終了！メリークリスマス！")
```

## 実行してみよう！

上記スクリプトをjingle_bell.pyなどとして保存し、ターミナルから実行します。
```bash
python3 jingle_bell.py
```

実行すると、プログラム中で定義したリズムに合わせてRoom NavigatorのLEDが点灯・消灯し、Mac側からビープ音（またはafplayで再生している音）が同期して再生されます。
こちらが実際の動画です。

https://app.vidcast.io/share/3cf19774-cfc2-4d57-ae6b-69d8cf4d4e23

## やってみた感想
アプリケーションの実行速度がそこまで早くないので音の間隔が長く、細かい部分はガバガバですが、クリスマス気分をテックな方法で楽しむにはおもしろいネタになると思います。
Room Navigatorは本来ビデオ会議端末のリモコンとしてやミーティングの予約デバイスの利用がほとんどですが、こうしたAPIを使うとちょっとしたイルミネーション装置みたいなこともできちゃうのが面白いですね。
オフィスのエントランスに設置してクリスマス週限定で鳴らしてみるとか、クリスマスツリー代わりにお客様をショーケースに招いた時にウケ狙いで見せるとか、使い方はアイデア次第です。

まとめ
* Cisco Room NavigatorのLEDを色とタイミングで制御し、音と光をシンクロ
* ドレミ音階のAIFFファイルを用意して本格的なメロディを再生
* IoTデバイス×季節ネタでちょっとユニークなサイドプロジェクトに！

これで、あなたもホリデーシーズンを少しハイテクに彩ってみてはいかがでしょうか？
**メリークリスマス！**