diff --git a/tests/find_address.py b/tests/find_address.py deleted file mode 100755 index c201ebf..0000000 --- a/tests/find_address.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python3 -from time import sleep -from sys import exit -import minimalmodbus -import serial - - -print('---- Looking for device ----') -slave_address_list = range(200,256) -baud_list = [19200,115200] -CO2_addr = 9 -total_devices = 0 -for slave_address in slave_address_list: - for baud in baud_list: - print(f'Address {slave_address} baud {baud}:\t\t', end='') - try: - # modbus init - instrument = minimalmodbus.Instrument('/dev/rs485', slave_address, close_port_after_each_call=True) # port name, slave address (in decimal) - instrument.serial.baudrate = baud - instrument.serial.bytesize = 8 - instrument.serial.parity = serial.PARITY_EVEN - instrument.serial.stopbits = 1 - instrument.serial.timeout = 0.05 # seconds - instrument.mode = minimalmodbus.MODE_RTU # rtu or ascii mode - instrument.clear_buffers_before_each_transaction = True - ## - CO2 = instrument.read_register(CO2_addr, 1, functioncode=4) * 10 - print('DEVICE RESPONDED') - total_devices += 1 - except minimalmodbus.NoResponseError: - print(f'no response') - sleep(0.1) -print(f'Found {total_devices} devices (tried {len(slave_address_list)} addresses)') -print('---- DONE ----') -exit(0) diff --git a/tests/find_device.py b/tests/find_device.py new file mode 100755 index 0000000..dea07f9 --- /dev/null +++ b/tests/find_device.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 +from time import sleep +from sys import exit, argv +import minimalmodbus +import serial +from sensor import Sensor + +def print_usage(): + print( +f''' +USAGE: +\t{argv[0]} [ -a [{{FIRST_ADDR-LAST_ADDR | ADDR}} ...] ] [ -b [BAUD ...]] +EXAMPLES: +Complete search (slow!): +\t{argv[0]} +Look for devices 123,10,56 at baudrates 19200,115200: +\t{argv[0]} -a 123 10 56 -b 19200 115200 +Look for devices 10-55 at baudrate 19200: +\t{argv[0]} -a 10-55 -b 19200 +Look for device 1-10 and 55 at baudrate 115200: +\t{argv[0]} -a 1-10 55 -b 115200 +Look for device 1-10 at all possible baudrates: +\t{argv[0]} -a 1-10 55 +''' + ) + +# Parse arguments. And no, I won't use argparse. +processing_address = 0 +processing_baud = 0 +addr = [] +baud = [] +for arg in argv[1:]: + if arg == '-a' or arg == '--address': + processing_address = 1 + processing_baud = 0 + elif arg == '-b' or arg == '--baudrate': + processing_address = 0 + processing_baud = 1 + elif processing_address: + if arg.count('-') == 1: + # range in form START_ADDR-STOP_ADDR + start_addr, stop_addr = arg.split('-') + for a in range(int(start_addr), int(stop_addr) + 1): + addr.append(a) + else: + addr.append(int(arg)) + elif processing_baud: + baud.append(int(arg)) + elif arg == '-h' or arg == '--help': + print_usage() + exit(0) + else: + print(f'Unknown argument {arg}') + print_usage() + exit(-1) +# if empty, use all possible values +if not baud: + baud = Sensor.baudrates +if not addr: + addr = [a for a in range(1,248)] + addr.reverse() # we usually use high addresses for test devices +# print +print('---- Searchspace ----') +print(f'Addresses: {addr}') +print(f'Baudrates: {baud}') +# search for device +print('---- Looking for device ----') +total_devices = 0 +tried_devices = 0 +CO2_addr = Sensor.input_register_offset['CO2_addr'] +for a in addr: + for b in baud: + print(f'Address {a : >3} baud {b : >6}: ', end='') + try: + # modbus init + instrument = minimalmodbus.Instrument('/dev/rs485', a, close_port_after_each_call=True) # port name, slave address (in decimal) + instrument.serial.baudrate = b + instrument.serial.bytesize = 8 + instrument.serial.parity = serial.PARITY_EVEN + instrument.serial.stopbits = 1 + instrument.serial.timeout = 0.05 # seconds + instrument.mode = minimalmodbus.MODE_RTU # rtu or ascii mode + instrument.clear_buffers_before_each_transaction = True + ## + CO2 = instrument.read_register(CO2_addr, 1, functioncode=4) * 10 + print('DEVICE RESPONDED') + total_devices += 1 + except minimalmodbus.NoResponseError: + print('no response') + tried_devices += 1 + sleep(0.1) +print(f'Found {total_devices} devices (tried {tried_devices})') +print('---- DONE ----') +exit(0) diff --git a/tests/sensor.py b/tests/sensor.py new file mode 100644 index 0000000..8060f04 --- /dev/null +++ b/tests/sensor.py @@ -0,0 +1,20 @@ +class Sensor(): + baudrate_config = [ 19200,4800,9600,14400,19200,28800,38400,57600,76800,115200 ] + baudrates = [ 4800,9600,14400,19200,28800,38400,57600,76800,115200 ] + input_register_offset = { \ + 'CO2_addr': 9, \ + 'T_SHT4x_addr': 10, \ + 'RH_SHT4x_addr': 11, \ + 'T_SCD4x_addr': 12, \ + 'RH_SCD4x_addr': 13, \ + 'T_SHT4x_signed_addr': 14, \ + 'T_SCD4x_signed_addr': 15 } + holding_register_offset = { \ + 'LED_on_register': 0, \ + 'LED_brightness_register': 1, \ + 'LED_smooth_register': 2, \ + 'CO2_alert_limit_1_register': 3, \ + 'CO2_alert_limit_2_register': 4, \ + 'SCD4x_temperature_offset_register': 5, \ + 'MODBUS_address_register': 6, \ + 'baudrate_register': 7 }