Tengo una bombilla ZWave y un interruptor de pared de 4 botones ZWave, ambos conectados a Domoticz instalados en una Raspberry Pi.
Me gustaría los siguientes escenarios:
- Botón 1: lámpara encendida durante 30 minutos
- Botón 2: lámpara apagada
- Botón 3: lámpara siempre encendida
- Botón 4: convocar a Cthulhu
Cada botón anula la acción anterior (Botón 3 -> Botón 1 = encendido durante 30 minutos)
El cableado y la programación de los botones es fácil, pero ahora, ¿qué tal el temporizador? Me gustaría evitar crear un servicio casero porque tengo miedo de jugar init.d
.
Tengo 3 posibilidades:
Domoticz interruptor ficticio
Domoticz permite crear un interruptor ficticio que puede cambiar los estados después de un tiempo dado en una interfaz:
Pros
- temporizador fuera de la plataforma!
- Puedo interactuar bastante rápido entre mi interruptor de pared y la lámpara
Contras
- aunque Domoticz maneja MQTT, habrá una gran cantidad de script LUA y "bloque" para interconectar dispositivos
- el tiempo puede no ser fácilmente configurable ...
at
y atq
at
es un comando de Linux para planificar una acción a tiempo, tan simple como
at [when] < [what]
Pros
- servicio de temporizador múltiple
- fácil de usar y llamar
Contras
- solo da una identificación única, a menos que analice el comando planeado, no puedo asignarle un nombre al trabajo (a menos que con un comando mágico de Linux ...)
- por lo tanto, necesito codificar / implementar un buscador de trabajo usando una base de datos
Crontab
Crontab es un servicio de Linux para planificar tareas repetitivas. En mi caso será un simple
# check every minute
* * * * * /path/checktimer.sh
Pros
- Activador de tiempo confiable
Contras
- No se pueden administrar segundos ...
- Aún forzado a mantener en algún lugar un empleo
A mi pregunta:
- ¿Tuviste que gestionar temporizadores como este?
- ¿Me perdí otras soluciones más confiables / configurables?
- ¿Tiene preferencia con las soluciones anteriores?
fuente
sleep
ousleep
para activar el apagado? Es la función subyacente en at, y puede usarlojobs
para manejar trabajos en segundo plano (principalmente para cancelar un apagado planificado si lo entendí correctamente)sleep
se ve peor: solo pasas un tiempo y no devuelve nada. ¿Puedes responder y dar un ejemplo usandojobs
?Respuestas:
Por solicitud, intentaré dar un ejemplo de cómo lo abordaría (con el
jobs
manejo de bash shell ):Botón 1:
Al encender una lámpara X durante 30 segundos y la lámpara Y durante 5 minutos:
Debido a las limitaciones del proceso, esto tiene que estar en dos líneas separadas, el eco anterior debe ser reemplazado por comandos reales, obviamente.
botón 3:
Luego puedes
kill
dormir para detenerlo y mantener la luz encendida obteniendo un trabajo pid y matándolo:El hecho de que los comandos estén encadenados
&&
evitará que el comando sesleep
ejecute después de que el sueño no salga correctamente.Esto no maneja trabajos no existentes, lo que puede causar que kill devuelva un error, aquí no debería pasar nada malo.
Botón 2: Usando el mismo método que el botón 3, pero usando el comando de detención y eliminando los trabajos si los hay.
Botón 4:
(lo siento, no tengo idea de lo que deseas aquí, listo para completar)
Detalles de implementaciones sobre
jobs
:jobs -p %?lamp_y
devolver el pedido actual-p
de un trabajo que coincida con la especificación del trabajo, lo%?lamp_y
que significa quelamp_y
puede aparecer en cualquier lugar de la línea de comando, elija cuidadosamente qué usar aquí (pero apuesto a que tiene un identificador único para las cosas o el grupo de cosas que desea controlar).fuente
true taskid &&
para que pueda seguir fácilmente su trabajo. Desafortunadamente, esto no funciona si PHP u otro programa llama al comando porque se lanzará como una subshell ...Si desea utilizar un servicio en línea para esto, debería poder utilizar https://www.stringify.com. Admiten secuencias y variables (y temporizadores). No he usado su servicio con ira, pero parece que debería poder usar un temporizador para disminuir una variable (que determina el tiempo restante), y los diversos eventos desencadenantes pueden forzar la variable a un nuevo valor.
Admiten la integración IFTTT, por lo que casi cualquier punto final puede vincularse de alguna manera.
fuente
He encontrado otra forma bastante costosa pero trabajando con procesos externos como PHP
system
: pantallaPrimero, instálalo:
Entonces llama a tu función
Para enumerar tus tareas
Para matarlo
fuente