BlackZork / mqmgateway

MQTT gateway for modbus networks
GNU Affero General Public License v3.0
42 stars 18 forks source link

Error when poll groups are defined for multiple modbus slaves #58

Closed git-developer closed 2 months ago

git-developer commented 2 months ago

The application (v2.6.0) is shutting down with a critical error when poll_groups are defined for a comma-separated list of slaves in documented syntax.

How to reproduce

Common configuration

modmqttd:
  converter_search_path:
    - /usr/lib/modmqttd
  converter_plugins:
    - stdconv.so

mqtt:
  client_id: mqmgateway
  refresh: 5s
  broker:
    host: broker
  objects:
    - topic: mqmgateway/dev/${network}/${slave_name}/energy-total-a
      network: rtutest
      slave: 30
      state: { register: 28, count: 2, converter: std.divide(100) }

modbus:
  networks:
    - name: rtutest
      device: /dev/ttyUSB0
      baud: 19200
      parity: E
      data_bit: 8
      stop_bit: 1

Working slave definition

      slaves:
        - address: 30
          name: first-meter
          poll_groups:
            - { register:  1, count: 20 }
            - { register: 21, count: 20 }
        - address: 31
          name: second-meter
          poll_groups:
            - { register:  1, count: 20 }
            - { register: 21, count: 20 }

Failing slave definition:

      slaves:
        - address: 30
          name: first-meter
        - address: 31
          name: second-meter
        - address: 30,31
          poll_groups:
            - { register:  1, count: 20 }
            - { register: 21, count: 20 }
$ modmqttd --loglevel 1
2024-Jul-13 07:21:25.234569: [CRITICAL] config error(line 38): missing name for slave id=30 needed for placeholder in topic mqmgateway/dev/rtutest/${slave_name}/energy-total-a
git-developer commented 2 months ago

The order of YAML list entries seems to be relevant (see modmqtt.cpp). Workaround:

      slaves:
        - address: 30,31
          poll_groups:
            - { register:  1, count: 20 }
            - { register: 21, count: 20 }
        - address: 30
          name: first-meter
        - address: 31
          name: second-meter