Temporizadores confiáveis ​​para lâmpadas sempre ligadas / temporizadas / desligadas

7

Eu tenho uma lâmpada ZWave e um interruptor de parede com 4 botões ZWave, ambos conectados ao Domoticz instalado em um Raspberry Pi.

Eu gostaria dos seguintes cenários:

  • Botão 1: lâmpada acesa por 30 minutos
  • Botão 2: lâmpada apagada
  • Botão 3: lâmpada sempre acesa
  • Botão 4: convocar Cthulhu

Cada botão substitui a ação anterior (Botão 3 -> Botão 1 = ativado por 30 minutos)

É fácil conectar e programar os botões, mas agora, e o temporizador? Eu gostaria de evitar a criação de um serviço caseiro, porque tenho medo de mexer init.d.

Eu tenho 3 possibilidades:


Interruptor fictício Domoticz

O Domoticz permite criar um comutador fictício que pode mudar de estado após algum tempo fornecido em uma interface:

interruptor fictício domoticz

Prós

  • temporizador de prateleira!
  • Posso interagir rapidamente entre o interruptor da parede e a lâmpada

Contras

  • embora o Domoticz lide com MQTT, haverá muitos scripts LUA e "blocos" para interconectar dispositivos
  • o tempo pode não ser facilmente configurável ...

at e atq

at é um comando linux para planejar uma ação no tempo, tão simples quanto

at [when] < [what]

Prós

  • serviço multi-timer
  • fácil de usar e ligar

Contras

  • fornece apenas um ID exclusivo, a menos que analise o comando planejado, não posso dar um nome ao trabalho (a menos que com um comando linux mágico ...)
  • portanto, preciso codificar / implementar um job matcher usando um banco de dados

Crontab

O Crontab é um serviço Linux para planejar tarefas repetitivas. No meu caso, será uma simples

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

Prós

  • Gatilho de tempo confiável

Contras

  • Não é possível gerenciar segundos ...
  • Ainda forçado a manter em algum lugar um candidato a emprego

Para minha pergunta:

  • Você teve que gerenciar temporizadores como esse?
  • Perdi outras soluções mais confiáveis ​​/ configuráveis?
  • Você prefere as soluções acima?
Goufalite
fonte
11
Basta usar sleepou usleeppara ativar o desligamento? Sua função subjacente sob a, e você pode o uso jobspara trabalhos de fundo punho (principalmente para cancelar uma planejada fora se eu entendi corretamente)
Tensibai
sleepparece pior: você só passa um tempo e ele não retorna nada. Você pode responder e dar um exemplo usando jobs?
Goufalite

Respostas:

5

Por solicitação, tentarei dar um exemplo de como eu o enfrentaria (com o jobsmanuseio do bash shell ):

Botão 1:
Ao acender uma lâmpada X por 30 segundos e a lâmpada Y por 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" &

Devido às limitações do processo, isso deve ocorrer em duas linhas separadas, o eco acima deve ser substituído por comandos reais, obviamente.

botão 3:
Você pode killdormir para pará-lo e manter a luz acesa, recebendo um anúncio de emprego e matando-o:

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

O fato de os comandos serem encadeados &&impedirá que o comando sleepseja executado depois que o sono não for encerrado corretamente.
Isso não lida com o trabalho inexistente, o que pode causar a morte para retornar um erro; nada de ruim deve acontecer aqui.

Botão 2: Usando o mesmo método que o botão 3, mas usando o comando stop e eliminando os trabalhos, se houver.

Botão 4:

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

(desculpe, eu não tenho idéia do que você deseja aqui, defina a integridade)


Detalhes de implementações sobre jobs:

jobs -p %?lamp_yretorne o pid atual -pde uma tarefa que corresponda à especificação da tarefa, o %?lamp_yque significa que lamp_ypode aparecer em qualquer lugar da linha de comando, escolha cuidadosamente o que usar aqui (mas aposto que você tem um identificador exclusivo para coisas ou grupo de coisas que deseja controlar).

Tensibai
fonte
3
Eu não estou oferecendo-se para testar sua implementação do botão 4.
Sean Houlihane
2
Um trabalho matador de linha é perfeito! Obrigado! Eu tentei a implementação do seu botão 4 e agora todas as minhas luzes estão piscando e há um som assustador em todos os lugares, ótimo para uma festa de Halloween!
Goufalite
@Goufalite feliz porque aconteceu ajuda
Tensibai
Protip: inicie o comando com true taskid &&para que você possa acompanhar facilmente o seu trabalho! Infelizmente isso não funciona se o PHP ou outro programa chama o comando, porque ele vai ser lançado como um subnível ...
Goufalite
3

Se você quiser usar um serviço on-line para isso, poderá usar https://www.stringify.com. Eles oferecem suporte a seqüências e variáveis ​​(e timers). Não usei o serviço deles com raiva, mas parece que você deve usar um timer para diminuir uma variável (que determina o tempo restante), e os vários eventos de acionamento podem forçar a variável a um novo valor.

Eles suportam a integração IFTTT, de modo que praticamente qualquer ponto final pode ser vinculado de alguma forma.

Sean Houlihane
fonte
3

Eu encontrei outra maneira bastante cara, mas trabalhando com processos externos, como o PHP system: screen

Primeiro, instale-o:

sudo apt-get install screen

Então chame sua função

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

Para listar suas tarefas

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

Para matá-lo

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