exoedge-modbus 21.9.15
An ExoEdge source for interfacing with Modbus devices.
License: Apache 2.0
Requires Python: <4,>=2.7.9
Keywords: murano exosite iot iiot client gateway modbus tcp rtu

Description
############

.. image:: https://travis-ci.com/exosite/lib_exoedge_modbus_python.svg?token=tgjcyH1MG5sXqcVsD1kG&branch=master
    :target: https://travis-ci.com/exosite/lib_exoedge_modbus_python

This project is a Modbus source for Exosite's ``ExoSense`` which uses ``ExoEdge``.

Install
#########

From Source
""""""""""""

.. code-block::

    pip install -r requirements.txt
    python setup.py install

From PyPi
""""""""""""

The wheel for this hasn't been published yet.

.. code-block::

    pip install exoedge_modbus

ExoEdge Configuration
######################

In order to start using this Modbus source, start the ``edged`` daemon with your desired parameters. For more information on ``edged``, visit `ExoEdge <https://pypi.org/project/exoedge/>`_ on PyPi.

Example
""""""""

.. code-block::

    $ cat modbus-test1.ini
    [device]
    murano_host = mqtt://f5330e5s8cho0000.m2.exosite.io/
    murano_id = modbus-test1
    $ edged -i modbus-test1.ini go


ExoSense Configuration
########################

Below is an example ``config_io`` settings that illustrates how Modbus RTU data can be sent to ExoSense via ExoEdge.

.. code-block:: json

    {
      "channels": {
        "001": {
          "display_name": "Input Register 1",
          "description": "Input Register 1.",
          "channel_name": "001",
          "properties": {
            "data_unit": "NUMBER",
            "data_type": "TEMPERATURE",
            "min": null,
            "max": null,
            "precision": null,
            "device_diagnostic": false
          },
          "protocol_config": {
            "timeout": null,
            "report_on_change": false,
            "report_rate": 2000,
            "application": "Modbus_RTU",
            "app_specific_config": {
              "byte_endianness": "big",
              "register_range": "INPUT_REGISTER",
              "register_offset": "0002",
              "register_count": 1,
              "register_endianness": "big",
              "bitmask": "0xffffffff",
              "slave_id": 1,
              "evaluation_mode": "unsigned"
            },
            "sample_rate": 2000,
            "input_raw": {},
            "offset": 0,
            "interface": "/dev/ttyM0",
            "down_sample": "ACT"
          }
        }
      }
    }

Below is the ``config_applications`` configuration needed for the ``config_io`` above:

.. code-block:: json

    {
      "applications": {
        "Modbus_RTU": {
          "application_display_name": "Modbus RTU",
          "interfaces": [
              {
                "interface": "/dev/ttyM0",
                "baud_rate": 19200,
                "stop_bits": 1,
                "data_bits": 7,
                "parity": "none"
              }
          ]
        }
      }
    }

Below is a ``config_io`` example for ``Modbus_TCP``:

.. code-block:: json

    {
      "channels": {
        "1": {
          "display_name": "Input Register 1",
          "description": "One-second intervals of input register 1.",
          "properties": {
            "max": null,
            "precision": null,
            "data_type": "BINARY",
            "min": null
          },
          "protocol_config": {
            "application": "Modbus_TCP",
            "report_on_change": false,
            "report_rate": 1000,
            "sample_rate": 1000,
            "down_sample": "ACT",
            "app_specific_config": {
              "ip_address": "192.168.11.139",
              "port": 5020,
              "register_range": "INPUT_REGISTER",
              "register_offset": 0,
              "register_count": 1,
              "byte_endianness": "big",
              "register_endianness": "big",
              "evaluation_mode": "string-ascii",
              "bitmask": "0x0000"
            }
          }
        }
      }
    }


For linux user
########################

Users should not run exoedge with `sudo` for security reasons. If you get `permission denied: could not open port` when using Modbus_RTU, try:

.. code-block:: bash

    groups ${USER}

This will list all the groups you belong to. If you don't belong to the dialout group then add yourself to it, for example:

.. code-block:: bash

    sudo gpasswd --add ${USER} dialout

You then need to log out and log back in again for it to be effective.