aws-lambda - IFTTT 的 AWS IOT 按钮切换
问题描述
我设置了一个 AWS IOT 按钮,并使用 IFTTT 和 SmartLife 来打开/关闭设备。目前我已将其设置为使用单击和双击来打开和关闭,因为 IFTTT 似乎没有切换应用程序(至少,不适用于 SmartLife。)
我怎样才能让它成为一个开关,所以我可以通过单击来交替打开和关闭?
寻找免费的解决方案。
解决方案
有一个使用 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。)
您还可以通过检查序列号来编辑上述功能以处理多个按钮。
推荐阅读
- android - 如何从 Flutter Android 应用程序连接到 MAC 蓝牙地址
- c# - 打破单一责任
- http - 如何在 Flutter 中通过 HTTP 发布请求发送参数?
- c# - 双击 ListView 的一行时选择了哪一列
- c# - 另一个 Unity3D 旋转问题:将旋转限制在一个范围内
- docker - 停止特定堆栈中的所有 docker 容器(保持配置文件夹完整)
- python - Ubuntu - Anaconda 2020.02 - 命名空间 Gtk 不可用
- php - 回显 HTML 标记周围的 PHP 语法错误
- sql-server - SQL Server - 使用游标避免 tempdb 存储问题
- angular - Angular + CSS 自定义属性语法