From 6716b7d9438693637cad939c0562ccc6e67dd18d Mon Sep 17 00:00:00 2001 From: egguy Date: Thu, 3 Nov 2022 18:13:39 +0100 Subject: [PATCH] Publish a current extension, with the latest modification --- grott-current/CHANGELOG.md | 6 ++ grott-current/DOCS.md | 30 +++++++ grott-current/Dockerfile | 34 ++++++++ grott-current/README.md | 157 +++++++++++++++++++++++++++++++++++++ grott-current/build.yaml | 1 + grott-current/config.json | 80 +++++++++++++++++++ grott-current/icon.png | Bin 0 -> 23261 bytes grott-current/logo.png | Bin 0 -> 16844 bytes grott-current/script.sh | 49 ++++++++++++ 9 files changed, 357 insertions(+) create mode 100644 grott-current/CHANGELOG.md create mode 100644 grott-current/DOCS.md create mode 100644 grott-current/Dockerfile create mode 100644 grott-current/README.md create mode 100644 grott-current/build.yaml create mode 100644 grott-current/config.json create mode 100644 grott-current/icon.png create mode 100644 grott-current/logo.png create mode 100644 grott-current/script.sh diff --git a/grott-current/CHANGELOG.md b/grott-current/CHANGELOG.md new file mode 100644 index 0000000..bc093e4 --- /dev/null +++ b/grott-current/CHANGELOG.md @@ -0,0 +1,6 @@ +# Changelog + +## 0.1 + +- Initial version +- Based on grott v2.7.6 diff --git a/grott-current/DOCS.md b/grott-current/DOCS.md new file mode 100644 index 0000000..bc95320 --- /dev/null +++ b/grott-current/DOCS.md @@ -0,0 +1,30 @@ +# Home Assistant Add-on: Grott - The Growatt inverter monitor + +## Installation + +Follow these steps to get the add-on installed on your system: + +1. Navigate in your Home Assistant frontend to **Supervisor** -> **Add-on Store**. +2. Find the "Grott" add-on and click it. +3. Click on the "INSTALL" button. + +## How to use + +The add-on has a couple of options available. To get the add-on running: + +1. Start the add-on. +2. Have some patience and wait a couple of minutes. +3. Check the add-on log output to see the result. + +## Add-on configuration: +All options from grott are available as options in this add-on. They need to follow the naming convention of the environment variables. Eg: +```yaml + gmode: proxy + gnomqtt: False + gmqttip: 127.0.0.1 + gmqttport: 5288 + gmqttauth: False + gmqtttopic: energy/grott + gmqttuser: user + gmqttpassword: password +``` diff --git a/grott-current/Dockerfile b/grott-current/Dockerfile new file mode 100644 index 0000000..376b370 --- /dev/null +++ b/grott-current/Dockerfile @@ -0,0 +1,34 @@ +ARG BUILD_FROM +FROM $BUILD_FROM + +ENV LANG C.UTF-8 + +# Run updates +# RUN apt-get clean && apt-get update && apt-get upgrade -y + +# Set the locale +# RUN apt-get install -y locales && locale-gen en_US.UTF-8 + +# Install python/pip +ENV PYTHONUNBUFFERED=1 +RUN apk add --update --no-cache python3 && ln -sf python3 /usr/bin/python +RUN python3 -m ensurepip +RUN pip3 install --no-cache --upgrade pip setuptools + + +#RUN curl -k https://codeload.github.com/johanmeijer/grott/zip/master --output files.zip && unzip files.zip +#RUN unzip files.zip + +# Copy data for add-on +COPY script.sh /app/script.sh +WORKDIR /app +RUN curl -Lk 'https://github.com/johanmeijer/grott/archive/refs/heads/2.7-(Beta).zip' --output files.zip && unzip -o files.zip && rm files.zip && mv grott-*/*.py ./ +# Move the addon +RUN curl -L 'https://raw.githubusercontent.com/egguy/grott/feature/ha-extension/examples/Home%20Assistent/grott_ha.py' -o grott_ha.py + +#Install required python packages +RUN pip install paho-mqtt requests influxdb influxdb + + +RUN chmod a+x script.sh +CMD [ "./script.sh" ] diff --git a/grott-current/README.md b/grott-current/README.md new file mode 100644 index 0000000..c7246f1 --- /dev/null +++ b/grott-current/README.md @@ -0,0 +1,157 @@ +## The Growatt Inverter Monitor +[![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/donate?business=RQFS46F9JTESQ&item_name=Grott+¤cy_code=EUR) + +(Per 28-12-2021 version 2.6 (2.6.1g) has been promoted to master branche) + +Growatt 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. + +The 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. + + +### Two modes of metric data retrieval +Grott can intercept the inverter metrics in two distinct modes: +* 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. +* 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). + + +### Where Grott can forward metric data to +Grott can forward the parsed metrics to: +* MQTT (suggested option for many home automation systems such as Home Assistant, OpenHAB and Domoticz) +* InfluxDB v1 and v2 (a time series database with dashboarding functionality) +* PVOutput.org (a service for sharing and comparing PV output data) +* Custom output using the extension functionality (Examples available for Export to CSV files and writing to a Http Server). + + +### Compatibility +The program is written in python and runs under Linux, Windows. +It can run: +* Interactive from the command line interface +* As a Linux or Windows service +* As a [Docker container](https://github.com/johanmeijer/grott/wiki/Docker-support). + +And is tested, but not limited to, inverter models: ++ 1500-S (ShineWiFi) ++ 3000-S (Shinelan) ++ 2500-MTL-S (ShineWiFi) ++ 4200-MTL-S (Shinelan) ++ 5000TL-X (ShineWifi-X) ++ 3600TL-XE (ShineLink-X) ++ 3600TL-XE (ShineLan) ++ MOD 5000TL3-X* (ShineLan) ++ MOD 9000TL3-X* + +**Experimental in latest 2.6 branch* + +The Docker images are tested RPI(arm32), Ubuntu and Synology NAS + +## Grott installation + +### ShineLAN or ShineWIFI configuration +If 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. +Please see the [Wiki](https://github.com/johanmeijer/grott/wiki) for further information and installation details. + +## What's new +### New in Version 2.6.1 (Master) +#### TL3-X 3 phase inverter support +see issue #81/#82/#85: add invtype=tl3 in grott.ini [Generic] section (or use ginvtype="tl3" environmental variable e.g. for docker ledidome/grott:2.6.1f) +#### SPF off grid inverter support +see issue #42/#46: add invtype=spf in grott.ini [Generic] section (or use ginvtype=spf environmental variable e.g. for docker) +#### SPH hybrid (grid/battery) support +see issue #34: add invtype=sph in grott.ini [Generic] section (or use ginvtype=sph environmental variable e.g. for docker) +#### Growatt Smart Meter support +see issue #47: data will be processed automatically and send to MQTT, InfluxDB and PVOutput.org +#### Export to CSV file +see issue #79, pull request #91. Moe information can be found in the wiki: https://github.com/johanmeijer/grott/wiki/Extensions + +### New in Version 2.5.x +Improved dynamic data processing and dynamic generation of output allowing: +* add new output (values) without changing code (using external layout definitions) +* rename keywords in MQTT JSON message and influxDB to own naming convention +* format the verbose output values +* Allow negative values for pvpowerout. New (always on) inverters can also use power. +* Bugfix inluxdb port error + +see: https://github.com/johanmeijer/grott/wiki/Grott-advanced-(customize-behaviour) +
+Added 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) +
+ +Improve environmental processing for mqtt/influxDB/growatt ip and port definitions + +### New in Version 2.4.0 +Introduce possibility to add extensions for additional (personalized) processing. +,br. +see: https://github.com/johanmeijer/grott/wiki/Extensions + +### New in Version 2.3.1 +Direct output to inlfuxdb (v1 and v2) +
+see: https://github.com/johanmeijer/grott/wiki/InfluxDB-Support +### New in Version 2.2.6 +Mulitiple inverter (multiple system id's) support in PVOutput.org +
+see: https://github.com/johanmeijer/grott/wiki/PVOutput.org-support + +#### Be aware: Wiith this release the default grott.ini moved to examples directory +This file is deleted from the grott default directory to simply github installation (not overwrite your settings). +It is advised to copy this file into the Grott default directory (and customise it) during first time installation + +### New in Version 2.2.1 +#### Automatic protocol detection and processing +Limited .ini configuration needed (inverterid, encryption, offset and record layout is automaticially detected) +#### Direct output to PVOutput.org (no mqtt processing needed). +Specify pvoutput = True and apikey and systemid in .ini file to enable it. +#### Docker support +2 docker containers are created ledidobe/grottrpi (specific old RPI with ARM32) and ledidobe/grott (generic one, tested on synology NAS and Ubuntu). See https://hub.docker.com/search?q=ledidobe&type=image. +See issue 4 and 15 on how to use it (wiki will be updated soon) +#### Command Blocking / Filtering +with blockcmd = True specified in .ini (configure/reboot) commands from outside to the inverter are blocked. This protects the inverter from beeing controlled from the outside while data exchange with server.growatt.com for reporting is still active. +#### Use date/time from data record +If 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). +If date/time is not available in the data record the server time will be used (as it was originally). +In the mqtt message the key buffered is added (yes/no) which indicates that the message is from the buffer (past) or actual. + +### Version 2: Introduction of 2 modes support: sniff and proxy. +In 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. + +With 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. + +The proxy mode functionality can be enabled by: + +- mode = proxy in the conf.ini file +- m proxy parameter during startup + +Pro / Cons: + + sniff mode + + Data will also be routed to the growatt server if Grott is not active + - All TCP packages (also not growatt) need to be processed by Grott. + This is more resource (processor) intesive and can have a negative impact on the device performance. + - Configure IP forwarding can be complex if a lot of other network routing is configured (e.g. by Docker). + - Sudo rights necessary to allow network sniffering + + proxy mode: + + Simple configuration + + Only Growatt IP records are being analysed and processed by Grott + + Less resource intensive + + No sudo rights needed + + Blocking / Filtering of commands from the outside is possible + - If Grott is not running no data will be sent to the Growatt server + +The 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. +
+Sniff mode is not supported under Windows +
+In sniff mode it is necessary to run Grott with SUDO rights. + +#### Minimal installation +The following modules are needed the use Grott: +- grott.py +- grott.ini (available in examples direcory) +- grottconf.py +- grottdata.py +- grottproxy.py +- grottsniffer.py + +#### More Version History: see Version_history.txt file. +#### 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. diff --git a/grott-current/build.yaml b/grott-current/build.yaml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/grott-current/build.yaml @@ -0,0 +1 @@ + diff --git a/grott-current/config.json b/grott-current/config.json new file mode 100644 index 0000000..2763035 --- /dev/null +++ b/grott-current/config.json @@ -0,0 +1,80 @@ +{ + "name": "Grott - HA extension - current", + "version": "2.7.7-current", + "slug": "grott-current", + "description": "The Growatt inverter monitor - current HA plugin", + "url": "https://github.com/johanmeijer/grott", + "arch": [ + "armhf", + "armv7", + "aarch64", + "amd64", + "i386" + ], + "startup": "application", + "services": [ + "mqtt:need" + ], + "init": false, + "boot": "auto", + "ports": { + "5279/tcp": 5279 + }, + "watchdog": "tcp://[HOST]:[PORT:5279]", + "options": { + "gmode": "proxy", + "gnomqtt": "False", + "ginvtype": "default", + "mqtt": {} + }, + "schema": { + "gverbose": "bool?", + "gminrecl": "int?", + "gmode": "str", + "ggrottip": "str?", + "ggrottport": "port?", + "gblockcmd": "bool?", + "gnoipf": "bool?", + "gtime": "str?", + "gtimezone": "str?", + "gsendbuf": "bool?", + "gcompat": "bool?", + "gvalueoffset": "int?", + "ginverterid": "str?", + "gincludeall": "bool?", + "ginvtype": "str?", + "gdecrypt": "bool?", + "ggrowattip": "str?", + "ggrowattport": "port?", + "gnomqtt": "bool?", + "gmqttip": "str?", + "gmqttport": "str?", + "gmqtttopic": "str?", + "gmqttauth": "bool?", + "gmqttuser": "str?", + "gmqttpassword": "password?", + "gpvoutput": "bool?", + "gpvapikey": "str?", + "gpvsystemid": "int?", + "gpvinverters": "int?", + "ginflux": "bool?", + "ginflux2": "bool?", + "gifdbname": "str?", + "gifip": "str?", + "gifport": "port?", + "gifuser": "str?", + "gifpassword": "password?", + "giforg": "str?", + "gifbucket": "str?", + "giftoken": "str?", + "gextension": "bool?", + "gextname": "str?", + "gextvar": "str?", + "ginvtypemap": "str?", + "mqtt": { + "server": "str?", + "user": "str?", + "password": "str?" + } + } +} diff --git a/grott-current/icon.png b/grott-current/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b3a89bc4a0af1dcd828a01edc58a31dedbcc4e9e GIT binary patch literal 23261 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∓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 a9te53F0mEuYgd8V1Jcpb#}#SV1^*v`-kHMy literal 0 HcmV?d00001 diff --git a/grott-current/script.sh b/grott-current/script.sh new file mode 100644 index 0000000..07ed0f1 --- /dev/null +++ b/grott-current/script.sh @@ -0,0 +1,49 @@ +#!/usr/bin/with-contenv bashio + +if bashio::config.has_value 'gverbose'; then export gverbose="$(bashio::config 'gverbose')"; fi +if bashio::config.has_value 'gminrecl'; then export gminrecl="$(bashio::config 'gminrecl')"; fi +if bashio::config.has_value 'gmode'; then export gmode="$(bashio::config 'gmode')"; fi +if bashio::config.has_value 'ggrottip'; then export ggrottip="$(bashio::config 'ggrottip')"; fi +if bashio::config.has_value 'ggrottport'; then export ggrottport="$(bashio::config 'ggrottport')"; fi +if bashio::config.has_value 'gblockcmd'; then export gblockcmd="$(bashio::config 'gblockcmd')"; fi +if bashio::config.has_value 'gnoipf'; then export gnoipf="$(bashio::config 'gnoipf')"; fi +if bashio::config.has_value 'gtime'; then export gtime="$(bashio::config 'gtime')"; fi +if bashio::config.has_value 'gtimezone'; then export gtimezone="$(bashio::config 'gtimezone')"; fi +if bashio::config.has_value 'gsendbuf'; then export gsendbuf="$(bashio::config 'gsendbuf')"; fi +if bashio::config.has_value 'gcompat'; then export gcompat="$(bashio::config 'gcompat')"; fi +if bashio::config.has_value 'gvalueoffset'; then export gvalueoffset="$(bashio::config 'gvalueoffset')"; fi +if bashio::config.has_value 'ginverterid'; then export ginverterid="$(bashio::config 'ginverterid')"; fi +if bashio::config.has_value 'gincludeall'; then export gincludeall="$(bashio::config 'gincludeall')"; fi +if bashio::config.has_value 'ginvtype'; then export ginvtype="$(bashio::config 'ginvtype')"; fi +if bashio::config.has_value 'gdecrypt'; then export gdecrypt="$(bashio::config 'gdecrypt')"; fi +if bashio::config.has_value 'ggrowattip'; then export ggrowattip="$(bashio::config 'ggrowattip')"; fi +if bashio::config.has_value 'ggrowattport'; then export ggrowattport="$(bashio::config 'ggrowattport')"; fi +if bashio::config.has_value 'gnomqtt'; then export gnomqtt="$(bashio::config 'gnomqtt')"; fi +if bashio::config.has_value 'gmqttip'; then export gmqttip="$(bashio::config 'gmqttip')"; fi +if bashio::config.has_value 'gmqttport'; then export gmqttport="$(bashio::config 'gmqttport')"; fi +if bashio::config.has_value 'gmqtttopic'; then export gmqtttopic="$(bashio::config 'gmqtttopic')"; fi +if bashio::config.has_value 'gmqttauth'; then export gmqttauth="$(bashio::config 'gmqttauth')"; fi +if bashio::config.has_value 'gmqttuser'; then export gmqttuser="$(bashio::config 'gmqttuser')"; fi +if bashio::config.has_value 'gmqttpassword'; then export gmqttpassword="$(bashio::config 'gmqttpassword')"; fi +if bashio::config.has_value 'gpvoutput'; then export gpvoutput="$(bashio::config 'gpvoutput')"; fi +if bashio::config.has_value 'gpvapikey'; then export gpvapikey="$(bashio::config 'gpvapikey')"; fi +if bashio::config.has_value 'gpvsystemid'; then export gpvsystemid="$(bashio::config 'gpvsystemid')"; fi +if bashio::config.has_value 'gpvinverters'; then export gpvinverters="$(bashio::config 'gpvinverters')"; fi +if bashio::config.has_value 'ginflux'; then export ginflux="$(bashio::config 'ginflux')"; fi +if bashio::config.has_value 'ginflux2'; then export ginflux2="$(bashio::config 'ginflux2')"; fi +if bashio::config.has_value 'gifdbname'; then export gifdbname="$(bashio::config 'gifdbname')"; fi +if bashio::config.has_value 'gifip'; then export gifip="$(bashio::config 'gifip')"; fi +if bashio::config.has_value 'gifport'; then export gifport="$(bashio::config 'gifport')"; fi +if bashio::config.has_value 'gifuser'; then export gifuser="$(bashio::config 'gifuser')"; fi +if bashio::config.has_value 'gifpassword'; then export gifpassword="$(bashio::config 'gifpassword')"; fi +if bashio::config.has_value 'giforg'; then export giforg="$(bashio::config 'giforg')"; fi +if bashio::config.has_value 'gifbucket'; then export gifbucket="$(bashio::config 'gifbucket')"; fi +if bashio::config.has_value 'giftoken'; then export giftoken="$(bashio::config 'giftoken')"; fi +if bashio::config.has_value 'ginvtypemap'; then export ginvtypemap="$(bashio::config 'ginvtypemap')"; fi + + +export gextension="True" +export gextname="grott_ha" +export gextvar="{\"ha_mqtt_host\": \"$(bashio::services mqtt "host")\", \"ha_mqtt_port\": \"$(bashio::services mqtt "port")\", \"ha_mqtt_user\": \"$(bashio::services mqtt "username")\", \"ha_mqtt_password\": \"$(bashio::services mqtt "password")\"}" + +python -u grott.py -v