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

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

[复制链接]

14

主题

256

回帖

1817

积分

金牌会员

积分
1817
金钱
1547
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




回复

使用道具 举报

hhh. 手机认证

9

主题

298

回帖

2794

积分

论坛UI达人

积分
2794
金钱
2487
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

主题

256

回帖

1817

积分

金牌会员

积分
1817
金钱
1547
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,但一直是出错的,谢谢了
回复

使用道具 举报

hhh. 手机认证

9

主题

298

回帖

2794

积分

论坛UI达人

积分
2794
金钱
2487
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

主题

256

回帖

1817

积分

金牌会员

积分
1817
金钱
1547
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

主题

256

回帖

1817

积分

金牌会员

积分
1817
金钱
1547
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]];
      });
回复

使用道具 举报

hhh. 手机认证

9

主题

298

回帖

2794

积分

论坛UI达人

积分
2794
金钱
2487
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

主题

256

回帖

1817

积分

金牌会员

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

主 ...

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

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-5-14 12:55 , Processed in 0.067425 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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