maaash.jp

what I create

IRLauncher - Mac使用時に最速でエアコンをつけるために

IRKit というものを作るほど、エアコンに対する不満が強いようです。
というわけで、Macを使用している時に最速でエアコンをつけるためのアプリ IRLauncher をつくりました。

IRLauncher デモ動画をご覧くださいませ。

IRLauncher : Launch IR signals from your favorite launcher (Quicksilver, Alfred, ..) http://github.com/irkit/osx-launcher IRLauncher is a Mac client for IRKit device. Get one from Amazon.co.jp and set it up before using this. IRLauncher’s purpose is to be the fastest way to control home electronics when you’re using a Mac. Fastest means not leaving home position on keyboard, obviously. I heavily use Quicksilver, many others use Alfred 2 or Spotlight, so why not send infrared signals utilizing a launcher app?

Terminalにいる時には ruby IRKit gemの提供するirkitコマンド が便利なのですが、
Macに向かっている時にはTerminal以外にもChromeやXcode,Emacsがアクティブな場合が多いので、グローバルなショートカット経由でよくアクセスするQuicksilver(or Alfred)にのっかるのがいいかな〜と思いました。

快適なエアコン生活をお楽しみください。

IRLauncher : Launch IR signals from your favorite launcher (Quicksilver, Alfred, ..)

IRKitはiOSのアクセシビリティ(スイッチコントロール、VoiceOver)に対応しています

iOSには、あまりメジャーでないかもしれませんが
設定画面にアクセシビリティという機能があり、これがよくできています。

IRKitシンプルリモコンアプリ では、過去ご要望があり、アクセシビリティのうち、スイッチコントロールとVoiceOverに対応しています(iPhoneのみ。iPadは未対応)
iOSの設定アプリ –> 一般 –> アクセシビリティ –> スイッチコントロール を開き、オンにした後、
リモコンアプリを開くと、以下のように、ボタンそれぞれの周りに青く枠が付き、スイッチコントロールの外部ボタンで選択(=赤外線信号を送信)できるようになります。

IRKit simple remote Accessibility

また、iOSの設定アプリ –> 一般 –> アクセシビリティ –> VoiceOver を開き、オンにした後は同様に、
このボタンの下に書いてある、「25暖房自然風」とかって文字列をiOSが音声合成して読み上げてくれます。

これを実現するのに追加で書く必要のあるコードが少ないのがiOSが「よくできている」と思うポイントですが、以下のような変更でこの対応を行いました。

この画面ではUICollectionViewを使っていて、各ボタンは、UICollectionViewCellを継承したクラスです。

