我有一个ZWave灯泡和一个ZWave 4按钮墙壁开关,都连接到安装在Raspberry Pi上的Domoticz。
我希望出现以下情况:

按钮1:点亮持续30分钟
按钮2:灯熄灭
按钮3:灯始终亮起
按钮4:召唤克苏鲁

每个按钮都会覆盖上一个操作(按钮3->按钮1 =开启30分钟)
对按钮进行接线和编程很容易,但是现在计时器又如何呢?我想避免创建自制服务,因为我害怕弄乱init.d
我有3种可能性:

Domoticz虚拟交换机
Domoticz允许创建虚拟服务器可以在界面中给定的时间后改变状态的开关:

专业版

现成的计时器!
我可以在墙壁之间快速交互开关和灯

缺点

尽管Domoticz处理MQTT,但是会有很多LUA脚本和“块状”来互连设备
时间可能并不容易可配置...



atatq

at是一个Linux命令,用于及时计划一个动作,就像
一样简单
at [when] < [what]

优点

多计时器服务
易于使用和调用

缺点

仅给出唯一的ID ,除非解析计划的命令,否则我无法为作业命名(除非使用神奇的linux命令...)
,因此我需要对作业进行编码/实现使用数据库


Crontab
Crontab是用于计划重复任务的linux服务。就我而言,这将是一个简单的方法。
专业人士

可靠的时间触发器

缺点

无法管理秒数。 ..
还是被迫在某处维持工作匹配器


对我的问题:

您是否必须管理这种计时器?
/>我是否想念其他更可靠/可配置的解决方案?
您是否对上述解决方案有偏爱?


评论

只是使用sleep或usleep来触发关闭?它是at的基础功能,您可以使用作业来处理后台作业(如果我理解正确,主要是取消计划中的作业)

睡眠看起来更糟:您只经过一段时间,却什么也没有返回。您可以使用作业回答并给出示例吗?

#1 楼

根据请求,我将尝试举例说明如何解决该问题(使用bash外壳jobs处理):

按钮1:
打开X灯30秒钟并打开灯时Y持续5分钟:

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


由于工艺限制,必须在两条单独的线上,上面的回显显然应由实际命令代替。 >
按钮3:
然后您就可以通过休眠和杀死Q4312079q来使其停止并保持亮起:

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


kill链接命令的事实将阻止&&之后的命令运行,因为睡眠无法正确退出。
这不能处理不存在的作业,这可能会导致kill返回错误,没有什么不好的

按钮2:
使用与按钮3相同的方法,但使用stop命令并杀死作业(如果有的话)。

按钮4:

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


(对不起,我不知道您在这里想要什么,设置完整)


关于sleep的实现的详细信息:

jobs返回与jobspec jobs -p %?lamp_y匹配的作业的当前pid -p,这意味着%?lamp_y可能出现在命令行中的任何位置,请仔细选择在此处使用的内容(但我敢打赌,您对要控制的事物或事物组具有唯一的标识符)。

评论


我不是自愿测试您对按钮4的实现。

– Sean Houlihane
17年4月21日在9:13

一名班轮杀人工作是完美的!谢谢!顺便说一句,我尝试了按钮4的实现,现在我所有的灯都闪烁了,到处都是令人毛骨悚然的声音,非常适合万圣节派对!

–古法利特
17年4月24日在12:03

@Goufalite很高兴它有所帮助

–滕西拜
17-4-24在12:05



Protip:使用真正的taskid &&启动命令,以便您轻松跟踪工作!不幸的是,如果PHP或其他程序调用该命令,则此命令将不起作用,因为它将作为子shell启动。

–古法利特
18年2月16日在9:58

#2 楼

如果要为此使用在线服务,则应该能够使用https://www.stringify.com。它们支持序列和变量(和计时器)。我没有激怒他们的服务,但是看来您应该可以使用计时器来递减变量(确定剩余的按时),并且各种触发事件可以将变量强制为新值。 br />
它们支持IFTTT集成,因此几乎任何端点都可以通过某种方式链接。

#3 楼

我发现另一种相当昂贵的方法,但是可以使用外部流程(例如PHP的system):屏幕

首先,安装它:

sudo apt-get install screen


然后调用您的函数

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


列出您的任务

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


杀死它

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