0

EdisonとMIDIコントローラでHueを調光する

これ
Node.jsとMIDIコントローラでHueを調光する

Macminiにつないで常用してたので、けっこうアップデートしてる。
https://github.com/shokai/hue-korg-control

やっぱりスマホアプリよりも物理的なツマミやスライダーが複数あったほうが複数のHueを操作するのには向いてると思う

Edisonは起動が速くて、電源入れて10秒ぐらいでWiFiつながってsystemdに登録しておいたhue-korg-controlが起動して調光できるようになる。たまにnano KONTROLが認識されてないのでEdisonにUSBホストケーブル挿し直す必要あるけど


EdisonにUSB MIDIコントローラを接続する

EdisonにArduinoをUSB接続すると同じ要領で、USBホストケーブルを使ってkorg NANO KONTROLをつないだ。

使ってるUSBホストケーブルはこれ

もう売ってない初代nano KONTROL使ってるんだけど、2でも動くだろたぶん


alsaインストール

midiデバイスはNode.jsからだとmidi npmを使って制御する。中で使われてるRtMidiがalsaに依存しているので、opkgでインストールする

% opkg install alsa-lib-dev alsa-dev


hue-korg-control起動

shokai/hue-korg-controlをgit cloneしてnpm installしてnpm start


serviceとして登録する

Edison起動時にhue-korg-controlを起動するようにsystemdを設定した

/lib/systemd/system/edison_config.service とかを参考にした


/lib/systemd/system/hue-korg-control.service
[Unit]
Description=hue-korg control service
After=mdns.service

[Service]
ExecStart=/bin/su root -c 'cd /home/root/src/hue-korg-control && npm start'
Restart=always
RestartSec=10s
Environment=NODE_ENV=development

[Install]
WantedBy=default.target
環境変数を複数設定したい時は単純にEnvironment=を複数書けばいいらしい

% systemctl enable hue-korg-control  # 登録
% systemctl start hue-korg-control # 起動

rebootして起動してたらok


ログはjournalctlでtail -fみたいに見れる
% journalctl -u hue-korg-control -f

0

philips-hue npm作った

Node.jsとMIDIコントローラでHueを調光するの中で使っていたhueライブラリを切り出してnpmにした。

https://www.npmjs.com/package/philips-hue
https://github.com/shokai/node-philips-hue

なんで作ったかちゃんと思い出せないんだけど、たしかRubyのhue gemについているコマンドが引数多くて使いにくかったり、他のコマンドだと全ランプにまとめてeffect:colorloopを設定するのが面倒だったり、Nodeのライブラリだと色々あるけどAPIの抽象化方法に違和感あったりで満足するのが無かったからだったと思う。


インストール

% npm install philips-hue -g


コマンド

philips-hueというコマンドが付いている。


–lightで番号を指定しなければ全てのランプに指令を送る。


ライブラリ


ふつうにhue.getBridge()やhue.auth()で認証プロセスを組み立てるのもできるけど、アプリ作る時に認証情報を保存して次回起動時に読み出すのが面倒だったので、loadConfigFileという設定ファイルを読み出す(ファイル無ければ認証して作る)便利関数を用意しておいた。
var Hue = require('philips-hue');
var hue = new Hue();

var conf_file = process.env.HOME+'/.philips-hue.json'; // 設定ファイル
hue.loadConfigFile(conf_file, function(err, conf){
var light = hue.light(1);
light.on(); // 点灯

var state = {bri: 200, sat: 120, hue: 50000};
light.setState(state, function(err, res){
if(err) return console.log(err);
console.log(res);
});

hue.light(2).off(function(err, res){ // 消灯
if(err) return console.error(err);
console.log(res);
});
});


ご意見ご感想


バグや質問はtwittergithub issueへどうぞ

0

Node.jsとMIDIコントローラでHueを調光する

できた

MIDIコントローラ、安いしツマミとかスライダーがいっぱい付いてて便利だと思う。

ツマミで色相(hue)、スライダーでbrightness(輝度)を調整できる。
動画では使ってないけど横のボタンで彩度(saturation)を0にして真っ白にもできる。



ソースコード

これをgit cloneしてnpm installしてnpm startすれば起動する。
https://github.com/shokai/hue-korg-control

MIDIコントローラの制御にはkorg-nano npmを使っている。KORG nanoKontrolを操作すると”knob:1″とか”slider:3″とか”button:play”というイベントを発火させてくれるのでEventEmitterで受けるだけでいい。

Hueの操作は、nodeのhueライブラリにどうもしっくり来るものが無かったので1から自作した。HueのAPIは単純なのに、どれもなんだか過剰にwrapしすぎているように見える。
Web+DB Press vol.83でHueのAPIについては解説してて、それを見たらすぐ実装できた。


MIDIコントローラ

家にたまたまあったKORG nanoKontrolで操作している。nanoKontrolは絶版になってて中古で1万円ぐらいなんだけど、後継機のnanoKontrol2が3〜4千円ぐらいで売ってる。たぶんそっちでも同じように使える。

USB接続で、ドライバなしでMacに接続していきなり使えて便利だった。なんか便利っぽいのでもう1,2個ぐらいほしい。



NodeでMIDI

MIDIデバイスはUSBで接続できるやつも最近はたくさんあるみたいだし、ツマミ・スライダー・ボタンがたくさん付いているのでコントローラとして優秀だと思う。

Node.jsの場合はmidi npmでMIDIデバイスとやりとりできる。midi npmはRtMidiというMac/Windows/Linux対応してるC++ライブラリのラッパーなので、Raspberry Piとかでも動かせそう。

midiは大変簡単なバイナリプロトコルで、1byte(8bit)の1番上の1bitが1ならコマンド、0ならデータで、のこり7byteにコマンドやデータ内容が書かれている。
今回はkorg-nano npmを使っているが、midiデバイスをNodeで扱うとしたらこんな感じでできる。

EventEmitter = require('events').EventEmitter

midi = require 'midi'
debug = require('debug')('midi-device')

module.exports = class Device extends EventEmitter

constructor: (device_name=".*") ->
@input = new midi.input
for i in [0...@input.getPortCount()]
name = @input.getPortName i
debug "found device [#{i}] \"#{name}\""
if new RegExp(device_name, 'i').test name
debug "openPort #{i}"
@input.openPort i
break

## midi messageを受信
@input.on 'message', (delta, raw) =>
@emit 'message', {delta: delta, raw: raw}

device = new Device("keyboard")

device.on 'message', (data) ->
console.log data.raw


Rubyではmidi gemというのがあって、試してないけどgithubを見た感じよくメンテナンスされているように見えるので、これでもいい気がする。

0

Web+DB Press vol.83でHueについて書いた

前:Web+DB Press vol.82にJawbone Up24について書いた


書いた

今日(10/24)発売のWeb+DB Press vol.83にphilips hueというプログラマブル電球について書いた。

WEB+DB PRESS Vol.83
WEB+DB PRESS Vol.83
posted with amazlet at 14.10.24
原田 騎郎 吉羽 龍太郎 山口 陽平 青木 雅弥 松下 誠太 三宅 英明 高橋 征義 南川 毅文 伊藤 直也 海野 弘成 高安 洋輝 佐藤 歩 泉水 翔吾 佐藤 太一 横江 直輔 舘野 祐一 橋本 翔 渡邊 恵太 中島 聡 はまちや2 小沢 邦雄 長沢 智治
技術評論社
売り上げランキング: 265

hueはフルカラーLED電球なんだけど、よくある専用のスマホアプリから調光できるLED電球と違ってHTTPから操作できるAPIがある。あとHSV/CIE/Mired色温度などで細かく色指定できたり、電球が点灯しているかどうかもAPIで取得できたりする。

記事ではcurlやRubyでhueを操作したりとか、俺が(家の外で)プログラム書いたりgit commitすると家の電球が明るくなったり暗くなったり色が変わったりして、家族に俺ががんばってる感が伝わるシステムを作ったりした。


天気を電球で表示するプログラムが動かない

3ページ目に書いてあるMSN天気のAPIが消滅してしまった。入稿時には確かに地域ごとにRSSが存在していたんだけど完全に無くなっちゃった


代わりにyahoo天気を使う例をここに書いておきます。weather-report gemを使うと、降水確率は取得できないけど傘が必要そうな天気かどうかはわかる。

require 'hue'
require 'weather-report'

weather = WeatherReport.get '東京'

light = Hue::Client.new.lights.find{|i| i.name == '居間' } # 居間の電球を使う
puts light.name

light.on = true
light.saturation = 80
light.brightness = 255

if weather.today.umbrella?
light.hue = 47000 # 青
else
light.hue = 60000 # 赤
end


これをcrontabとかにセットして朝実行すると、電気ついて起きれるうえに雨ふりそうかとかわかるので、傘を忘れない。

0

今日の天気をHueで表示する

weather_jpで降水確率を取得して、30%以上だったら青に、そうでなければ赤く光らせる。
これがあると朝ぱっと天気が目に入るので、傘を忘れることがなくなる。

github.com/shokai/weather-hue
関連:プログラマブル電球hueをRubyから使う

実装

bundle exec ruby weather-hue.rb --city 鎌倉
で実行できる。crontabなどに登録して定期的に動かすとよい。

weather-hue.rb
require 'rubygems'
require 'bundler'
Bundler.require

args = ArgsParser.parse ARGV do
arg :city, 'city', :alias => :c, :default => '東京'
arg :rain, '降水確率のしきい値 (%)', :default => 30
arg :help, 'show help', :alias => :h
arg :hue, 'hue light number', :default => 0

on :help do
STDERR.puts help
STDERR.puts "e.g. ruby #{$0} -city 鎌倉"
exit 1
end
end

weather = WeatherJp.get args[:city], :today
puts "#{weather} - #{Time.now}"

light = Hue::Client.new.lights[ args[:hue].to_i ]
puts "light : #{light.name}"
light.on = true
light.saturation = 180
light.brightness = 200

if weather.rain < args[:rain]
light.hue = 60000 # red
else
light.hue = 47000 # blue
end