{"id":17278105,"url":"https://github.com/rany2/grott","last_synced_at":"2025-02-25T02:32:56.323Z","repository":{"id":52213099,"uuid":"502184481","full_name":"rany2/grott","owner":"rany2","description":"Growatt inverter monitor","archived":false,"fork":false,"pushed_at":"2024-07-11T00:29:48.000Z","size":3499,"stargazers_count":9,"open_issues_count":0,"forks_count":0,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-07-11T02:49:01.294Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rany2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2022-06-10T21:23:53.000Z","updated_at":"2024-07-11T00:29:49.000Z","dependencies_parsed_at":"2023-02-15T05:46:42.151Z","dependency_job_id":"9158b658-37ca-4e7a-8279-1b791f0c83c5","html_url":"https://github.com/rany2/grott","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rany2%2Fgrott","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rany2%2Fgrott/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rany2%2Fgrott/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rany2%2Fgrott/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rany2","download_url":"https://codeload.github.com/rany2/grott/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219844638,"owners_count":16556483,"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","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":[],"created_at":"2024-10-15T09:10:51.308Z","updated_at":"2024-10-15T09:10:51.370Z","avatar_url":"https://github.com/rany2.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"### New in Version 2.8\n* Added first SPA support (2.8.1)\n* Added first MIN support (2.8.2)\n\n### New in Version 2.7\n* Added first beta of **grottserver** to act as destination for inverter/datalogger data (remove need to cummunicate with internet).\n  - grottserver is able to sent read/write register commands to inverter and datalogger.\n  - see https://github.com/johanmeijer/grott/wiki/Grottserver and discussions https://github.com/johanmeijer/grott/discussions/98 for more information\n* Support for SDM630/Raillog connected (see issue https://github.com/johanmeijer/grott/issues/88)\n* Support for SDM630/Inverter (modbus) connected 3 phases support\n* Export to CSV file (see issue https://github.com/johanmeijer/grott/issues/79, pull request https://github.com/johanmeijer/grott/pull/91). \n  - Also avaialble in 2.6.1 (master) \n  - More information can be found in the wiki: https://github.com/johanmeijer/grott/wiki/Extensions\n* Add parameter to enable message retain in MQTT (https://github.com/johanmeijer/grott/issues/84)\n  - .ini [MQTT section] retain = True\n  - environmental gmqttretain = \"True\" (docker: -e gmqttretain = \"True\") \n* Add parameter to enable sent inverter temperature as temperature value to pvoutput (not advised PVOutemp should be outside temperature) Issue https://github.com/johanmeijer/grott/issues/60\n  - .ini [PVOutput section] pvtemp = True\n  - environmental gpvtemp = \"True\" (docker: -e gpvtemp = \"True\")\n* Add parameter to disable sending energytoday to pvoutput (disable V1 input). This should show better avarages. Issue: https://github.com/johanmeijer/grott/issues/52  \n  - .ini [PVOutput section] pvdisv1 = True\n  - environmental gpvdisv1 = \"True\" (docker: -e gpvdisv1 = \"True\")  \n* Add support for SPH5000 T05nnnnXSPH data record\n* Add record validation to eliminate incomplete/corrupted records (for both Grott and Grottserver), see also issue https://github.com/johanmeijer/grott/issues/135\n  - No CRC checking is being done for older converter types (length validation is always performed).\n* Added option to add inverter serial to MQTT topic (thanks to @ebosveld)\n  - Add mqttinverterintopic = True to MQTT section of grott.ini or use  qmqttinverterintopic = \"True\" environmental (e.g. docker).\n\n### planned in Version 2.7.x (not commited yet)\n* Auto detect for SPF, SPH, TL3 inverters\n* Improved / configurable PVOutput support \n* MQTT Retain message support      \n* Enhanced record layout for SPH \n* tbd\n\n## The Growatt Inverter Monitor \nGrowatt inverters can send performance and status metrics (log data) to the Growatt company servers. The inverters rely on either a ShineWIFI module or a ShineLAN box to relay the data to Growatt. The metrics stored on the Growatt servers then can be viewed on the Growatt website or using the ShinePhone mobile app. \n\nThe purpose of Grott is to read, parse and forward the *raw metrics as they are sent* to Growatt servers. This means other applications can consume the raw Growatt metrics without relying on the Growatt API and servers and without delay. \n\n\n### Two modes of metric data retrieval\nGrott can intercept the inverter metrics in two distinct modes:\n* Proxy mode (man in the middle): The Growatt ShineWifi or ShineLAN box can be easily configured to use Grott as an alternative server to the default server.growatt.com. Grott then acts as a relay to the Growatt servers. Grott reads the transmitted data, and then forwards the data to server.grott.com.\n* Sniff mode (original connection): Can be used if your router is linux based. IPTables NAT masquerading is used in conjuction with a python packet sniffer to read the data. (This is more resource intensive on the linux host).\n\n\n### Where Grott can forward metric data to\nGrott can forward the parsed metrics to: \n* MQTT (suggested option for many home automation systems such as Home Assistant, OpenHAB and Domoticz)\n* InfluxDB v2 (a time series database with dashboarding functionality) \n* PVOutput.org (a service for sharing and comparing PV output data)\n* Custom output using the extension functionality (Examples available for Export to CSV files and writing to a Http Server).\n\n\n### Compatibility\nThe program is written in python and runs under Linux, Windows.\nIt can run:\n* Interactive from the command line interface\n* As a Linux or Windows service\n* As a [Docker container](https://github.com/johanmeijer/grott/wiki/Docker-support), use `ghcr.io/rany2/grott:master` for this fork.  \n\nAnd is tested, but not limited to, inverter models:\n+ 1500-S (ShineWiFi)\n+ 3000-S  (Shinelan)\n+ 2500-MTL-S (ShineWiFi)\n+ 4200-MTL-S (Shinelan)\n+ 5000TL-X   (ShineWifi-X)\n+ 3600TL-XE (ShineLink-X)\n+ 3600TL-XE (ShineLan)\n+ MOD 5000TL3-X* (ShineLan)\n+ MOD 9000TL3-X*\n\n**Experimental in latest 2.6 branch*\n\nThe Docker images are tested RPI(arm32), Ubuntu and Synology NAS\n\n## Grott installation\n\n### ShineLAN or ShineWIFI configuration\nIf Grott is running in proxy mode the ShineLAN box or ShineWIFI module [needs to be configured](https://github.com/johanmeijer/grott/wiki/Rerouting-Growatt-Wifi-TCPIP-data-via-your-Grott-Server) to send data to Grott instead of the Growatt server API.\nPlease see the [Wiki](https://github.com/johanmeijer/grott/wiki) for further information and installation details. \n\n## What's new\n### New in Version 2.6.1  (Master)\n#### TL3-X 3 phase inverter support \nsee issue https://github.com/johanmeijer/grott/issues/81/ https://github.com/johanmeijer/grott/issues/82/ https://github.com/johanmeijer/grott/issues/85: add invtype=tl3 in grott.ini [Generic] section (or use ginvtype=\"tl3\" environmental variable e.g. for docker ledidome/grott:2.6.1f)\n#### SPF off grid inverter support \nsee issue https://github.com/johanmeijer/grott/issues/42/ https://github.com/johanmeijer/grott/issues/46: add invtype=spf in grott.ini [Generic] section (or use ginvtype=spf environmental variable e.g. for docker)\n#### SPH hybrid (grid/battery) support \nsee issue https://github.com/johanmeijer/grott/issues/34: add invtype=sph in grott.ini [Generic] section (or use ginvtype=sph environmental variable e.g. for docker)\n#### Growatt Smart Meter support\nsee issue https://github.com/johanmeijer/grott/issues/47: data will be processed automatically and send to MQTT, InfluxDB and PVOutput.org\n#### Export to CSV file\nsee issue https://github.com/johanmeijer/grott/issues/79, pull request https://github.com/johanmeijer/grott/pull/91. More information can be found in the wiki: https://github.com/johanmeijer/grott/wiki/Extensions\n\n### New in Version 2.5.x  \nImproved dynamic data processing  and dynamic generation of output allowing: \n* add new output (values) without changing code (using external layout definitions)\n* rename keywords in MQTT JSON message and influxDB to own naming convention \n* format the verbose output values\n* Allow negative values for pvpowerout. New (always on) inverters can also use power. \n* Bugfix inluxdb port error\n\nsee: https://github.com/johanmeijer/grott/wiki/Grott-advanced-(customize-behaviour)   \n\u003cbr\u003e \nAdded new outout values to mqtt and influxDB to support 3 phase grid connection (actual information on voltage, current and power delivered), total active worktime (in 0.5 S) and energy generation per PV string (day and total)\n\u003cbr\u003e\n     \nImprove environmental processing for mqtt/influxDB/growatt ip and port definitions\n\n### New in Version 2.4.0  \nIntroduce possibility to add extensions for additional (personalized) processing. \n,br.     \nsee: https://github.com/johanmeijer/grott/wiki/Extensions\n\n### New in Version 2.3.1  \nDirect output to inlfuxdb (v1 and v2)   \n\u003cbr\u003e \nsee: https://github.com/johanmeijer/grott/wiki/InfluxDB-Support\n### New in Version 2.2.6  \nMulitiple inverter (multiple system id's) support in PVOutput.org \n\u003cbr\u003e \nsee: https://github.com/johanmeijer/grott/wiki/PVOutput.org-support \n\n#### Be aware: Wiith this release the default grott.ini moved to examples directory \nThis file is deleted from the grott default directory to simply github installation (not overwrite your settings). \nIt is advised to copy this file into the Grott default directory (and customise it) during first time installation \n\n### New in Version 2.2.1  \n#### Automatic protocol detection and processing\nLimited .ini configuration needed (inverterid, encryption, offset and record layout is automaticially detected)\n#### Direct output to PVOutput.org (no mqtt processing needed). \nSpecify pvoutput = True and apikey and systemid in .ini file to enable it. \n#### Docker support \n2 docker containers are created (`ghcr.io/rany2/grott:master`)\nSee issue 4 and 15 on how to use it (wiki will be updated soon)\n#### Use date/time from data record\nIf date/time is available in the data (inserted by the inverter) this will be used. In this way buffered records will be sent with the original  creation time (in the past). \nIf date/time is not available in the data record the server time will be used (as it was originally). \nIn the mqtt message the  key buffered is added (yes/no) which indicates that the message is from the buffer (past) or actual. \n\n### Version 2: Introduction of 2 modes support: sniff and proxy. \nIn sniff mode (default and compatable with older Grott versions) IP sniffering technology is used (based on: https://github.com/buckyroberts/Python-Packet-Sniffer). In this mode the data needs to be \"re-routed\" using linux IP forwarding on the device Grott is running. In this mode Grott \"sees\" every IP package and when a Growatt TCP packages passes it will be processed and a MQTT will be sent if inverter status information is detected. \n\nWith the proxy mode Grott is listening on a IP port (default 5279), processes the data (sent MQTT message) and routes the original packet to the growatt website. \n\nThe proxy mode functionality can be enabled by: \n\n- mode = proxy in the conf.ini file \n- m proxy parameter during startup\n\nPro / Cons: \n\n    sniff mode\n    + Data will also be routed to the growatt server if Grott is not active\n    - All TCP packages (also not growatt) need to be processed by Grott. \n      This is more resource (processor) intesive and can have a negative impact on the device performance.\n    - Configure IP forwarding can be complex if a lot of other network routing is configured (e.g. by Docker). \n    - Sudo rights necessary to allow network sniffering\n    \n    proxy mode: \n    + Simple configuration \n    + Only Growatt IP records are being analysed and processed by Grott \n    + Less resource intensive \n    + No sudo rights needed\n    + Blocking / Filtering of commands from the outside is possible\n    - If Grott is not running no data will be sent to the Growatt server\n\nThe adivse is to use the proxy mode. This mode is strategic and will be used for enhanced features like automatic protocol detection and command blocking filtering.  \n\u003cbr\u003e\nSniff mode is not supported under Windows\n\u003cbr\u003e\nIn sniff mode it is necessary to run Grott with SUDO rights. \n\n#### Minimal installation \nThe following modules are needed the use Grott:\n- grott.py\n- grott.ini (available in examples direcory) \n- grottconf.py\n- grottdata.py\n- grottproxy.py\n- grottsniffer.py\n\n#### More Version History: see Version_history.txt file. \n#### Grott is a \"hobby\" project you can use it as it is (with the potential errors and imperfections). Remarks and requests for improvement are welcome. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frany2%2Fgrott","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frany2%2Fgrott","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frany2%2Fgrott/lists"}