Added new search script find_device.py

This commit is contained in:
mj 2021-11-24 16:14:16 +01:00
parent e062ab640b
commit 5185544f12
3 changed files with 114 additions and 35 deletions

View File

@ -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
View 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
View 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 }