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年3月2日水曜日

グローバルIPが変わったら知らせるTaskerタスク

家に近づいたときに PCを Wake on LANで起動するようにしてるのですが、
グローバルIPが変わってしまってて起動できないことがありました。

そこで家に据え置きのスマホでグローバルIPを監視し、
変更があった場合は知らせるタスクを作ってみました。

●家スマホ


新規タスク "GIPget"
1. NET > HTTP Get
  Server:Port → www.whatismyip.org
  Mime Type → text/plain
  Output File → Tasker/myip.txt
 myip.txtは任意の場所(私はSDカードのTaskerフォルダ)に作っておく
2. File > Read Line
  File → Tasker/myip.txt
  Line → 41
  To Var → %myip
 こんなのが入ります↓
 <span style="color: blue; font-size: 36px; font-weight: 600;">123:456:789:012</span>
3. Variables > Variable Split
  Splitter → >
4. Variables > Variable Split
  Splitter → <
 3~4でIP部分だけを抜き出します
5. File > Write File
  File → Tasker/newip.txt
  Text → %myip21
  Add Newline → チェック外す
 Splitで分割した変数は数字を後につけることで指定できます。
 %myip2 でひとつめの">"の後、%myip21 で">"後で"<"の前まで。

あとはプロファイルで1日1回、夕方くらいに呼び出す。
こうして最新のグローバルIPを記載した newip.txtを
FolderSync Liteでクラウドサーバに保存します。

一部参考にさせてもらったのが以下の記事。

What's My Home IP automated via Tasker - Google Group
DaWeav さんの書き込み

●持ち歩きスマホ


あらかじめ oldip.txt/newip.txt をスマホ上に作っておきます。
また newip.txtは家スマホが夕方に更新した後を見計らって
FolderSync Liteで上書きコピーします。

新規タスク "GIPcheck"
1. File > Read File
  File → Tasker/oldip.txt
  Var → %oldgip
 oldip.txtは前日までのIPが書いてあります。
2. File > Read File
  File → Tasker/newip.txt
  Var → %newgip
3. Task > If
  %oldgip neq % newgip
 "neq"はDoesn't Equalです。もし新旧IPが違ってたら…
4. Alert > Notify
  Title → グローバルIP変更
  Text → %newgip
 通知します。
5. File > Write File
  File → Tasker/oldip.txt
  Text → %newgip
  Add Newline → チェック外す
 oldip.txt を最新に更新します。
6. System > Set Clipboard
  Text → %newgip
 WoLアプリに張り付けられるよう、クリップボードに値を入れます。
7. Task > End If

これをFolderSync Liteの上書きコピー処理の後に回すよう、
プロファイルで時間指定します。

2016年2月22日月曜日

スマホの温湿度センサーとTaskerの連携

● 構想


前回の記事で最後に少し書きましたが、
部屋の温度、湿度を家電のスマート化に活かせないかと考えて、
温湿度センサー付きの中古スマホを格安で購入しました。

REGZA Phone T-02D

2012年7月発売のデュアルコア、Android4.1.2と現役利用にはちときつい。
けど遊ぶには全然十分なスペックです。

REGZAブランドだが、熱暴走など多数の不具合で有名な富士通製。
だが、この製品に限っては悪くない評判でした。
またあえて富士通製品を選んだのは、温湿度センサー内蔵が多いのが特徴だからです。
他に搭載してるのはGalaxyくらい?

相場の半額以下で販売していたサイトでは「水漏れ、画面割れなどありの特価品」と記載あり、
届いてみたら「メニューボタン欠損」「PCへのUSB接続不可(充電は可)」な製品でした。
ボタンはプラ片で埋め。データ転送はAirDroidで。バッテリーもさほど劣化なく好調。悪くない。

で、謹製アプリで温度、湿度は測れるのだけど、これでは見るだけしかできない。

それにこの子はセンサーだけが目当てで、このデバイスでがっつり何かする気もなかったので、
以下のような作りにしようと考えました。

1. T-02D で Taskerを使って、テキストに温度・湿度を保存
2. FolderSync Liteで Dropboxの Publicにテキストをアップロード
3. Tasker で Dropboxから Nexus5に温度・湿度を読み込む
4. 煮るなり焼くなり(今回はMinimalistic Text: Widgetsで画面上に表示)


● 手順 1:Taskerを使って、テキストに温度・湿度を保存


あらかじめローカルに空のテキストファイルを作っておきます(thermo.txtとか)。
わたしはPCで作っておいて、SDカードのTaskerフォルダの下にコピりました。


