Zuverlässige Timer für immer ein / zeitlich / ausgeschaltete Lampen

7

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:

Domoticz Dummy-Schalter

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?
Goufalite
quelle
1
Einfach benutzen sleepoder usleepum das Aus auszulösen? Es ist die zugrunde liegende Funktion unter at, und Sie können die Verwendung verwenden jobs, um Hintergrundjobs zu bearbeiten (hauptsächlich, um einen geplanten Abbruch abzubrechen, wenn ich es richtig verstanden habe)
Tensibai
sleepsieht schlimmer aus: du verbringst nur eine Zeit und es gibt nichts zurück. Können Sie antworten und ein Beispiel geben jobs?
Goufalite

Antworten:

5

Auf Anfrage werde ich versuchen, ein Beispiel zu geben, wie ich es angehen würde (mit Bash-Shell- jobsHandling):

Taste 1:
Wenn Sie eine Lampe X 30 Sekunden lang und Lampe Y 5 Minuten lang einschalten:

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

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 killschlafen, um es zu stoppen und das Licht an zu halten, indem Sie eine Job-PID bekommen und es töten:

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

Die Tatsache, dass die Befehle verkettet &&sind, verhindert, dass der Befehl nach sleepdem 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:

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

(Entschuldigung, ich habe keine Ahnung, was Sie hier wünschen, der Vollständigkeit halber eingestellt)


Details zu Implementierungen über jobs:

jobs -p %?lamp_y-pGeben Sie %?lamp_ydie aktuelle PID eines Jobs zurück, die mit der Jobspezifikation übereinstimmt. Dies bedeutet, dass sie lamp_ymö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).

Tensibai
quelle
3
Ich melde mich nicht freiwillig, um Ihre Implementierung von Button 4 zu testen.
Sean Houlihane
2
Ein Liner-Tötungsjob ist perfekt! Vielen Dank! Übrigens, ich habe Ihre Button 4-Implementierung ausprobiert und jetzt blinken alle meine Lichter und überall ist ein gruseliger Sound zu hören, großartig für eine Halloween-Party!
Goufalite
@ Goufalite froh, dass es geholfen hat
Tensibai
Protip: Starten Sie den Befehl mit, 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 ...
Goufalite
3

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.

Sean Houlihane
quelle
3

Ich habe einen anderen Weg gefunden, der ziemlich teuer ist, aber mit externen Prozessen wie PHPs arbeitet system: Bildschirm

Installieren Sie es zuerst:

sudo apt-get install screen

Rufen Sie dann Ihre Funktion auf

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

Um Ihre Aufgaben aufzulisten

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

Um es zu töten

screen -S taskid -X kill
    -S : identify screen by name
    -X : access the screen and perform this command
Goufalite
quelle