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 )
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
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 )
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)]}")
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: