Git Product home page Git Product logo

py-goodwe's Introduction

py-goodwe

Python based lib to locally read data from Goodwe inverters.

CREDITS

Heavily inspired by koen-lee: https://github.com/koen-lee/GoodweUDPToPvOutput/tree/main/GoodweUdpPoller

How to use

Basically all of the magic is in lib/goodwe.py, it queries the inverter, and returns a dictionary containing whatever it can gather. Should support up to 4 MPPT, but tested on my own with 2, YMMV ;)

Example:

from goodwe import Goodwe,GoodweStatus

ip = your_ip_here
gw = Goodwe(ip=ip)

try:
    data = gw.getData()
except Exception as e:
    print(f"failed: {e}")
    exit(0)

print(data)

Output would look something like this:

{
    "sample": "2021-06-07 16:04:32",
    "voltage_dc_1": 367.0,
    "current_dc_1": 0.6,
    "voltage_dc_2": 542.9,
    "current_dc_2": 9.3,
    "voltage_dc_3": 6553.5,
    "current_dc_3": 6553.5,
    "voltage_dc_4": 6553.5,
    "current_dc_4": 6553.5,
    "voltage_ac_1": 236.3,
    "voltage_ac_2": 233.8,
    "voltage_ac_3": 234.6,
    "current_ac_1": 7.2,
    "current_ac_2": 7.2,
    "current_ac_3": 7.4,
    "frequency_ac_1": 50.01,
    "frequency_ac_2": 50.0,
    "frequency_ac_3": 50.0,
    "power_ac": 5161,
    "status": "NORMAL",
    "temperature": 54.2,
    "yield_today": 36.0,
    "yield_total": 3348.7,
    "working_hours": 2052,
    "power_dc_1": 220.2,
    "power_dc_2": 5048.97,
    "net_frequency_1": 50.01,
    "net_frequency_2": 50.0,
    "net_frequency_3": 50.0
}

files

/lib
    goodwe.py --> goodwe interface
    pvoutput.py --> pvoutput interface
    db.py --> pg database helper
/scripts
    run.py --> read metrics from inverter and store in db
    p1.py --> read metrics from p1 electricity meter and store in db
    push_status.py --> push status to pvoutput (from db)
    push_output.py --> push daily totals to pvoutput (from db)

PVOutput support

As a bonus, there's also some support for pvoutput, and a local db:

  • copy config.ini.dist to config.ini, and populate (inverter settings, db credentials and pvoutput api key) run.py will fetch data from the inverter and store it in the local db:
PYTHONPATH=.:$PYTHONPATH python scripts/run.py
  • push_status.py and push_output.py will push your data to pvoutput and can be run similarly, requirement is to have psycopg2 installed
  • p1.py can read, parse and insert p1 data from a smart electricity meter
  • db structure is in db.sql

setup Postgres

Easiest, is to run it in a docker container:

docker start postgresql

py-goodwe's People

Contributors

borft avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

mpbosma perokhel

py-goodwe's Issues

code stopped working

Error im receiving:

Traceback (most recent call last):
  File "Solar_MQTT2.py", line 1, in <module>
    from goodwe import Goodwe,GoodweStatus
  File "/home/pi/goodwe.py", line 14
    def to_16_bit(buffer: [bytes], exp: int = -1, signed: bool = False) -> int:
                        ^
SyntaxError: invalid syntax[](URL)

script:

from goodwe import Goodwe,GoodweStatus
import paho.mqtt.client as mqtt 
from random import randrange, uniform
import time
from datetime import datetime
import sys

now = datetime.now()
current_time = now.strftime("%H:%M:%S")
ip = "192.168.68.141"
gw = Goodwe(ip=ip)
mqttBroker ="192.168.68.119" 
client = mqtt.Client("SolarRoof2")
client.connect(mqttBroker) 
print('booting...')
while True:
    current_time = now.strftime("%H:%M:%S")
    #print(current_time)
    if current_time > '06:00:00':
        if current_time < '19:00:00':
            client.connect(mqttBroker) 
            try:
                data = gw.getData()
            except Exception as e:
                print("Failed: ".format(e))
                time.sleep(300)
                exit(0)
            data['power_dc_1'] = round(data['power_dc_1'], 2)
            data['power_dc_2'] = round(data['power_dc_2'], 2)
            client.publish('yield_today2', data['yield_today'])
            power = round(data['power_dc_2']+data['power_dc_1'], 2)
            client.publish('power2', power)
            print('publisch to yield_today2', data['yield_today'])
            print('publisch to power2', power)
            print('data succesfully recived and send')
            time.sleep(30)
        else:
            print('out of time cheking again in 60sec')
            time.sleep(60)
    else:
        print('out of time cheking again in 60sec')
        time.sleep(60)

