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()