crontab调用php函数的频率-寻找替代选项



我正在编写我自己的"智能家居";作为一个学习项目。我的代码运行得很好。我正在寻找帮助,以提高效率和代码和/或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设备的事件,如开/关或阈值保持限制扩展,那将是最好的。您还可以创建日志并将其存储在数据库中。

虽然,对于你目前的问题,这里有一个替代的解决方案。

  1. 设置每秒钟运行一次的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);
    }
    

    }

  2. 创建另一个cron来查找记录在文件中的停止事件。如果找到,则根据记录的数据(如时间和消耗)处理计算。您可以将此cron设置为根据需要运行,例如每秒钟或每分钟或每隔一段时间运行一次。

同时,处理代码删除旧日志,一旦发现停止的事件。

相关内容

  • 没有找到相关文章

最新更新