『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 155|回复: 7

[技术探讨] 怎么创建传感器以存放将用于ApexCharts的数据

[复制链接]

14

主题

207

帖子

1301

积分

金牌会员

Rank: 6Rank: 6

积分
1301
金钱
1094
HASS币
0
发表于 2024-5-6 20:24:37 | 显示全部楼层 |阅读模式
各位大佬大家好,我想使用从网络读取的数据绘制一个ApexCharts图表。我查看官方的示例,它的data_generator是从传感器中的属性读取数据的
那我从网上获取的数据,可以处理为数组格式,怎么写入到一个传感器的属性值呢,以便于ApexCharts进一步处理?谢谢
即是我如果有例子中的Time和PeakHeights数据,怎么创建一个这样格式的传感器,在Node Red中如何处理,谢谢



官方的示例如下:
My sensor (sensor.test) has this state as its last state:
FirstPeak: High
PeakTimes:
  - '2021-01-27 03:43:00'
  - '2021-01-27 10:24:00'
  - '2021-01-27 16:02:00'
  - '2021-01-27 22:38:00'
  - '2021-01-28 04:21:00'
  - '2021-01-28 11:06:00'
  - '2021-01-28 16:40:00'
  - '2021-01-28 23:18:00'
  - '2021-01-29 05:00:00'
  - '2021-01-29 11:45:00'
  - '2021-01-29 17:19:00'
  - '2021-01-29 23:58:00'
  - '2021-01-30 05:39:00'
  - '2021-01-30 12:25:00'
  - '2021-01-30 17:59:00'
PeakHeights:
  - 4.99
  - 1.41
  - 4.96
  - 1.33
  - 5.22
  - 1.19
  - 5.15
  - 1.14
  - 5.42
  - 1.01
  - 5.3
  - 0.99
  - 5.57
  - 0.87
  - 5.39
unit_of_measurement: m
friendly_name: Tides




回复

使用道具 举报

8

主题

172

帖子

1176

积分

金牌会员

Rank: 6Rank: 6

积分
1176
金钱
1004
HASS币
0
发表于 2024-5-6 20:33:13 | 显示全部楼层
chatGPT 多方便,试试AI 啊

// 初始化空数组以存储分离后的数据
var peakTimes = [];
var peakHeights = [];

// 循环遍历峰值数据
for (var i = 0; i < msg.payload.PeakTimes.length; i++) {
    // 将每个峰值时间添加到 peakTimes 数组中
    peakTimes.push(msg.payload.PeakTimes[i]);

    // 将相应的峰值高度添加到 peakHeights 数组中
    peakHeights.push(msg.payload.PeakHeights[i]);
}

// 创建一个新的消息对象以输出分离后的数据
var newMsg = {
    payload: {
        PeakTimes: peakTimes,
        PeakHeights: peakHeights
    },
    topic: "分离后的峰值数据"
};

// 输出分离后的数据
return newMsg;
回复

使用道具 举报

14

主题

207

帖子

1301

积分

金牌会员

Rank: 6Rank: 6

积分
1301
金钱
1094
HASS币
0
 楼主| 发表于 2024-5-6 20:49:04 | 显示全部楼层
hhh. 发表于 2024-5-6 20:33
chatGPT 多方便,试试AI 啊

谢谢你的回复,我的主要疑惑点是我已经有一个数据了,比如month: 1,2,3,4,5  data: 10 ,20, 30 ,40 ,50
怎么创建一个示例中的传感器(因为官方绘制图表是读取这个传感器的数据,再处理到X和Y轴)
是创建一个input text吗?还是怎么生成一个sensor,并使用NR将把我已有的数据更新到这个实体中
我试过问GPT,但一直是出错的,谢谢了
回复

使用道具 举报

8

主题

172

帖子

1176

积分

金牌会员

Rank: 6Rank: 6

积分
1176
金钱
1004
HASS币
0
发表于 2024-5-6 20:57:40 | 显示全部楼层
TestUser123 发表于 2024-5-6 20:49
谢谢你的回复,我的主要疑惑点是我已经有一个数据了,比如month: 1,2,3,4,5  data: 10 ,20, 30 ,40 ,50
...

