はじめに
USB ポートにつないで RGB 指定して光らせることの出来る LED ドングル blink(1) を3個買ったのですが、ifttt 連携してるだけではつまらないので色々いじってみてます。その一環として、ユーザーのアイコンに近い RGB で LED を光らせる earthquake.gem の plugin を書いてみました。
元ネタ: blink1_notifier.rb
インストール
ダウンロード : blink(1) eartuqake.gem plugin to blink by each user's icon color
RMagick が必要です。インストールに詰まったのですが、以下のサイトのように pkgconfig を指定して解決。
gems 以下にゴミが残っていてインストール出来ない問題にもぶち当たったので、.zsh_history から手順をさらっておきました。
$ brew install imagemagick $ export PKG_CONFIG_PATH=/usr/local/Cellar/imagemagick/6.8.0-10/lib/pkgconfig/ $ cd ~/.rvm/gems/ruby-1.9.3-head/gems/ $ sudo rm -rf rmagick-2.13.2 $ gem install rmagick
コード
# -*- coding: utf-8 -*- # blink(1) eartuqake.gem plugin to blink by each user's icon color # require 'rubygems' require 'rmagick' def getRGB(url) @rgb ||= {} if (@rgb["#{url}"].nil?) image = Magick::Image.read(url).first.resize!(1, 1) color = image.get_pixels(0, 0, 1, 1)[0] @rgb["#{url}"] = [color.red/256, color.green/256, color.blue/256] end @rgb["#{url}"] end Earthquake.init do output do |item| next if item.nil? || item['user'].nil? || item['user']['profile_image_url'].nil? url = item['user']['profile_image_url'] cmd = 'blink1-tool -q --rgb %d,%d,%d' EM.defer(lambda { system cmd % getRGB(url) }) end end
色の平均値を取れるメソッドあるのか分からなかったのですが、 1px × 1px に縮小して色見てみたらいい感じになってたので、コレを使いました。
ちなみに、blink(1) をコマンドラインから操作できる blink1-tool の引数は色々用意されているので妄想して面白いアイディア湧いたら買って何か作ってみて下さい。
$ blink1-tool Usage: blink1-tool <cmd> [options] where <cmd> is one of: --blink <numtimes> Blink on/off (specify --rgb before to blink a color) --random <numtimes> Flash a number of random colors --rgb <red>,<green>,<blue> Fade to RGB value --on Turn blink(1) full-on white --off Turn blink(1) off --red Turn blink(1) red --green Turn blink(1) green --blue Turn blink(1) blue --savergb <r>,<g>,<b>,<pos> Write pattern RGB value at pos --readrgb <pos> Read pattern RGB value at pos --play <1/0,pos> Start playing color sequence (at pos) --servertickle <1/0> Turn on/off servertickle (uses -t msec) --list List connected blink(1) devices Nerd functions: (not used normally) --hidread Read a blink(1) USB HID GetFeature report --hidwrite <listofbytes> Write a blink(1) USB HID SetFeature report --eeread <addr> Read an EEPROM byte from blink(1) --eewrite <addr>,<val> Write an EEPROM byte to blink(1) --version Display blink(1) firmware version and [options] are: -d dNums --id all|deviceIds Use these blink(1) ids (from --list) -g -nogamma Disable autogamma correction -m ms, --millis=millis Set millisecs for color fading (default 300) -q, --quiet Mutes all stdout output (supercedes --verbose) -t ms, --delay=millis Set millisecs between events (default 500) --vid=vid --pid=pid Specifcy alternate USB VID & PID -v, --verbose verbose debugging msgs Examples blink1-tool -m 100 --rgb 255,0,255 # fade to #FF00FF in 0.1 seconds blink1-tool -t 2000 --random 100 # every 2 seconds new random color blink1-tool --rgb 0xff,0,00 --blink 3 # blink red 3 times
おわりに
@rgb["#{url}"] が 3 回とかコードダサいので、誰かエロイ人添削して下さい (-人-)。