python version:
Python 2.7.16 (default, Oct 10 2019, 22:02:15)
[GCC 8.3.0] on linux2

First query works, but then nothing

Hello, I have a problem and wanted to check if there is any idea to proceed.
I have GoodWe inverter HF_E20, with LAN module (not wifi). PV master app from mobile phone works (wifi bridged to the same network), inverter also sends data to semsportal.

When I try the first phase manually using netcat, I succeed:
$ nc -u 192.168.42.150 48899
WIFIKIT-214028-READ

192.168.42.150,34:ea:e7:98:25:96,HF_E20

However, when trying with py-goodwe, I am not getting any response.

$ python3 run.py
Retrying 2 timed out
Retrying 1 timed out
Retrying 0 timed out
failed: Could not get proper data after retrying

I have in config.ini
[goodwe]
ip =192.168.42.150
port = 8899

I think the inverter doesn't react to the message \x7f\x03\x75\x94\x00\x49\xd5\xc2. I've tried to put there a test msg \xAA\x55\xC0\x7F\x01\x02\x00\x02\x41 instead, which has produced some response apparently, as the message changed to
Retrying 1 Invalid data (unexpected length: 85

I've tried to send these two manually as well:
$ echo -e "\x7f\x03\x75\x94\x00\x49\xd5\xc2" | nc -u 192.168.42.150 8899
(no response)

$ echo -e -n "\xAA\x55\xC0\x7F\x01\x02\x00\x02\x41" | nc -u 192.168.42.150 8899
�U��L0707CGW10K-ET 9010KETU21BW442302041-19-S0C�

So the communication works and probably just the default command to get data is not working for this type.

More info - I have scanned the inverted with nmap, I can see I have opened TCP 80 and 502 and UPD 8899 and 48899. When tried to discover more about modbus on TCP502, I didn't get anything more detailed.

$ nmap -sU -p0-65535 192.168.42.150
Starting Nmap 7.80 ( https://nmap.org ) at 2022-10-18 19:16 CEST
Stats: 0:02:00 elapsed; 0 hosts completed (1 up), 1 undergoing UDP Scan
UDP Scan Timing: About 3.89% done; ETC: 20:08 (0:49:26 remaining)
Nmap scan report for 192.168.42.150
Host is up (0.0013s latency).
Not shown: 65534 closed ports
PORT STATE SERVICE
8899/udp open|filtered ospf-lite
48899/udp open|filtered unknown
MAC Address: 34:EA:E7:98:25:96 (Shanghai High-Flying Electronics Technology)

Nmap done: 1 IP address (1 host up) scanned in 3293.26 seconds

$ nmap -sT -p0-65535 192.168.42.150
Starting Nmap 7.80 ( https://nmap.org ) at 2022-10-20 13:47 CEST
Nmap scan report for 192.168.42.150
Host is up (0.037s latency).
Not shown: 65534 closed ports
PORT STATE SERVICE
80/tcp open http
502/tcp open mbap
MAC Address: 34:EA:E7:98:25:96 (Shanghai High-Flying Electronics Technology)

Nmap done: 1 IP address (1 host up) scanned in 129.75 seconds

$ nmap --script modbus-discover -p 502 192.168.42.150
Starting Nmap 7.80 ( https://nmap.org ) at 2022-10-22 14:12 CEST
Nmap scan report for 192.168.42.150
Host is up (0.0012s latency).

PORT STATE SERVICE
502/tcp open mbap
MAC Address: 34:EA:E7:98:25:96 (Shanghai High-Flying Electronics Technology)

Nmap done: 1 IP address (1 host up) scanned in 688.56 seconds

Any hint what/how to change, please?
Thank you,
jimo4242

Influxdb Support?

Hey!
Thanks for this great tool, I will try it out as soon as my PV goes online. But do you mind adding support for InfluxDB?
When you don't want to add it, i will read into your code and try to implement it on my own, but I got little free time atm.
So it could take a while :)

Because for ppl which use InfluxDB and Grafana we can keep our setup as minimal as possible.

I will happily contribute a Grafana Dashboard, as soon as i can try it out. :)

psycopg2 error

Bedankt voor dit handige stukje code!
Ik krijg helaas bij het uitvoeren van de code een foutmelding(begin gaat wel goed en data wordt uit de GoodWe gehaald):
Traceback (most recent call last): File "run.py", line 88, in <module> cur.execute(query, values) psycopg2.errors.SyntaxError: syntax error at or near "ON" LINE 1: ....5,6553.5,148,49.97,655.35,655.35,4.3,1.1,1281.5) ON CONFLIC...
Ik maak gebruik van een oude Synology NAS, waardoor ik alleen psycopg2-binary kan installeren. Dus wellicht dat mijn foutmelding daar mee te maken heeft. Heb je een idee hoe ik dit zou kunnen oplossen?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.