我正在编写我自己的"智能家居";作为一个学习项目。我的代码运行得很好。我正在寻找帮助,以提高效率和代码和/或crontab + php代码的设置。
我正在用WIFI电能表监测洗衣机的能耗。目标是在洗衣机洗完后通知我,这样我就不会忘记清理了。
在我的Pi上我有一个crontab像这样:
*/20 7-22 * * * /usr/bin/php '/home/holger/html/plugs/washer.php'
php代码(为了更好的可读性,我简化了):
[…/当然,我调用了这个函数,但是这个函数完成了主要任务
function loop($maschine, $watt_init, $trashhold){
$max = 75;//max loops to avoid endless runs
$i = 1;//start counter
$tackt = 3;//tact time to check energy consumption
//$trashhold = 4;//ab x Watt kein standby
if ($watt_init < 1 ) {//Machine is switched off if energy consumption < 1 Watt
die;//quit
}
elseif ($watt_init < 2 ) {//Machine is switched off or in standby if energy consumption < 1 Watt
die;//quit
}
else {//Any thing else: Machine is running
while ($i < $max) {//loop as long as max loops are not reached
$watt_current = json_combine(IPplug5);//getting current energy consumption from WIFI energy meter via JSON
sleep(60*$tackt);//sleep and continue every 60s x tact time
$i++;//increase counter +1
//compare actual consumption with defined trashhold
if ($watt_current[0] >= $trashhold) {//continue while energy consumption bigger then trashhold
continue;//repeat loop
}
elseif ($watt_current[0] < $trashhold) {//stop if energy consumption lower then trashhold
break;//stop loop
}
}
echo "Program done. please clear. Runtime: " . $i*$tackt. "Min."
//[...] message me to my telegram bot
}
}
代码运行正常,我得到了我需要的输出。
我的问题是:有没有更好的方法来做到这一点?
目前我害怕超载我的Pi与太多的打开php会话,因此我只开始每20分钟的代码,也让while循环睡眠3分钟。但为了提高准确性,我喜欢更频繁地运行cronjob,也让while循环睡眠仅为30秒。我的要求是坚持我的PI和php代码,而不是使用任何可用的软件,如家庭助理。因为这与我的学习方法相矛盾。欢迎提出任何建议或见解。
理想情况下,这不是处理和测量功耗的最佳方法。如果您创建一个API来接受来自IP设备的事件,如开/关或阈值保持限制扩展,那将是最好的。您还可以创建日志并将其存储在数据库中。
虽然,对于你目前的问题,这里有一个替代的解决方案。
-
设置每秒钟运行一次的cron。
function get_powerConsumption($machine, $watt_init, $threshold) { if ($watt_init < 2) { exit(); } $time = date("Y-m-d H:i"); $filename = $machine . '_power_consumption.log'; // expecting some machine identification name here. otherwise ignore prefix $watt_current = json_combine(IPplug5); if ($watt_current[0] >= $threshold) { $data = array( $time, $watt_current[0] ); file_put_contents($filename, json_encode($data) . "n", FILE_APPEND); } elseif ($watt_current[0] < $threshold) { $data = array( $time, 'stopped' ); file_put_contents($filename, json_encode($data) . "n", FILE_APPEND); }
}
-
创建另一个cron来查找记录在文件中的停止事件。如果找到,则根据记录的数据(如时间和消耗)处理计算。您可以将此cron设置为根据需要运行,例如每秒钟或每分钟或每隔一段时间运行一次。
同时,处理代码删除旧日志,一旦发现停止的事件。