如何在仍然调用它时将Python函数置于休眠状态(IFTTT)

时间:2016-07-24 23:59:31

标签: python function loops ifttt

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

因为脚本是基于循环的,所以只要温度高于30°C,我就会每隔一分钟收到一条短信。理想情况下,我希望找到一种优雅的方法让函数在睡眠时保持睡眠状态检查温度。

以下是我用来触发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)

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

谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

例如,一个简单的布尔(True / False)变量可以用作一个简单的标志。你仍然可以使用一个循环,但只在第一次超过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小时过去了,或者你自己要求的任何数量。