条件が整うとき
Llama のイベントは、条件が整ったときに実行されます。
…でも、その詳細な動作は複雑です。
特に「条件が整う」ってどういうこと?
Llama のイベントが思うように動かない、という人は、ここで引っかかっている可能性が大。
逆に言えば、これをちゃんと把握すると、非常に柔軟に Llama のプログラムが作れるようになります。
条件の整う時
例えば、「WiFi 接続中なら」という条件が付けられたイベントは、どういうときに実行されるのでしょうか?
日本語的に考えれば、「WiFi接続中」ならば、いつでも実行されそうです。
いつでもって…いつでも? 繰り返し? だとしたら何秒ごとに?
実際には、条件が整った、を厳密に言えば「整っていなかったのが、整ったとき」です。
つまり、「接続していなかった WiFi が、接続したとき」が、「WiFi 接続中なら」のイベントが実行されるタイミングです。
「家で」という条件のイベントなら、「家に入った瞬間」だけが実行されるタイミング。
じゃぁ、「接続中なら」とか「家で」とか曖昧に書かないで、「接続したとき」とか「家に入ったとき」と書けばいいじゃないか、とお叱りが来そうです。
しかし、この書き方にはちゃんとした理由があるのです。
繰り返し
イベントは、繰り返し実行を指定することもできます。これは、イベント編集時の「高度機能...」の中で指定できます。
たとえば、5分毎に繰り返し実行、という指定をした場合、条件が「整った瞬間」に実行が行われ、以降「持続している間」定期的に実行し続けます。
この場合、「家で」という条件は、まさに家に居る間中、と言うことになります。
この繰り返しは、当然のことながら条件が変わると終了します。
遅延
イベントは、遅延実行を指定することもできます。こちらも「高度機能...」の中で指定できます。
条件が整った瞬間から何分か後に動作を起こす、と言うのが基本です。
しかし、実際に動作を起こすときにもう一度条件を確かめて、条件が変わっていたら動作を中止することもできます。
この「もう一度条件を確かめる」際には、条件が変わった瞬間を求めているわけではありません。
むしろ、条件が持続していることが重要でしょう。
(持続していなくても、「数分後に同じ」であれば良いのだけど)
複数条件の組み合わせ
ここまでは、繰り返そうが遅延仕様が、「条件が一つ」の場合の話をしていました。
ここから、複数条件の組み合わせの話になります。実は、条件の組み合わせは、裏で非常にややこしい処理が行われています。
フィルタとトリガ
まず、複数の条件は、当然のことながら「バラバラに」変化します。
Llama は、条件が変化すると、その条件変化によって実行されるイベントがないかを、チェックします。
常に動いていると、無駄に電池を消費してしまうからね。
Llama は OS に「なにか状況が変化したら教えてね」と頼んで、普段は寝ています。
そして、「携帯電波のIDが変化した」とか「WiFi接続が行われた」とか、重要な状況変化があった時だけ、OS から起こされるのです。
上に書いた「条件が変化すると~チェックします」というのは、OSに起こされて動作する、というLlama の仕組みによるものなのです。
さて、条件が変化して、Llama がチェック動作を行うとき、このきっかけになった(たった今変化した)条件のことを「トリガ」と呼び、その他の条件のことを「フィルタ」と呼びます。
トリガもフィルタも、すべての条件が整って、はじめてイベントが実行されます。
たとえトリガがLlama を動かしても、フィルタが阻止すればイベントは実行されません。
ちなみに、イベント実行のことは「ファイア(発火)」と呼ばれます。 引き金を引いたら銃口が火を噴くのです。
ほとんどの条件が、トリガにもフィルタにもなれます。しかし、中にはトリガにしかなれなかったり、フィルタにしかなれない条件もあります。
また、2013.4.21 公開のβ版では、一部の条件は「トリガとして動作しないように」設定できます。このことの詳細は後述します。
こういうものは、OS が Llama を起こしてくれないので、トリガにはなれないのです。
また、Llama の側で、わざわざ「状況が変化した瞬間」だけを整った、としている条件があります。
こういうものは、フィルタにはなれません。
トリガとして動作しないようにする、というのは、OS は Llama を起こすのですが、起こされた理由によっては Llama がそれを無視する、ということになります。
「条件すべてが」
Llama に複数の条件を列記すると、そのすべての条件が満たされるまで、実行は行われません。
プログラムの世界では、AND 条件、と呼ばれます。
すでに書いたように、AND 条件では、複数の条件は「フィルタ」と「トリガ」として認識されます。
最初に、条件が整うのは「変化した瞬間」だと書きましたが、これは「トリガ」としての話。フィルタとしては、「瞬間」だけでなく、現在の状態によって条件を認識します。
そして、ひとつでも整っていないフィルタがある場合は、イベントは実行されません。
また、Llama の条件の中には、わざわざ「AND」の指定があります。これは、次に書く OR 条件の中で使うためのものです。
「条件どれかが」
「[家で か WiFi接続中なら]」と言う条件の場合、どちらか片方が整えば、条件が整ったことになります。
つまり、フィルタは無視されます。トリガだけが重要な意味を持つのです。
ところで、すでに「家で」で条件が整っている場合に、「WiFi接続中なら」が新たに整ったらどうなるでしょうか?
実は、OR 条件の作成時に、「再度の条件確認」のチェックの有無で動作を決めることができます。
チェックありなら、先の例は動作を起こします。
全体としてすでに条件が整っていても、新たに条件が整ったなら動作を起こす、ということです。
チェック無しなら、動作を起こしません。
全体としてすでに条件が整っていれば、以降は新たな動作は起こさない、ということです。