Cookies op Tweakers

Tweakers is onderdeel van DPG Media en maakt gebruik van cookies, JavaScript en vergelijkbare technologie om je onder andere een optimale gebruikerservaring te bieden. Ook kan Tweakers hierdoor het gedrag van bezoekers vastleggen en analyseren. Door gebruik te maken van deze website, of door op 'Cookies accepteren' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt? Bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

GoodWe inverter lokaal uitlezen (USB / WiFi)

Pagina: 1
Acties:

Onderwerpen


  • Sircuri
  • Registratie: oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
Voor de mensen die geïnteresseerd zijn in het kunnen uitlezen van een GoodWe inverter via de USB aansluiting aan de onderkant, heb ik op GitHub een eerste versie gezet van een python script dat dit mogelijk maakt.

Met hulp van het programma EZExplorer (GoodWe) en een USB sniffer, heb ik de communicatie kunnen ontrafelen.

https://github.com/sircuri/GoodWeUSBLogger

Signature van nature


Acties:
  • +1Henk 'm!
  • Pinned

  • brainball
  • Registratie: juni 2001
  • Laatst online: 25-06 09:22
Ik heb een GoodWe GW4000-DT hangen met de wifi module HF-LPB100.

GoodWe heeft daar een aangepaste webpagina ingezet die een hoop configuratie opties verstopt. Dit kan je omzijlen door de standaard webpagina erin te laden. :)

Het aanpassen van de webpagina is simpel maar kan impact op je garantie hebben.

Op de website van de leverancier kan je onder downloads de firmware voor de module vinden (http://www.hi-flying.com/hf-lpb100) een van de bestanden in de rar file in de folder webpage is de standaard webpagina configuratie. Deze kan je via de pagina IPADRESS/iweb.html uploaden.

Nadat je dit gedaan hebt krijg je de volledige configuratie te zien en kan je onderandere het standaard wifi netwerk uitzetten maar ook de waarnaar hij de data stuurt aanpassen. Zodat dit naar een eigen data server kan.

Acties:
  • +1Henk 'm!
  • Pinned

  • geerttttt
  • Registratie: oktober 2006
  • Laatst online: 04-08 10:20

geerttttt

Manisch positief

Belofte maakt schuld. Hierbij het script wat ik gebruik. Je moet de www.goodwe-power.com dns naam uiteraard omzetten naar je eigen webserver. Vervolgens een .htaccess aanmaken met dit:

code:
1
2
3
4
5
6
7
8
RewriteEngine on
RewriteBase /

# only rewrite if the requested file doesn't exist
RewriteCond %{REQUEST_FILENAME} !-s 

# pass the rest of the request into index.php to handle     
RewriteRule ^Acceptor/(.*)$ /Goodwe/logger.php/$1 [L]


Vervolgens het logger.php script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
$filename = './dumprequest'.time().'.txt';
$file = file_get_contents('php://input');

//strip useless data
$file = substr($file, 20);
if ($file != "") {
    //echo date("d-m H:i:s", substr($filename,11, -4))." - ";
    //strip useless data
    $file = substr($file, 0, -5);
    $file = bin2hex($file);
    /*echo $file;
    echo "-";
    echo "Vpv1: ".(hexdec(substr($file, 0, 4))/10)."|";
    echo "Vpv2: ".(hexdec(substr($file, 4, 4))/10)."| ";
    echo "Ipv1: ".(hexdec(substr($file, 8, 4))/10)." | ";
    echo "Ipv2: ".(hexdec(substr($file, 12, 4))/10)." | ";
    echo "cur: ".hexdec(substr($file, 28, 4))." | "; #curr usage
    echo "Etotal: ".(hexdec(substr($file, 40, 16))/10)." | "; #eTotal :)
    //echo hexdec(substr($file, 56, 8))." | ";
    echo "Etoday: ".(hexdec(substr($file, 88, 4))/10)." | "; #eToday
    echo "Vac: ".(hexdec(substr($file, 16, 4))/10)." | ";
    echo "Iac: ".(hexdec(substr($file, 20, 4))/10)." | ";
    echo "Fac: ".(hexdec(substr($file, 24, 4))/100)." | ";
    echo "Temp: ".(hexdec(substr($file, 36, 4))/10)." | ";
    echo "Htotal: ".(hexdec(substr($file, 56, 8)))." | ";
    echo "?: ".(hexdec(substr($file, 80, 4)))." | ";
    echo "Generating: ".(hexdec(substr($file, 34, 2)))." | "; # Generating or waiting
    echo "\n";*/
    mysql_query("INSERT INTO `zonnepanelen` (`date`, `vpv1`, `vpv2`, `ipv1`, `ipv2`, `cur`, `etotal`, `etoday`, `vac`, `iac`, `fac`, `temp`, `htotal`, `generating`, `raw`)
    VALUES
        (NOW(),
        '".(hexdec(substr($file, 0, 4))/10)."',
        '".(hexdec(substr($file, 4, 4))/10)."',
        '".(hexdec(substr($file, 8, 4))/10)."',
        '".(hexdec(substr($file, 12, 4))/10)."',
        '".hexdec(substr($file, 28, 4))."',
        '".(hexdec(substr($file, 40, 16))/10)."',
        '".(hexdec(substr($file, 88, 4))/10)."',
        '".(hexdec(substr($file, 16, 4))/10)."',
        '".(hexdec(substr($file, 20, 4))/10)."',
        '".(hexdec(substr($file, 24, 4))/100)."',
        '".(hexdec(substr($file, 36, 4))/10)."',
        '".(hexdec(substr($file, 56, 8)))."',
        '".(hexdec(substr($file, 34, 2)))."',
        'Url: ".$_SERVER['REQUEST_URI']." - ".$file."');
    ");
    if(date('i')%5==0){
        $data = [];
        $data["d"] = date("Ymd"); //yyyymmdd
        $data["t"] = date("H:i"); //hh:mm
        $data["v1"] = (hexdec(substr($file, 88, 4))*100); // watt hours
        $data["v2"] = hexdec(substr($file, 28, 4)); // watt
        $data["v6"] = ((hexdec(substr($file, 0, 4))/10)+(hexdec(substr($file, 4, 4))/10));  // voltage
        $data["v5"] = (hexdec(substr($file, 36, 4))/10); // degrees
        $headers = "Content-type: application/x-www-form-urlencoded\r\n";
        $headers .= "X-Pvoutput-Apikey: PVOUTPUTAPIKEYHIER\r\n";
        $headers .= "X-Pvoutput-SystemId: SYSTEMIDHIER\r\n";
        $options = [
            "http" => [
                "header" => $headers,
                "method" => "POST",
                "content" => http_build_query($data)
            ]
        ];
        $context = stream_context_create($options);
        $output = file_get_contents("http://pvoutput.org/service/r2/addstatus.jsp", false, $context);
    }
}


$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,            "http://goodwe-power.com".$_SERVER['REQUEST_URI'] );
//curl_setopt($ch, CURLOPT_URL,            "http://goodwe-power.com/Acceptor/DataCRC" );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt($ch, CURLOPT_POST,           1 );
curl_setopt($ch, CURLOPT_POSTFIELDS,     file_get_contents('php://input'));
curl_setopt($ch, CURLOPT_HTTPHEADER,     array('Connection: Close'));

$result=curl_exec ($ch);
curl_close($ch);
//$result = substr($result, 0, -6);
//                                              Extra sec ?? (0xaa)   eindkarakter?
//$result = $result.chr(0x00).chr(0x00).chr(0x01).chr(0xFF).chr(0xaa).chr(0x00);
if ($_SERVER['REQUEST_URI'] == "/Acceptor/GetSendInterval") {
    file_put_contents($filename, file_get_contents('php://input')."\n\nreturn: ".$result);
}
print_r($result);

In mijn geval stuur ik het naar mijn mysql server en naar pvoutput.org. Doe hiermee wat je zelf wilt natuurlijk ;)

[Voor 1% gewijzigd door ThinkPad op 06-02-2021 15:17. Reden: syntax-highlighting op code :)]

Oost west, 127.0.0.1 best!


Acties:
  • +3Henk 'm!
  • Pinned

  • dirksenrdh
  • Registratie: oktober 2017
  • Laatst online: 21-06 11:05
