johanmeijer / grott

Growatt inverter monitor
https://github.com/johanmeijer/grott/wiki
395 stars 109 forks source link

Layout for sph - sunrino M12000 (Sunrino-SP Serie) #248

Open camelcamro opened 1 year ago

camelcamro commented 1 year ago

Hello is anyone having a sunrino sph (hybrid inverter layout ? it seems to be recognized as: i tried to make a clone of another .. finally, the values are maybe not correct .. here to startup it is only having 718 length

but of course ... now is like reverse enigeering needed or anyone which already started ?

camelcamro commented 1 year ago

Hello Johan, not sure, if i can reach you on this way ... trying it ...

My Question is, if you can help me to make a "record layout" which is having the right values ? i would offer you to make a donation of 100,-. USD or EURO.

i would like to ask you, if you would help me with making a "record layout - 0Sunrino Hybrid Inverter" Mine is a "Sacolar 12000W - Hybrid Dual Split Phase Inverter" (hot 1 + hot 2 = 240 Volt / hot1 + neutral = 120 Volt) (typically for America power system) with 2 MPPT - each 60 A - battery system 48V => SUNRINO SP serie https://www.sacolar.com/products/info_8_itemid_187.html https://www.sacolar.com/uploadfiles/2020/03/20200327151005105.pdf

Basically, it is a growatt product or most of it . also the WIFI USB logger is a growatt product: https://www.sacolar.com/products/info_8_itemid_140.html https://www.sacolar.com/uploadfiles/2019/04/20190424115107517.pdf

basically, it is the same as the growatt WIFI USB dongle .... only configured for domain server.pvbutler.com but also possible to reconfigure server.growatt.com

i guess, it is the small brother of them. as they are using for this as default: pvbutler.com, which is also on growatt network.

################################### anyhow .....

now, I'm using your grott server solution, but the "record layout" doesn'T fit fully - only few values are OK, and the length is also limited on 718.

so, i used a template: t060104sph.json as based and tried it with that ...

My Question is, if you can help me to make a "record layout" which is having the right values ? i would offer you to make a donation of 100,-. USD or EURO. grott.zip

if that is ok for you. attached: .)grott.ini -> config, to be sure, if i did anything wrong ... .) growatt_server.log -> from your server -> the log with all data and raw data(XLS .) RTG0A46019 storage data - 2022-12-04_2022-12-04.xls -> pvbutler (growatt) export in XLS time range for both is: 13:00 to 13:30 - 2min cycle ( (the date is on my raspery server is having UTC, so, that is why different as I'm in Costa Rica (-6hrs) 6 hrs different as on the growatt webservice configured .) t060103sph.json -> record layout what i was beginning todo ..

maybe you can help ?

camelcamro commented 1 year ago

to keep you up2date ...

meanwhile i was beginning with reverse engineering, and made a template , which is: 1.) figure out the length of the data (in my case on this inverter = 718 2.) every field define in a "record layout" file -> all fields as default in steps of 2 byte (4 lenght in total), and divide by 10, and then looking on the real values to compare on server.pvbutler / server.growatt.com

attached the draft version v0.1 for this kind of inverter, few values, i need to check when the PV system getting sun ;-) t060104sph.zip

johanmeijer commented 1 year ago

With the excel and the original data (the "t060104") record from the same time is should be relatively easy to create te right layout. I suppose you want to use the names of the fields as specified in the excel?

Can yo u also sent the log from the start of a connection till the first "04" record so we can see if the used protocol is also the same?

This week I am busy with other things than Grott. But next week I can look at it I think.

camelcamro commented 1 year ago

Hello Johann,

i already did the reserve engineering ... almost done for the new record layout

about the offset ? do you mean the offset in grottconf.py or only to set the grott.ini this values ?

compat = True valueoffset = 4

and then restarting and output posting ?

johanmeijer commented 1 year ago

If you use the layout files do not specify compat and valueoffset. That is only being used with the first version of Grott (is still there for compatibility reasons).

johanmeijer commented 1 year ago

Maybe a stupid question but if the inverter is alomost the same as a growatt sph is then the standard sph layout not giving the right info?

camelcamro commented 1 year ago

but you were asking, if i can do a "offset 4" start ? so, hoiw i should configure it to prepare the debug ttrace for you ?

removing my template (which i copied to root grott folder) ? verbose = True trace = True offset ? changing in grottconfig.py ? or what do you need ?

template data for now - almost fine ...

t060104sph.json

