常時オン/時限/オフのランプ用の信頼できるタイマー


7

ZWave電球とZWave 4ボタンの壁スイッチがあり、どちらもRaspberry PiにインストールされているDomoticzに接続されています。

以下のシナリオを希望します。

  • ボタン1:ランプが30分間点灯
  • ボタン2:ランプオフ
  • ボタン3:常時点灯
  • ボタン4:クトゥルフ召喚

各ボタンは前のアクションを上書きします(ボタン3->ボタン1 = 30分間オン)

ボタンの配線とプログラミングは簡単ですが、タイマーはどうですか?といちゃいちゃするのが怖いので、自家製のサービスは作りたくないinit.d

私には3つの可能性があります:


Domoticzダミースイッチ

Domoticzでは、インターフェイスで指定された時間の後に状態を変更できるダミースイッチを作成できます。

domoticzダミースイッチ

長所

  • 既製のタイマー!
  • 壁のスイッチとランプをすばやく操作できる

短所

  • DomoticzはMQTTを処理しますが、デバイスを相互接続するためのLUAスクリプトと「ブロック」が多数存在します。
  • 時間は簡単に設定できない場合があります...

at そして atq

at 次のように単純な、時間内にアクションを計画するLinuxコマンドです

at [when] < [what]

長所

  • マルチタイマーサービス
  • 使いやすく通話も簡単

短所

  • 計画されたコマンドを解析しない限り、一意のIDのみが与えられます(マジックLinuxコマンドを使用しない限り...)。
  • したがって、データベースを使用して求人マッチャーをコーディング/実装する必要があります

クロンタブ

Crontabは、反復的なタスクを計画するためのLinuxサービスです。私の場合、それは簡単です

# check every minute
* * * * * /path/checktimer.sh

長所

  • 信頼できる時間トリガー

短所

  • 秒を管理できません...
  • まだどこかの職人を維持することを余儀なくされています

私の質問へ:

  • このようなタイマーを管理する必要がありましたか?
  • 他のより信頼性の高い/構成可能なソリューションを見逃しましたか?
  • 上記のソリューションを優先していますか?

1
sleepまたはusleepを使用してオフをトリガーしますか?atの基本機能であり、jobsバックグラウンドジョブを処理するために使用できます(主に、私が適切に理解している場合は、計画されたキャンセルをキャンセルします)
Tensibai

sleep悪く見えます:あなたは時間を渡すだけで何も返しません。答えて、例を挙げていただけますjobsか?
Goufalite 2017

回答:


5

リクエストごとに、(bashシェルjobs処理を使用して)それにどのように取り組むかについて例を挙げてみます。

ボタン1:
ランプXを30秒間、ランプYを5分間点灯させる場合:

echo "Switch on lamp_x" && sleep 30s && echo "Switch off lamp_x" &
echo "Switch on lamp_y" && sleep 5m && echo "Switch off lamp_y" &

プロセスの制限により、これは2行に分ける必要があります。上記のエコーは実際のコマンドに置き換えてください。

ボタン3:
その後、killスリープしてジョブを停止し、ジョブpidを取得して強制終了することにより、ライトを点灯し続けることができます。

kill $(jobs -p %?lamp_y)
echo "Switch on lamp_y"

コマンドがチェーンされているという事実は、スリープが適切に終了しなかった&&ため、コマンドsleepが実行されないようにします。
これは存在しないジョブを処理しないため、killがエラーを返す可能性があり、ここでは何も問題は発生しません。

ボタン2:ボタン3と同じ方法を使用しますが、stopコマンドを使用し、ジョブがあればそれを強制終了します。

ボタン4:

echo "Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn"

(申し訳ありませんが、ここであなたが何を望んでいるかはわかりません、完全に設定してください)


に関する実装の詳細jobs

jobs -p %?lamp_y現在のpidを返す-pのjobspecマッチングジョブの%?lamp_y手段が、lamp_y(私はあなたがコントロールしたいものの物事やグループの一意の識別子を持っている賭ける)、どこでも、コマンドラインで表示されることがありますが、ここで使用するかを慎重に選択します。


3
私は、ボタン4の実装をテストするためにボランティアないよ
ショーンHoulihane

2
ライナーを殺す仕事は完璧です!ありがとうございました!ところで、ボタン4の実装を試したところ、すべてのライトが点滅し、どこにでも不気味な音が聞こえるので、ハロウィーンパーティーに最適です。
Goufalite 2017

@Goufalite助けてくれてうれしい
Tensibai

Protip:でコマンドを開始するとtrue taskid &&、ジョブを簡単に追跡できます。残念ながら、これはサブシェルとして起動されるため、PHPまたは別のプログラムがコマンドを呼び出した場合は機能しません...
Goufalite

3

このためにオンラインサービスを使用する場合は、https://www.stringify.comを使用できるはずですこれらは、シーケンスと変数(およびタイマー)をサポートしています。私は怒りの中でそれらのサービスを使用していませんが、タイマーを使用して変数(時間の残りを決定する)をデクリメントできるはずであり、さまざまなトリガーイベントによって変数を強制的に新しい値にすることができます。

これらはIFTTT統合をサポートしているため、ほとんどすべてのエンドポイントを何らかの方法でリンクできます。


3

PHPのような外部プロセスを操作するのにかなり高価な別の方法を見つけましたsystemscreen

まず、インストールします。

sudo apt-get install screen

次に、関数を呼び出します

screen -dm -S taskid bash -c 'sleep 20 && command'
    -dm : detach process
    -S  : identify screen by name

タスクを一覧表示するには

ls /var/run/screen/S-www-data (or S-anotheruser, warning it is user bound, or sudo it)

それを殺すために

screen -S taskid -X kill
    -S : identify screen by name
    -X : access the screen and perform this command
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.