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

 找回密码
 立即注册
查看: 817|回复: 3

[技术探讨] 如何在NodeRed中实现-预约时间不同组合的16进制转化为对应...

[复制链接]

15

主题

636

帖子

2181

积分

金牌会员

Rank: 6Rank: 6

积分
2181
金钱
1545
HASS币
0
发表于 2022-2-21 12:26:35 | 显示全部楼层 |阅读模式
请教各位大佬,以下需求如何在nodered中用function节点实现?

在通过抓包尝试将热水器服务器的信息展示在HA前端中,但是对于“预约时间”,服务器返回的是16进制码,想把它转化为可以识读的“时间段文字描述”,正常几个参数的话,完全可以手动用switch/case来赋值文字描述到变量,但是预约时间组合实在是太多了,想用笨办法穷尽,会累死,所以作为小白,想请教大佬指点function用javascript函数如何实现。

背景:预约时间背后的逻辑为:“0时”代表“0点-1点”这个时间段,以此类推,“23时”代表“23点-0点“这个时间段,每个”x时”都对应一个16进制代码,预约时间可以由用户随意组合,组合后的预约时间,也对应一个16进制代码。我尝试依次抓到了前16组按顺序排列的组合及代码,见下方:

预约时间
代表
Code
预约时间
代表
Code
0时
0~1点
01 00 00
0时 & 3时
0~1点 & 3~4点
09 00 00
1时
1~2点
02 00 00
1时 & 3时
1~2点 & 3~4点
0A 00 00
0时 & 1时
0~1点 & 1~2点
03 00 00
0时 & 1时 & 3时
0~1点 & 1~2点 & 3~4点
0B 00 00
2时
2~3点
04 00 00
2时 & 3时
2~3点 & 3~4点
0C 00 00
0时 & 2时
0~1点 & 2~3点
05 00 00
0时 & 2时 & 3时
0~1点 & 2~3点 & 3~4点
0D 00 00
1时 & 2时
1~2点 & 2~3点
06 00 00
1时 & 2时 & 3时
1~2点 & 2~3点 & 3~4点
0E 00 00
0时 & 1时 & 2时
0~1点 & 1~2点 & 2~3点
07 00 00
0时 & 1时 & 2时 & 3时
0~1点 & 1~2点 & 2~3点 & 3~4点
0F 00 00
3时
3~4点
08 00 00






比如我想实现,当我随意设置好开启热水循环的时间组合后,服务器返回某个code(假设服务器返回09 00 00),然后通过function函数转化为 “00:00-01:00, 03:00-04:00“, 不管以后如何更改,都可以按照这个方式转化为可识读的字符串。

我在function函数里是这样用switch/case来赋值的,但无法穷举,请教换成其他JS编程,如何实现呢?
var cycleReservationTimeSetting = msg.payload.data.cycleReservationTimeSetting; //循环预约时间

switch (cycleReservationTimeSetting){
    case "C0 00 00":
        cycleReservationTimeSetting = '06:00-08:00';
        break;
    }


感谢各位大佬,如果规律还不明显,请大佬指出,我再多抓点数据。。。

回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2022-2-21 13:26:30 | 显示全部楼层
本帖最后由 neroxps 于 2022-2-21 13:31 编辑

转成二进制你就懂了。
00000001 高低转换就是 0x01 0x00 0x00 0x00 代表 0时

00000010 高低转换就是 0x10 0x00 0x00 0x00 代表 1时

那么 0时 & 1时 就是 0x11 0x00 0x00 0x00 换成 10进制 就是 03 00 00

意思就是 8 bit 分别代表某个时间段,然后随意组合即可。

描述hexbin
0时000100000001
1时000200000010
2时000400000100
3时000800001000
4时001000010000
5时002000100000
6时004001000000
7时008010000000
6~7时00C011000000

以上表格二进制还需要高低转换 意思 1100 0000 转换后是 0xC0 0x00
Nero
回复

使用道具 举报

15

主题

636

帖子

2181

积分

金牌会员

Rank: 6Rank: 6

积分
2181
金钱
1545
HASS币
0
 楼主| 发表于 2022-2-21 14:57:32 | 显示全部楼层
neroxps 发表于 2022-2-21 13:26
转成二进制你就懂了。
00000001 高低转换就是 0x01 0x00 0x00 0x00 代表 0时

哈哈,感谢N大的指点。

这让我想起了之前黑苹果的时候拆分电池的数据。。。但是,非IT行业的小白,感觉尽管知道了原理,但是还是难以以编程的思维写出来。。。

太难了。。。
回复

使用道具 举报

40

主题

3057

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11135
金钱
8028
HASS币
182
发表于 2022-2-22 08:55:47 | 显示全部楼层
telanx 发表于 2022-2-21 14:57
哈哈,感谢N大的指点。

这让我想起了之前黑苹果的时候拆分电池的数据。。。但是,非IT行业的小白,感觉 ...

很简单嘛,你只要解析状态码的意义,就把得到的字符串转成二进制字符串,然后再取位置标记是不是1 就完了。是1 就是true 这个时间就配置上了。
Nero
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-5-20 21:57 , Processed in 0.050125 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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