Hue単体だとスマホのBluetooth接続でスマホアプリからの操作になる。
HueBridgeはAPIを提供してくれるので、LANに接続することでPCから制御することが出来るようになる。
Hue-HueBridge間の通信はZigbeeという独自のプロトコルで行われるらしい。
Zigbeeでの通信プログラムを書くのはダルいのでHueBridge経由でAPIを叩くか、と思っていたら、 matthew ragan様が既に作ってToxを公開してくれていました。
なので、UIを作っただけですが、一応メモを残しておきます。
なおHueBridgeのAPIは以下の公式ページで公開されています。
こちらが作ったものです。
システム構成
HW
- PC(Win11)
- Hue(color, white ambiance)
- HueBridge
SW
- TouchDesigner(2022.31030)
- touchdesigner-hueControl(SHA-1: 5148ff397acb1ad3420ca24b6d92480341c55599)
https://github.com/raganmd/touchdesigner-hueControl - python(3.9.5)
環境構築手順
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でもバキバキできるようではある。 色を変化させる速度のパラメータ設定もあるようなので、その辺りを地道に掘っていけば出来るのかも。。
おしまい