そしたら Taskerで任意の名前で新規 Taskを作成し、
1. Variables > Variable Set → Name は適当(%ONDOとか)、To に "round(%TEMP)"、
  Do Maths にチェック。%TEMP はセンサーからの温度取得、round は四捨五入です。
2. もひとつ、Variables > Variable Set → Name は適当(%SHITSUDOとか)、
  To に "round(%HUMIDITY)"、%HUMIDITY は湿度取得です。
3. File > Write File → File で先ほどのテキストを選択、Textには
  %ONDO
  %SHITSUDO
  と入れておきます。改行して2行で記載です。Add Newline のチェックは外します。

あと定期的に更新するために、上記 Taskを Profiles で定期イベントにしておきます。
Profilesタブで新規作成(+)をタップし、Timeで Repeat に every "15" Minute(s) とします。
そして先ほどタスクを選択。


● 手順 2:FolderSync Liteで Dropboxの Publicにテキストをアップロード


DropboxのPublicにおいたファイルを共有することで、URLでアクセスができます。
手順 3でNexus5のTaskerから読み込むため、また定期更新するために、
FolderSync Liteというアプリを使って、Dropboxに同期します。

まず「アカウント」であらかじめ Dropboxのアカウント認証をすませておきます。
次に「同期フォルダ」で新規作成(+)をタップし、
 固有の名前 → 任意
 アカウント → 先ほどのDropboxアカウントを選択
 同期タイプ → リモートフォルダ(スマホのデータをクラウドへ)
 リモートフォルダ → Dropbox のPublic を指定
 ローカルフォルダ → テキストのあるフォルダを選択(わたしは /storage/sdcard0/Tasker)
 スケジュール → 15分ごと
 同期オプション → チェックをすべて外し、「競合した場合の動作」は"古いものを上書き"
 接続 → 室温用なので "Wifiを使用"のみにしました
最後に右下の「保存」を押して完了です。

● 手順 3:Tasker で 別デバイスに温度・湿度を読み込む


まずPCのブラウザでDropboxに接続し、Public の "thermo.txt"を共有しておきます。
以下のようなアドレスが付与されます。u のとこは s だったりするかも。
 https://www.dropbox.com/u/xxxxxxxxxxxxxxx/thermo.txt?dl=0


そしたら 別デバイス(わたしは Nexus5)のTaskerで任意の名前で新規 Taskを作成し、
1. Net > HTTP Get
  Server:Port → https://dl.sropboxusercontent.com/u/xxxxxxxxxxxxxxx/thermo.txt
  Mime Type → text/plain (選択しなくてもいけるかも?)
  Output File → Tasker/temp.txt(一時ファイルを作っておきます。こうしないとうまくいかない?)
2. Variables > Variable Set → Name に "%GYO"、To に "1"。行指定用の変数を宣言
3. File > Read Line → File に先ほどの一時ファイル、Line に "%GYO"、Var to に
  温度を一時受けする変数。%TMP としました。
4. Variables > Variable Set → Name に "%GYO"、To に "2"。次は2行目を読みたいので。
5. File > Read Line → File に先ほどの一時ファイル、Line に "%GYO"、Var to に
  湿度を一時受けする変数。%HUM としました。
6. Plugin > MinimalisticText → Configration を開いて
  Variable name に 温度を MinimalisticText に渡す変数を入力。 "%ONDOV"としました。
Variable content に先ほどの一時受け変数 "%TMP"
7. もひとつ Plugin > MinimalisticText → Configration を開いて
  Variable name に 湿度を MinimalisticText に渡す変数を入力。 "%HUMV"としました。
Variable content に先ほどの一時受け変数 "%HUM"

これも定期的に取得・更新したいので、作った Taskを Profiles から呼び出すのですが、
手順 1と違って、以下のようにしないと読みだせませんでした。なんで?
Profilesタブで新規作成(+)をタップし、Timeで
 From に "AM 0:00"
 Repeat に every "15" Minute(s)
 To に "PM 11:59"


最後に MinimalisticText でホームでのウィジェット表示です。
ホーム画面長押しなど(ホームアプリによる)でウィジェット追加を選び、
MinimalisticText の任意のサイズを選んだら、
LAYOUTタブで「Locale variable」を選んで、「Variable name」"%ONDOV"を入力。
同様にもひとつ作った「Locale variable」で"%HUMV"を選んで、
あと「Static text」で「℃」や「%」をつけるなり、他のタブでサイズや色を変えるなりして完成~。

