diff --git a/firmware/rust1/rtumaster_pymodbus.py b/firmware/rust1/rtumaster_pymodbus.py
new file mode 100644
index 0000000000000000000000000000000000000000..15131a634688e60791ab289d7c7cd4210b9b787e
--- /dev/null
+++ b/firmware/rust1/rtumaster_pymodbus.py
@@ -0,0 +1,80 @@
+#!/usr/bin/env python
+# -*- coding: utf_8 -*-
+
+# based on https://github.com/pymodbus-dev/pymodbus/blob/dev/examples/client_sync.py
+
+import logging
+import time
+import sys
+import pymodbus
+from pymodbus.exceptions import ModbusException
+from pymodbus.client import ModbusSerialClient
+from  pymodbus.file_message import FileRecord
+
+PORT = '/dev/ttyUSB0'
+DEVICE_ADDR = 1
+
+logger = logging.getLogger()
+logger.setLevel(logging.INFO)
+log_handler = logging.StreamHandler(sys.stdout)
+#log_handler.setFormatter(logging.Formatter("%(asctime)s\t%(levelname)s\t%(module)s.%(funcName)s\t%(threadName)s\t%(message)s"))
+logger.addHandler(log_handler)
+
+def main():
+    try:
+        client = ModbusSerialClient(
+            port=PORT,
+            timeout=0.2,
+            # Common optional paramers:
+            #    framer=ModbusRtuFramer,
+            #    timeout=10,
+            #    retries=3,
+            #    retry_on_empty=False,
+            #    close_comm_on_error=False,
+            #    strict=True,
+            baudrate=19200,
+            parity="E",
+        )
+        client.connect()
+        logger.info("connected")
+
+        x = client.read_holding_registers(address=1, count=1, slave=DEVICE_ADDR)
+        logger.info("holding reg 1: %s: %r", x, x.registers)
+
+        x = client.read_file_record([
+            # documentation says tuple of: Reference type, File number, Record Number, Record Length
+            # but actually an object is expected:
+            FileRecord(file_number=0, record_number=0, record_length=7),
+            FileRecord(file_number=0, record_number=1, record_length=5),
+            FileRecord(file_number=0, record_number=2, record_length=3),
+        ], slave=DEVICE_ADDR)
+        logger.info("file 0: %s:", x)
+        for r in x.records:
+            logger.info("  %s: %r", r, r.record_data)
+
+        logger.info("Bootloader state partition:")
+        x = client.read_file_record([
+            FileRecord(file_number=1, record_number=int(0x6000/2), record_length=20),
+        ], slave=DEVICE_ADDR)
+        logger.info("file 1 @ bootloader state partition: %s:", x)
+        for r in x.records:
+            logger.info("  %s: %r", r, r.record_data)
+
+        toggle = True
+        while True:
+            logger.info(client.write_coil(address=0, value=toggle, slave=DEVICE_ADDR))
+            toggle = not toggle
+
+            x = client.read_discrete_inputs(address=0, count=5, slave=DEVICE_ADDR)
+            logger.info("read_discrete_inputs: %s: %r", x, x.bits)
+
+            x = client.read_input_registers(address=0, count=25, slave=DEVICE_ADDR)
+            logger.info("read_input_registers: %s: %r", x, x.registers)
+
+            time.sleep(0.1)
+
+    except ModbusException as exc:
+        logger.error("%s", exc)
+
+if __name__ == "__main__":
+    main()