示例#1
0
def device(config):

    # Configuration parameters:
    #
    # timeout   seconds to wait for a response, default: 1
    # retries   number of retries, default: 3
    # unit      modbus address, default: 1
    #
    # For Modbus TCP:
    # host      ip or hostname
    # port      modbus tcp port
    #
    # For Modbus RTU:
    # device    serial device, e.g. /dev/ttyUSB0
    # stopbits  number of stop bits
    # parity    parity setting, N, E or O
    # baud      baud rate

    timeout = config.getint("timeout", fallback=1)
    retries = config.getint("retries", fallback=3)
    unit = config.getint("src_address", fallback=1)

    host = config.get("host", fallback=False)
    port = config.getint("port", fallback=False)
    device = config.get("device", fallback=False)

    if device:
        stopbits = config.getint("stopbits", fallback=1)
        parity = config.get("parity", fallback="N")
        baud = config.getint("baud", fallback=2400)

        if (parity
                and parity.upper() in ["N", "E", "O"]):
            parity = parity.upper()
        else:
            parity = False

        return sdm_modbus.SDM120(
            device=device,
            stopbits=stopbits,
            parity=parity,
            baud=baud,
            timeout=timeout,
            retries=retries,
            unit=unit
        )
    else:
        return sdm_modbus.SDM120(
            host=host,
            port=port,
            timeout=timeout,
            retries=retries,
            unit=unit
        )
示例#2
0
    def __init__(self, name, device="/dev/modbus", baud=2400):
        """Initialize Interfacer

        """
        # Initialization
        super(EmonHubSDM120Interfacer, self).__init__(name)

        # This line will stop the default values printing to logfile at start-up
        # self._settings.update(self._defaults)

        # Interfacer specific settings
        self._SDM120_settings = {'read_interval': 10.0, 'nodename': 'sdm120'}

        self.next_interval = True

        # Only load module if it is installed
        try:
            import sdm_modbus
            self._log.info("Connecting to SDM120 device=" + str(device) +
                           " baud=" + str(baud))
            self._sdm = sdm_modbus.SDM120(device="/dev/modbus", baud=2400)
            self._sdm_registers = sdm_modbus.registerType.INPUT
        except ModuleNotFoundError as err:
            self._log.error(err)
            self._sdm = False
示例#3
0
def device(
        host=False, port=False,
        device=False, stopbits=False, parity=False, baud=False,
        timeout=False, retries=False, unit=False,
        extended=False
    ):

    if device:
        return sdm_modbus.SDM120(
            device=device,
            stopbits=stopbits,
            parity=parity,
            baud=baud,
            timeout=timeout,
            unit=unit
        )
    else:
        return sdm_modbus.SDM120(
            host=host,
            port=port,
            timeout=timeout,
            unit=unit
        )
示例#4
0
if __name__ == "__main__":
    argparser = argparse.ArgumentParser()
    argparser.add_argument("device", type=str, help="Modbus device")
    argparser.add_argument("--stopbits", type=int, default=False, help="Stop bits")
    argparser.add_argument("--parity", type=str, default=False, choices=["N", "E", "O"], help="Parity")
    argparser.add_argument("--baud", type=int, default=False, help="Baud rate")
    argparser.add_argument("--timeout", type=int, default=1, help="Connection timeout")
    argparser.add_argument("--unit", type=int, default=1, help="Modbus unit")
    argparser.add_argument("--json", action="store_true", default=False, help="Output as JSON")
    args = argparser.parse_args()

    meter = sdm_modbus.SDM120(
        device=args.device,
        stopbits=args.stopbits,
        parity=args.parity,
        baud=args.baud,
        timeout=args.timeout,
        unit=args.unit
    )

    if args.json:
        print(json.dumps(meter.read_all(), indent=4))
    else:
        print(f"{meter}:")
        print("\nInput Registers:")

        for k, v in meter.read_all(sdm_modbus.registerType.INPUT).items():
            address, length, rtype, dtype, vtype, label, fmt, batch = meter.registers[k]

            if type(fmt) is list or type(fmt) is dict:
                print(f"\t{label}: {fmt[str(v)]}")
示例#5
0
    argparser.add_argument("--timeout",
                           type=int,
                           default=1,
                           help="Connection timeout")
    argparser.add_argument("--unit",
                           type=int,
                           default=1,
                           help="Modbus device address")
    argparser.add_argument("--json",
                           action="store_true",
                           default=False,
                           help="Output as JSON")
    args = argparser.parse_args()

    meter = sdm_modbus.SDM120(host=args.host,
                              port=args.port,
                              timeout=args.timeout,
                              unit=args.unit)

    if args.json:
        print(json.dumps(meter.read_all(), indent=4))
    else:
        print(f"{meter}:")
        print("\nInput Registers:")

        for k, v in meter.read_all(sdm_modbus.registerType.INPUT).items():
            address, length, rtype, dtype, vtype, label, fmt, batch = meter.registers[
                k]

            if type(fmt) is list or type(fmt) is dict:
                print(f"\t{label}: {fmt[str(v)]}")
            elif vtype is float: