ラベル IRKit の投稿を表示しています。 すべての投稿を表示
ラベル IRKit の投稿を表示しています。 すべての投稿を表示

2016年3月3日木曜日

降水確率をLED電球の色で知らせる Tasker+IRKit ハック

リモコン付きの16色LED電球を買いました。1000円。
あとクリップスタンド。700円。




ほんとは いろんなことができそうな Philips hueがほしかった。
けど、スターターで25,000円。

今回は Taskerで取得した降水確率にあわせて、このLEDを IRKitから灯します。
着想になったのは、こちら↓

au Umbrella stand


買えば8000円、作れば2000円。いうても IRKitが8000円してますからね。

● 降水確率を取得する(Tasker)


使わせていただく天気情報は Weather ServiceのXMLデータ。

わたしは東京なので、以下のXMLページになります。
http://www.otenki.co.jp/xml/xml/yohou4410.xml

で、Taskerですが、Taskを新規登録。
1. Net > HTTP Get → "Server:Port"に上記アドレスを入力。
 これで%HTTPDにページの全情報が格納されます。
2. Varilables > Varilable Set
  → "Name" に任意の変数(%otenki)
  → "To" に %HTTPD
 いちおう、%HTTPDから自前の変数に移し替えます。
3. さて、長ったらしいデータをどこで切って、降水確率を抜き出すか。
  Varilables > Varilable Split
  → "Name" にさきほどのの変数(%otenki)
  → "Splitter" に proba0

XMLデータでは、<weatherdata type="today"> のところに今日の予報、
"tomorrow" のところに明日の予報、そして
 "proba01" - 0 -6 時の降水確率
 "proba02" - 6 -12時の降水確率
 "proba03" - 12-18時の降水確率
 "proba04" - 18-24時の降水確率
となってます。そこで"proba0"で区切ってやると
 "%otenki1" → XML冒頭から todayの proba01の手前まで
 "%otenki2" → "1>xx</"
 "%otenki3" → "1><"
 "%otenki4" → "2>xx</"
って感じになります。xxは降水確率の数字。使うのだけ整理すると、
 "%otenki4"  → today の 6 -12時の降水確率
 "%otenki6"  → today の 12-18時の降水確率
 "%otenki8"  → today の 18-24時の降水確率
 "%otenki10" → tomorrow の 0 -6 時の降水確率
 "%otenki12" → tomorrow の 6 -12時の降水確率

さて次に、実行時間ごとに次の12時間の予報を取得しようと思います。
天気予報は 5時、11時、17時の3回更新されますので、
 0 -5 時に実行 → tomorrow の 0 -6、6 -12時の降水確率
 (日付は変わってますが、昨日が todayとして残ってます)
 5 -11時に実行 → today の  6-12、12-18時の降水確率
 11-17時に実行 → today の 12-18、18-24時の降水確率
 17-24時に実行 → today の 18-24、tomorrow の 0 - 6時の降水確率
としようと思います。
また12時間分、ふたつの予報をとって、高い数字の方をLEDで警告することにします。

4. Task > If → %TIME > 0.00 And %TIME < 5.00
5. Varilables > Varilable Section
  → "Name" に %otenki10
  → "From" を 3
  → "Length" を 2
 これで余計な文字列を取り除いた数字2桁が取得できます。
  → "Store Result In" に %rainyA(ひとつめの降水確率を格納する任意の変数)
6. Varilables > Varilable Section
  → "Name" に %otenki12
  → "From" を 3
  → "Length" を 2
 これで余計な文字列を取り除いた数字2桁が取得できます。
  → "Store Result In" に %rainyB(ふたつめの降水確率を格納する任意の変数)

ここで問題発生です。降水確率がゼロのときはXMLの記載は"0"で、
2桁とってくると"0<"と次の括弧が入ってしまう。
次のA,Bの値比較時などに困ったことになってしまいます。そこで。

7. Varilables > Varilable Set
  → "Name" に %rainyA
  → "To" に 0
  → "If" に %rainyA ~ 0<
8. %rainyBについても同様に

で、比較です。
9. Task > If → %rainyA > %rainyB
10. Varilables > Varilable Set → "Name" に %rainy、"To" に %rainyA
11. Task > Else
12. Varilables > Varilable Set → "Name" に %rainy、"To" に %rainyB
13. Task > End If
これで大きい値が%rainyに格納されます。同じだった場合は %rainyBが入る。

以下、時間帯の違いを繰り返すだけです。一部入力値は割愛。

14. Task > Else → "If" に %TIME > 5.00 And %TIME < 11.00
15. Varilables > Varilable Section で "%otenki4"
16. Varilables > Varilable Section で "%otenki6"
17~23は7~13と同じ

24. Task > Else → "If" に %TIME > 11.00 And %TIME < 17.00
25. Varilables > Varilable Section で "%otenki6"
26. Varilables > Varilable Section で "%otenki8"
27~33は7~13と同じ

34. Task > Else
35. Varilables > Varilable Section で "%otenki8"
66. Varilables > Varilable Section で "%otenki10"
37~43は7~13と同じ

44. Task > End If

● 降水確率に応じてLEDを光らせる(Tasker+IRKit)


降水確率50%以上の時は濃い青、
20%~40%のときは薄い青、
0~10%のときは薄いオレンジにすることにしました。

また光るタイミングとしては、au Umbrella standのように
日常の動作に混ぜ込みたかった。
私は毎朝体重を測って、家に置きっぱのお古のスマホから
入力するようにしています。
そこで入力の際に充電スタンドから取り外したときにLEDが光る、
再び充電スタンドに置いたら消える、という運用にしました。

IRKitにて赤外線信号を読み取り、jsonファイルにする手順は
過去の記事をご参照ください。

45. Code > JavaScript → roomLEDon.json
46. Task > If →  %rainy > 49
47. Code > JavaScript → roomLEDblue1.json
48. Task > Else →  "If" に %rainy > 19 And %rainy < 50
49. Code > JavaScript → roomLEDblue2.json
50. Task > Else
51. Code > JavaScript → roomLEDorange2.json

また別の新規タスクで
1. Code > JavaScript → roomLEDoff.json

そして新規プロファイルで
State > Power > Power → "Source" は Any、Invertにチェック
 → 降水確率のタスクを指定
State > Power > Power → "Source"  Any
 → オフのタスクを指定

さて、今朝は・・・雨みたいですね。

2016年2月19日金曜日

IRKit+Tasker+Pebbleでスマート家電(3)

前回はとりあえず Pebbleで家電を操作できるとこまで行き着きました。
今回はもうちょっとスマートに仕上げましょう。

● 個々の家電操作は IRKit Remote で (Pebble)


Tasker の魅力は連続したタスク処理や、条件での自動発動です。
帰り着く頃に明かりと冷暖房とPCをオンとか。

前回作った、iPhoneアプリでできることの Pebble版を求めるのであれば、
Taskerを使わずともアプリを作ってくださった方がいらっしゃいます。

makoto_kwさんの IRKit Remoteがそれです。

前回書いた送信用スクリプトを、家電ごとではなくひとつの Configuration.json にまとめ、
ネット上の参照できる場所に置くことで、写真のようにPebbleに一覧が表示されます。



設定方法の詳細は GitHubにわかりやすく書かれているので割愛します。


● Tasker+PebbleTasker では寝る前の一括操作なんてどうでしょう?(Android+Pebble)


で、Tasker では個々のコントロールではなく、連続処理や条件発動を作りこみます。
そもそもわたしのやりたかった、寝る前に家電一括オフとかです。

具体的には
 ・ PCのシャットダウン
 ・ 加湿器のオフ
 ・ 冷暖房のオフ
 ・ 天井のライトのオフ
 ・ LEDデスクスタンドのオフ
これらを、ベッドに入って Pebbleのボタン1個押すだけで実現したい。

で作ったのが以下のようなタスク。


1. スマホのWi-Fiがオフならオンにする ※手順3の前段階として
  Task > If → %WIFI ~ off
  Net > WiFi  → Set On
  Task > End If