別デバイスに送るのでなければもっとシンプルに、Tasker で %TEMP/%HUMIDITY を読むだけ。
また取得した値を条件に、前回の赤外線送信と絡めれば
 ・ 30℃を超えたら冷房、25℃を切ったらオフ
 ・ 25%を下回ったら加湿器オン、50%を超えたらオフ
なんてことができますね。
ただスマホの温湿度センサーだと精度が甘いかもなので注意です。

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"}

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

2016年1月14日木曜日

フィットネス・ヘルス情報を(ある程度)一元化・自動化してみた



体組成計を買いまして。

せっかくなので毎日測って、記録を取ろうと思って買ったのですが、
フィットネス系サービスと連携する WiFi機能とかの体組成計は高いのです。

結局私が買ったのは Panasonic EW-FA13というやつで、
結構いろいろな数値も取れるし、精度の評判もいいのですが、お手頃2500円。
データ連携系を買おうと思うと、2万とかする。

しかも国内のメジャーメーカーだと自社のサービスとは連携するのですが、
スマホアプリやフィットネスバンドで有名なサービスにはデータを渡せなかったり。
じゃあ手入力でいいじゃないかと。

とはいえ面倒なのも事実。続けなければ意味がないので負荷は減らしたい。
あと一元管理したかったので様々なサービスを試した結果、最初の写真のようになりました。

では、その仕組みを紹介。




〇 ヘルス情報:体重・体脂肪率など

上記の図を左上からご覧ください。

 1. 体重を測る
 2. (図の右) Withingsに Androidアプリから日々入力(体重と体脂肪率のみ)
 3. (さらに右) numerousで表示 - IF(後述)でWithings記入時に自動更新

これがメインです。その日の体重、体脂肪率を表示する。
残念ながらヘルス情報と、歩数などのフィットネス情報を一元管理できるサービスがない。
そこで【一元表示】、【管理】、【連携】と3つに分けました。メインは【一元表示】。

【管理】は以下のステップです。できれば毎日だけど、溜めても大丈夫。
 1. 体重を測る
 2. (図の下) Androidアプリから入力(皮下脂肪率や筋肉レベルなどすべて)
 3. 上記アプリのPC版にアクセスし、csv出力
 4. 形を合わせてGoogle Driveにコピペ
2番のアプリは Panasonic Smart Appのダイエットメモというやつです。
csvは Withingに流し込むこともできる。試したら何故か体脂肪率が増えたけども。

【連携】というのは、フィットネス系にも体重情報だけは渡しておきたかったので。
2番まではメインと一緒で、そのあとも自動です。
 3. サービス連携で体重と体脂肪率が myfitnesspal に引き継がれる
 4. 同様に Misfitに引き継がれる
myfitnesspal は海外最大手らしいのですが、一元管理できないところで捨て。
と思ったら、これを間に挟まないと Misfit(あとで詳しく)にデータが渡せなくて拾い。

毎日しなきゃいけない手作業は、体重計に乗ることと、Withingsの入力のみ。

〇 ヘルス情報:心拍数

フィットネスバンドのように常に測れるわけではないけど、測って記録してみたかった。
図中央上部、「心拍数」のところからご覧ください。

 1. Androidアプリ Instant Heart Rateでスマホのカメラを使って計測
 2. 結果をTwitterでシェア。その際数値とハッシュタグ以外は削る
 3. numerousで表示 - IF(後述)でハッシュタグ付ツイートがあったときに自動更新

【管理】としては
 4. numerousの履歴を見て Withings、Google Driveに手入力

これも毎日必須としては測ってシェアするだけ。

【2016/1/22 追記】
1/20のアップデートで Withingsの Androidアプリに心拍数測定が導入されました。
別アプリ の起動、ツイートの手間がなくなりました。

 1. Androidアプリ Withings で体重・体脂肪率記入時に心拍数も測定
 2. numerousで表示 - IF(後述)で Withings記入時に自動更新

〇 フィットネス情報:歩数、移動距離、カロリー消費

図の右下の方、「Pebble」から「Misfit」の部分です。

スマートウォッチ Pebbleは前から愛用しているのですが、
せっかくなので入れておいたフィットネスアプリが Misfit 。
競合の Fitbitもできそうだったのですが、Pebbleアプリが有料のうえ評判いまひとつ。

