A python library to access GivEnergy inverters via Modbus TCP, with no dependency on the GivEnergy Cloud.
Project description
GivEnergy Modbus
A Python library for communicating with GivEnergy inverters via Modbus TCP on a local network, with no dependency on the GivEnergy Cloud. Inspired by and originally built on pymodbus, it now provides its own asyncio-based framer, decoder and PDUs specific to the GivEnergy implementation.
⚠️ This project makes no representations as to its completeness or correctness. You use it at your own risk — if your inverter mysteriously explodes because you accidentally set the
BOOMTIMEregister or you consume a MWh of electricity doing SOC calibration: you really are on your own. We make every effort to prevent you from shooting yourself in the foot, so as long as you use the client and its exposed methods, you should be perfectly safe.
- Documentation: https://dewet22.github.io/givenergy-modbus
- GitHub: https://github.com/dewet22/givenergy-modbus
- PyPI: https://pypi.org/project/givenergy-modbus/
- Free software: Apache-2.0
Features
- Reading all registers and decoding them into their representative datatypes
- Writing data to holding registers that are deemed to be safe to set configuration on the inverter
How to use
The client is async. Use it inside an asyncio event loop; commands are plain functions that return request lists
which you send via one_shot_command or execute:
import asyncio
from givenergy_modbus.client.client import Client
from givenergy_modbus.client import commands
from givenergy_modbus.model import TimeSlot
from givenergy_modbus.model.inverter import Model
async def main():
client = Client(host="192.168.99.99", port=8899)
await client.connect()
# Read current state first (needed for slot_map)
await client.refresh_plant(full_refresh=True)
plant = client.plant
# Write configuration to the device
await client.one_shot_command(commands.set_charge_target(80))
# set a charging slot from 00:30 to 04:30; slot_map selects correct registers for this model
await client.one_shot_command(
commands.set_charge_slot(1, TimeSlot.from_components(0, 30, 4, 30), plant.inverter.slot_map)
)
# set the inverter to charge from excess solar and discharge to meet demand
await client.one_shot_command(commands.set_mode_dynamic())
assert plant.inverter_serial_number == 'SA1234G567'
assert plant.inverter.model == Model.HYBRID
assert plant.inverter.enable_charge_target
assert plant.inverter.charge_slot_1 == TimeSlot.from_components(0, 30, 4, 30)
assert plant.inverter.model_dump() == {
'serial_number': 'SA1234G567',
'device_type_code': '3001',
'charge_slot_1': TimeSlot.from_components(0, 30, 4, 30),
...
}
assert plant.inverter.model_dump_json() == '{"serial_number": "SA1234G567", "device_type_code": "3001", ...'
assert plant.batteries[0].serial_number == 'BG1234G567'
assert plant.batteries[0].v_cell_01 == 3.117
assert plant.batteries[0].model_dump() == {
'bms_firmware_version': 3005,
'cap_design': 160.0,
...
}
assert plant.batteries[0].model_dump_json() == '{"serial_number": "BG1234G567", "v_cell_01": 3.117, ...'
await client.close()
asyncio.run(main())
Credits
This package was created with Cookiecutter and the waynerv/cookiecutter-pypackage project template.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file givenergy_modbus-2.0.0.tar.gz.
File metadata
- Download URL: givenergy_modbus-2.0.0.tar.gz
- Upload date:
- Size: 115.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6a40ec533b2eef42ef59c041e7c3f142d051957dba1be24ba180ccf7beddd73
|
|
| MD5 |
05d90f09141fbfe6b662bd4cd1616b5b
|
|
| BLAKE2b-256 |
f51a06822214b3aca4254be029b4dfd0b794ada4f163b98e873132a6afd53958
|
Provenance
The following attestation bundles were made for givenergy_modbus-2.0.0.tar.gz:
Publisher:
release.yml on dewet22/givenergy-modbus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
givenergy_modbus-2.0.0.tar.gz -
Subject digest:
f6a40ec533b2eef42ef59c041e7c3f142d051957dba1be24ba180ccf7beddd73 - Sigstore transparency entry: 1606065855
- Sigstore integration time:
-
Permalink:
dewet22/givenergy-modbus@e87c8fe3ad730fc488feb2e6df55130a7b891f13 -
Branch / Tag:
refs/heads/v2.0 - Owner: https://github.com/dewet22
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e87c8fe3ad730fc488feb2e6df55130a7b891f13 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file givenergy_modbus-2.0.0-py3-none-any.whl.
File metadata
- Download URL: givenergy_modbus-2.0.0-py3-none-any.whl
- Upload date:
- Size: 72.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6988e3cc896e5b886378a2b3c26c141588b0d8a8f83952d094c2e19b0f2f12bb
|
|
| MD5 |
67fbc85436817f3c8da144af794c75d3
|
|
| BLAKE2b-256 |
a2bc719481664f77ca6b27bc8c0905313115d45a24344d011c8c9253aa4bb444
|
Provenance
The following attestation bundles were made for givenergy_modbus-2.0.0-py3-none-any.whl:
Publisher:
release.yml on dewet22/givenergy-modbus
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
givenergy_modbus-2.0.0-py3-none-any.whl -
Subject digest:
6988e3cc896e5b886378a2b3c26c141588b0d8a8f83952d094c2e19b0f2f12bb - Sigstore transparency entry: 1606065957
- Sigstore integration time:
-
Permalink:
dewet22/givenergy-modbus@e87c8fe3ad730fc488feb2e6df55130a7b891f13 -
Branch / Tag:
refs/heads/v2.0 - Owner: https://github.com/dewet22
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e87c8fe3ad730fc488feb2e6df55130a7b891f13 -
Trigger Event:
workflow_dispatch
-
Statement type: