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