首页 > 解决方案 > IFTTT 的 AWS IOT 按钮切换

问题描述

我设置了一个 AWS IOT 按钮,并使用 IFTTT 和 SmartLife 来打开/关闭设备。目前我已将其设置为使用单击和双击来打开和关闭,因为 IFTTT 似乎没有切换应用程序(至少,不适用于 SmartLife。)

我怎样才能让它成为一个开关,所以我可以通过单击来交替打开和关闭?

寻找免费的解决方案。

标签: aws-lambdaifttt

解决方案


有一个使用 apilio 的解决方案,但它不是免费的解决方案:在 IFTTT 中的两个操作之间创建切换

对于免费解决方案,请使用 Lambda 的 DynamoDB 保存按钮状态,并在每次调用时反转状态。它向 IFTTT 发送“IotButton2”或“IotButton2Off”。

'''
Example Lambda IOT button IFTTT toggle

Test payload:
{
    "serialNumber": "GXXXXXXXXXXXXXXXXX",
    "batteryVoltage": "990mV",
    "clickType": "SINGLE" # or "DOUBLE" or "LONG"
}
'''

from __future__ import print_function

import boto3
import json
import logging
import urllib2

import boto3
from botocore.exceptions import ClientError

logger = logging.getLogger()
logger.setLevel(logging.INFO)

maker_key = 'xxxxxxxxxxxxxxxxx'  # change this to your Maker key

def get_button_state(db, name):
    table = db.Table('toggles')
    try:
        response = table.get_item(Key={'name': name})
    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        # response['item'] == {u'name': u'IotButton2', u'on': False}
        if 'Item' in response:
            return response['Item']['on']
    return False

def set_button_state(db, name, state):
    table = db.Table('toggles')
    try:
        response = table.put_item(Item={'name': name, 'on': state})
    except ClientError as e:
        print(e.response['Error']['Message'])
    
def lambda_handler(event, context):
    logger.info('Received event: ' + json.dumps(event))
    
    db = boto3.resource('dynamodb')

    maker_event = "IotButton2"
    # maker_event += ":" + event["clickType"]

    state = get_button_state(db, maker_event)
    logger.info(maker_event + " state = " + ("on" if state else "off"))

    response = set_button_state(db, maker_event, not state)

    if state:
        maker_event += "Off"

    logger.info('Maker event: ' + maker_event)
    url = 'https://maker.ifttt.com/trigger/%s/with/key/%s' % (maker_event, maker_key)
        f = urllib2.urlopen(url)
        response = f.read()
        f.close()
        logger.info('"' + maker_event + '" event has been sent to IFTTT Maker channel')
        return response

上面的版本响应任何类型的点击(单,双,长)。您可以通过取消注释此行来控制 3 个不同的开关:

maker_event += ":" + event["clickType"]

这将转化为这些 IFTTT 事件:

IotButton2:SINGLE
IotButton2:SINGLEOff
IotButton2:DOUBLE
IotButton2:DOUBLEOff
IotButton2:LONG
IotButton2:LONGOff

创建 DynamoDB 表。对于我的示例,表名称是“toggles”,其中一个键字段“name”和一个布尔字段“on”。该表必须存在,但如果条目不存在,它会在您第一次单击按钮或测试 Lambda 函数时创建。

您必须更新 Lambda 函数角色以包含您的 DynamoDb 权限。将以下行添加到策略中:

    {
        "Effect": "Allow",
        "Action": [
            "dynamodb:GetItem",
            "dynamodb:PutItem"
        ],
        "Resource": [
            "arn:aws:dynamodb:us-east-1:xxxxxxxx:table/toggles"
        ]
    }

(从 AWS 控制台 DynamoDB -> 表 -> 切换 -> 附加信息获取 ARN。)

您还可以通过检查序列号来编辑上述功能以处理多个按钮。


推荐阅读