HoloLens、Firebase、Node.js、irMagicianを使ってテレビを操作する

[こちら](https://qiita.com/miso_develop/items/c2008235cb4a8567cfa9)の記事を参考にさせて頂き、HoloLensを使ってテレビの電源をON/OFF出来るようにしてみました。

#処理の流れ
![webhook.png.001.png](https://qiita-image-store.s3.amazonaws.com/0/154355/ac4d4366-ec2e-eb92-be7b-59a304e154bc.png)

#使ったもの
* [HoloLens](https://www.microsoft.com/ja-jp/hololens)
* [Raspberry Pi zero w](http://ssci.to/3200)
* [irMagician](http://ssci.to/2150)
* テレビ

#実装イメージ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">HoloLens x Firebase x Node.js x irMagicianでテレビの電源を操作してみた。<br>リモコン使ったほうが早いですけどねｗ <a href="https://twitter.com/hashtag/HoloLens?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens</a> <a href="https://twitter.com/hashtag/HoloLensJP?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLensJP</a> <a href="https://twitter.com/hashtag/MR?src=hash&amp;ref_src=twsrc%5Etfw">#MR</a> <a href="https://twitter.com/hashtag/Firebase?src=hash&amp;ref_src=twsrc%5Etfw">#Firebase</a> <a href="https://twitter.com/hashtag/Nodejs?src=hash&amp;ref_src=twsrc%5Etfw">#Nodejs</a> <a href="https://t.co/gxv5oW4Anb">pic.twitter.com/gxv5oW4Anb</a></p>&mdash; がおまる@HoloLens研究者 (@gaomar) <a href="https://twitter.com/gaomar/status/925191286948110336?ref_src=twsrc%5Etfw">2017年10月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#irMagicianの準備
irMagicianをRaspberry Piで使えるように設定します。

irMagicianの使い方、Node.jsモジュールのインストールについては以下の記事を参照下さい。
[Nodeモジュール「irmagician」を作りました。](https://qiita.com/tamaki/items/f4127249ec211f7d70cd)

#Unity画面設定
テレビ操作のボタンを用意して、`HoloLensCamera`や`InputManager`、`CursorWithFeedback`はヒエラルキービューに設定しておきます。

![s100.png](https://qiita-image-store.s3.amazonaws.com/0/154355/1f6b0593-65d8-206c-a78a-2008825177f7.png)

###ネットワーク接続設定
ネットワーク接続するので、`Internet Client`にチェックを入れておきます

![s101.png](https://qiita-image-store.s3.amazonaws.com/0/154355/93d475c3-c20c-21c5-4563-b3b7a60cb129.png)

###タッチ処理
ボタンにAirTapした時の処理を記述します。新しいスクリプトをボタンに追加します。
AirTapするとFirebaseの対象ファイルに`tv オン`と書き込みます。
描き込むと更新情報がNode.jsに送られそこで処理をしています。

```csharp:TouchAction.cs
using HoloToolkit.Unity.InputModule;
using System.Collections;
using UnityEngine;
using System.Text;
using UnityEngine.Networking;

public class TouchAction : MonoBehaviour, IInputClickHandler
{
    // Firebaseの更新先URL
    string fb_url = "https://xxxxxxxxxxxxx.firebaseio.com/googlehome/word.json";

    // AirTap処理
    public void OnInputClicked(InputClickedEventData eventData)
    {
        Debug.Log("Touch!");
        StartCoroutine(Put(fb_url, "\"tv オン\""));
    }


    public IEnumerator Put(string url, string jsonStr)
    {

        var request = new UnityWebRequest();
        request.url = url;
        byte[] body = Encoding.UTF8.GetBytes(jsonStr);
        request.uploadHandler = new UploadHandlerRaw(body);
        request.downloadHandler = new DownloadHandlerBuffer();
        request.SetRequestHeader("Content-Type", "application/json; charset=UTF-8");
        request.method = UnityWebRequest.kHttpVerbPUT;
        yield return request.Send();

        if (request.isNetworkError)
        {
            Debug.Log(request.error);
        }
        else
        {
            if (request.responseCode == 200)
            {
                Debug.Log("success");
                Debug.Log(request.downloadHandler.text);

            }
            else
            {
                Debug.Log("failed");
            }
        }
    }

    // Use this for initialization
    void Start () {
        
    }
	
    // Update is called once per frame
    void Update () {
		
    }

}
```

#まとめ
うまく反応する事が出来ました。でもこの距離だと直接リモコン操作した方が早いですけどね。。。
様々なボタンを用意してやれば、HoloLensでボタンを押すだけで反応することが出来ますね。

でも、はたから見れば指をタップするとテレビがついたり、消えたりするんで異様な感じになりますね。