我的理解不知对不对,HA需要实时的数据才能绘制图标,那就按照时间线使用node-red给sensor数据,这个是不是要看“官方绘制图表”这个东西支持什么样的数据。
回复

使用道具 举报

14

主题

207

帖子

1301

积分

金牌会员

Rank: 6Rank: 6

积分
1301
金钱
1094
HASS币
0
 楼主| 发表于 2024-5-6 21:09:18 | 显示全部楼层
hhh. 发表于 2024-5-6 20:57
我的理解不知对不对,HA需要实时的数据才能绘制图标,那就按照时间线使用node-red给sensor数据,这个是不 ...

谢谢你的回复,ApexCharts图表支持直接读取传感器的历史数据,或通过data_generator的方式直接处理数据
但官方给出的data_generator示例,数据是存放于一个实体中的attributes。也就是说只要我想处理的数据(例如之前6个月的值)放到一个传感器的属性值中(多个数据),data_generator就能将其处理为图表中的XY。
这样可以使用任意数据,不用按时间线给传感器赋值,直接写到属性值中即可。
论坛上之前有个南方电网的图表也是这样画的(他有一个本月电量实体,实体的属性值中就是对应每天的日期和电量)
我现在就是不知道在已有数组的情况下,怎么往属性里写多个值。不是state.
谢谢了


下面是官方的实例。
data_generator Option
Before we start, to learn javascript, google is your friend or ask for help on the forum
回复

使用道具 举报

14

主题

207

帖子

1301

积分

金牌会员

Rank: 6Rank: 6

积分
1301
金钱
1094
HASS币
0
 楼主| 发表于 2024-5-6 21:11:06 | 显示全部楼层
本帖最后由 TestUser123 于 2024-5-6 21:12 编辑

type: custom:apexcharts-card
graph_span: 4d # I have 4 days worth of data in the future in the attributes
span:
  start: hour # I want to display from the start of the current hours 4 days into the future
series:
  - entity: sensor.test
    data_generator: | # This is what builds the data
      return entity.attributes.PeakTimes.map((peak, index) => {
        return [new Date(peak).getTime(), entity.attributes.PeakHeights[index]];
      });
回复

使用道具 举报

8

主题

172

帖子

1176

积分

金牌会员

Rank: 6Rank: 6

积分
1176
金钱
1004
HASS币
0
发表于 2024-5-6 21:34:58 | 显示全部楼层
TestUser123 发表于 2024-5-6 21:11
type: custom:apexcharts-card
graph_span: 4d # I have 4 days worth of data in the future in the attri ...

你可以看看我的关于本地万年历的帖子,里面的流程里就有关于把数据给属性的部分,这是个实际参考。

主要就是分离数据,然后转为对象输出,然后给sensor填写对应的对象名称即可。

这是参考
// 获取传感器状态数据
var sensorData = msg.payload;

// 提取各个部分的数据
var firstPeak = sensorData.FirstPeak;
var peakTimes = sensorData.PeakTimes;
var peakHeights = sensorData.PeakHeights;

// 将 PeakTimes 转换为对象数组
var peakTimesObj = peakTimes.map(function(time) {
    return { "Time": time };
});

// 将 PeakHeights 转换为对象数组
var peakHeightsObj = peakHeights.map(function(height) {
    return { "Height": height };
});

// 构建输出对象
var outputObj = {
    "FirstPeak": firstPeak,
    "PeakTimes": peakTimesObj,
    "PeakHeights": peakHeightsObj
};

// 返回输出对象
return outputObj;
回复

使用道具 举报

14

主题

207

帖子

1301

积分

金牌会员

Rank: 6Rank: 6

积分
1301
金钱
1094
HASS币
0
 楼主| 发表于 2024-5-6 21:59:21 | 显示全部楼层
hhh. 发表于 2024-5-6 21:34
你可以看看我的关于本地万年历的帖子,里面的流程里就有关于把数据给属性的部分,这是个实际参考。

主 ...

谢谢回复
你万年历中的Sensor节点我从来没用过
我之前都是用call service节点处理
我学习消化一下
谢谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-20 05:44 , Processed in 0.276105 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表