Ik ben inmiddels wel veel verder gekomen met mijn GW8K-dt
bij Alie een HF2211 RS485 naar Wifi en ethernet converter gekocht. Die is net binnen.
De ontbrekende connectoren voor de omvormer zijn van ExceedConn (EP-serie)
Verder had ik de basale python programmatuur al voorbereid, en wonder boven wonder werkte het in één keer.
Dus ik heb nu én de wifi adapter van Goodwe in de "USB" connector zitten en die stuurt elke x minuten een update naar de SEMS portal zodat mijn pv leverancier de installatie vanuit zijn kant kan monitoren.
Én ik heb de rs485 koppeling operationeel zodat ik elke seconde mijn raspberry Pi met Domotics de actuele waarden kan laten uitlezen.
De Python software is nog niet in een stadium dat het de delen valt maar er is wel progressie.

plans without actions are dreams


Acties:
  • +3Henk 'm!
  • Pinned

  • msatter
  • Registratie: maart 2021
  • Niet online
Hierbij het script welke SFK nodig heeft om te kunnen werken.

Er worden twee bestanden gebruikt om de gegevens op te slaan, goodwe.info die het antwoord van de broadcast bevat en hex.txt die de ontvangen HEX string bevat van met waardes. Hex.txt is tijdelijk en zal vervangen worden door log bestanden.

Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env bash

# Read the production of a Goodwe inverter and the retrieved data can be stored in a log file. At the end of the stored line time of retrieval.
# The name of the log file is the date in YYMMDD format and is this way unique. Each retrieved hex string has it's own line with a timestamp at the end.
# To retrieve data through IP needs a ARM firmware of 13 or higher. The last part of my firmware is stating for ARM "1.51.14" so 14 number for the ARM.

# This script needs SFK to run (http://www.stahlworks.com/dev/swiss-file-knife.html) 

# to-do: config file for storing the location logfile and cron.

sfk echo ""
sfk echo "Read and collect data from Goodwe inverter"
sfk echo "" 
sfk echo "Do broadcast to find the Goodwe inverter:"
sfk cudp -broad 255.255.255.255 48899 -listen -noerror -timeout=500 0x574946494b49542d3231343032382d52454144 -flat > goodwe.info
sfk echo -pure "  SSID: " +xfind goodwe.info "/**,**,//"
sfk echo -pure "  IP addr: " +xfind goodwe.info "/,**//"

sfk xfind goodwe.info "/,**//" +setvar ipa +cudp -var "#(ipa)" 8899 -listen -noerror -timeout=500 0x7f0375940049d5c2 -pure +xed "/[eol]//" +time " hms" >> ./`date +%Y`/`date +%Y%m%d`.log

# Check if the directory exists and if not create it.
sfk ifnotexist .`date +%Y`\*.log  mkdir `date +%Y`

# Show the values stored in the log file
echo ""  
sfk sel -since today *.log +hexfile -offlen -7 6 -flat -nofile +setvar logtime +echo -var "Log time: #(logtime)"
sfk echo "" 
sfk time "Current value at h:m:s:"

sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -292 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar vpv +echo -var     "  Vpv:      #(vpv) V"
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -288 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar ipv +echo -var     "  Ipv:      #(ipv) A "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -232 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar vac +echo -var     "  Vac:      #(vac) V "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -208 4 -flat -nofile   +dec +calc "#text*0.01" -dig=2  +setvar fac +echo -var     "  Fac:      #(fac) Hz "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -292 4 -flat -nofile +dec +setvar vpv +sel -since today ./`date +%Y`/*.log +hexfile -offlen -288 4 -flat -nofile +dec +setvar ipv +echo -var "#(vpv)*#(ipv)/100000" +calc "#text" -dig=2 +setvar power +echo -var    "  Power: #(power) kW "
#sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -232 4 -flat -nofile +dec +setvar vac +sel -since today ./`date +%Y`/*.log +hexfile -offlen -220 4 -flat -nofile +dec +setvar iac +echo -var "#(vac)*#(iac)/100000" +calc "#text" -dig=2 +setvar power +echo -var    "  PowerAC:  #(power) kW "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -140 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar temp +echo -var    "  Temperature:  #(temp) celcius "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -128 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar eday +echo -var    "  Eday:     #(eday) kWh "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -120 4 -flat -nofile   +dec +calc "#text*0.1"  -dig=1  +setvar etotal +echo -var  "  Etotal:   #(etotal) kWh "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -112 4 -flat -nofile   +dec +calc "#text*1.0"  -dig=0  +setvar work +echo -var    "  Totalruntime: #(work) hours "
sfk sel -since today ./`date +%Y`/*.log +hexfile -offlen -16  4 -flat -nofile   +dec +calc "#text*1.0"  -dig=0  +setvar rssi +echo -var    "  WiFi Signal:  #(rssi) %"


Ik kan nu eenvoudig de laatste waarden uit een log bestand lezen en het was eenvoudiger dan ik dacht. En ik had een tijdelijk bestand aangemaakt maar de methode kon ik ook direct toepassen.

De bijgewerkte lijst met de gevonden waardes door Tinkpad:

code:
1
2
3
4
5
6
7
8
9
10
11
12
Value read at 13:09:29:
  Vpv:          268.5 V
  Ipv:          1.3 A
  Vac:          229.4 V
  Iac:          1.8 A
  Fac:          49.96 Hz
  Power:        0.35 kW
  Temperature:  28.6 celcius
  Eday:         2.7 kWh
  Etotal:       42.0 kWh
  Tot. runtime: 86 hours
  WiFi Signal:  52 %


De temperatuur is ook een belangrijke waarde. Als alles erg warm wordt dan werkt alles minder en dan is het tijd om de koeling van de omvormer te bekijken.

Update.
Als er geen gevens terugkomen van fe omvormer dan gaat er ook niets naar het log. Lost ook meteen de offline zijn van de omvormer als er geen zon is.

Naast de bestandsnaam met de datum het kan ook de directory zelf een de naam van de omvormer hebben en zo kun je verschillende omvormers apart houden. Dit voor mensen zelf meer dan één omvormer hebben.

Update:
Script aangepast om de log bestanden een sub-dir te plaatsen met als naam het huidige jaar.

[Voor 36% gewijzigd door msatter op 05-05-2021 13:36. Reden: De door Thinkpad gevonden waardes toegevoegt]


Acties:
  • +6Henk 'm!
  • Pinned

  • ThinkPad
  • Registratie: juni 2005
  • Laatst online: 22:59

ThinkPad

Moderator Duurzame Energie & Domotica
Nadat ik de firmware heb laten bijwerken door Goodwe en ik de omvormer kon uitlezen met de SolarGo app, heb ik met bovenstaande code als basis het aan de praat gekregen om de omvormer (3000XS) via Node-RED uit te lezen:


Ik stuur een hex string naar de omvormer, waarop hij reageert en de data terugstuurt. In Node-RED haal ik uit de ontvangen hexstring de waardes en zet deze om naar variabelen:


De flow in Node-RED:
code:
1
[{"id":"1114148f.9e4e3b","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"901d892e.0b27e","type":"function","z":"1114148f.9e4e3b","name":"","func":"var inverter_reply = msg.payload;\n\nvar year = \"20\" + inverter_reply.readInt8(5); // \nvar month = inverter_reply.readInt8(6); // \nvar day = inverter_reply.readInt8(7); // \nvar hour = inverter_reply.readInt8(8); // \nvar minutes = inverter_reply.readInt8(9); // \nvar seconds = inverter_reply.readInt8(10); // \n\nvar timestamp = hour+\":\"+minutes+\":\"+seconds+\" \"+day+\"-\"+month+\"-\"+year;\n\n\nvar vpv = parseFloat((inverter_reply.readInt16BE(11)*0.1).toFixed(1)); // Vpv\nvar ipv = parseFloat((inverter_reply.readInt16BE(13)*0.1).toFixed(1)); // Ipv\nvar vac = parseFloat((inverter_reply.readInt16BE(41)*0.1).toFixed(1)); // Vac\nvar iac = parseFloat((inverter_reply.readInt16BE(47)*0.1).toFixed(1)); // Iac\nvar fac = parseFloat((inverter_reply.readInt16BE(53)*0.01).toFixed(2)); // Fac\nvar dc_power = parseFloat(((vpv*ipv)).toFixed(0)); \nvar ac_power = parseFloat(((vac*iac)).toFixed(0));\nvar eday = parseFloat((inverter_reply.readInt16BE(93)*0.1).toFixed(1)); // Eday\nvar etotal = parseFloat((inverter_reply.readInt16BE(97)*0.1).toFixed(2)); // Etotal\nvar rssi = inverter_reply.readInt16BE(149); // wifi signal strength?\nvar workhours = inverter_reply.readInt16BE(101); // work hours inverter\nvar temperature = parseFloat((inverter_reply.readInt16BE(87)*0.1).toFixed(1)); // Inverter temperature\nvar power = inverter_reply.readInt16BE(61); // power\nvar status = inverter_reply.readInt16BE(63); // \n\n\nvar workmode;\nswitch (status) {\n    case 0:\n        workmode = \"Wait Mode\"\n        break;\n    case 1:\n        workmode = \"Normal\"\n        break;\n    case 2:\n        workmode = \"Error\"\n        break;\n    case 4:\n        workmode = \"Check Mode\"\n        break;\n}\n\nmsg.payload = {\n    vpv,\n    ipv,\n    vac,\n    iac,\n    fac,\n    power,\n    eday,\n    etotal,\n    rssi,\n    workhours,\n    temperature,\n    workmode,\n    timestamp\n    \n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":320,"wires":[["3a0e034d.bce714"]]},{"id":"3a0e034d.bce714","type":"debug","z":"1114148f.9e4e3b","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":710,"y":320,"wires":[]},{"id":"1ea4603b.d6454","type":"udp in","z":"1114148f.9e4e3b","name":"","iface":"192.168.8.21","port":"8899","ipv":"udp4","multicast":"false","group":"192.168.8.21","datatype":"buffer","x":260,"y":320,"wires":[["901d892e.0b27e"]]},{"id":"80cdaee9.19bce8","type":"udp out","z":"1114148f.9e4e3b","name":"","addr":"192.168.6.15","iface":"","port":"8899","ipv":"udp4","outport":"8899","base64":false,"multicast":"false","x":750,"y":140,"wires":[]},{"id":"46c68558.f9e15c","type":"inject","z":"1114148f.9e4e3b","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":140,"wires":[["4a16c267.f83f14"]]},{"id":"4a16c267.f83f14","type":"function","z":"1114148f.9e4e3b","name":"","func":"var inverter_ask = Buffer.from(\"7F0375940049D5C2\",\"hex\");\n\nmsg.payload = inverter_ask;\nreturn msg;\n","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":140,"wires":[["80cdaee9.19bce8"]]},{"id":"dae4530a.7c94c","type":"comment","z":"1114148f.9e4e3b","name":"Request inverter data","info":"","x":300,"y":100,"wires":[]},{"id":"cea711ef.0e5a68","type":"comment","z":"1114148f.9e4e3b","name":"Parse received data","info":"","x":290,"y":280,"wires":[]}]


De function node heb ik intussen al weer bijgewerkt, ik bereken nu de CRC en verwerk het bericht pas als deze klopt. Merkte namelijk dat ik heel soms een incompleet bericht binnenkreeg. Hierbij de meest recente inhoud van de function node:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
var inverter_reply = msg.payload;

var message = inverter_reply.slice(2); // Remove 'AA55' from start of message
var message = message.slice(0, -2); //Remove two CRC bytes from end of message

function crc16(buffer) {
    var crc = 0xFFFF;
    var odd;

    for (var i = 0; i < buffer.length; i++) {
        crc = crc ^ buffer[i];

        for (var j = 0; j < 8; j++) {
            odd = crc & 0x0001;
            crc = crc >> 1;
            if (odd) {
                crc = crc ^ 0xA001;
            }
        }
    }
    return crc.toString(16);
}

//Calculate CRC ourselves
var calculated_crc = crc16(message);

//Get CRC from inverter reply and un-reverse it
var reply_crc = inverter_reply.slice(-2).toString('hex');
var crc1 = reply_crc.slice(0, 2);
var crc2 = reply_crc.slice(-2);
var new_crc = crc2 + crc1;

if (new_crc == calculated_crc) {
    //var year = "20" + inverter_reply.readUInt8(5);
    var year = 2000 + inverter_reply.readUInt8(5); 
    var month = inverter_reply.readUInt8(6);
    var day = inverter_reply.readUInt8(7); 
    var hour = inverter_reply.readUInt8(8); 
    var minutes = inverter_reply.readUInt8(9); 
    var seconds = inverter_reply.readUInt8(10); 
    
    var minutes = (minutes < 10 ? '0' : '') + minutes;
    var seconds = (seconds < 10 ? '0' : '') + seconds;
    var timestamp = hour + ":" + minutes + ":" + seconds + "  " + day + "-" + month + "-" + year;

    //Putting '+' in front to make it a number instead of a string
    var vpv = +(inverter_reply.readUInt16BE(11) * 0.1).toFixed(1);
    var ipv = +(inverter_reply.readUInt16BE(13) * 0.1).toFixed(1);
    var vac = +(inverter_reply.readUInt16BE(41) * 0.1).toFixed(1);
    var iac = +(inverter_reply.readUInt16BE(47) * 0.1).toFixed(1);
    var fac = +(inverter_reply.readUInt16BE(53) * 0.01).toFixed(2);
    var eday = +(inverter_reply.readUInt16BE(93) * 0.1).toFixed(1);
    var etotal = +(inverter_reply.readUInt32BE(95) * 0.1).toFixed(1);
    var rssi = inverter_reply.readUInt16BE(149);
    var workhours = inverter_reply.readUInt32BE(99);
    var temperature = +(inverter_reply.readUInt16BE(87) * 0.1).toFixed(1);
    var power = inverter_reply.readUInt32BE(59);
    var status = inverter_reply.readUInt16BE(63);
    var workmode;

    switch (status) {
        case 0:
            workmode = "Waiting"
            break;
        case 1:
            workmode = "Normal"
            break;
        case 2:
            workmode = "Error"
            break;
        case 4:
            workmode = "Checking"
            break;
    }

    msg.payload = {
        vpv,
        ipv,
        vac,
        iac,
        fac,
        power,
        eday,
        etotal,
        rssi,
        workhours,
        temperature,
        status,
        workmode,
        timestamp
    }

    var nodestate = {
        text: workmode + ' - Power: ' + power + 'W - ' + timestamp,
    };
    node.status(nodestate);

    return msg;
}

[Voor 255% gewijzigd door ThinkPad op 06-07-2021 21:43]

Gas besparen door CV-tuning | Elektriciteit besparen
Geen vragen via privébericht die ook via het forum kunnen a.u.b.


Acties:
  • +2Henk 'm!
  • Pinned

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 01:23

Pinobigbird

doesn't share food!

Ik heb de volgende waarde uit de response van m'n 3-fase GW5K-DT:
./sfk.exe cudp 192.168.1.11 8899 -listen -noerror -timeout=500 0x7f0375940049d5c2 -pure +xed "/[eol]//"

AA557F03921505070A02290B0B001E0C79001BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0FD20FDE0FE10927091C0935001900190019138813851383000006D600010000000000000000000000000000000000000000FFFF0178FFFFFFFF002600000C08000000A800140000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF001017F50C4000000000000002390095000400000031AAD9

Ik kom dan uit op deze waarden:
poslengtehexdecgrootheidwaardeeenheid
14AA 55170Header43605? - vaste waarde
527F127Response type127?- vaste waarde
720333?- vaste waarde
9292146146?- vaste waarde
1121521jaar2021Y
132055maand05M
152077dag07D
1720A10uur10h
192022minuut02m
2122941seconden41S
2340B 0B2827Vdc1282,7V
27400 1E30Idc13,0A
3140C 793193Vdc2319,3V
35400 1B27Idc22,7A
394FF FF65535
434FF FF65535
474FF FF65535
514FF FF65535
554FF FF65535
594FF FF65535
634FF FF65535
674FF FF65535
7140F D24050Vac1-2405,0V
7540F DE4062Vac2-3406,2V
7940F E14065Vac3-1406,5V
83409 272343Vac1234,3V
87409 1C2332Vac2233,2V
91409 352357Vac3235,7V
95400 1925Iac12,5A
99400 1925Iac22,5A
103400 1925Iac32,5A
107413 885000Fac150,00Hz
111413 854997Fac249,97Hz
115413 834995Fac349,95Hz
119400 000
123406 D61750Power1,750kW
127400 011Work modeNormal0: Wait Mode
1: Normal
2: Error
4: Check Mode
131400 000
135400 000
139400 000
143400 000
147400 000
151400 000
155400 000
159400 000
163400 000
167400 000
1714FF FF65535
175401 78376Temperature37,6°C
1794FF FF65535
1834FF FF65535
187400 2638Today generation3,8kWh
191800 00 0C 083080Total generation308,0kWh
199800 00 00 A8168Total hours168h
207400 1420Country safetyHolland(*)
211400 000
215400 000
219400 000
223400 000
2274FF FF65535
2314FF FF65535
2354FF FF65535
2394FF FF65535
2434FF FF65535
2474FF FF65535
2514FF FF65535
2554FF FF65535
259400 1016FunBit16
263417 F56133BusVolt6133
26740C 403136NBusVolt3136
271400 000
275400 000
279400 000
283402 39569569?- vaste waarde
287400 95149149?- vaste waarde
291400 0444?- vaste waarde
295400 000
299400 3149RSSI49%
3032AA D943737CRC-16 Modbus checksum in omgekeerde volgorde

@msatter Ik zie dus wél Power er tussen staan op positie 123, en de timestamp staat in het begin vanaf positie 11 met 2 hex-karakters per decimaal-karakter.

Positie 71 t/m 83 zijn volgens mij de spanningen tussen de drie fasen (iets meer dan 400V), maar dat is een gok.

Verder zie ik de waarden FunBit, BusVolt en NBusVolt terugkomen, die ik ook terugzie in SolarGo > More > Device maintenance > Debugging information.

edit:
Waarden van Total generation en Total hours van 4 naar 8 karakters. Wellicht ook nodig voor Power.

edit:
Laatste 4 cijfers als checksum

edit:
09-05-2021 22:40 Work mode en Country safety, (*) volgens https://github.com/mleten...we/goodwe_inverter.py#L70.

edit:
11-05-2021 18:05 AA55 als header. Checksum toelichting.

[Voor 4% gewijzigd door Pinobigbird op 11-05-2021 18:05]

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • +1Henk 'm!
  • Pinned

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 01:23

Pinobigbird

doesn't share food!

Ik heb via Wireshark de strings voor Shadow Scan on/off gevonden. Zo zou je de shadow scan alleen aan kunnen zetten op bepaalde tijdstippen waarop je het denkt nodig te hebben.

Shadow scan on:
7f069d8600018c51
Antwoord:
aa557f069d8600018c51

Shadow scan off:
7f069d8600004d91
Antwoord:
aa557f069d8600004d91


Waarbij
blauw = shadow scan adres
rood = waarde aan (1) of uit (0)
groen = omgekeerde CRC-16/MODBUS-checksum. Als ik de checksum bereken op https://www.lammertbies.nl/comm/info/crc-calculation van 7f069d860001 dan is dat [51 8c] i.p.v. [8c 51], en [91 4d] i.p.v. [4d 91]
aa55 is de antwoordheader, telt niet mee voor de checksum


Voorbeeld via sfk Shadow Scan aanzetten:
./sfk.exe cudp 192.168.1.11 8899 -listen -noerror -timeout=1000 0x7f069d8600018c51 -pure

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


Acties:
  • +2Henk 'm!
  • Pinned

  • hpmkruit
  • Registratie: november 2009
  • Laatst online: 22:31
Even een bevestiging vanuit mijn kant dat het lokaal uitlezen van een 5000D-NS ook lukt na een firmware update door GoodWe.

Acties:
  • +1Henk 'm!
  • Pinned

  • Pinobigbird
  • Registratie: januari 2002
  • Laatst online: 01:23

Pinobigbird

doesn't share food!

@Onno ! Ik heb 808.808.06 op m'n GW5K-DT en het lokaal uitlezen kan gewoon. De voorwaarde "ARM firmware of 13 or higher" die je in dit topic regelmatig tegenkomt is alleen voor sommige modellen van toepassing.
De test is of je met de app SolarGo kan werken. Zo ja, dan zit je goed.

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt

Pagina: 1


Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Microsoft Xbox Series X LG CX Google Pixel 5a 5G Sony XH90 / XH92 Samsung Galaxy S21 5G Sony PlayStation 5 Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True