Open camelcamro opened 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 ?
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
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.
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 ?
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).
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?
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}
} }
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 ;-)
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).
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.
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.
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.
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.
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.
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
nbusvolt : 0.0
ipf : 0.0
realoppercent : 0.0
opfullwatt : 0.0
deratingmode : 0
but of course ... now is like reverse enigeering needed or anyone which already started ?