繁体   English   中英

Modbus 家庭助理和 python 结构(小端、大端、uint16 的负值)

[英]Modbus home assistant and python struct (little endian, big endian, negative values from uint16)

我有一个关于 modbus 设置的问题。 我仔细阅读了文档,尝试搜索一些主题,但不幸的是我没有找到问题的答案。

我有一个热泵,可以通过 modbus 进行通信。 过去没有HA我在ESP8266上有自己的应用程序,读取数据,上传它们等等。现在我想把它移到HA。 我发现 modbus 协议是在 HA 中实现的,这很棒。

现在,在我的自定义应用程序中,我必须读取注册表并修改每个值的响应,因为设备具有 MSB 实现,让我举一个例子:

从设备文档中,我所知道的唯一事情(而且似乎已经足够了,因为我能够实施该应用程序)是:热泵在...... IP地址上进行通信,在......端口上。 它使用从站,从站 ID 是……所有值都以 MSB(最高有效字节)表示。 现在关于值,例如外部温度在地址 0 上,类型是只读的,比例是 100(对于配置文件中的 modbus,它应该是 0.01 - 现在让我们忽略它),单位是° C。

所以,我的配置看起来像:

# Modbus configuration
modbus:
  - name: ...
    type: tcp
    host: ...
    port: ...
    delay: 5
    timeout: 5
    sensors:
      - name: Heat pump outside temperature
        address: 0
        slave: 1
        input_type: holding
        device_class: temperature
        state_class: measurement
        data_type: uint16
        unique_id: "ac_heating_outside_temp"

这导致此实体的值为 65436,这显然是错误的。 此时的真实值为-1。 uint16 的最大值为 65535,65436-65535 = -99,乘以 0.01(或除以 100)为 -0.99,即(如果我们减去零)-1.00 度...这就是我需要的值。 好吧,在我的 C 应用程序中,我一直在自己进行重新计算(以字节为单位)。 不幸的是,我不知道如何在“我们的”modbus yaml 描述中做到这一点。

我一直在寻找文档中的 SWAP、DATA_TYPE 和 STRUCTURE: DOCUMENTATION(文档链接)不幸的是,没有任何东西对我有用。 我知道如果我想提供结构我必须设置自定义data_type,但是在结构中定义自定义类型和“> I”需要2个注册表才能读取,但是实体的地址是0,也就是1个注册表。 即使这样我也试过了,但我无法获得正确的价值。 将 data_type 设置为带有交换字节甚至交换字的 uint16 似乎不起作用。 我尝试(出于必要)玩 uint8、2 个注册表并一起交换,但没有组合会导致正确的结果。 Python 结构文档: https://docs.python.org/3.8/library/struct.html

有人可以帮我解决这个问题吗?

你可以考虑Modbus-to-MQTT桥接模式,使用一些专业的Modbus工具轮询设备数据并发布到MQTT,然后家庭助手可以通过MQTT集成轻松集成这些数据。

遵循上述解决方案至少有3 个优点

  • Modbus 工具(例如modpoll )为您提供更多选项(Big/Little Word/Byte Endian,各种数据类型)来处理来自不同供应商的一些非标准实现
  • MQTT 代理将 Modbus 工作负载与 HA 解耦,有利于模块化设计原则
  • MQTT 代理使调试/故障排除变得更加容易,您可以随时订阅特定主题,而无需 HA 停机。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM