Package: cheap-modbus-rtu
cheap_modbus_rtuLightweight control of cheap Modbus RTU components using PythonCurrently supported hardware"bestep" brand:NOTE:While the 2-CH and the 4-CH relay PCB seem to come without the 120-Ohms termination resistor, the 1-CH relay does have the resistor fitted, this is marked R14 on the 1-CH-PCB.
For multiple devices on the bus, this resistor must be removed.NOTE:The relay PCBs require an external, biased RS-485 termination:The on-board bias network is not sufficient when the bus is properly terminated with 120-Ohms on each end⚠️WARNING:Even though the 2-CH and the 4-CH module come with optocouplers fitted on the digital inputs, the clearance and creepage distances on the PCB are /not/ sufficient for basic or reinforced insulation of 115/230V mains voltage. Use an external optocoupler when connecting the inputs to mains voltage circuits!1-CH Digital IN + Relay module (non-isolated input)2-CH Digital IN + Relay module (input with low-voltage isolation)4-CH Digital IN + Relay module (input with low-voltage isolation)(untested) 8-CH Digital IN + Relay module(no image)"eletechsup" brand:PWM8A04 3-CH PWM OUT PCBR4DIF08 8-CH Digital IN moduleN4AIA04 4-CH 0..5V / 0..10V / 0..20mA analog input moduleN4DAC02 2-CH 0..5V / 0..10V analog output module# This requires Python >= 3.9 
# and recent version of setuptools and pip
user@linux:~/mysrc$ python -m pip install --upgrade pip

# Install from local git sources:
user@linux:~/mysrc$ git clone https://github.com/ul-gh/cheap_modbus_rtu.git
user@linux:~/mysrc$ cd cheap_modbus_rtu
user@linux:~/mysrc$ pip install .Documentation Link:API Documentation (Github Link)R4DIF08, 8-Channel digital input PCB: Read all eight inputsfromcheap_modbus_rtuimportR4DIF08# Slave ID for these modules is pre-set to 1input_module=R4DIF08(slave_id=1,serial_device_name="/dev/ttyUSB0")inputs=input_module.get_inputs()print(inputs)Relay IO PCB: Toggle one relay on-off in a 1-second cycleimporttime# Also works with the other multi-channel variantsfromcheap_modbus_rtuimportRelay2Ch# Slave ID for these modules is pre-set to 255modbus_relay=Relay2Ch(slave_id=255,serial_device_name="/dev/ttyUSB0")whileTrue:modbus_relay.set_output(1,True)time.sleep(0.5)modbus_relay.set_output(1,False)time.sleep(0.5)PWM8A04, 3-Channel PWM output PCB: Set output 1 to 20 kHz, 33 % duty cyclefromcheap_modbus_rtuimportPWM8A04# Slave ID for these PWM modules is pre-set to 1pwm=PWM8A04(slave_id=1,serial_device_name="/dev/ttyUSB0")pwm.set_output_frequency(1,20000)pwm.set_output_duty(1,33)Relay IO PCB: Read both inputs of the 2-Channel variant and write them directly to the relay outputswhileTrue:input_1=modbus_relay.get_input(1)input_2=modbus_relay.get_input(2)modbus_relay.set_output(1,input_1)modbus_relay.set_output(2,input_2)print(f"\rInput 1:{input_1}Input 2:{input_2}",end="")time.sleep(0.1)Input 1: False  Input 2: FalseRelay IO PCB: Set Slave ID from 255 to 1This must only be done once, not at every device start, otherwise flash wear might be an issue. Once a different Slave ID is configured, invoke the constructor of this library with the new ID as an argument.modbus_relay.get_broadcast_slave_id()>>>255modbus_relay.set_slave_id(1)modbus_relay.get_broadcast_slave_id()>>>1Nice documentation of the Modbus-RTU protocol (English):https://ipc2u.com Modbus Protocol Description and Examples(Same content in German) Beschreibung des Modbus-RTU Protokolls:https://ipc2u.de