2. 加湿器・エアコン・天井照明のオフ
  Code > JavaScript → Path に 加湿器のスクリプトを指定
  Code > JavaScript → Path に エアコンのスクリプトを指定
  Code > JavaScript → Path に 天井照明のスクリプトを指定x3
   ※照明は輝度Maxから消灯まで3回リモコンを押すので
3. リモートアプリ"Unified Remote"からPCをシャットダウン
  App > Launch App でアプリを指定
   ※一度アプリを起動しておかないと次の処理が走らなかった
  Plugin > Unified Remote → Remote Action > Power > Shutdown
4. LEDデスクスタンドのオフ
  Code > JavaScript → Path に コンセントオフのスクリプトを指定
  Code > JavaScript → Path に コンセントオンのスクリプトを指定
※各処理ごとに3~5秒のWait を入れてます。

まずステップ1と3の解説です。
PCのシャットダウンは赤外線ではないので、同一LAN上のAndroidからPCに
シャットダウンのコマンドを送るアプリを導入し、Taskerからプラグイン連携しました。
また WiFi経由が大前提なので、事前に WiFi Onになるような処理を入れ、
間に別の処理を入れて時間も稼いでいます。
Unified Remote は有料版じゃないとダメだったかもしれない。

次にステップ2。
冷暖房は入/切が別の信号(リモコン上で別ボタン)なので、
普通に入切したいときは IRKit Remote で随時、
今回のTaskerスクリプトでは寝る前のオフのみ組み込みました。

加湿器は オンオフが同じボタンでの操作なのでシンプル。
ただ、もし自分で切ってるときに一括操作をすると、逆にオンになってしまう。
今回のスマート化では家電のオンオフ状況は判断できないので仕方なしです。

シーリングライトも同様ですね。もし輝度を変えていた場合は明るくなっちゃう。
そのときは Pebble から  IRKit Remote で消します。

最後にステップ4。
LEDデスクスタンドはリモコンのないものなので本来は操作できないのですが、
コンセントの根っこに以下の製品を足しました。

これでスタンドへの通電がオンオフできます。オンのときに通電を切ればにすれば強制オフ。
オンにするにはスタンドのボタンを押すしかないですが、付けたいときは机にいるので問題なし。
ただ通電をカットした状態だとオンにできないので、通電カット時は再度通電までしときます。

この Tasker の Task を前回そうしたように、PebbleTaskerから指定します。
あとは寝るときに Pebble からその Task を呼び出すと、1~4を順次行ってくれます。

● 他にもいろいろ


IRKit Remote では以下も作っておきました。
・エアコンOn (夏季用)
・エアコンOn (冬季用)
・テレビOn/Off
・テレビチャンネル+
・テレビ入力切替

Tasker では以下のシナリオも作っておきました。
・基地局を判定して自宅近くに帰ってきたら照明・エアコン・加湿器・PCをオン
・休日目覚めたとき用に、LEDデスクスタンドとPCをオン
・Macのスリープ復帰

また最近中古で温湿度計のついたスマホ(Fujitsu T-02D)を買ったので、
これと連携すれば、温度/湿度に応じてエアコンと加湿器を自動操作もできそうです。

また、あまってる昔のスマホで賢い時計みたいなものも作ってみました。

・大きめに日時表示(WidgetHomeランチャー)
・日時をタップしたら or 毎朝7時に天気予報表示(Llama + WeatherNow)
・Googleカレンダーの予定一覧(ジョルテ)
・温湿度表示(Tasker + Minimalistic Text: Widgets)
・会社に行く方向の運行情報表示(駅探ウィジェット)

他にももっと便利にできることないかなー。

2016年2月8日月曜日

IRKit+Tasker+Pebbleでスマート家電(2)

では前回の続きです。


● 赤外線信号情報を学習する(Android/Windows)


iPhoneアプリがやってくれてることを、コマンドでやります。
まず覚えさせたいリモコンを IRKitに向けてポチ。LEDが点滅します。
そしたら次のコマンド。