{"T060104SPH": {
    "decrypt"           : {"value" :"True"},
    "pvserial"          : {"value" :76, "length" : 10, "type" : "text", "divide" : 10},
    "date"              : {"value" :136, "divide" : 10},
    "recortype"         : {"value" :154, "length" : 2, "type" : "num"},
    "pvstatus"          : {"value" :158, "length" : 2, "type" : "num"},
    "vPV1"              : {"value" :162, "length" : 2, "type" : "num", "divide" : 10},
    "vPV2"              : {"value" :166, "length" : 2, "type" : "num", "divide" : 10},
    "data_170"          : {"value" :170, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "PPV"               : {"value" :174, "length" : 2, "type" : "num", "divide" : 10},
    "data_178"          : {"value" :178, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_182"          : {"value" :182, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "iChargePV1"        : {"value" :186, "length" : 2, "type" : "num", "divide" : 10},
    "data_190"          : {"value" :190, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_194"          : {"value" :194, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "outPutPower"       : {"value" :198, "length" : 2, "type" : "num", "divide" : 10},
    "data_202"          : {"value" :202, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "outPutPowerVA"     : {"value" :206, "length" : 2, "type" : "num", "divide" : 10},
    "data_210"          : {"value" :210, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "pacGrid"           : {"value" :214, "length" : 2, "type" : "num", "divide" : 10},
    "data_218"          : {"value" :218, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "pacGridAll"        : {"value" :222, "length" : 2, "type" : "num", "divide" : 10},
    "vBat"              : {"value" :226, "length" : 2, "type" : "num", "divide" : 100},
    "capacity"          : {"value" :230, "length" : 2, "type" : "num", "divide" : 1},
    "data_234"          : {"value" :234, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "vGrid"             : {"value" :238, "length" : 2, "type" : "num", "divide" : 10},
    "freqGrid"          : {"value" :242, "length" : 2, "type" : "num", "divide" : 100},
    "outPutVolt"        : {"value" :246, "length" : 2, "type" : "num", "divide" : 10},
    "freqOutPut"        : {"value" :250, "length" : 2, "type" : "num", "divide" : 100},
    "data_254"          : {"value" :254, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "Temperature1"      : {"value" :258, "length" : 2, "type" : "num", "divide" : 10},
    "Temperature2"      : {"value" :262, "length" : 2, "type" : "num", "divide" : 10},
    "LoadPercent"       : {"value" :266, "length" : 2, "type" : "num", "divide" : 10},
    "W_data_270"        : {"value" :270, "length" : 2, "type" : "num", "divide" : 10},
    "data_274"          : {"value" :274, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_278"          : {"value" :278, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_282"          : {"value" :282, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_286"          : {"value" :286, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_290"          : {"value" :290, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "outPutCurrent1"    : {"value" :294, "length" : 2, "type" : "num", "divide" : 10},
    "outPutCurrent2"    : {"value" :298, "length" : 2, "type" : "num", "divide" : 10},
    "data_302"          : {"value" :302, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "pacGrid"           : {"value" :306, "length" : 2, "type" : "num", "divide" : 10},
    "data_310"          : {"value" :310, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_314"          : {"value" :314, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_318"          : {"value" :318, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_322"          : {"value" :322, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_326"          : {"value" :326, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_330"          : {"value" :330, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "W_data_334"        : {"value" :334, "length" : 2, "type" : "num", "divide" : 10},
    "EtoGridToday"      : {"value" :338, "length" : 2, "type" : "num", "divide" : 10},
    "W_data_342"        : {"value" :342, "length" : 2, "type" : "num", "divide" : 10},
    "data_346"          : {"value" :346, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_350"          : {"value" :350, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_354"          : {"value" :354, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_358"          : {"value" :358, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "eChargeToday"      : {"value" :362, "length" : 2, "type" : "num", "divide" : 10},
    "data_366"          : {"value" :366, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "eChargeTotal"      : {"value" :370, "length" : 2, "type" : "num", "divide" : 10},
    "data_374"          : {"value" :374, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_378"          : {"value" :378, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_382"          : {"value" :382, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_386"          : {"value" :386, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_390"          : {"value" :390, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "eacChargeToday"    : {"value" :394, "length" : 2, "type" : "num", "divide" : 10},
    "data_398"          : {"value" :398, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "eacChargeTotal"    : {"value" :402, "length" : 2, "type" : "num", "divide" : 10},
    "data_406"          : {"value" :406, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "eBatDisChargeToday": {"value" :410, "length" : 2, "type" : "num", "divide" : 10},
    "data_414"          : {"value" :414, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "eBatDisChargeTotal": {"value" :418, "length" : 2, "type" : "num", "divide" : 10},
    "data_422"          : {"value" :422, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_426"          : {"value" :426, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_430"          : {"value" :430, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_434"          : {"value" :434, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_438"          : {"value" :438, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_442"          : {"value" :442, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_446"          : {"value" :446, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_450"          : {"value" :450, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_454"          : {"value" :454, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_458"          : {"value" :458, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_462"          : {"value" :462, "length" : 2, "type" : "num", "divide" : 10},
    "data_466"          : {"value" :466, "length" : 2, "type" : "num", "divide" : 10},
    "data_470"          : {"value" :470, "length" : 2, "type" : "num", "divide" : 10},
    "data_474"          : {"value" :474, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "pBat"              : {"value" :478, "length" : 2, "type" : "numx", "divide" : 10},
    "data_482"          : {"value" :482, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_486"          : {"value" :486, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_490"          : {"value" :490, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_494"          : {"value" :494, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_498"          : {"value" :498, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_502"          : {"value" :502, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_506"          : {"value" :506, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "eopDischrToday"    : {"value" :510, "length" : 2, "type" : "num", "divide" : 10},
    "data_514"          : {"value" :514, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "eopDischrTotal"    : {"value" :518, "length" : 2, "type" : "num", "divide" : 10},
    "data_522"          : {"value" :522, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_526"          : {"value" :526, "length" : 2, "type" : "num", "divide" : 10},
    "data_530"          : {"value" :530, "length" : 2, "type" : "num", "divide" : 10},
    "data_534"          : {"value" :534, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_538"          : {"value" :538, "length" : 2, "type" : "num", "divide" : 10},
    "data_542"          : {"value" :542, "length" : 2, "type" : "num", "divide" : 10},
    "data_546"          : {"value" :546, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_550"          : {"value" :550, "length" : 2, "type" : "num", "divide" : 10},
    "data_554"          : {"value" :554, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_558"          : {"value" :558, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_562"          : {"value" :562, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_566"          : {"value" :566, "length" : 2, "type" : "num", "divide" : 10},
    "data_570"          : {"value" :570, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "epvTotal"          : {"value" :574, "length" : 2, "type" : "num", "divide" : 10},
    "epvToday"          : {"value" :578, "length" : 2, "type" : "num", "divide" : 10},
    "data_582"          : {"value" :582, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_586"          : {"value" :586, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_590"          : {"value" :590, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_594"          : {"value" :594, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_598"          : {"value" :598, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_602"          : {"value" :602, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_606"          : {"value" :606, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_610"          : {"value" :610, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_614"          : {"value" :614, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_618"          : {"value" :618, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_622"          : {"value" :622, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_626"          : {"value" :626, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_630"          : {"value" :630, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_634"          : {"value" :634, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_638"          : {"value" :638, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_642"          : {"value" :642, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_646"          : {"value" :646, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_650"          : {"value" :650, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_654"          : {"value" :654, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_658"          : {"value" :658, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_662"          : {"value" :662, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_666"          : {"value" :666, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_670"          : {"value" :670, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_674"          : {"value" :674, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_678"          : {"value" :678, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_682"          : {"value" :682, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_686"          : {"value" :686, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_690"          : {"value" :690, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_694"          : {"value" :694, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_698"          : {"value" :698, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_702"          : {"value" :702, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_706"          : {"value" :706, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_710"          : {"value" :710, "length" : 2, "type" : "num", "divide" : 10, "incl" : "no"},
    "data_714"          : {"value" :714, "length" : 2, "type" : "num", "divide" : 10}
} }
camelcamro commented 1 year ago

Maybe a stupid question but if the inverter is alomost the same as a growatt sph is then the standard sph layout not giving the right info?

no, 1.) only 718 bytes, and failing if i use the default 2.) huge difference .... don'T ask me, why it is showing the "T060104SPH" it is also finny, on first start it is looking for a "T060103SPH". Then after next update (in my case 1x), then it is always using the "T060104SPH" maybe the "offset" test with 4, is giving us better infos. you tell me ;-)

johanmeijer commented 1 year ago

The 03 is an announce record only sent once after session start. The 04 is te real data record that is sent at regulair basis and contains the real information.

Grott does decode the 03 record (is not needed).

camelcamro commented 1 year ago

FYI: with the give template above, i alreadyy getting more values which i was possible to define, as it is by the export from growatt ;-) few information, still are not clear for me, but can be something internal things, which they hidding from the users ... but, the template is really great, and having everything what others are having.

johanmeijer commented 1 year ago

I think if you use invtype = spf (and ignore op_va because I detected a bug there) it might fit your record layout pretty close.

camelcamro commented 1 year ago

well, my template (record layout is totally different to the normal "T060104SPH", but maybe noone did at on this exact level as i did. FYI: where i was adding , "incl" : "no"},, that was as there are no values, doesn'T care in which status i was using the inverter, neither the values which were on constant 65k were not needed.

johanmeijer commented 1 year ago

I really mean spf (not sph) If you run grott with invtype = spf you might see some usable values. I tested with your data amd think it will fit.

camelcamro commented 1 year ago

well, i can only tell you, i tested also "spf", but that is having only few values, and not using 716 bytes. i guess, spf is having only 378 or something what i have seen, and then there would be several values missing. so, that would be only a workaround. and also not all given vlaues are then also good named.