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の上書きコピー処理の後に回すよう、
プロファイルで時間指定します。

Evernote

Clip to Evernote