开发者中心

最佳实践

命名语句

@Name 标注可以在模块中对语句命名。在一个模块中,名称必须是唯一的。 这将对 实时通知的通道产生直接影响。 它也将有助于在管理用户界面中调试模块,因为通道名称(因而语句名称)在列表中打印出来。 如果不命名语句,它会自动被命名为"statement_{number of statement}"。

使用设备上下文

如果你需要一个设备上下文,通常不必把每一个语句都放在上下文中。 例如测量值的聚集,只需要在确实有实际的聚合时需要上下文。尝试在第一次开发模块完全不用上下文,并在必要的地方添加。

拆分模块

如果模块很大把它分割成多个模块更好。 如果生命模式或函数等,它们将在你的租户的所有模块中可用。 一个很好的方法可以是:

  • 模块 1: 过滤传入的数据并从数据库中加载额外的数据
  • 模块 2: 计算
  • 模块 3: 在数据库中创建数据

请记住,这将产生模块内的依赖关系(例如,模块2需要一个在模块1中定义的模式)。你必须避免循环依赖关系。

数值格式

默认情况下,如果和测量值交互将使用BigDecimal(例如,如果你使用getNumber())。 如果结果是一个循环小数,当计算BigDecimal会有一个错误。这将导致从内置函数,如avg()返回null。 有两种方法来防止这个问题:

  1. 如果你使用的是内置函数,最简单的方法是转换BigDecimal到双精度数

    avg(cast(getNumber(e, "c8y_TemperatureMeasurement.T.value"), double))

  2. 如果是自己计算(例如在表达示)确保舍入,以保持BigDecimal getNumber(e,"c8y_TemperatureMeasurement.T.value").divide(new BigDecimal(3) , 5,RoundingMode.HALF_UP)