1
2
3
4
// SSButtonCell : UICollectionViewCell
- (void)awakeFromNib {
    self.isAccessibilityElement = YES;
}
1
2
3
4
5
6
7
// SSMainViewController : UICollectionViewController
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath; {
        IRSignal *signal = [_signals objectAtIndex: indexPath.row];
        SSButtonCell *cell = [cv dequeueReusableCellWithReuseIdentifier: @"SSButtonCell" forIndexPath: indexPath];
        cell.label.text         = signal.name;
        cell.accessibilityLabel = signal.name;
...

これだけだし、accessibilityLabelのところを、漢字もうまく読み上げてくれるのだからすごい。

accessibilityLabelが音声認識対象になって、アプリ内でSiriと話せるようになるとSiriも使えるし、
多くのアプリがアクセシビリティに対応するようになるし一石二鳥でいいと思うんだけどな〜
iOS9で待ってます。

参考

サービスをつくるときには 「こういうユーザー層にこういう使われ方をするだろう」 と考えてその予測の精度がよいと、 いい仕事をした、という満足感がありますが、
(予測は当った上で) さらに想像を越えたところで使われ、 自分の想像力の欠如をよい意味で裏切られるのも、 嬉しいものですね。

ということで、最近もまたアクセシビリティ関連のお問い合わせがあったので検索用に書いてみました。

リモコンNKとIRKit対応アプリの申請方法

自分以外の人がつくったIRKit対応アプリがAppStoreに出たよ!!!!
リモコンNK [AppStore]

すごい!!!!!!!!!
こちらのアプリは事前に聞いていなかったし驚きました!
AppStoreに “家電操作” のカテゴリができる日も近い!

公式アプリに対して “もっとボタンを置きたい” という要望をいただいておりますが
開発者の @nakano_koumuten さんもその点に気づいたのか
公式アプリの不満点を解消してより高機能になっていますねー。

さて、IRKitというデバイスとセットで動作するアプリをAppStoreに申請して、
AppleにIRKitが無いのにどう審査するんだ?
という話。

自分の場合はデバイスが販売開始もしていないときだったので、 Review Notes (Optional) に以下のように書きました。

I’m going to manufacture IRKit device starting this Decemeber, and here’s some pictures of it. http://www.flickr.com/photos/99687464@N00/11311616785/ And a demo video using IRKit prototype device with the app. http://www.youtube.com/watch?v=4MdpfICnl3I&feature=youtu.be

動画は、URLを知っている人だけが見られる限定公開設定にしておきます。
こうすれば再生数を見て “Appleの人が動画を見たようだな” と知ることも可能!!

リモコンNKの作者の @nakano_koumuten さんは、以下の動画をのせたそうです。

赤外線リモコンデバイスIRKit専用のリモコンアプリです。 (IRKitの詳細は http://getirkit.com を参照ください。) 標準のIRKit Simpleアプリと比較して以下の機能が追加されています。 ・オートリピート ・1つのボタンで複数信号の送信  送信間隔(時間)、ディレイ時間の設定が可能 ・複数ページ ・データのインポート、エクスポート

よくできていますね〜
iMovieで字幕をつけたそうです。

申請用であれば自分のやつのような簡易的なものでも動作がわかれば通るようですし、
一般向けのアプリの説明動画としても使うのであれば一石二鳥ですしこのように作り込んでもよいかもしれませんね。

もしIRKit対応アプリを作ろうかな、と思っている方いらっしゃいましたらお気軽にご連絡ください〜
@maaasho.masakazu@gmail.com 宛てにどうぞ。

IRKitのハードユーザーとして、もしよろしければテスターとしてご協力させていただきたいですし、
公式アプリからIRKit対応アプリ群にリンクする計画もあります!
ぜひぜひ。

IRKit 3rdロットとモールスWi-Fiセットアップの終了について

Wi-Fi機能を備えたデバイスのセットアップ、そしてモールスWi-Fiセットアップについて のようにしてがんばって モールスWi-Fiセットアップをつくりましたが、
非常に残念ながら、それを捨てるときが来ました。

モールスWi-Fiセットアップ はIRKitの2nd Lotまでで役目を終え、
今週からAmazonに入荷予定の3rd Lotからは外します。
モールスに期待していたみなさまには本当に申し訳ないです。

基板はしばらくはそのままですが、マイクやアンプ、マイク周りの周辺部品は未実装とします。

理由はたくさんありますが、
その最大のものは、部品の調達がしんどいから、です。

1st Lotで使ったマイクは Hosiden の KUB2823 を使い、
それが手に入りにくかったので、2nd Lotでは似た仕様の Kobitone の 254-ECM6044-RO に切り替えました。
基板だってマイク調達の選択肢を増やすため、6mm径のマイクと4mm径のマイクがどちらでも実装できるように工夫してみました(これはうまくいかなかったが)。

IRKitの仕様にあう特定のマイクの在庫を 500個 も抱えているところは無いし、部品を切り替えるためには評価することになるし、何ヶ月後に入荷するマイクをまとめて大量に買えるほど自信もない。
マイクがなかったとしても、個人がデバイスをつくるにあたって部品調達が一番しんどい(と私は感じた)、ということは IRKitの作り方 にも書いたとおりです。
なるべく部品を減らしたいのです。

他の理由も。。。
iPadやAndroidの機種達ではマイクの音量が大きく、IRKitの筐体の音響設計がなされていないためか、iPhone以外の対応機種を増やそうとすると認識精度を高く保つためにArduino側のマイク周りの回路やモールス信号デコード処理を改善する必要があるがプログラムメモリが足りない。
Wi-Fiアクセスポイントに接続できなかった時にその理由がフィードバックされないので、モールスが失敗したんだろう、と思い込みやすい。実際にはパスワードを間違えただけであったとしても。
などなど。

多くの場合はうまくいくし、うまくいった時の感動は素晴らしいのですが、残念です。

結局、これからはモールスの代わりに、
先の記事 の最初に書いた方法: IRKitがWi-Fiアクセスポイントになり、設定アプリからIRKitのアクセスポイントに接続する方法を使うことにします。

IRKitのアプリ側のデザイナーのしーほ の神デザインの助けもあり、この方法でも意外とスムーズにセットアップできるのではないか。
むしろかなりスムーズであると思います。
実際どうなのかは体験してみてください!
IRKit on Amazon

さて、モールスが大好きなあなたにとっての参考情報です。
IRKitはArduino派生商品であるので、IRKitの3rd Lotを購入し、モールスで遊ぶのに必要な以下の部品を購入し、IRKitの回路図 を見ながら未実装であるパッドに部品をハンダ付けし、Arduinoのプログラムを書き込むとよいでしょう。

回路図の下半分中央辺りに “MICROPHONE” と書かれたエリアがあります。
その部品番号と以下の部品表が対応しています。
少量購入する際に便利なショップのURLものせておきました。

Wi-Fi機能を備えたデバイスのセットアップ、そしてモールスWi-Fiセットアップについて

IRKitのように、スマートフォンとWi-Fiで接続するデバイスをつくる際には、
どのように家のWi-FiのSSIDやセキュリティの設定(WPA2なのかWEPなのか等)、パスワードをどのようにスマートフォンからデバイスに伝えるのか、ということが問題になる。

スマフォからは同時に1つのWi-Fiアクセスポイントにしか接続できないのだから、
家でも使うデバイスなのであれば、デバイスが家のWi-Fiアクセスポイントに接続することになる。

だがデバイスには入力用のインターフェースがない。

一番思いつきやすいのが、デバイスがWi-Fiアクセスポイントになり、スマフォからそれに接続して家のWi-Fiアクセスポイントの情報を伝える、という方法。
だがこれでは自分のアプリ内でセットアップが完結しない。iOSであれば一度設定アプリを開き、Wi-Fiの設定からデバイスのアクセスポイントを選択し、、となる。

興味深い事例をいくつかご紹介すると、
Eye-Fiカードでは、一度PCにつなぎ、PC上のセットアップツールを使い、Eye-Fiカードが接続するアクセスポイントの情報を直接カードに書き込む。

この方法だとアクセスポイントはプルダウンメニューから選択できるのでSSID等を手入力せずに済むし、Wi-Fiに接続できなかった場合にデバイスからのフィードバックもあるが、PCにつながくてもセットアップできるとなおよい。

Electric Imp というWi-Fiモジュールでは、光の点滅をデジタル信号のようにして使う BlinkUp Technology を使う。

BlinkUp is the proprietary Electric Imp setup solution that integrates seamlessly into your apps, letting you and your customers connect products in seconds using just a smartphone or tablet.

スマフォのディスプレイがチカチカするのだ。かっこいい。
オープンソースにはなっていないし、Wi-FiモジュールとしてElectric Impを採用する必要があったがIRKitではそれは別の理由でできない。TELECも2014年3月現在取得していない。

IRKitをつくるときには、他のWi-Fiモジュールを使いつつこれをぱくろうかと最初は思ったが、
Patent Pendingと強調されているし、探すと申請中の特許 Optically configured modularized control system to enable wireless network control and sensing of other devices も見つかったのでびびってやめておいた。

光がだめなら音はどうか。
モールス信号はかっこいい。

(中略)ということで音でいこうと決めた。

Arduinoでモールス信号の送受信を試している人も何人かいて google: arduino morse 、それらを参考に組んでみた。

モールス信号 は、長音と短音、無音区間の比率を規定するもので、速度は WPM という単位を使い、可変である。
WPM は Words Per Minute の略。
Word は “PARIS” を基準とする場合が多い。
つまり .__. ._ ._. .. ... (ただし ‘_’ が長音, ‘.’ が短音, ‘ ’ が文字区切りとする) の長さである。
長音1つは短音3つに相当し、
各音の間には1短音分、文字区切りは3短音分、単語区切りは7短音分の無音区間があるので、
“PARIS” は 50短音分の長さがあり、
WPM は 1分間で 50短音分の長さ をいくつ再生できるのか、という速度の単位である。

SSIDとパスワード+アルファを送ろうとするのに、何分もかかるようでは困る。
ということで IRKit で採用する際には高速化をはかった。

まずは鳴らす側、iPhoneアプリではモールス音を高速に鳴らすライブラリは無かったので、書くことにした。
できあがったものはこちら。
IRMorsePlayerOperation.m
モールス信号をサイン波のサンプルから生成し、ローパスフィルターを通し(サイン波を鳴らしたり無音にしたりする境目で発生するノイズを落とすため)、マイクから鳴らす。
AudioUnit, AUGraphを使った。

Arduino側はこちら。
morse.cpp

モールス信号は、長音と短音の組み合わせにアルファベットをマッピングしていく。
その表はこちら。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// # standard morse tree
// T _    M _ _    O _ _ _    CH _ _ _ _
//                            Ö _ _ _ .
//                 G _ _ .    Q _ _ . _
//                            Z _ _ . .
//        N _ .    K _ . _    Y _ . _ _
//                            C _ . _ .
//                 D _ . .    X _ . . _
//                            B _ . . .
// E .    A . _    W . _ _    J . _ _ _
//                            P . _ _ .
//                 R . _ .    Ä . _ . _
//                            L . _ . .
//        I . .    U . . _    Ü . . _ _
//                            F . . _ .
//                 S . . .    V . . . _
//                            H . . . .

ところがSSIDには日本語が使えてしまうので、SSIDをモールスで送ろうとすると困る。

IRKitでは以下のように [0-9A-F] と区切り用に ‘/’ に特化したマッピングを採用した。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// # hex+/ morse tree
// # 4,5 should be used more frequently than others because they're used in ascii alphabet
// 4 _    3 _ _    0 _ _ _    ? _ _ _ _
//                            ? _ _ _ .
//                 1 _ _ .    ? _ _ . _
//                            ? _ _ . .
//        6 _ .    8 _ . _    ? _ . _ _
//                            ? _ . _ .
//                 9 _ . .    ? _ . . _
//                            A _ . . .
// 5 .    2 . _    B . _ _    ? . _ _ _
//                            ? . _ _ .
//                 C . _ .    ? . _ . _
//                            ? . _ . .
//        7 . .    D . . _    ? . . _ _
//                            ? . . _ .
//                 E . . .    F . . . _
//                            / . . . .

これで厳密にはモールス信号ではないのだろうが、しょうがない。
文字列はUTF-8にエンコードしたものを16進にして4bitずつ1文字として送る。
例: “あ” –> “E38182” –> ... __ _._ __. _._ ._

iPhoneアプリでモールス音を再生し、Arduinoでデコードする。
安定して認識できた速度 100 WPM を採用した。
これでそこそこ長いSSIDとパスワードの組み合わせ+アルファを送るのに 12 秒。
セーフか。

こんなふうにして再生する、 100 WPM のモールス信号の音を参考までに置いておく。

この方式を モールスWi-Fiセットアップ と勝手に呼んでいた。

dstat経由でredis infoを眺めfluentdを通してgrowthforecastでグラフにする

dstat が万能なのでredis infoのキーを眺められるプラグインをつくった。

redis-cli info の total_commands_processed を眺める場合。

DSTAT_REDIS_* な環境変数を設定することでなんでもできるし
fluentd-plugin-dstatを使う場合には環境変数がいじりにくかったので同じディレクトリにある設定ファイルを使ってもいい。

次にこれを fluent-plugin-dstat を使い fluentd に流し込み、fluent-plugin-growthforecast を使って GrowthForecast でグラフにしよう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# td-agent/templates/default/td-agent.conf.erb
<source>
  type dstat
  tag dstat.<%= node[:hostname] %>
  option --redis
  delay 30
</source>

<match dstat.*>
  type map
  tag  "mapped." + tag
  time time
  record record["dstat"]
</match>

<match mapped.dstat.*>
  type           flatten_hash
  add_tag_prefix flattened.
</match>

<match flattened.mapped.dstat.**>
  type growthforecast
  gfapi_url http://growthforecast/api/
  service dstat
  tag_for section
  remove_prefix flattened.mapped.dstat
  name_key_pattern .*
</match>

と、こうなる

このプラグインの組み合わせにたどり着くまで大変だった!
けど、これで <%= node[:hostname] %> 毎にgrowthforecastの section ができるので捗る気がする。

dstatのプラグイン は公式のものがたくさんあるのでそれらを参考にすればわりと簡単に書ける。
dstat,fluentd,growthforecast最高!

kazeburo wareなアラートシステムを心待ちにしております

IRKitリリース!そして再入荷予定について

IRKit (Amazon) の再入荷予定はこのページの一番上に最新情報を掲載する形でしばらく更新していきます。
IRKit (switch-science) でも販売を開始いたしました。


第5ロットを製造中です。
現在Amazon,switch-scienceともに在庫がありませんが今週中には出荷予定です。
少々お待ちくださいませ。

2014-08-05 13:30追記


第3ロットを製造中&随時Amazonおよびswitch-scienceへ納品中です。
一時的に在庫が無い場合もありますが数日中には補充されると思います。

2014-04-01 10:30追記


第2ロットが売り切れました!
ありがとうございます。

第3ロットの部品はほぼそろっていまして、1-2週間で出荷できる予定です。
しばらくお待ちくださいませ。

2014-03-18 11:30追記


基板の実装は完了したのですが検査プログラムに問題があり、出荷までもう少々かかりそうです。
もう少々お待ちを…

2014-02-28 15:20追記


次のロットに向けた全部品がそろいそうです。
在庫補充は3月1日頃を予定しています。
部品についてご連絡いただいた方、お待ちいただいている方、ありがとうございます!
2014-02-18 12:20追記


非常に残念ですが、2月14日頃の入荷はなくなりました。
必要な部品 (ATMEGA32U4-AUというAtmel社のマイコン) が手に入りにくいためです。
購入後 1月24日 納期を待っていたものが 2月26日 納期に延期になり、さらに先ほど5月になってしまいました!!
なんということでしょう。
様々なみなさまのご協力により少しずつかき集めて作りたいと思っていますが
再入荷予定は、確実に見えてからまた更新するようにいたします。
もし ATMEGA32U4-AU を入手できる方がいらっしゃいましたらご紹介ください。お願いいたします。
2014-02-13 00:00追記


再入荷についてですが、最速で2月14日頃になりそうです。
またこちらを更新する形でお知らせいたします。
2014-02-01 18:30追記


IRKitAmazonで販売開始しました

が、2014-01-15 13:00現在在庫がありません。
残念です。。

製造と在庫の補充予定について。
最初に100個/ロットつくりまして、様子を見てゆっくり100個/ロットを回していくか、
それとも数を増やしていくかを考えようという予定でした。

最初の100個のうち、20個ばかりがお試し期間中にお問い合わせいただいたり、
こちらからお願いしてデバッグのような感じで(すんなり動かなかった方は本当にご協力ありがとうございました)
先行販売/差し上げて使っていただきました。

残り80個を 24 x 3 に分けて、
ファームウェアに不具合があれば最後の最後に書き換えられるように(結局、書き換えていませんが)
少しずつAmazonへ出荷しようと考えていて、その最初の24個が売り切れ、
次の24個が到着、Amazonの納品作業待ちです。
今日中には購入いただけるようになるでしょう。


こちら納品完了し、売り切れました!ありがとうございますー
2014-01-15 14:00追記

最後の24個はまだ家にありまして後ほど発送しますので、
週末中には購入いただけるようになるでしょう。


こちら納品完了し、売り切れました!ありがとうございますー
2014-01-29 11:00追記

その後はしばらく品切れのまま、数を増やしたロットが1月末か2月頭にできあがるはずです。
それまで熱がさめてしまわないことを祈ります!
申し訳ありませんがしばらくお待ちを…


こちら1月末は難しくなりました。残念です。。
2月初旬にできあがる予定ですがまだ日程が確定できる段階ではありませんのでまたこちらを更新してお知らせいたします。
2014-01-29 11:00追記

ではかっこいい写真を見ていってください。
撮影協力 Thanks @_somtd手縫いの革小物屋さん collocollo

IRKit Internet HTTP APIと販売開始に向けて

外出先からエアコンつけたいですよね。
そうですよね。

IRKit同じWiFiアクセスポイントにつながっている時に、HTTP POSTで赤外線信号をIRKitに送ってもらうAPI仕様 についてはもう書いてあったんですが、
外出先から赤外線信号を送ってもらうためのAPIについても書きました。
IRKit Internet HTTP API と言います。(ちょっと長いですよね, でもデバイス側もHTTPサーバだしなんとも…)

赤外線信号を送るためのAPIは POST /1/messages です。
そのパラメータには送り元のクライアントを認証する clientkey と、
赤外線を送信するIRKitデバイスを特定するIDである deviceid が必要です。
どうやってこれらを手に入れましょうか。

よくある使い方として考えているのは、
IRKitを買っていただいて、公式アプリを使ってWiFiにつないで、普通に使えた!という後に、
せっかくもっと楽しめるんだからインターネット越しに使ってみよう、という方。
この場合には簡単です。

デバイスに POST /keys とやると、一時的に有効な clienttoken というのをもらえます。
これをサーバ側に POST /1/keys で送ると、
サーバ側でこのIRKitデバイスと新しいクライアントの情報を関連づけて記録して deviceid, clientkey をもらえます。
これをつけて POST /1/messages すれば、messageをサーバ経由でデバイスに届けて、赤外線を送ってくれます。

このやり方は clienttoken を使うことでデバイスとクライアントを関連づける、デバイス –> クライアント のやり方です。
クライアント –> デバイスのルートで関連づけを行うやり方もありまして、これが公式アプリやiOS SDKから使うモールス信号を使ったやり方ですが、、、

ちなみに、IRKitは来週15日水曜日Amazonで販売開始予定です。
試用はこの辺りで受付を中止いたします。試用していただいた方はありがとうございましたー!

dkdk