Pebbleの Misfitアプリに蓄えられたデータは自動、または手動同期でスマホ→ウェブへ。
また同期時に IF(後述)で Numerousにも渡されます。
睡眠データも渡されるのですが、それは後述。


〇 フィットネス情報:睡眠

「Pebble」から下の「Sleep as Android」の流れです。

Misfitでもデータは取れるのですが、当初うまくいかず導入したのが Sleep as Android。
機能を購入する必要がありますが、Google Driveや Twitter連携を自動でしてくれる。
精度も Misfit より高い気がします。

逆に Misfitの利点は、寝る前に開始ボタンを押す必要がないこと。
ただ Sleepはスマート目覚ましとしても使ってるので、両方使ってます。

さて numerous表示は図に書ききれなかったので略してますが、
Twitterにつぶやいたものを IF (後述)で拾って、numerousにコメント。
それを見たときに、深い睡眠がとれた率を手動でデータ入力してます。
numerousは数値しか受け入れないし、IF はテキスト加工できないので苦肉の策。
まあほぼ自動ってことで。

〇 フィットネス情報:カフェインカウンター

図では「Pebble」から上に伸びるラインです。

賞に輝きながら IF(IFTTT) の苦情で消えてしまった Pebbleアプリ PushButton。
 紹介ブログ:「Pushbutton」初代Pebbleと次世代Pebble Timeを「IFTTT」の実行ボタンにすることができるアプリが登場。IoTとかコントロール可能に-Thanx Palm(Yuu Andouさん)
IF の新サービス Do buttonを Pebbleからできるようにします。

IF は睡眠のところで書いたようにサービスとサービスを連携させるものなのですが、
この Do buttonアプリではボタンを押すと、予め登録したサービスに値を投げます。
でもスマホ取り出して、アプリ起動するの面倒です。そこで PushButton。
"pbw"で検索すると幸せになれます。

で、具体的な仕掛けですが、 Do buttonでボタンを押したら
numerousに作っておいた「CoffeeCountを1増やす」という機能を作成。
また IFで「0時になったら CoffeeCountをゼロにする」という機能も作成。

あとはコーヒーを飲むたびに Pebbleで PushButtonから CoffeeCountを押すだけです。
ときどき numerousの履歴から Google Driveに記録をうつします。

〇 フィットネス情報?:移動場所

左下。以前からAndroidに入れてある「Moves」のExportサービスを使って
Evernoteに日々の記録を投げてます。たまに見返すと面白い。


結局毎日必須の手作業は3つかな?これなら続けられそうです。
さて、他にもいろいろ使ってみたのですが諦めたサービスにも触れておきましょう。

▽ からだバランスラボ
 パナの薦める自社サービスだったので使ってみた。が。
 モバイル版の案内があるのに開けず、データは入れたきりエクスポートもできず。
 体組成計の上位機種向けであるダイエットメモの方が小回りが利きました。
 てかなんで別アプリ?

▽ Google Fit
 他サービスを統合できるってあったから期待したけど、ごく一部のみ。
 入力できる値も少ない。将来に期待。

▽ FitHub
 幾つかのフィットネスアプリを束ね、平均/個別で表示してくれる Androidアプリ。
 でもヘルス系ができなかったので。

▽ UP by Jawbone
 フィットネスバンドで有名。Pebbleでは代用できないのと、
 ハブとして myfitnesspal 的に使おうとしたらうまくいかなかったので断念。

▽ Runkeeper
 有名なフィットネスアプリ。これもうまくハブにできず断念。
 アクティビティの記録がメインなので、データを渡してはくれても貰ってはくれないのかな?

▽ Fitbit
 家電量販店いくとこれのフィットネスバンドが並びまくってますね。携帯キャリアとも組んでる。
 これは前述のとおり、Pebbleとの相性で却下。アプリの見た目も Misfitがよかった。
 図のPebble の画面のがそれです(小さくて見えないかな?)

▽ ARGUS
 これは惜しかった!見た目がよく、情報も多く統合できるのだが、
 他サービスとの連携が弱く、Pebbleとも組み合わせられなかった。
 心拍数測定アプリの Instant Heart Rateは同じ Azumio社のアプリです。

▽ Runtastic Heart Rate / Cardiograph
 Instant Heart Rate同様の Android用心拍数測定アプリ。
 外部への測定値出力ができなかったのが分かれ目でした。
 Runatic はメジャーサービスなのに、Share時のツイートが「測定しました」って・・・

以上、長くなりました。ご覧いただき、ありがとうございます。
参考になれば幸いです。






Evernote

Clip to Evernote