{"id":19781,"name":"solariot","description":"Leverage your IoT enabled Solar PV Inverter to stream your solar energy usage data to a real time dashboard.","url":"https://github.com/meltaxa/solariot","last_synced_at":"2026-04-03T12:30:28.210Z","repository":{"id":41271496,"uuid":"103654354","full_name":"meltaxa/solariot","owner":"meltaxa","description":"Leverage your IoT enabled Solar PV Inverter to stream your solar energy usage data to a real time dashboard.","archived":false,"fork":false,"pushed_at":"2025-08-11T01:09:56.000Z","size":5408,"stargazers_count":224,"open_issues_count":17,"forks_count":76,"subscribers_count":16,"default_branch":"master","last_synced_at":"2026-01-13T00:37:41.073Z","etag":null,"topics":["dashboard","dweet","freeboard","influxdb","iot","modbus-sungrow","pvoutput","solar-energy","sungrow-inverter","telemetry"],"latest_commit_sha":null,"homepage":"https://solariot.live","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/meltaxa.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["meltaxa"]}},"created_at":"2017-09-15T12:26:12.000Z","updated_at":"2025-12-25T10:25:30.000Z","dependencies_parsed_at":"2024-05-28T17:16:21.426Z","dependency_job_id":"a033fa8f-e32e-43d7-a283-a9fe8ee772b7","html_url":"https://github.com/meltaxa/solariot","commit_stats":{"total_commits":125,"total_committers":15,"mean_commits":8.333333333333334,"dds":0.632,"last_synced_commit":"017186cd20e6feb569a90b147e9dd1f97ba9a16d"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/meltaxa/solariot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meltaxa%2Fsolariot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meltaxa%2Fsolariot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meltaxa%2Fsolariot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meltaxa%2Fsolariot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/meltaxa","download_url":"https://codeload.github.com/meltaxa/solariot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/meltaxa%2Fsolariot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28761586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T20:56:06.009Z","status":"ssl_error","status_checked_at":"2026-01-25T20:54:48.203Z","response_time":113,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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"}},"owner":{"login":"meltaxa","name":"Dennis Mellican","uuid":"19274980","kind":"user","description":"DevOps Consultant","email":"meltaxa@gmail.com","website":"https://mellican.com/","location":"Brisbane, Australia","twitter":null,"company":null,"icon_url":"https://avatars.githubusercontent.com/u/19274980?u=a2a36a5e7fa9172624c9411e20428ea9a0f15d45\u0026v=4","repositories_count":19,"last_synced_at":"2025-10-23T17:48:23.003Z","metadata":{"has_sponsors_listing":true},"html_url":"https://github.com/meltaxa","funding_links":["https://github.com/sponsors/meltaxa"],"total_stars":333,"followers":16,"following":0,"created_at":"2023-09-27T02:15:44.087Z","updated_at":"2025-10-23T17:48:23.003Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/meltaxa","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/meltaxa/repositories"},"packages":[],"commits":{"id":1253897,"full_name":"meltaxa/solariot","default_branch":"master","total_commits":127,"total_committers":17,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":7.470588235294118,"dds":0.6377952755905512,"past_year_total_commits":1,"past_year_total_committers":1,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":1.0,"past_year_dds":0.0,"last_synced_at":"2025-12-15T01:28:41.653Z","last_synced_commit":"60edcdb657d76f64629deae431c3cb7b93d37bed","created_at":"2023-03-27T10:47:48.906Z","updated_at":"2025-12-15T01:27:57.075Z","committers":[{"name":"Dennis Mellican","email":"meltaxa@gmail.com","login":"meltaxa","count":46},{"name":"Michael Robbins","email":"michael.robbins@xero.com","login":"michael-robbins","count":25},{"name":"vagrant","email":"vagrant@vagrant.vm","login":"invalid-email-address","count":14},{"name":"Ubuntu","email":"ubuntu@ip-172-26-15-19.us-west-2.compute.internal","login":null,"count":12},{"name":"slackerlinux85","email":"80187889+slackerlinux85","login":"slackerlinux85","count":7},{"name":"Dean Pemberton","email":"dean@cassini.nz","login":null,"count":4},{"name":"Ben Reedy","email":"breed808@breed808.com","login":"breed808","count":3},{"name":"Nathan Pickworth","email":"nathan@mors.me","login":"nmors","count":3},{"name":"Abilio Henrique","email":"admin@zyrorl.com","login":"zyrorl","count":2},{"name":"ShaneH","email":"shane.hollaway@gmail.com","login":"ShogunQld","count":2},{"name":"bohdan-s","email":"bohdan-s","login":"bohdan-s","count":2},{"name":"rark-ha","email":"62318984+rark-ha","login":"rark-ha","count":2},{"name":"Bartha Adam","email":"bartha_adam@yahoo.com","login":"bartha-adam","count":1},{"name":"Rob Thomas","email":"xrobau@gmail.com","login":"xrobau","count":1},{"name":"Antony Puckey","email":"apuckey@rawideas.com","login":null,"count":1},{"name":"chainsawbike","email":"chainsawbike@gmail.com","login":"chainsawbike","count":1},{"name":"scottah","email":"scottah@gmail.com","login":"scottah","count":1}],"past_year_committers":[{"name":"Bartha Adam","email":"bartha_adam@yahoo.com","login":"bartha-adam","count":1}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/meltaxa%2Fsolariot/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-01-12T01:17:07.515Z","repositories_count":6163930,"commits_count":932724860,"contributors_count":36260141,"owners_count":1137133,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"meltaxa/solariot","html_url":"https://github.com/meltaxa/solariot","last_synced_at":"2025-09-01T03:33:24.251Z","status":"error","issues_count":47,"pull_requests_count":40,"avg_time_to_close_issue":6208175.7272727275,"avg_time_to_close_pull_request":3589757.3513513515,"issues_closed_count":33,"pull_requests_closed_count":37,"pull_request_authors_count":16,"issue_authors_count":37,"avg_comments_per_issue":4.723404255319149,"avg_comments_per_pull_request":1.225,"merged_pull_requests_count":24,"bot_issues_count":0,"bot_pull_requests_count":11,"past_year_issues_count":1,"past_year_pull_requests_count":1,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":1,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":2.0,"past_year_avg_comments_per_pull_request":0.0,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2023-05-09T10:38:01.810Z","updated_at":"2025-09-02T10:51:00.884Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/meltaxa%2Fsolariot","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/meltaxa%2Fsolariot/issues","issue_labels_count":{"enhancement":5,"help wanted":1,"bug":1},"pull_request_labels_count":{"dependencies":11,"enhancement":1},"issue_author_associations_count":{"NONE":40,"CONTRIBUTOR":5,"OWNER":4},"pull_request_author_associations_count":{"CONTRIBUTOR":24,"NONE":17,"COLLABORATOR":1},"issue_authors":{"meltaxa":4,"shannondpasto":4,"michael-robbins":3,"bdog720":2,"rark-ha":2,"crazycusti":1,"satyr-software":1,"eimann":1,"flare04":1,"shannonpasto":1,"kaba72":1,"Flynsarmy":1,"knights1":1,"MeldrumIO":1,"brettbeeson":1,"tgcowell":1,"gservat":1,"indivisualvj":1,"erikderzweite":1,"brunolinsalves":1,"plague-doctor":1,"kisa72":1,"jeremyw24":1,"EvoSems":1,"mvandersteen":1,"wombatvic":1,"Hoerli1337":1,"iankds05":1,"sEdsKi":1,"vikram1505":1,"immoos":1,"swedishstyle":1,"lukecarbis":1,"lohita":1,"TrentBartlem":1,"mbc99":1,"jtc242":1,"ghost":1,"CarsonRedeye":1},"pull_request_authors":{"dependabot[bot]":11,"michael-robbins":10,"breed808":3,"slackerlinux85":3,"xrobau":2,"nmors":2,"bohdan-s":2,"andycapx":1,"ShogunQld":1,"zyrorl":1,"chainsawbike":1,"scottah":1,"rark-ha":1,"deanpemberton":1,"bartha-adam":1,"apuckey":1},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2025-10-31T00:00:39.152Z","repositories_count":11270521,"issues_count":34994096,"pull_requests_count":113577999,"authors_count":11042245,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":2},"past_year_pull_request_author_associations_count":{"NONE":1},"past_year_issue_authors":{"indivisualvj":1,"kaba72":1},"past_year_pull_request_authors":{"bartha-adam":1},"maintainers":[{"login":"meltaxa","count":4,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/meltaxa"},{"login":"ShogunQld","count":1,"url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors/ShogunQld"}],"active_maintainers":[]},"events":{"total":{"IssuesEvent":2,"WatchEvent":17,"IssueCommentEvent":2,"PushEvent":1,"PullRequestReviewEvent":1,"PullRequestEvent":3,"ForkEvent":7},"last_year":{"IssuesEvent":2,"WatchEvent":17,"IssueCommentEvent":2,"PushEvent":1,"PullRequestReviewEvent":1,"PullRequestEvent":3,"ForkEvent":6}},"keywords":["dashboard","dweet","freeboard","influxdb","iot","modbus-sungrow","pvoutput","solar-energy","sungrow-inverter","telemetry"],"dependencies":[{"ecosystem":"actions","filepath":".github/workflows/build.yml","sha":null,"kind":"manifest","created_at":"2023-02-16T08:45:40.440Z","updated_at":"2023-02-16T08:45:40.440Z","repository_link":"https://github.com/meltaxa/solariot/blob/master/.github/workflows/build.yml","dependencies":[{"id":7708445924,"package_name":"actions/checkout","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false},{"id":7708445925,"package_name":"crazy-max/ghaction-docker-buildx","ecosystem":"actions","requirements":"v1","direct":true,"kind":"composite","optional":false}]},{"ecosystem":"docker","filepath":"Dockerfile","sha":null,"kind":"manifest","created_at":"2023-02-16T08:45:40.532Z","updated_at":"2023-02-16T08:45:40.532Z","repository_link":"https://github.com/meltaxa/solariot/blob/master/Dockerfile","dependencies":[{"id":7708445942,"package_name":"python","ecosystem":"docker","requirements":"3.9-alpine","direct":true,"kind":"build","optional":false}]},{"ecosystem":"pypi","filepath":"requirements.txt","sha":null,"kind":"manifest","created_at":"2023-02-16T08:45:40.633Z","updated_at":"2023-02-16T08:45:40.633Z","repository_link":"https://github.com/meltaxa/solariot/blob/master/requirements.txt","dependencies":[{"id":7708447196,"package_name":"paho-mqtt","ecosystem":"pypi","requirements":"\u003e=1.5.1","direct":true,"kind":"runtime","optional":false},{"id":7708447200,"package_name":"pymodbus","ecosystem":"pypi","requirements":"==2.5.3","direct":true,"kind":"runtime","optional":false},{"id":7708447201,"package_name":"dweepy","ecosystem":"pypi","requirements":"\u003e=0.3.0","direct":true,"kind":"runtime","optional":false},{"id":7708447206,"package_name":"prometheus-client","ecosystem":"pypi","requirements":"\u003e=0.9","direct":true,"kind":"runtime","optional":false},{"id":7708447208,"package_name":"influxdb","ecosystem":"pypi","requirements":"\u003e=5.3.1","direct":true,"kind":"runtime","optional":false},{"id":7708447212,"package_name":"SungrowModbusTcpClient","ecosystem":"pypi","requirements":"\u003e=0.1.5","direct":true,"kind":"runtime","optional":false},{"id":7708447213,"package_name":"SungrowModbusWebClient","ecosystem":"pypi","requirements":"\u003e=0.2.4","direct":true,"kind":"runtime","optional":false}]}],"score":8.318010277546872,"created_at":"2023-09-11T14:52:07.084Z","updated_at":"2026-04-03T12:30:28.213Z","avatar_url":"https://github.com/meltaxa.png","language":"Python","category":"Renewable Energy","sub_category":"Photovoltaics and Solar Energy","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# Solariot\n\nLeverage your IoT enabled Solar PV Inverter to stream your solar energy usage\ndata to a real time dashboard.\n\nSolariot will connect directly to your Inverter using Modbus TCP. \n\nCurrently, Solariot is able to talk to a SMA Sunny Boy and Sungrow SH5K \u0026 SG5KD inverters. \nSolariot is designed to allow any Modbus TCP enabled inverter to be queried using a Modbus register map.\n\nData is collected and can be streamed to destinations like dweet.io, MQTT, InfluxDB or PVOutput. \nTo visualise the telemetry, use a dashboard such as Grafana. For example, this is Meltaxa's Grafana dashboard on \n\u003ca href=\"https://solariot.live\"\u003esolariot.live\u003c/a\u003e:\n\u003cp align=\"center\"\u003e\n  \u003c!--- \n  Github will by default use it's Camo CDN to cache images (https://github.blog/2014-01-28-proxying-user-images/). \n  To override this, on the origin web server add the header Cache-Control no-cache. Also if you are using \n  Cloudflare set the Browser Cache TTL to respect existing headers. The solarspy-live.png image is a Puppeteer \n  screenshot and updated every 5 minutes displaying the energy usage at Meltaxa's home.\n  ---\u003e\n  \u003cimg src=\"https://mellican.com/images/solarspy-live.png?github\" width=70%\u003e\n\u003c/p\u003e\n\n## Pre-requisites\n\n* The Inverter must be accessible on the network using TCP.\n\n* This Python script should work on most Inverters that talk Modbus TCP. You can \ncustomise your own modbus register file.\n\n* Run on Python 3.5+.\n\n## Installation\n\n1. Download or clone this repository to your local workstation.\n    ```\n    git clone https://github.com/meltaxa/solariot.git\n    cd solariot\n    ```\n   \n2. Install the required libraries.\n    ```\n    pip install --upgrade -r requirements.txt\n    ```\n   \n3. Update the config.py with your values, such as the Inverter's IP address, \nport, inverter model (which corresponds to the modbus register file) and the\nregister addresses Solariot should scan from. Enable optional support for MQTT,\nPVOutput, InfluxDB and more.\n\n4. Run the solariot.py script. \n    ```\n    ./solariot.py\n    ```\n   * Command line options:\n    ```\n    -c             Python module to load as our config. Default is config.py.\n    -v             Level of verbosity 0=ERROR 1=INFO 2=DEBUG.\n    --one-shot     Run Solariot just once then exit.\n    ```\n## Docker\n\n1. Create a directory for the config file [config.py].\n\n2. Create a config.py (see config-example.py) and place it in the config directory.\n\n3. Run the Docker image with the volume switch to mount your config directory as /config in the image\n   * `docker run -v \u003clocalpath\u003e:/config meltaxa/solariot`\n\nNote that the container runs as UID/GID 2000, so mounted config files will need to be readable. E.G.\n\n```bash\nchgrp 2000 $FILE # Set group of file to 2000\nchown g+r $FILE # Allow group 2000 to read file\n```\n\n## Next Steps\n\nNow that you are collecting the inverter's data, you'll want to ultimately\ndisplay it in a dashboard as seen above. \n\nThere are many methods to stream the data. Here are a few options, which\ncan be enabled in Solariot. \n\n### Dweet.io and Freeboard\n\nThis is the quickest method and is a good place to start.\n\nMetrics are streamed to dweet.io a free IoT messaging service. No sign up is \nrequired. All you need to do is create a unique identifier by updating the\ndweepy_uuid value in the config.py file.\n\nData can then be visualised using a ~~free~~ low-cost dashboard service from \n[Freeboard](https://freeboard.io/). You'll need to create your own dashboard,\nusing dweet.io as your data source.\n\n### MQTT Support\n\nThis is a good way to push data to MQTT topics that you might subscribe various tools \nsuch as Node-Red or Home Assistant to. Running your own MQTT server will mean you can\nalso retrieve these values when your internet is offline.\n\nAll you need to do is to set the `mqtt_server`, `mqtt_port`, `mqtt_username`, \n`mqtt_password` and `mqtt_topic` values in `config.py` file and you'll be up \nand running.\n\n### InfluxDB and Grafana\n\nUse a time series database such as \n[InfluxDB](https://github.com/influxdata/influxdb) to store the inverter data as\nit streams in. You'll need to install this on your own server.\n\nTo display the data in real time dashboard, you can use \n[Grafana](https://grafana.com/get) to pull the metrics from InfluxDB. You can \neither install your own Grafana server or use their free \n[Grafana hosted solution](https://grafana.com/cloud/grafana).\n\nA json export of solarspy.live Grafana dashboard is available under the grafana folder.\nThe file will require editing to match your InfluxDb settings.\n\n### Prometheus and Grafana\n\n[Prometheus](https://prometheus.io/) can be enabled in config.py by setting `prometheus` to true. the data will then be exported on the port specified by `prometheus_port` (defaults to 8000).\n\nyou can configure [Prometheus](https://prometheus.io/) to scrape this by adding a rule like this to your prometheus.yml\n```\nscrape_configs:\n  - job_name: 'solariot'\n    scrape_interval: 30s\n    static_configs:\n      - targets: ['localhost:8000']\n```\n\nalternatively if your using [Kubernetes](https://kubernetes.io/) you can use this [helm chart](https://github.com/slackerlinux85/HelmCharts/tree/master/helm-chart-sources/solariot)\n\n### PVOutput.org\n\nWe offer direct integration to publishing metrics to the 'Add Status' [API endpoint](https://pvoutput.org/help.html#api-addstatus) of PVOutput.\n\nSupported values are `v1` through to `v6` and an assumption that `v1` and `v3` are values are incremental and reset every day.\n\nAll you need to do is set the `pvoutput_api`, `pvoutput_sid` and `pvoutput_rate_limit` values in `config.py` file and \nyou'll be publishing in no time!\n\n## Integration with PVOutput.org and Grafana\n\nIf you are using Grafana as your dashboard, a neat little trick is to then\nincorporate your Grafana panels with your PVOutput as system photos. From your\n[PV Ladder page](https://pvoutput.org/ladder.jsp?f=1\u0026pf=4102\u0026pt=4102\u0026sf=5130\u0026st=5130\u0026country=1\u0026in=Sungrow\u0026pn=Infinity\u0026io=1\u0026oc=0), click on your photos to view the real time Grafana images: \n\n![alt tag](docs/animated-pvoutout-grafana-integration.gif)\n\n1. Obtain your Grafana panel direct link, see their documentation: \u003chttp://docs.grafana.org/reference/sharing/#direct-link-rendered-image\u003e.\n\n2. In your PVOutput \"Edit System\" page, add your Grafana panel link in the \n\"Image Link\" field. Append \"\u0026png\" to the link. Note, if the URL is longer than \n100 characters, use a URL shortener service instead (such as \u003chttps://goo.gl\u003e).\nDon't forget to append the \"\u0026png\" string to your URL.\n\n3. Now go to your system in the PV Ladder page and click on the photos.\n\n:bulb: Tip: You can add any URL image, such as the latest weather radar image \n:wink:\n\n## Contributions\n\nIf you have created a modbus register map for an inverter, please submit your\nfile as a pull request for Solariot inclusion.\n\n## Acknowledgements\n\n* [michael-robbins](https://github.com/michael-robbins) for Docker support, modbus contrib and other improvements.\n* [rpvelloso](https://github.com/rpvelloso) for the SungrowModbusTcpClient class that enables decryption of comms.\n* [shannonpasto](https://github.com/shannonpasto) for the Sungrow SG3KD modbus map.\n* [ShogunQld](https://github.com/ShogunQld) for the SMA Sunnuyboy modbus map.\n* [zyrorl](https://github.com/zyrorl) for MQTT support contrib.\n","funding_links":["https://github.com/sponsors/meltaxa"],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/19781","html_url":"https://ost.ecosyste.ms/projects/19781"}