% curl -i "http://(Fingで調べたIRKitのIP)/messages" -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.3.13.gbe33d36
Content-Type: text/plain

{"format":"raw","freq":38,"data":[19991,10047,1275,(中略),19991,5049,1275]}

ゲットした情報のうち、一番下の行がリモコンの赤外線信号を数値化したものです。


● Tasker経由で信号送信してみる(Android)


では得た情報をまとめて、送信用スクリプトを作りましょう。簡単です。
メモ帳を開いて、以下をコピーしてください。

var id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
var msg = {"format":"raw","freq":38,"data":[XXXX,XXXX,XXX,X,XXXX,XXXX,XXXX,XXXX]};

function send(message){
  var xhr = new XMLHttpRequest();
  xhr.open("post", "https://api.getirkit.com/1/messages", false);
  var form = new FormData();
  form.append("deviceid", id);
  form.append("clientkey", key);
  form.append("message", JSON.stringify(message));
  xhr.send(form);
}

function main(){
  send(msg);
}

try{
  main();
}
catch(e){
  flash(e.message);
}
exit();

上から3行のXXXを書き換えます。(3行目はいちおう等号の後をすべて置き換えます)

・id の行に、前回ゲットした DeviceID
・key の行に、同じくゲットした ClientKey
・msg の行に、先ほどゲットした赤外線信号の情報。

そしたら"(任意の名前).json"という名前で保存してください。
わたしは家電の名前を付けてます。"humidifier.json"(加湿器)とか。

このあたりの手順は以下のブログを参考にさせていただきました。
rdmmtd's blog - IRKitを使って家に帰ったら電気がつくようにした

そしたらそれを Androidの適当な場所に置いてください。
わたしは Taskerフォルダの下に"Scripts"というフォルダを作って置きました。

そしたら、
1. Taskerで Tasksタブに移動。
2. "+"で新規作成>任意のタスク名(わたしはここも家電名)。
3. もう一度"+"でタスク内の処理を新規作成>Code>JavaScriptを選択
4. Path欄の虫メガネアイコンをタップして、先ほどのjsonファイルを指定
5. 戻るx2

これでタスクが1個できてると思います。
試しにタスクを開いて、左下の再生ボタンを押すと・・・

家電に信号が飛んだはずです。

● PebbleTasker(Pebble)


Tasker のタスクは、Profileタグで条件指定して自動発動もできますし、
ショートカットにしたりもできます。
それも便利なのですが、ここでは Pebble連携をやりましょう。

Tasker の右上の"・・・"から"Preferences"(設定)を選び、"Misc"タブへ。
"Allow External Access"にチェックを入れてください。

あとは簡単。PlayストアとPebbleストアで、スマホとPebbleの両方に PebbleTasker をダウンロード。Androidで PebbleTaskerを起動すると、Pebbleのボタンにアサインする画面が出るので、
先ほど作ったタスクを選択。

で、Pebbleで同アプリを起動してみると・・・


さあボタンを押してください。あなたの腕から家電が操作できるはず!
次回は Pebbleからの更なる使いこなしを行いましょう。

2016年1月29日金曜日

IRKit+Tasker+Pebbleでスマート家電(1)

いつもベッドに入ってから、「あ、電気つけっぱだ」「暖房切ってない」とかやらかします。
今のような寒い時期や、すっごい眠いときにはこれが辛い。

そこで昔買った iPhoneを学習リモコンにする『L5 remote』を引っ張り出したのですが、
設定したものが全部ふっとんでる。やむなく設定しなおしたのですが、以下のような問題が。
 ・新しく買った加湿器に使うと、ON/OFFを際限なく繰り返すw
 ・そもそも冷暖房には使えてなかった(エアコンは学習する赤外線信号が複雑)
 ・PS3を赤外線操作できる周辺機器も買ってたのだが、設定が復活できない

最後のは『L5 remote』にあったクラウドがサービス終了してたため、
自分が持ってないリモコン設定を持ってことができなくなってしまったためです。
PS3を赤外線操作できるリモコンはほとんどありません(公式リモコンは Bluetooth)。
だが赤外線ならリモコンの一本化が狙えるので復活したい。

そこで一念発起して、スマート家電化を目指そうと考えました。
どうせならリモコンやスマホではなく、スマートウォッチ Pebbleから操作したい。
睡眠管理のために寝る時もつけてますからね。

で、買ったのが『IRKit』。WiFi経由で指示を出すと赤外線を出します。
この手の製品にしては手頃な値段で、やれることも多く、一方で設定はちょっと難しい。


ネット記事を参考に試行錯誤した顛末が誰かの参考になるかもしれないので残しておきます。
比較的古めの記事が多くてひっかかったというのもあったので。
あと Taskerや Pebbleでここまでやったという記事も見かけなかったので。

● IRKit初期設定編(iPhone)


iPhone だと公式のリモコンアプリも出ていて、普通に使う分には実は超簡単です。
まずアプリを使って初期設定と簡単なリモコン登録をしてみました。



ここは簡単に流してしまいますが、アプリの指示に従って
 家のWiFi情報入力>IRKitに接続>同梱のパスワードを入力>家のWiFiに接続
これで初期設定完了です。次にリモコンに天井のライトを登録してみます。
 追加ボタン>アプリの指示が出るので、ライトのリモコンをIRKitに向けて押す


で、作ったライト用のボタンを押すと、
 iPhoneアプリ>WiFiでIRKit>赤外線でシーリングライト
と指示が飛んで、電気がつきます。

● IRKit初期設定編(Android/Windows)


私は今は Androidをメインに使っているのと、やりたいのが Pebbleからの操作なので、
次はPCで少し難しめのことをします。といってもちょっと PC慣れた人なら大丈夫。

さて。ここで知りたいい情報は以下の2つ。信号送信スクリプトを書くために必要です。
・IRKitの DeviceID
・IRKitの ClientKey

まずIRKitのIPアドレスを確認します。
ルーター設定眺めたり、コマンド送ったりしたけど、以下が一番楽でした。


【追記】 アプリ紹介がうまく動いてないようなので。
     Fing - Network Tools というアプリです。

教えてくれたのはオフブレさんのブログ「87miles.net」。

次に DeviceIDと ClientKeyを知るために、IRKitから ClientTokenを貰います。
コマンドプロンプトから cURL というコマンドを使います。

まずこのサイトから cURL プログラムをダウンロード、解凍し、C:\Windows の下に置きます。
私のマシンは 64bitなので、"Win64 ia64 zip"(SSLの方)ってのを落としてきました。

このあたりの流れは以下のサイトを参考にさせてもらいました。
パソコンで家電をリモコン操作する IRKit

で、コマンドを打ってみるも、返ってきた答えが「404 Not Found」。
あれれーと30分ほどネットの海をさまよい、答えは公式サイトと製作者ブログにありました。

maaash.jp - IRKitの脆弱性とファームウェアアップデートのお願い
IRKit

% curl -i "http://(Fingで調べたIRKitのIP)/keys" -d '' -H "X-Requested-With: curl"
HTTP/1.0 200 OK
Access-Control-Allow-Origin: *
Server: IRKit/2.1.3.13.gbe33d36
Content-Type: text/plain

{"clienttoken":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

最新ファームではヘッダ(-H から後)を付けないといけないのです。
これが参考にした幾つかのブログでは書かれてなくて引っかかった。

で、得られた ClientTokenを使って、DeviceIDと ClientKeyをゲットします。

% curl -i -d "clienttoken=XXXXXXXXXXXXXXXXXXXXX" "https://api.getirkit.com/1/keys"
HTTP/1.1 200 OK
Server: ngx_openresty
Date: Tue, 07 Jan 2014 08:46:06 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 94
Connection: keep-alive
X-Content-Type-Options: nosniff

{"deviceid":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","clientkey":"XXXXXXXXXXXXXXXXXXXXXXX"}

ここまでで下準備は完了です。
長くなりそうなので、続きは次の記事で。

Evernote

Clip to Evernote