{"id":18517695,"url":"https://github.com/rosswarren/epevermodbus","last_synced_at":"2025-09-20T13:31:43.543Z","repository":{"id":50537632,"uuid":"393513693","full_name":"rosswarren/epevermodbus","owner":"rosswarren","description":"Python library for communicating with EPever solar charge controllers","archived":false,"fork":false,"pushed_at":"2024-07-14T15:29:31.000Z","size":35,"stargazers_count":49,"open_issues_count":10,"forks_count":25,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-09-01T14:46:02.405Z","etag":null,"topics":["energy-monitor","epever","modbus","python","raspberry-pi","solar","solar-energy"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rosswarren.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2021-08-06T22:02:04.000Z","updated_at":"2025-08-06T07:57:25.000Z","dependencies_parsed_at":"2023-09-24T12:39:57.315Z","dependency_job_id":"7490ba99-b97c-4116-aa00-dabc45a0c888","html_url":"https://github.com/rosswarren/epevermodbus","commit_stats":{"total_commits":38,"total_committers":5,"mean_commits":7.6,"dds":0.1578947368421053,"last_synced_commit":"87910eb30ff9e6b217a3556cc4d63f7a884528c8"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rosswarren/epevermodbus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosswarren%2Fepevermodbus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosswarren%2Fepevermodbus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosswarren%2Fepevermodbus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosswarren%2Fepevermodbus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rosswarren","download_url":"https://codeload.github.com/rosswarren/epevermodbus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rosswarren%2Fepevermodbus/sbom","scorecard":{"id":785303,"data":{"date":"2025-08-11","repo":{"name":"github.com/rosswarren/epevermodbus","commit":"b5d62d134a68e9f6ff0eaa148918f3ecf9cfb6ba"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.2,"checks":[{"name":"Code-Review","score":2,"reason":"Found 8/30 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2024-48 / GHSA-fj7x-q9j7-g6q6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 9 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T05:56:30.191Z","repository_id":50537632,"created_at":"2025-08-23T05:56:30.191Z","updated_at":"2025-08-23T05:56:30.191Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276105085,"owners_count":25586179,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["energy-monitor","epever","modbus","python","raspberry-pi","solar","solar-energy"],"created_at":"2024-11-06T17:07:29.845Z","updated_at":"2025-09-20T13:31:43.259Z","avatar_url":"https://github.com/rosswarren.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# epevermodbus\n\nThis package is intended to help you communicate with an EPever charge controller. It has been tested with an EPever Tracer AN but should work with other EPever devices.\n\n![image](https://user-images.githubusercontent.com/613642/128763284-c5bbe67b-3905-479a-8a90-b1db16ff59fb.png)\n\n## Features\n* Read real time data\n* Read battery parameters\n* Write battery parameters _this feature is a work in progress_\n* Automatic retries\n\n## Connecting to the charge controller\n\nI have only tested this package on Linux / Raspberry Pi but I see no reason why it should not work on other devices.\n\nFor the cable you have two options\n\n* Official EPever cable\n\n![image](https://user-images.githubusercontent.com/613642/128763357-c88e8ef6-481c-470f-9ca3-40dd7cf85914.png)\n\nWhen using the offical cable on Linux your device will show up something like `/dev/ttyXRUSB0`. You will need to use a custom driver to use this cable on Linux rather than the bundled cdc-acm driver. It can be difficult to get this driver working properly on Linux and Raspberry Pi.\n\nOn Windows you can use the driver provided by EPever and the cable should work fine so long as you check the rs485 checkbox in device manager.\n\n* Your own custom cable\n\nYou can quite easily make your own cable if you purchase a few parts, and with this approach you won't need a custom driver on Linux so it should be easier to get working. The device should show up as something like `/dev/ttyUSB0`.\n\nFor more information read: https://ross-warren.co.uk/2021/08/14/building-a-cable-to-connect-my-epever-charge-controller/\n\n## Installing the package\n\n\n\nTo install the package run\n\n```sh\npip install epevermodbus\n```\n\nThis package requires Python 3, depending on your setup you might have to instead run:\n\n```sh\npip3 install epevermodbus\n```\n\n\n## Command line utility\n\nTo run the command line utility and see the debug output run the following on the command line:\n\n```sh\nepevermodbus --portname /dev/ttyUSB0 --slaveaddress 1\n```\n\n```sh\nusage: epevermodbus [-h] [--portname PORTNAME] [--slaveaddress SLAVEADDRESS]\n\noptional arguments:\n  -h, --help            show this help message and exit\n  --portname PORTNAME   Port name for example /dev/ttyUSB0\n  --slaveaddress SLAVEADDRESS\n                        Slave address 1-247\n  --baudrate BAUDRATE   Baudrate to communicate with controller (default is 115200)\n```\n\nExample output\n\n```sh\nReal Time Data\nSolar voltage: 0.02V\nSolar current: 0.0A\nSolar power: 0.0W\nSolar power L: 0.0W\nSolar power H: 0.0W\nLoad voltage: 0.0V\nLoad current: 0.0A\nLoad power: 0.0W\nLoad power L: 0.0W\nLoad power H: 0.0W\nBattery current L: 0.0A\nBattery current H: 0.0A\nBattery voltage: 13.25V\nBattery state of charge: 86%\nBattery temperature: 16.91°C\nRemote battery temperature: 0.0°C\nController temperature: 16.55°C\nBattery status: {'wrong_identifaction_for_rated_voltage': False, 'battery_inner_resistence_abnormal': False, 'temperature_warning_status': 'NORMAL', 'battery_status': 'NORMAL'}\nCharging equipment status: {'input_voltage_status': 'NORMAL', 'charging_mosfet_is_short_circuit': False, 'charging_or_anti_reverse_mosfet_is_open_circuit': False, 'anti_reverse_mosfet_is_short_circuit': False, 'input_over_current': False, 'load_over_current': False, 'load_short_circuit': False, 'load_mosfet_short_circuit': False, 'disequilibrium_in_three_circuits': False, 'pv_input_short_circuit': False, 'charging_status': 'NO_CHARGING', 'fault': False, 'running': True}\nDischarging equipment status: {'input_voltage_status': 'NORMAL', 'output_power_load': 'LIGHT', 'short_circuit': False, 'unable_to_discharge': False, 'unable_to_stop_discharging': False, 'output_voltage_abnormal': False, 'input_over_voltage': False, 'short_circuit_in_high_voltage_side': False, 'boost_over_voltage': False, 'output_over_voltage': False, 'fault': False, 'running': False}\nDay time: False\nNight time: True\nMaximum battery voltage today: 14.5V\nMinimum battery voltage today: 13.25V\nDevice over temperature: False\n\n\nBattery Parameters:\nRated charging current: 20.0A\nRated load current: 20.0A\nBattery real rated voltage: 12.0V\nBattery type: USER_DEFINED\nBattery capacity: 40AH\nTemperature compensation coefficient: 0\nOver voltage disconnect voltage: 14.7V\nCharging limit voltage: 14.4V\nOver voltage reconnect voltage: 14.6V\nEqualize charging voltage: 14.4V\nBoost charging voltage: 14.4V\nFloat charging voltage: 13.6V\nBoost reconnect charging voltage: 13.3V\nLow voltage reconnect voltage: 12.0V\nUnder voltage recover voltage: 12.0V\nUnder voltage warning voltage: 11.5V\nLow voltage disconnect voltage: 11.0V\nDischarging limit voltage: 11.0V\nBattery rated voltage: 12V\nDefault load on/off in manual mode: OFF\nEqualize duration: 0 min\nBoost duration: 180 min\nBattery discharge: 30%\nBattery charge: 100%\nCharging mode: VOLTAGE_COMPENSATION\n```\n\n## Python usage\n\nTo use the library within your Python code\n\n```python\nfrom epevermodbus.driver import EpeverChargeController\n\n\ncontroller = EpeverChargeController(\"/dev/ttyUSB0\", 1)\n\ncontroller.get_solar_voltage()\n```\n\nSee https://github.com/rosswarren/epevermodbus/blob/main/epevermodbus/driver.py for all available methods\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frosswarren%2Fepevermodbus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frosswarren%2Fepevermodbus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frosswarren%2Fepevermodbus/lists"}