0

如果我的房子温度超过 30 摄氏度,我会设置一个 Python 函数给我发短信。该脚本还驱动和循环显示各种天气信息的 LCD 显示器:房屋温度、湿度、室外条件和有轨电车的时间。

因为脚本是基于循环的,所以只要温度高于 30 摄氏度,我每分钟左右都会收到一条短信。理想情况下,我想找到一种优雅的方式让函数进入睡眠状态,同时仍然调用它进行检查温度。

下面是我用来触发 IFTTT 的代码示例:

def send_event(api_key, event, value1=None, value2=None, value3=None):
"""Send an event to the IFTTT maker channel"""
url = "https://maker.ifttt.com/trigger/{e}/with/key/{k}/".format(e=event,
                                                                 k=api_key)
payload = {'value1': value1, 'value2': value2, 'value3': value3}
return requests.post(url, data=payload)

任何和所有的帮助表示赞赏。

谢谢!

4

2 回答 2

0

与其试图阻止循环继续,不如记录最后一次警报的发送时间,并且仅在自上一次警报以来经过足够的时间后才重新发送。

每当发送温度警报时,将其记录datetime到变量中。每次调用该函数时,让它将电流datetime与变量进行比较,以查看差异是否大于某个阈值。如果是,请重新发送警报并将最后一个警报替换为当前的datetime.

from datetime import datetime

alert_interval = 1800 # 30 minutes in seconds
last_alert = datetime(1, 1, 1) # set the initial time to very long ago

def send_event():
    time_diff = datetime.now() - last_alert # get a timedelta
    if time_diff.total_seconds() >= alert_interval:
        last_alert = datetime.now()
        # call the API to send another alert
于 2016-07-25T00:06:17.810 回答
0

如果我理解正确,问题是您收到的文本太多。在这种情况下,存储有关先前事件的一些状态并使用它来决定是否发送文本。

例如,一个简单的布尔 (True/False) 变量可以用作一个简单的标志。您仍然可以使用循环,但仅在第一次超过 30 度时发送事件,并在低于 30 度时重置:

temp_is_high = False

while True:
    data = weather.get_data()

    if data['temp'] > 30:
        # only send if we are going from "cool" to "hot"
        # not if we were already in "hot" mode
        if not temp_is_high:
            # we are not in "hot" mode: remember for next time
            temp_is_high = True
            send_event(...)
   else: 
       # reset the condition flag
       temp_is_high = False

这个主题有变化。例如,您可能想要添加滞后,以便如果您的恒温器设置为 30 度,并且房屋温度在该温度附近徘徊,则 [29, 30, 29, 30, 29, 30, ....] 的测量值不会每次都发短信。为此,仅在温度超过 30 度低于(例如)26 度时重置“热模式”标志。或者 1 小时过去了,或者你自己的任意数量的要求。

于 2016-07-25T00:10:11.630 回答