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

 找回密码
 立即注册
查看: 8275|回复: 5

[进阶教程] jinja2 十六进制转二进制

[复制链接]

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
发表于 2020-11-14 12:25:29 | 显示全部楼层 |阅读模式
本帖最后由 neroxps 于 2020-11-14 14:30 编辑

最近折腾某些小玩意,mqtt过来消息是16进制,格式是固定的两位十六进制。

想取发过来取固定位置的十六进制转成二进制,每位二进制都代表一个二进制传感器。

既然HA展示,那也不想经过其他系统,想在 HA 那边直接转换了。

但是找了一圈没找到咋将16进制转成2进制

上网搜索下16进制转二进制原理,用 jinja2 实现下转换

{% set value = 'CB' %}
{% set high = value[1] %}
{% set low = value[0] %}
{% set high_bin_0 = high | int(high,16)/2/2/2%2 %}
{% set high_bin_1 = high | int(high,16)/2/2%2 %}
{% set high_bin_2 = high | int(high,16)/2%2 %}
{% set high_bin_3 = high | int(high,16)%2 %}
{% set low_bin_0 = low | int(low,16)/2/2/2%2 %}
{% set low_bin_1 = low | int(low,16)/2/2%2 %}
{% set low_bin_2 = low | int(low,16)/2%2 %}
{% set low_bin_3 = low | int(low,16)%2 %}
{{ "%d%d%d%d%d%d%d%d" | format(low_bin_0,low_bin_1,low_bin_2,low_bin_3,high_bin_0,high_bin_1,high_bin_2,high_bin_3) }}

上方代码被吐槽效率低下

下方优化版本~

{% set value = 'CBAAA' %}
{% set result = namespace(bin=[]) %}
{% for word in value %}
{% set hex = word | int(word,16) %}
{% set bin_0 = "%d" | format(hex/2/2/2%2) %}
{% set bin_1 = "%d" | format(hex/2/2%2) %}
{% set bin_2 = "%d" | format(hex/2%2) %}
{% set bin_3 = "%d" | format(hex%2) %}
{% set result.bin = result.bin + [bin_0] %}
{% set result.bin = result.bin + [bin_1] %}
{% set result.bin = result.bin + [bin_2] %}
{% set result.bin = result.bin + [bin_3] %}
{% endfor %}
{{ result.bin }}
{{ result.bin[2] }}



Nero
回复

使用道具 举报

2

主题

711

帖子

5047

积分

论坛元老

Rank: 8Rank: 8

积分
5047
金钱
4336
HASS币
85
发表于 2020-11-14 20:30:26 | 显示全部楼层
厉害了~我都是用nodered来实现
回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
 楼主| 发表于 2020-11-14 21:23:34 | 显示全部楼层
nice2943 发表于 2020-11-14 20:30
厉害了~我都是用nodered来实现

我就是感觉还要用nr转一层不太好,才研究下jinja2 怎么搞,花了半天时间。折腾死了
Nero
回复

使用道具 举报

2

主题

711

帖子

5047

积分

论坛元老

Rank: 8Rank: 8

积分
5047
金钱
4336
HASS币
85
发表于 2020-11-14 23:40:51 | 显示全部楼层
可是用jinja2 不是还要转到template吗?
回复

使用道具 举报

40

主题

3056

帖子

1万

积分

超级版主

Nero

Rank: 8Rank: 8

积分
11149
金钱
8042
HASS币
182
 楼主| 发表于 2020-11-15 00:06:08 | 显示全部楼层
nice2943 发表于 2020-11-14 23:40
可是用jinja2 不是还要转到template吗?

template 就是用 jinja2 语法啊
Nero
回复

使用道具 举报

6

主题

267

帖子

2379

积分

论坛技术达人

积分
2379
金钱
2092
HASS币
90
发表于 2021-8-4 16:47:26 | 显示全部楼层
我也来分享一版:
{%- set val = '010203ff' %}
{%- set nsb = namespace(bytes=[]) %}
{%- for c in val %}
{%-   if loop.index is even %}
{%-     set byt = val[loop.index - 2:loop.index] | int(0,16) %}
{%-     set nsb.bytes = nsb.bytes + [byt] %}
{%-   endif %}
{%- endfor %}
{{ nsb.bytes }}



评分

参与人数 1金钱 +20 收起 理由
neroxps + 20 这是高手

查看全部评分

小米MIoT插件:miot-spec.com
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-27 10:45 , Processed in 0.119314 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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