Temporizadores confiables para lámparas siempre encendidas / temporizadas / apagadas

7

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:

interruptor ficticio domoticz

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?
Goufalite
fuente
1
¿Solo usa sleepo usleeppara activar el apagado? Es la función subyacente en at, y puede usarlo jobspara manejar trabajos en segundo plano (principalmente para cancelar un apagado planificado si lo entendí correctamente)
Tensibai
sleepse ve peor: solo pasas un tiempo y no devuelve nada. ¿Puedes responder y dar un ejemplo usando jobs?
Goufalite

Respuestas:

5

Por solicitud, intentaré dar un ejemplo de cómo lo abordaría (con el jobsmanejo de bash shell ):

Botón 1:
Al encender una lámpara X durante 30 segundos y la lámpara Y durante 5 minutos:

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

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 killdormir para detenerlo y mantener la luz encendida obteniendo un trabajo pid y matándolo:

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

El hecho de que los comandos estén encadenados &&evitará que el comando se sleepejecute 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:

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

(lo siento, no tengo idea de lo que deseas aquí, listo para completar)


Detalles de implementaciones sobre jobs:

jobs -p %?lamp_ydevolver el pedido actual -pde un trabajo que coincida con la especificación del trabajo, lo %?lamp_yque significa que lamp_ypuede 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).

Tensibai
fuente
3
No me ofrezco para probar su implementación del botón 4.
Sean Houlihane
2
¡Un trabajo de matar de línea es perfecto! ¡Gracias! Por cierto, probé la implementación del botón 4 y ahora todas mis luces parpadean y hay un sonido espeluznante en todas partes, ¡genial para una fiesta de Halloween!
Goufalite
@Goufalite contento de que haya ayudado
Tensibai
Protip: inicie el comando con 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 ...
Goufalite
3

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.

Sean Houlihane
fuente
3

He encontrado otra forma bastante costosa pero trabajando con procesos externos como PHP system: pantalla

Primero, instálalo:

sudo apt-get install screen

Entonces llama a tu función

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

Para enumerar tus tareas

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

Para matarlo

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