なるように、なる

徒然なつぶやき、備忘録です。

Philips Hue をTouchDesignerで制御するシステムを作った話

Hue単体だとスマホBluetooth接続でスマホアプリからの操作になる。
HueBridgeはAPIを提供してくれるので、LANに接続することでPCから制御することが出来るようになる。
Hue-HueBridge間の通信はZigbeeという独自のプロトコルで行われるらしい。

Zigbeeでの通信プログラムを書くのはダルいのでHueBridge経由でAPIを叩くか、と思っていたら、 matthew ragan様が既に作ってToxを公開してくれていました。

なので、UIを作っただけですが、一応メモを残しておきます。

なおHueBridgeのAPIは以下の公式ページで公開されています。

developers.meethue.com

こちらが作ったものです。

youtu.be

システム構成

HW

  • PC(Win11)
  • Hue(color, white ambiance)
  • HueBridge

SW

環境構築手順

HueBridgeのネットワーク接続

HueBridgeは有線でLANに接続する。
有線のみである。

でも刺せばいいだけ。
いさぎがよい。

HueBridgeのIPアドレスを調べる

touchdesigner-hueControlとHueBridgeを接続するときに必要になる。
IPアドレスを調べる手順は以下のとおり。

スマホの公式アプリ->設定->ブリッジ設定->ネットワーク設定 のところにあるDHCPのスイッチをOFFにするとIPが表示される

pythonのインストール

touchdesigner-hueControlのマニュアルを読むと、ローカルPCにもPythonをインストールしておく必要があるとのこと。
python3.9系であればよいと書いてあったので、念のためTDと同じ3.9.5をインストールしました。
今年はpythonをクリーンに使うと決めたので、pyenvでインストール。

touchdesigner-hueControlの環境構築

READMEに書かれている手順は古くなっている。
環境構築用のシェルを叩く手順が記載されているが、最新版ではその必要は無い。

dev/dev-env.toe を開く、もしくは、release/base_hueControl.tox 入れたtoeを開くと、初回に必要なpythonモジュール(phue)がインストールされる。

touchdesigner-hueControlとHueBridgeの接続

これはREADMEの「Connecting to the Hue Bridge」に手順が書いてあるけど、ざっくり以下のとおり。

  • base_hueControl tox のHueAdminタブで、HueBridgeのIPを設定する
  • HueBridgeの真ん中の大きなボタンを押す(ここ重要!!!!)
  • 間をあけずにbase_hueControl tox のHueAdminタブで、Set-up Individual Lights ボタンを押す

これでHueBridgeと接続されるのと同時に、HueBridgeと接続可能なHueライトの情報が収集され、toxのIndividual Lightsタブに一覧化される。
あとはパラメータを操作すれば、Hueの操作が出来るようになる。

white ambiance向けのカスタマイズ

今回はColorのライト以外に白色-暖色のみのwhite ambienceというHue製品も制御したかった。
しかし、base_hueControl toxの送信するコマンドでは、白色-暖色の色を変化させることができなかった。

APIを調べたところ、色の指定方法は複数あり、Colorの場合は"xy":[0.3220,0.5858] のようにXY空間で指定するが(他の指定方法もいくつかあった)、white ambienceの場合は "ct":165 のように、ct値(153(6500K)~500(2000K))で指定すると良さそうだった。

どうしようかなって思ったんだけれど、base_hueControl tox内のpythonコードを少しだけ変更することで対応しました。

hueControlEXTというDATがphueライブラリを使ってHueBridgeのAPIを叩いているようだったので、Hueクラスに以下の処理を追加しました。

  # RGBのRをCT値として利用する
    def Convert_ct(self, rgb):
        value = rgb[0]
        color_ct = 153.0 + (500.0 - 153.0) * value

        return int(color_ct)
  def Build_command_dict(self, light_index):
    # 前半省略

    # ライトの名前でColorとwhite ambianceを区別し、コマンドを投げ分ける
        light_name = parent().pars('Lightname{}'.format(light_index))[0].eval()
        if "color" in light_name:
            xy_cmd              = self.Convert_color(color_as_list)
            command_dict        = {
                'on'                : bool(on_cmd),
                'bri'               : self.Remap_brightness(bri_cmd),
                'transitiontime'    : trans_cmd * self.Trans_time_scaler,
                'xy'                : xy_cmd
            }
            return command_dict
        else:
            ct_cmd              = self.Convert_ct(color_as_list)
            command_dict        = {
                'on'                : bool(on_cmd),
                'bri'               : self.Remap_brightness(bri_cmd),
                'transitiontime'    : trans_cmd * self.Trans_time_scaler,
                'ct'                : ct_cmd
            }
            return command_dict

申し訳ないほど雑な処置ですが、参考までに。

使い勝手の感想

  • すごく簡単に接続&制御できる
  • ライトの明るさや色の変化に若干ラグがある。色々やり方を工夫したけれど、base_hueControl tox経由ではバキバキに反応させるのは出来なかった。 本家のサイトを見る限りはHueでもバキバキできるようではある。 色を変化させる速度のパラメータ設定もあるようなので、その辺りを地道に掘っていけば出来るのかも。。

おしまい