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からの更なる使いこなしを行いましょう。