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

 找回密码
 立即注册
查看: 2556|回复: 14

[已解决] 关于MQTT publish的问题请教

[复制链接]

23

主题

227

帖子

2782

积分

金牌会员

Rank: 6Rank: 6

积分
2782
金钱
2555
HASS币
0
发表于 2022-6-23 12:22:47 | 显示全部楼层 |阅读模式
本帖最后由 water3033 于 2022-6-25 09:41 编辑

在设置自动化的时候,想通过MQTT publish发送某个实体的数值(发送前先转化为十六进制),比如说温度传感器的温度。请问怎么样能设置payload或者payload template啊?举个例子,某个实体的数值为30.1,怎么将这个数值通过设置payload或者payload template先获取该实体当前的实时数值,然后转化为十六进制发送出去。求指点。


感谢xcray大佬的耐心帮助
回复

使用道具 举报

47

主题

1657

帖子

6690

积分

论坛元老

Rank: 8Rank: 8

积分
6690
金钱
5023
HASS币
40
发表于 2022-6-23 15:18:46 | 显示全部楼层
先传入这个实体数值,然后写函数,网上有进制转换,我记得先定义一个变量,然后传入msg,然后计算公式,在取这个变量
折腾精神永存,感恩感谢论坛每一位愿意分享和帮助过我的大佬,论坛有你更精彩
回复

使用道具 举报

23

主题

227

帖子

2782

积分

金牌会员

Rank: 6Rank: 6

积分
2782
金钱
2555
HASS币
0
 楼主| 发表于 2022-6-23 16:49:47 | 显示全部楼层
jjcs 发表于 2022-6-23 15:18
先传入这个实体数值,然后写函数,网上有进制转换,我记得先定义一个变量,然后传入msg,然后计算公式,在 ...

这个是用nodered实现吗?用代码该怎么实现啊?能具体点写个例子吗?
回复

使用道具 举报

23

主题

227

帖子

2782

积分

金牌会员

Rank: 6Rank: 6

积分
2782
金钱
2555
HASS币
0
 楼主| 发表于 2022-6-24 15:46:24 | 显示全部楼层
自己顶一下
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

发表于 2022-6-24 16:39:31 | 显示全部楼层
本帖最后由 XCray 于 2022-6-24 16:48 编辑

HA的模板还是很强大的,只是没多少人用,jinja的文档又太晦涩。。。这种简单的转换用nr多少有些折腾
{{"%0X" | format(states("sensor.xxxx")|int)}}
回复

使用道具 举报

23

主题

227

帖子

2782

积分

金牌会员

Rank: 6Rank: 6

积分
2782
金钱
2555
HASS币
0
 楼主| 发表于 2022-6-24 18:05:37 | 显示全部楼层
XCray 发表于 2022-6-24 16:39
HA的模板还是很强大的,只是没多少人用,jinja的文档又太晦涩。。。这种简单的转换用nr多少有些折腾
...

感谢,想再问一下,如果是想把30.1中的30转为一个十六进制,比如1E ,   小数点后的 1转为一个十六进制,比如01,然后加上帧头 AA 55, 帧尾55 AA,形成字符串 AA 55 1E 01 55 AA,该怎么写啊?
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

发表于 2022-6-24 18:46:13 | 显示全部楼层
water3033 发表于 2022-6-24 18:05
感谢,想再问一下,如果是想把30.1中的30转为一个十六进制,比如1E ,   小数点后的 1转为一个十六进制, ...
{{"AA 55 %02X %02X 55 AA" | format(8,1)}}


给你个例子,剩下的你应该会了。
回复

使用道具 举报

23

主题

227

帖子

2782

积分

金牌会员

Rank: 6Rank: 6

积分
2782
金钱
2555
HASS币
0
 楼主| 发表于 2022-6-24 20:30:12 | 显示全部楼层
XCray 发表于 2022-6-24 18:46
给你个例子,剩下的你应该会了。

感谢,现在小数点后面的那个遇到问题了,比如说数值为29.56, 想把数字5取出来,不会太多编程,只能用笨办法,按照29.56*10|int-29.56|int*10的算法进行取值,结果测试发现29.56*10|int 计算出来的值为0,很不明白什么原因。先取整再乘以10是正常的。
(states("sensor.xiao_mi_wen_shi_du_chuan_gan_qi_temperature")*10)|int-(states("sensor.xiao_mi_wen_shi_du_chuan_gan_qi_temperature")|int)*10
回复

使用道具 举报

105

主题

2954

帖子

1万

积分

超级版主

智能家居&单板滑雪痴迷爱好者

Rank: 8Rank: 8

积分
12103
金钱
9084
HASS币
460

教程狂人突出贡献

发表于 2022-6-24 21:40:38 | 显示全部楼层
本帖最后由 XCray 于 2022-6-24 21:44 编辑
water3033 发表于 2022-6-24 20:30
感谢,现在小数点后面的那个遇到问题了,比如说数值为29.56, 想把数字5取出来,不会太多编程,只能用笨 ...

我有点好奇你发了mqtt之后对端是要干啥?实话说,你这个处理浮点数的思路比较弱(包括对端)。

一般来说,比较好的办法是先把原始数值乘以10(保留小数点后1位)或100(保留2位),然后当成整型进行传送、转换。

另外,你在8楼说的这个问题,解决方法也很简单,就是不要吝啬括号,其实就是个小学学到的运算优先级的问题(只是比算术课上稍微复杂了一点)。

你如果必须按照你说的方式处理数据,给你个思路,具体调试你自己弄吧:
((value|float - value|int) *10)|int

另外,还有四舍五入问题,在意的话就在int前面再加个round
回复

使用道具 举报

23

主题

227

帖子

2782

积分

金牌会员

Rank: 6Rank: 6

积分
2782
金钱
2555
HASS币
0
 楼主| 发表于 2022-6-24 21:50:48 | 显示全部楼层
XCray 发表于 2022-6-24 18:46
给你个例子,剩下的你应该会了。

实在整不明白了,尝试了半天还是没搞定。再次麻烦大神,直接请教结果吧。 结合上面说的数据,例如sensor.XXX的数值为29.56,希望29转化为十六进制1D,5转化为十六进制05。加上上面说的帧头帧尾,希望MQTT publish的内容为:
 {"cmd":"AA 55 1D 05 55 AA"} 
     cmd是不变的,类似于帧头,但因为带{}和“”两个符号,直接套用你前面的办法无法实现。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-25 21:14 , Processed in 0.344992 second(s), 33 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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