Examples#
Basic (sync) Client Example#
1""" A basic client demonstrating how to use pysolarmanv5."""
2from pysolarmanv5 import PySolarmanV5
3
4
5def main():
6 """Create new PySolarman instance, using IP address and S/N of data logger
7
8 Only IP address and S/N of data logger are mandatory parameters. If port,
9 mb_slave_id, and verbose are omitted, they will default to 8899, 1 and 0
10 respectively.
11 """
12 modbus = PySolarmanV5(
13 "192.168.1.24", 123456789, port=8899, mb_slave_id=1, verbose=False
14 )
15
16 """Query six input registers, results as a list"""
17 print(modbus.read_input_registers(register_addr=33022, quantity=6))
18
19 """Query six holding registers, results as list"""
20 print(modbus.read_holding_registers(register_addr=43000, quantity=6))
21
22 """Query single input register, result as an int"""
23 print(modbus.read_input_register_formatted(register_addr=33035, quantity=1))
24
25 """Query single input register, apply scaling, result as a float"""
26 print(
27 modbus.read_input_register_formatted(register_addr=33035, quantity=1, scale=0.1)
28 )
29
30 """Query two input registers, shift first register up by 16 bits, result as a signed int, """
31 print(
32 modbus.read_input_register_formatted(register_addr=33079, quantity=2, signed=1)
33 )
34
35 """Query single holding register, apply bitmask and bitshift left (extract bit1 from register)"""
36 print(
37 modbus.read_holding_register_formatted(
38 register_addr=43110, quantity=1, bitmask=0x2, bitshift=1
39 )
40 )
41
42 modbus.disconnect()
43
44if __name__ == "__main__":
45 main()
Async Client Example#
1""" A basic client demonstrating how to use the async version of pysolarmanv5."""
2from pysolarmanv5 import PySolarmanV5Async
3import asyncio
4
5
6async def main():
7 """Create new PySolarman instance, using IP address and S/N of data logger
8
9 Only IP address and S/N of data logger are mandatory parameters. If port,
10 mb_slave_id, and verbose are omitted, they will default to 8899, 1 and 0
11 respectively.
12 """
13 modbus = PySolarmanV5Async(
14 '192.168.1.121', 1234567890, port=8899, mb_slave_id=1, verbose=False, auto_reconnect=True
15 )
16 await modbus.connect()
17
18 """Query six input registers, results as a list"""
19 print(await modbus.read_input_registers(register_addr=33022, quantity=6))
20
21 """Query six holding registers, results as list"""
22 print(await modbus.read_holding_registers(register_addr=60, quantity=6))
23
24 """Query single input register, result as an int"""
25 print(await modbus.read_input_register_formatted(register_addr=33035, quantity=1))
26
27 """Query single input register, apply scaling, result as a float"""
28
29 print(
30 await modbus.read_input_register_formatted(register_addr=33035, quantity=1, scale=0.1)
31 )
32
33 """Query two input registers, shift first register up by 16 bits, result as a signed int, """
34 print(
35 await modbus.read_input_register_formatted(register_addr=33079, quantity=2, signed=1)
36 )
37
38
39 """Query single holding register, apply bitmask and bitshift left (extract bit1 from register)"""
40 print(
41 await modbus.read_holding_register_formatted(
42 register_addr=500, quantity=1, bitmask=0x2, bitshift=1
43 )
44 )
45
46 await modbus.disconnect()
47
48if __name__ == "__main__":
49 asyncio.run(main())
Register Scan Example#
1""" Scan Modbus registers to find valid registers"""
2from pysolarmanv5 import PySolarmanV5, V5FrameError
3import umodbus.exceptions
4
5
6def main():
7 modbus = PySolarmanV5(
8 "192.168.1.24", 123456789, port=8899, mb_slave_id=1, verbose=False
9 )
10
11 print("Scanning input registers")
12 for x in range(30000, 39999):
13 try:
14 val = modbus.read_input_registers(register_addr=x, quantity=1)[0]
15 print(f"Register: {x:05}\t\tValue: {val:05} ({val:#06x})")
16 except (V5FrameError, umodbus.exceptions.IllegalDataAddressError):
17 continue
18 print("Finished scanning input registers")
19
20 print("Scanning holding registers")
21 for x in range(40000, 49999):
22 try:
23 val = modbus.read_holding_registers(register_addr=x, quantity=1)[0]
24 print(f"Register: {x:05}\t\tValue: {val:05} ({val:#06x})")
25 except (V5FrameError, umodbus.exceptions.IllegalDataAddressError):
26 continue
27 print("Finished scanning holding registers")
28
29
30if __name__ == "__main__":
31 main()