Ich habe eine ZWave-Glühbirne und einen ZWave-4-Tasten-Wandschalter, die beide mit Domoticz verbunden sind und auf einem Raspberry Pi installiert sind.
Ich möchte die folgenden Szenarien:
- Taste 1: Lampe 30 Minuten lang an
- Taste 2: Lampe aus
- Taste 3: Lampe immer an
- Knopf 4: Cthulhu beschwören
Jede Taste überschreibt die vorherige Aktion (Taste 3 -> Taste 1 = 30 Minuten lang eingeschaltet)
Das Verdrahten und Programmieren der Tasten ist einfach, aber wie steht es jetzt mit dem Timer? Ich möchte vermeiden, einen hausgemachten Service zu erstellen, weil ich Angst habe, mich damit herumzuschlagen init.d
.
Ich habe 3 Möglichkeiten:
Domoticz Dummy-Schalter
Domoticz ermöglicht das Erstellen eines Dummy-Schalters, der nach einer bestimmten Zeit in einer Schnittstelle den Status ändern kann:
Vorteile
- Standard-Timer!
- Ich kann sehr schnell zwischen meinem Wandschalter und der Lampe interagieren
Nachteile
- Obwohl Domoticz MQTT verarbeitet, wird es eine Menge LUA-Skripte geben und "blocky", um Geräte miteinander zu verbinden
- Zeit ist möglicherweise nicht einfach zu konfigurieren ...
at
und atq
at
ist ein Linux-Befehl zum Planen einer Aktion in der Zeit, so einfach wie
at [when] < [what]
Vorteile
- Multi-Timer-Service
- einfach zu bedienen und anzurufen
Nachteile
- at gibt nur eine eindeutige ID an, es sei denn, ich analysiere den geplanten Befehl. Ich kann dem Job keinen Namen geben (es sei denn mit einem magischen Linux-Befehl ...).
- Daher muss ich einen Job Matcher mithilfe einer Datenbank codieren / implementieren
Crontab
Crontab ist ein Linux-Dienst zum Planen sich wiederholender Aufgaben. In meinem Fall wird es einfach sein
# check every minute
* * * * * /path/checktimer.sh
Vorteile
- Zuverlässiger Zeitauslöser
Nachteile
- Kann keine Sekunden verwalten ...
- Immer noch gezwungen, irgendwo einen Job Matcher zu unterhalten
Zu meiner Frage:
- Mussten Sie solche Timer verwalten?
- Habe ich andere zuverlässigere / konfigurierbare Lösungen vermisst?
- Haben Sie eine Präferenz für die oben genannten Lösungen?
quelle
sleep
oderusleep
um das Aus auszulösen? Es ist die zugrunde liegende Funktion unter at, und Sie können die Verwendung verwendenjobs
, um Hintergrundjobs zu bearbeiten (hauptsächlich, um einen geplanten Abbruch abzubrechen, wenn ich es richtig verstanden habe)sleep
sieht schlimmer aus: du verbringst nur eine Zeit und es gibt nichts zurück. Können Sie antworten und ein Beispiel gebenjobs
?Antworten:
Auf Anfrage werde ich versuchen, ein Beispiel zu geben, wie ich es angehen würde (mit Bash-Shell-
jobs
Handling):Taste 1:
Wenn Sie eine Lampe X 30 Sekunden lang und Lampe Y 5 Minuten lang einschalten:
Aufgrund von Prozessbeschränkungen muss dies in zwei getrennten Zeilen erfolgen. Das obige Echo sollte offensichtlich durch tatsächliche Befehle ersetzt werden.
Knopf 3:
Sie können dann
kill
schlafen, um es zu stoppen und das Licht an zu halten, indem Sie eine Job-PID bekommen und es töten:Die Tatsache, dass die Befehle verkettet
&&
sind, verhindert, dass der Befehl nachsleep
dem Ausführen ausgeführt wird, da der Ruhezustand nicht ordnungsgemäß beendet wurde.Dies behandelt nicht vorhandene Jobs nicht, was dazu führen kann, dass kill einen Fehler zurückgibt. Hier sollte nichts Schlimmes passieren.
Schaltfläche 2: Verwenden Sie dieselbe Methode wie Schaltfläche 3, verwenden Sie jedoch den Befehl stop und beenden Sie die Jobs, falls vorhanden.
Taste 4:
(Entschuldigung, ich habe keine Ahnung, was Sie hier wünschen, der Vollständigkeit halber eingestellt)
Details zu Implementierungen über
jobs
:jobs -p %?lamp_y
-p
Geben Sie%?lamp_y
die aktuelle PID eines Jobs zurück, die mit der Jobspezifikation übereinstimmt. Dies bedeutet, dass sielamp_y
möglicherweise irgendwo in der Befehlszeile angezeigt wird. Wählen Sie sorgfältig aus, was hier verwendet werden soll (aber ich wette, Sie haben eine eindeutige Kennung für Dinge oder Gruppen von Dingen, die Sie steuern möchten).quelle
true taskid &&
damit Sie Ihren Job einfach verfolgen können! Leider funktioniert dies nicht, wenn PHP oder ein anderes Programm den Befehl aufruft, da er als Subshell gestartet wird ...Wenn Sie hierfür einen Onlinedienst verwenden möchten, sollten Sie https://www.stringify.com verwenden können. Sie unterstützen Sequenzen und Variablen (und Timer). Ich habe ihren Dienst nicht im Zorn verwendet, aber es sieht so aus, als ob Sie in der Lage sein sollten, einen Timer zum Dekrementieren einer Variablen zu verwenden (der die verbleibende Pünktlichkeit bestimmt), und die verschiedenen Triggerereignisse können die Variable auf einen neuen Wert zwingen.
Sie unterstützen die IFTTT-Integration, sodass so ziemlich jeder Endpunkt auf irgendeine Weise verknüpft werden kann.
quelle
Ich habe einen anderen Weg gefunden, der ziemlich teuer ist, aber mit externen Prozessen wie PHPs arbeitet
system
: BildschirmInstallieren Sie es zuerst:
Rufen Sie dann Ihre Funktion auf
Um Ihre Aufgaben aufzulisten
Um es zu töten
quelle