You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Alexa调用DynamoDB中的时间戳并读取机器温度数据?

你的需求完全可行!

一、实现路径拆解

这个场景是典型的Alexa自定义技能对接后端数据库的应用,落地起来并不复杂,核心步骤大概是这样:

  • 搭建Alexa自定义技能:创建对应的意图(比如QueryTemperatureIntent),配置语音交互模型,让Alexa能理解用户的查询指令——比如“查询XX机器昨天的温度”或者“查看机器001下午两点的温度”。
  • 后端服务对接:用AWS Lambda作为中间层(也可以用你自己的后端服务),Lambda需要配置DynamoDB的读权限。当Alexa收到用户请求后,会把解析后的参数(比如机器ID、查询时间范围)传给Lambda。
  • DynamoDB数据查询:Lambda通过AWS SDK调用DynamoDB的查询接口,根据用户指定的时间条件(或默认条件)获取对应的温度数据,再把数据整理成自然语言文本返回给Alexa,由Alexa朗读出来。

这里给你贴一段Lambda中查询DynamoDB的示例代码(Node.js),方便你参考:

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
  // 从Alexa请求中解析出机器ID和目标时间(已转换为ISO 8601格式)
  const machineId = event.request.intent.slots.machineId.value;
  const targetTime = event.request.intent.slots.targetTime.value;
  
  const params = {
    TableName: 'MachineTemperature',
    KeyConditionExpression: '#mid = :mid AND #ts = :targetTs',
    ExpressionAttributeNames: {
      '#mid': 'machineId',
      '#ts': 'timestamp'
    },
    ExpressionAttributeValues: {
      ':mid': machineId,
      ':targetTs': targetTime
    }
  };
  
  const result = await docClient.query(params).promise();
  if (result.Items.length > 0) {
    const temp = result.Items[0].temperature;
    // 整理成语音友好的文本返回
    return {
      version: '1.0',
      response: {
        outputSpeech: {
          type: 'PlainText',
          text: `机器${machineId}在${targetTime}的温度是${temp}摄氏度`
        }
      }
    };
  } else {
    return {
      version: '1.0',
      response: {
        outputSpeech: {
          type: 'PlainText',
          text: `没有找到机器${machineId}在指定时间的温度记录`
        }
      }
    };
  }
};

二、关于日期时间的存储建议

是否需要用ISO 8601格式?

非常推荐用ISO 8601格式存储时间戳,原因很直接:

  • DynamoDB没有原生的日期时间类型,用ISO 8601字符串(比如2024-05-20T15:30:00Z)存储是行业通用做法,既便于人类阅读,也能被大多数编程语言的日期库直接解析。
  • ISO 8601格式的字符串是按字典序排序的,和时间顺序完全一致,这样你在DynamoDB里做时间范围查询(比如查某一天、某一小时的所有数据)会非常高效,尤其是把时间戳设为排序键的时候。

是否需要分离日期和时间?

不需要刻意分离,但可以根据查询场景优化:

  • 如果你的主要查询是按完整时间戳(比如精确到分钟的某个点)或者时间范围(比如某段时间内的温度),直接存ISO 8601格式的完整时间戳就足够了,解析的时候可以轻松提取出日期或时间部分。
  • 如果你的查询经常需要按“日期”维度过滤(比如用户常问“今天的温度”“昨天的最高温度”),可以额外增加一个date字段(格式如2024-05-20),并给这个字段创建全局二级索引(GSI),这样按日期查询会更高效,避免全表扫描。

参考表结构示例

你的DynamoDB表可以设计成这样,兼顾查询效率和扩展性:

字段名类型说明
machineIdString分区键,标识不同的机器
timestampString排序键,ISO 8601格式时间
temperatureNumber机器温度值
dateString可选,仅日期部分,用于GSI查询

内容的提问来源于stack exchange,提问作者zuba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:16