Added new search script find_device.py
This commit is contained in:
parent
e062ab640b
commit
5185544f12
@ -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)
|
94
tests/find_device.py
Executable file
94
tests/find_device.py
Executable file
@ -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)
|
20
tests/sensor.py
Normal file
20
tests/sensor.py
Normal file
@ -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 }
|
Loading…
Reference in New Issue
Block a user