服务名称

文档链接

背景说明

有些用户使用Fox-Edge从南向设备侧获得采样数据后,在自己的诸多场景中不适合直接使用设备的这些采样数据,而是需要对这些采样数据根据自己的算法进行再加工, 才能进行使用。

设备侧的传感器稳定性不高,设备提供的数值是设备自己简单测量的数值,有时候会偶尔出现一些跳变的异常数据,需要进行方差类算法进行剔除。

设备侧的传感器稳定性不高,用户想要通过平均值算法,对这些数据进行平均值,获得一个比较稳定的数据

设备侧的传感器种类比较简单,用户想要通过A数据和B数据,按一定计算方式,拟合出C数据。

用户在实际项目中,会遇到对设备的采样数据,进行二次处理后,才能进行实际使用的场景,此时他们会提出对采样数据进行再加工的场景需求。

功能描述

数值计算服务,是Fox-Edge中的业务级服务,它作用是负责将获得的南向设备数据,在保存到redis之后,通过编写 JavaScript 任务,对设备的采样数据进行二次加工, 从而获得精加工数据的服务。

它会通过不断感知采样数据保存在redis中 DeviceValueEntity 的变化,不断将变化的数据追加到reids的缓存队列 DeviceValueExCacheEntity 中, 然后通过 配置任务 中的 JavaScript 脚本,对缓存数据进行不断的计算,并将计算结果保存到 DeviceValueExEntity

相关接口

Fox-Edge的数据,都在Redis缓存之中按Topic进行分类保存,用户有必要了解相关的Topic。

为了更快速的感知redis数据变化,Fox-Edge的缓存格式是按时间戳机制进行保存的,每个数据包括总时间戳,对象级时间戳,对象数据三个级别。

fox.edge.entity.xxx.sync------------总时间戳,从它这边可以知道全局有没有数据变化
fox.edge.entity.xxx.agile-----------对象级时间戳,从它这边可以进一步知道细粒度的数据变化
fox.edge.entity.xxx.data------------对象数据,从它这边可以读取具体的数据

设备采样数据topic,Fox-Edge从南向设备采集数据后,会通过持久化服务把设备的采样数据,写入该topic之中

数值计算任务topic,用户通过Fox-Edge的数值计算任务管理界面,编写JavaScript脚本任务后,会同步写入记录到redis的这个topic之中。 数值计算服务在感知到这个topic的内容变化后,会装载对应的JavaScript脚本任务。

数值计算任务topic,会根据用户编写的计算任务,计算需要缓存哪些数据到redis的topic,然后将后续感知到的DeviceValueEntity数据变化, 追加复制到DeviceValueExCacheEntity之中,形成一个数值队列。

数值计算任务,在不断感知到DeviceValueEntity的变化后,会从DeviceValueExCacheEntity取出历史数据,形成一组最新的数据队列, 然后启动JavaScript脚本对数据队列,进行数值计算处理,并获得数据处理结果,然后写入DeviceValueExEntity之中。

最后,用户可以从DeviceValueExEntity之中,获得二次加工数据,作为自己下游业务的数据源。

配置说明

用户可以通过配置持久化任务的方式,确定自己需要使用哪些采样数据作为 输入参数 ,将每个采样数据的先后多份数据样本,按队列的方式缓存到redis之中。

并调用编写的JavaScript脚本,对这些缓存数据进行计算处理,然后将计算结果作为 输出参数 写入redis。

范例如下

数据任务会根据任务指定的范围,从原始的采样数据,提取数据保存到redis缓存队列总

[
     "系统输出功率",
     "逆变器06输出功率",
     "逆变器01输出功率",
     "逆变器03输出功率"
]

数据任务会根据用户编写的脚本,对缓存队列数据,进行JavaScript脚本的计算处理

/**
 * 脚本函数
 * 全局参数:
 *     values:缓存中的数值对象列表
 *            范例:[
 *                    {"value":26.4,"time":1715952708573},
 *					  {"value":26.4,"time":1715952708573}
 *					]
 *     params:设备的配置参数
 * 返回值:
 *     map结构的对象
 *            范例:{
 *                    "系统输出功率1(任务)":26.4,
 *                    "系统输出功率2(任务)":26.5
*					}
 */
function main() {
    var valueObjectList1 = values["系统输出功率"];
    var valueObjectList2 = values["逆变器06输出功率"];
    var valueObjectList3 = values["逆变器01输出功率"];
    var valueObjectList4 = values["逆变器03输出功率"];

    // 获取数组末尾元素'
    var valueObject1 = valueObjectList1[valueObjectList1.length - 1];
    var valueObject2 = valueObjectList2[valueObjectList2.length - 1];
    var valueObject3 = valueObjectList3[valueObjectList3.length - 1];
    var valueObject4 = valueObjectList4[valueObjectList4.length - 1];

    var value1 = valueObject1.value;
    var value2 = valueObject2.value;
    var value3 = valueObject3.value;
    var value4 = valueObject4.value;

    var time = valueObject1.time;

    var result = {
        "系统输出功率(+1)": value1 + 1,
        "逆变器06输出功率(x2)": value2*2,
        "逆变器01输出功率(+100)": value3 + 100,
        "逆变器03输出功率(/2)": value4/2,
    }

    return result;
}


数据任务在javaScript计算完成后,会将内容保存到redis之中,供其他服务消费

{
        "系统输出功率(+1)": value1 + 1,
        "逆变器06输出功率(x2)": value2*2,
        "逆变器01输出功率(+100)": value3 + 100,
        "逆变器03输出功率(/2)": value4/2,
}

用户开发的私有服务,可以通过redis的DeviceValueEntity主题,获得自己需要的数据。

Fox-Edge提供了相关的JAVA组件从redis中进行数据的方便读取,相关的JAR包为fox-edge-server-common-entity-service

        <dependency>
            <groupId>cn.fox-tech</groupId>
            <artifactId>fox-edge-server-common-entity-service</artifactId>
            <version>1.1.3</version>
        </dependency>