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:
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?
fonte
sleep
ouusleep
para ativar o desligamento? Sua função subjacente sob a, e você pode o usojobs
para trabalhos de fundo punho (principalmente para cancelar uma planejada fora se eu entendi corretamente)sleep
parece pior: você só passa um tempo e ele não retorna nada. Você pode responder e dar um exemplo usandojobs
?Respostas:
Por solicitação, tentarei dar um exemplo de como eu o enfrentaria (com o
jobs
manuseio do bash shell ):Botão 1:
Ao acender uma lâmpada X por 30 segundos e a lâmpada Y por 5 minutos:
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
kill
dormir para pará-lo e manter a luz acesa, recebendo um anúncio de emprego e matando-o:O fato de os comandos serem encadeados
&&
impedirá que o comandosleep
seja 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:
(desculpe, eu não tenho idéia do que você deseja aqui, defina a integridade)
Detalhes de implementações sobre
jobs
:jobs -p %?lamp_y
retorne o pid atual-p
de uma tarefa que corresponda à especificação da tarefa, o%?lamp_y
que significa quelamp_y
pode 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).fonte
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 ...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.
fonte
Eu encontrei outra maneira bastante cara, mas trabalhando com processos externos, como o PHP
system
: screenPrimeiro, instale-o:
Então chame sua função
Para listar suas tarefas
Para matá-lo
fonte