Goodwe - SEMS portal naar PVOutput

Kijk hier voor datalog programma's en handleidingen.
Plaats reactie
Gebruikersavatar
RoelandK
lid
Berichten: 67
Lid geworden op: 30 jun 2015, 11:35
Installatie Land: België

Goodwe - SEMS portal naar PVOutput

Bericht door RoelandK » 10 okt 2018, 17:57

Hey,

Ivm dat Goodwe hun portal gaat veranderen heb ik nu een nieuw PHP script gemaakt dat hiermee werkt.
Het is een PHP script, dus je kunt het draaien op een webserver als je daar cronjob op hebt (elke 5 min */5 in de minute in cron gedeelte).

Ivm dat het nog maar een test versie is wil ik het liefst dit eerst beperkt testen.
[mo]
https://pastebin.com/4UNEmG4v
[/mo]

Ik ben ook aan het kijken voor een raspberry pi/vmware box versie te maken waarbij de calls van de goodwe ontvanger intercept worden en lokaal opgeslagen kunnen worden. Zodat als de service van goodwe plat ligt je tenminste de gegevens nog kunt loggen.
Zijn hier mensen die daar interesse in hebben?

FYI ik ben opzoek naar iemand die een WiFi receiver over heeft en niet meer nodig heeft om te kijken of ik de firmware kan uitlezen of op een andere manier kan aanpassen.

Mvg
Roeland
Diepenbeek - 16x SF 165-s op Zuid-oost (garage dak)

Gebruikersavatar
RoelandK
lid
Berichten: 67
Lid geworden op: 30 jun 2015, 11:35
Installatie Land: België

Re: Goodwe - SEMS portal naar PVOutput

Bericht door RoelandK » 10 okt 2018, 20:09

Mijn excuses in verkeerd subforum geplaatst. Kan iemand dit verplaatsen naar zonnepanelen? Bedankt.
Diepenbeek - 16x SF 165-s op Zuid-oost (garage dak)

Gebruikersavatar
janus
Site Admin
Site Admin
Berichten: 10715
Lid geworden op: 04 mar 2009, 22:39
Installatie Land: Ander
Locatie: Ten zuiden van antwerpen
Sponsor ons: Afbeelding
Contacteer:

Re: Goodwe - SEMS portal naar PVOutput

Bericht door janus » 10 okt 2018, 22:29

Bij deze.
.
Mijn wens is: "Dat ook in de toekomst de zon voor iedereen gratis op mag komen."

Gelieve geen technische vragen via pb Klik voor Uitleg

Gebruikersavatar
Wally©
Senior lid
Berichten: 493
Lid geworden op: 28 jun 2017, 22:26
Installatie Land: België
Locatie: Tessenderlo
Contacteer:

Re: Goodwe - SEMS portal naar PVOutput

Bericht door Wally© » 10 okt 2018, 22:49

Foutje in lijn 149..?

'Tempperature..?
Je hebt niet voldoende permissies om de bijlagen van dit bericht te bekijken.
10 Phono Solar 270 Mono Full Black 2700 Wp O180° H35° Omvormer GoodWe 2500-NS
Schaduw (eiken) van medio oktober tot begin maart...

Gebruikersavatar
RoelandK
lid
Berichten: 67
Lid geworden op: 30 jun 2015, 11:35
Installatie Land: België

Re: Goodwe - SEMS portal naar PVOutput

Bericht door RoelandK » 10 okt 2018, 22:49

Je zou het denken. Maar de schrijffout komt van goodwe zelf... ;) enable debug mode maar eens..
2018-10-10_22h49_06.png
Je hebt niet voldoende permissies om de bijlagen van dit bericht te bekijken.
Diepenbeek - 16x SF 165-s op Zuid-oost (garage dak)

Gebruikersavatar
Wally©
Senior lid
Berichten: 493
Lid geworden op: 28 jun 2017, 22:26
Installatie Land: België
Locatie: Tessenderlo
Contacteer:

Re: Goodwe - SEMS portal naar PVOutput

Bericht door Wally© » 10 okt 2018, 22:54

RoelandK schreef:
10 okt 2018, 22:49
Je zou het denken. Maar de schrijffout komt van goodwe zelf... ;) enable debug mode maar eens..
2018-10-10_22h49_06.png
Het zijn dan ook Sjienezen... :mrgreen:
10 Phono Solar 270 Mono Full Black 2700 Wp O180° H35° Omvormer GoodWe 2500-NS
Schaduw (eiken) van medio oktober tot begin maart...

Gebruikersavatar
Wally©
Senior lid
Berichten: 493
Lid geworden op: 28 jun 2017, 22:26
Installatie Land: België
Locatie: Tessenderlo
Contacteer:

Re: Goodwe - SEMS portal naar PVOutput

Bericht door Wally© » 10 okt 2018, 22:59

Kwam trouwens een aantal weken geleden dit tegen op het internet...

Misschien ben je d'r iets mee...

https://raspberrytips.nl/raspberry-pi-g ... -omvormer/
10 Phono Solar 270 Mono Full Black 2700 Wp O180° H35° Omvormer GoodWe 2500-NS
Schaduw (eiken) van medio oktober tot begin maart...

Gebruikersavatar
RoelandK
lid
Berichten: 67
Lid geworden op: 30 jun 2015, 11:35
Installatie Land: België

Re: Goodwe - SEMS portal naar PVOutput

Bericht door RoelandK » 10 okt 2018, 23:02

Gaat niet meer werken omdat de eu site offline gaat mid oktober...

De methode die wij gaan gebruiken is dns server op de goodwe ontvanger aanpassen en de POST intercepten.

Code: Selecteer alles

[Full request URI: http://www.goodwe-power.com/Acceptor/DataCRC]
Data: 00393330303044534e313732573032333301003c0efc0fa5...
0000 c8 0e 14 cb 3f 04 60 c5 a8 6b 6a 9d 08 00 45 00 È..Ë?.`Ũkj...E.
0010 00 dc 06 07 00 00 40 06 4c eb c0 a8 b2 5f 2f fe .Ü....@.LëÀ¨²_/þ
0020 84 24 7c 1e 00 50 00 e3 03 19 52 8e ba b1 50 18 .$|..P.ã..R.º±P.
0030 04 00 dc 8f 00 00 50 4f 53 54 20 2f 41 63 63 65 ..Ü...POST /Acce
0040 70 74 6f 72 2f 44 61 74 61 43 52 43 20 48 54 54 ptor/DataCRC HTT
0050 50 2f 31 2e 31 0d 0a 43 6f 6e 6e 65 63 74 69 6f P/1.1..Connectio
0060 6e 3a 43 6c 6f 73 65 0d 0a 43 6f 6e 74 65 6e 74 n:Close..Content
0070 2d 4c 65 6e 67 74 68 3a 30 38 30 0d 0a 48 6f 73 -Length:080..Hos
0080 74 3a 77 77 77 2e 67 6f 6f 64 77 65 2d 70 6f 77 t:www.goodwe-pow
0090 65 72 2e 63 6f 6d 0d 0a 0d 0a 00 39 33 30 30 30 er.com.....93000
00a0 44 53 4e 31 37 32 57 30 32 33 33 01 00 3c 0e fc DSN172W0233..<.ü
00b0 0f a5 00 0d 00 09 09 4d 00 26 13 88 03 4f 00 01 .¥.....M.&...O..
00c0 00 bc 00 00 00 00 00 00 7d f6 00 00 0e c0 50 19 .¼......}ö...ÀP.
00d0 00 00 00 02 00 00 10 6d 00 06 00 0d 12 0a 0a 0a .......m........
00e0 30 13 00 00 00 00 c3 52 00 00 0.....ÃR..

eerste gedeelte is serienr en de rest is hex code ...

Code: Selecteer alles

06cb06d200660064096b008a13880d160001018600000000000001300000001900ca000001f400600e830014005212051713213b00000019
Vpv1: 173.9|Vpv2: 174.6| Ipv1: 10.2 | Ipv2: 10 | cur: 3350 | Etotal: 30.4 | Etoday: 8.2 | Vac: 241.1 | Iac: 13.8 | Fac: 50 | Temp: 39 | Htotal: 25 | ?: 3715 |
een python versie, die ik zelf zou willen omzetten naar een apache versie.. met een vhost.

Code: Selecteer alles

#!/usr/bin/python
import cstruct
from datetime import date, datetime, timedelta
from bottle import request, response, get, post, run, template, Bottle, error
import time
from crc16 import crc16xmodem
import struct
import sys
import mysql.connector
from mysql.connector import errorcode
import collections
from collections import namedtuple
from pprint import pprint

class LocalTimeReq(cstruct.CStruct):
    __byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
        char serial[16];
    """

class MsgTime(cstruct.CStruct):
    __byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
        unsigned char Year;
        unsigned char Month;
        unsigned char Day;
        unsigned char Hour;
        unsigned char Min;
        unsigned char Sec;
    """

    def SetLocalTime(self):
        lt=time.localtime()
        self.Year=lt.tm_year%100
        self.Month=lt.tm_mon
        self.Day=lt.tm_mday
        self.Hour=lt.tm_hour
        self.Min=lt.tm_min
        self.Sec=lt.tm_sec

class LocalTimeResp(cstruct.CStruct):
    __byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
        char serial[16];
        unsigned char Year;
	struct MsgTime time;
        unsigned short cksum;
    """

    def GetResponse(self,serial):
        self.serial=serial
	self.time.SetLocalTime()
        self.cksum=0
        cksum=sum(map(ord, self.pack()))
        self.cksum=cksum
        return self.pack()

class RemoteControlReq(cstruct.CStruct):
    __byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
        char serial[16];
        char unknown[76];
    """

class RemoteControlResp(cstruct.CStruct):
    __byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
    """

    def GetResponse(self,serial):
        return ""


class DataCRCS0(cstruct.CStruct):
    _byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
        unsigned short Vpv1;
        unsigned short Vpv2;
        unsigned short Ipv1;
        unsigned short Ipv2;
        unsigned short Vac1;
        unsigned short Iac1;
        unsigned short Fac1;
        unsigned short Pac;
        unsigned short WorkMode;
        unsigned short Temperature;
        unsigned int ErrorMsg;
        unsigned int ETotal;
        unsigned int hTotal;
        unsigned short SoftVersion;
        unsigned short WarningCode;
        unsigned short FunctionsBitValue;
        unsigned short BUSVoltage;
        unsigned short NBUSVoltage;
        unsigned short GFCIFaultValue;
        unsigned short EDay;
        unsigned short unknown;
    """

class DataCRCS1(cstruct.CStruct):
    __byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
        unsigned short Vpv1;
        unsigned short Vpv2;
        unsigned short Ipv1;
        unsigned short Ipv2;
        unsigned short Vac1;
        unsigned short Vac2;
        unsigned short Vac3;
        unsigned short Iac1;
        unsigned short Iac2;
        unsigned short Iac3;
        unsigned short Fac1;
        unsigned short Fac2;
        unsigned short Fac3;
        unsigned short Pac;
        unsigned short WorkMode;
        unsigned short Temperature;
        unsigned int ErrorMsg;
        unsigned int ETotal;
        unsigned int hTotal;
        unsigned short SoftVersion;
        unsigned short WarningCode;
        unsigned short PV2FaultValue;
        unsigned short FunctionsBitValue;
        unsigned short Line2VFaultValue;
        unsigned short Line3VFaultValue;
        unsigned short BUSVoltage;
        unsigned short NBUSVoltage;
        unsigned short Line3FFaultValue;
        unsigned short GFCIFaultValue;
        unsigned short EDay;
        struct MsgTime time;
        unsigned int unknown2;
        unsigned short ARMSoftVersion;
        unsigned short unknown3;
        unsigned short unknown4;
        unsigned short unknown5;
        unsigned short unknown6;
        char model[10];
    """

class DataCRCReq(cstruct.CStruct):
    __byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
        unsigned char unknown1;
        char serial[16];
        unsigned char series;
        unsigned short size;
    """

    def print_info(self):
        print("%s,%s,%s,%s,%s" % (self.serial, self.reading.Vac1, self.reading.Iac1, self.reading.Temperature, self.reading.ETotal))

    def GetMessage(self,data):
        self.unpack(data[:len(self)])
        if self.series == 0:
            self.reading=DataCRCS0()
        else:
            self.reading=DataCRCS1()
        self.reading.unpack(data[len(self):])

class DataCRCResp(cstruct.CStruct):
    __byte_order__ = cstruct.BIG_ENDIAN
    __struct__ = """
        char serial[16];
        unsigned short unknown1;
        unsigned short unknown2;
        unsigned short cksum;
    """

    def GetResponse(self,serial):
        self.serial=serial
        self.cksum=0
        cksum=sum(map(ord, self.pack()))
        self.cksum=cksum
        return self.pack()

@post('/DataCRC')
def datacrc():
    data = DataCRCReq()
    response.set_header('Content-Type', 'application/octet-stream;charset=UTF-8')
    body = request.body.read()
    data.GetMessage(body)
    data.print_info()
    reply=DataCRCResp()
    return reply.GetResponse(data.serial)

@post('/GetSendInterval')
def getsendinterval():
    data = SendIntervalReq()
    body = request.body.read()
    data.unpack(body)

    reply = LocalTimeResp()
    return reply.GetResponse(data.serial)


@post('/GetLocalTime')
def getlocaltime():
    data = LocalTimeReq()
    body = request.body.read()
    data.unpack(body)

    reply = LocalTimeResp()
    return reply.GetResponse(data.serial)

@post('/GetRemoteControl')
def getremotecontrol():
    data = RemoteControlReq()
    body = request.body.read()
    data.unpack(body)

    reply = RemoteControlResp()
    return reply.GetResponse(data.serial)

run(server='cgi')

Diepenbeek - 16x SF 165-s op Zuid-oost (garage dak)

Plaats reactie