Growatt Binding

With 4.1.0 M3 in docker container together with grott service the Bridge is online.
Grott receives Data.
But no Thing appears and manual thingk (with Inverter_Serial as ID) is not getting online.
What am I doing wrong?

Two things…

  1. Try http://[openhab-ip]:8080/growatt
  2. Can you turn on log:set TRACE ?

EDIT I would imagine that you need to create an inverter thing with the serial number from ‘pvserial’ as it’s config param. Note that the data logger usually pushes packets every 5 minutes, so it could take up to that length of time before the respective thing changes state to ‘online’…

EDIT2 the parameter data values from your screenshot above look a bit ‘fishy’ to me e.g mains freqency or phase voltages. What country are you in, and what model of inverter do you have?

Hi Andrew,

  1. Yes, it shows the bridge is working.
  2. The Thing is not recognizing all of the channels? I am keen on steering Charge/Discharge power based on SOC and PV Generation/Load/Grid Export/Import.
    The Thing “GZL0DA804M” is not showing any channels (CHNT 666 Smart Meter).
21:48:52.247 [TRACE] [internal.handler.GrowattBridgeHandler] - handleGrottContent() json:"{\"device\": \"KLN0D6L034\", \"time\": \"2023-12-26T21:48:33\", \"buffered\": \"no\", \"values\": {\"pvserial\": \"KLN0D6L034\", \"pvstatus\": 1, \"pvpowerin\": 0, \"pv1voltage\": 669, \"pv1current\": 0, \"pv1watt\": 0, \"pv2voltage\": 695, \"pv2current\": 0, \"pv2watt\": 0, \"pv3voltage\": 0, \"pv3current\": 0, \"pv3watt\": 0, \"pv4voltage\": 0, \"pv4current\": 0, \"pv4watt\": 0, \"pvpowerout\": 4294966929, \"pvfrequentie\": 5001, \"pvgridvoltage\": 2359, \"pvgridcurrent\": 7, \"pvgridpower\": 1651, \"pvgridvoltage2\": 2367, \"pvgridcurrent2\": 8, \"pvgridpower2\": 1893, \"pvgridvoltage3\": 2379, \"pvgridcurrent3\": 8, \"pvgridpower3\": 1903, \"vacrs\": 4084, \"vacst\": 4118, \"vactr\": 4104, \"ptousertotal\": 8099, \"ptogridtotal\": 0, \"ptoloadtotal\": 8239, \"totworktime\": 79652, \"pvenergytoday\": 178, \"pvenergytotal\": 178, \"epvtotal \": 162, \"epv1today \": 79, \"epv1total\": 79, \"epv2today\": 83, \"epv2total\": 83, \"epv3today\": 0, \"epv3total\": 0, \"etousertoday\": 64, \"etousertotal\": 64, \"etogridtoday\": 1, \"etogridtotal\": 1, \"eloadtoday\": 237, \"eloadtotal\": 0, \"deratingmode\": 0, \"iso\": 15997, \"dcir\": 0, \"dcis\": 0, \"dcit\": 0, \"gfci\": 137645, \"pvtemperature\": 296, \"pvipmtemperature\": 410, \"temp3\": 296, \"temp4\": 0, \"temp5\": 319, \"pbusvoltage\": 3311, \"nbusvoltage\": 3265, \"ipf\": 20000, \"realoppercent\": 0, \"opfullwatt\": 150000, \"standbyflag\": 0, \"faultcode\": 0, \"warningcode\": 0, \"systemfaultword0\": 0, \"systemfaultword1\": 0, \"systemfaultword2\": 0, \"systemfaultword3\": 0, \"systemfaultword4\": 0, \"systemfaultword5\": 0, \"systemfaultword6\": 0, \"systemfaultword7\": 0, \"invstartdelaytime\": 60, \"bdconoffstate\": 1, \"drycontactstate\": 0, \"edischrtoday\": 103, \"edischrtotal\": 1843, \"echrtoday\": 91, \"echrtotal\": 3005, \"eacchrtoday\": 5, \"eacchrtotal\": 5, \"priority\": 1, \"epsfac\": 0, \"epsvac1\": 0, \"epsiac1\": 0, \"epspac1\": 0, \"epsvac2\": 0, \"epsiac2\": 0, \"epspac2\": 0, \"epsvac3\": 0, \"epsiac3\": 0, \"epspac3\": 0, \"epspac\": 0, \"loadpercent\": 0, \"pf\": 10000, \"dcv\": 0, \"bdc1_sysstatemode\": 513, \"bdc1_faultcode\": 0, \"bdc1_warncode\": 701, \"bdc1_vbat\": 6582, \"bdc1_ibat\": 0, \"bdc1_soc\": 11, \"bdc1_vbus1\": 6582, \"bdc1_vbus2\": 3303, \"bdc1_ibb\": 0, \"bdc1_illc\": 0, \"bdc1_tempa\": 409, \"bdc1_tempb\": 291, \"bdc1_pdischr\": 100, \"bdc1_pchr\": 0, \"bdc1_edischrtotal\": 1843, \"bdc1_echrtotal\": 3005, \"bdc1_flag\": 1, \"bdc2_sysstatemode\": 17, \"bdc2_faultcode\": 12, \"bdc2_warncode\": 248, \"bdc2_vbat\": 266, \"bdc2_ibat\": 223, \"bdc2_soc\": 19, \"bdc2_vbus1\": 49, \"bdc2_vbus2\": 11, \"bdc2_ibb\": 11, \"bdc2_illc\": 4, \"bdc2_tempa\": 0, \"bdc2_tempb\": 394, \"bdc2_pdischr\": 26214400, \"bdc2_pchr\": 0, \"bdc2_edischrtotal\": 0, \"bdc2_echrtotal\": 0, \"bdc2_flag\": 0, \"bms_status\": 4, \"bms_error\": 0, \"bms_warninfo\": 0, \"bms_soc\": 11, \"bms_batteryvolt\": 4041, \"bms_batterycurr\": 0, \"bms_batterytemp\": 0, \"bms_maxcurr\": 2200, \"bms_deltavolt\": 2200, \"bms_cyclecnt\": 0, \"bms_soh\": 100, \"bms_constantvolt\": 568, \"bms_bms_info\": 464, \"bms_packinfo\": 0, \"bms_usingcap\": 0, \"bms_fw\": 1400, \"bms_mcuversion\": 0, \"bms_commtype\": 1}}"
21:48:55.716 [TRACE] [internal.handler.GrowattBridgeHandler] - handleGrottContent() json:"{\"device\": \"GZL0DA804M\", \"time\": \"2023-12-26T21:48:36\", \"buffered\": \"no\", \"values\": {\"datalogserial\": \"GZL0DA804M\", \"pvserial\": \"KLN0D6L034\", \"voltage_l1\": 2355, \"voltage_l2\": 2374, \"voltage_l3\": 2376, \"Current_l1\": 22, \"Current_l2\": 15, \"Current_l3\": 12, \"act_power_l1\": 4909, \"act_power_l2\": 1710, \"act_power_l3\": 1478, \"app_power_l1\": 5058, \"app_power_l2\": 3321, \"app_power_l3\": 2712, \"react_power_l1\": -1222, \"react_power_l2\": -2847, \"react_power_l3\": -2275, \"powerfactor_l1\": 936, \"powerfactor_l2\": 481, \"powerfactor_l3\": 502, \"pos_rev_act_power\": 8098, \"pos_act_power\": 8098, \"rev_act_power\": 8098, \"app_power\": 11091, \"react_power\": -6346, \"powerfactor\": 690, \"frequency\": 500, \"L1-2_voltage\": 4095, \"L2-3_voltage\": 4113, \"L3-1_voltage\": 4097, \"pos_act_energy\": 9587, \"rev_act_energy\": 1387}}"
  1. The “fishy” data are OK for a 3phase net (I am in Germany) - (Lx/Ly Voltage)
    image

Do you confirm that it shows this…

image

Do you have more than one inverter? And does either one or the other show correct data? i.e. is one working, and the other one not?

Can you please explain a bit further? Note: I am fully aware of how 3-phase electricity works – even in Germany – (I used to work for Siemens) … which is why a mains frequency of 278.7 Hz or RS, ST, TR voltages of 31.5V, 0V, 40.7V seem quite … well … ‘fishy’ to me…

image

Snag_8011b0b

GZL0DA804M is the Serial of the Smartmeter (CHNT 666).
With invtype=min (supported since Grott 2.8.2) values of smart meter looking fine to me:


Values of Inverter itself are fine too, except pvpowerout. Here some data from the smart meter are included, some not…
Both are found by the binding automatically and showing channels as soon as login data are entered.

@DirkNeumann sorry but I am a bit confused. In one of your prior posts you said that one of the things was showing no channels. But now you seem to be saying that both of them do show channels? Or??

Also can you please explain the purpose of the smart meter in your system? Is this meter in addition to the meter supplied by your utility company?


EDIT: apropos activating the battery charging program: could you please have a look at the Rule Actions chapter in the documentation? You may need to install the latest version of the binding to get support for that feature…

https://github.com/andrewfg/openhab-addons/blob/growatt/bundles/org.openhab.binding.growatt/README.md

Hi Andrew,

sorry to confuse you :wink:
That why I sent you you the trace log data.
My Growatt System is 1 Inverter (MID 15KTL3 XH with battery pack (APX 2.0)
and Smartmeter (CHNT 666)).
It is being lister in Grott as two devices (Smartmeter and Inverter), where
the inverter data also contain battery data.

=> Things are found, Data are available but the smart meter thing does not
get any channels.

Difference between these two things is the “Device ID”.
I guess the JSON format of the smart meter value is causing the issue (see
red marked code).

Inverter: KLN0D6L034 UID: growatt:inverter:111c355902:KLN0D6L034
=> json:"{"device": "KLN0D6L034", "time": "2023-12-27T11:53:37",
"buffered": "no", "values": {"pvserial": "KLN0D6L034",
"pvstatus": 1, "pvpowerin": 39325, "pv1voltage": 5414,

Smartmeter: GZL0DA804M UID: growatt:inverter:111c355902:GZL0DA804M
=> json:"{"device": "GZL0DA804M", "time": "2023-12-27T11:52:14",
"buffered": "no", "values": {"datalogserial": "GZL0DA804M",
"pvserial": "KLN0D6L034", "voltage_l1\ …

I tried to change the Smartmeter Device ID to KLN0D6L034 which is causing
the following warnings.
I guess two things with the same Device ID are not possible.


Liebe Grüsse / Best Regards
Dirk

Don’t do that.

Yes. It seems that the Growatt engineers are using different JSON field names in different device models as synonyms for the same data. It is not only different between your inverter and your meter, but also different between your inverter and mine. (IMHO they use a kind of spaghetti code approach which is not very professional). I will need to make some JSON synonym mappings in the binding which should probably help you to see more channels.

In general that would be the normal thing since the inverter is charging the battery. But I still find your battery data rather confusing, since it looks like you have two of them (one at 65volt and the other at 26volt). Is that correct?


EDIT: you can download a revised Jar with the Json field synonyms now implemented for your devices HERE.

EDIT 2: your "pvpowerout": 4294966929 Json value still looks ‘fishy’ but it will now not break the binding, and I guess you can simply ignore that channel.

@DirkNeumann I think that your "pvpowerout": 4294966929 Json value may be due to a bug in Grott since they seem to have changed the handling of that register to allow negative values (see link below). Reason why I say that is that ‘4294966929’ is a huge positive integer, but if you consider it as a two’s complement negative integer, it is a fairly small value i.e. -36.5 Watt.

=> Can you please confirm that you are using the correct version of Grott? And if so, perhaps you can raise an issue with @johanmeijer on his GitHub page?

Hi There,

thanks for feed back.
I am using 2.8.2 thus I need support for invtype=min.
@johanmeijer => Bug known?

@

@DirkNeumann in the meantime I also applied a fix within the binding HERE. => You can get the latest Jar HERE

Great!

Here the results:
“Saldierte Leistung” => activereactive_power is not shown (but I can calculate this from the 3 single powers.
Naming issue:
"Inverter Output Power (#R) => Gridpower (positive=from grid (“Import” or “reactive”) negative=to grid (“Export” or “active”)

Grid Frequency => *10 please.

For the inverter Data there is a bug (values are cross mixed) I guess:

“Inverter Energy to Charge Battery Today” => “AC Energy to charge Battery today”
“Import Energy to Charge Battery Today” => “Battery Overall Charge today”

BTW:
What is “User Id as displayed ion the Shine App” ?

22:49:50.870 [TRACE] [internal.handler.GrowattBridgeHandler] - handleGrottContent() json:"{\"device\": \"KLN0D6L034\", \"time\": \"2023-12-28T22:44:02\", \"buffered\": \"no\", \"values\": {\"pvserial\": \"KLN0D6L034\", \"pvstatus\": 1, \"pvpowerin\": 0, \"pv1voltage\": 669, \"pv1current\": 0, \"pv1watt\": 0, \"pv2voltage\": 695, \"pv2current\": 0, \"pv2watt\": 0, \"pv3voltage\": 0, \"pv3current\": 0, \"pv3watt\": 0, \"pv4voltage\": 0, \"pv4current\": 0, \"pv4watt\": 0, \"pvpowerout\": 4294966922, \"pvfrequentie\": 5001, \"pvgridvoltage\": 2326, \"pvgridcurrent\": 7, \"pvgridpower\": 1628, \"pvgridvoltage2\": 2324, \"pvgridcurrent2\": 7, \"pvgridpower2\": 1626, \"pvgridvoltage3\": 2331, \"pvgridcurrent3\": 7, \"pvgridpower3\": 1631, \"vacrs\": 4023, \"vacst\": 4033, \"vactr\": 4036, \"ptousertotal\": 7546, \"ptogridtotal\": 0, \"ptoloadtotal\": 7606, \"totworktime\": 429483, \"pvenergytoday\": 221, \"pvenergytotal\": 587, \"epvtotal \": 552, \"epv1today \": 77, \"epv1total\": 264, \"epv2today\": 86, \"epv2total\": 288, \"epv3today\": 0, \"epv3total\": 0, \"etousertoday\": 72, \"etousertotal\": 276, \"etogridtoday\": 3, \"etogridtotal\": 7, \"eloadtoday\": 285, \"eloadtotal\": 0, \"deratingmode\": 0, \"iso\": 65530, \"dcir\": 0, \"dcis\": 0, \"dcit\": 0, \"gfci\": 137528, \"pvtemperature\": 295, \"pvipmtemperature\": 410, \"temp3\": 295, \"temp4\": 0, \"temp5\": 320, \"pbusvoltage\": 3252, \"nbusvoltage\": 3205, \"ipf\": 20000, \"realoppercent\": 0, \"opfullwatt\": 150000, \"standbyflag\": 0, \"faultcode\": 0, \"warningcode\": 0, \"systemfaultword0\": 0, \"systemfaultword1\": 0, \"systemfaultword2\": 0, \"systemfaultword3\": 0, \"systemfaultword4\": 0, \"systemfaultword5\": 0, \"systemfaultword6\": 0, \"systemfaultword7\": 0, \"invstartdelaytime\": 60, \"bdconoffstate\": 1, \"drycontactstate\": 0, \"edischrtoday\": 161, \"edischrtotal\": 2129, \"echrtoday\": 108, \"echrtotal\": 3329, \"eacchrtoday\": 8, \"eacchrtotal\": 66, \"priority\": 1, \"epsfac\": 0, \"epsvac1\": 0, \"epsiac1\": 0, \"epspac1\": 0, \"epsvac2\": 0, \"epsiac2\": 0, \"epspac2\": 0, \"epsvac3\": 0, \"epsiac3\": 0, \"epspac3\": 0, \"epspac\": 0, \"loadpercent\": 0, \"pf\": 10000, \"dcv\": 0, \"bdc1_sysstatemode\": 513, \"bdc1_faultcode\": 0, \"bdc1_warncode\": 701, \"bdc1_vbat\": 6454, \"bdc1_ibat\": 0, \"bdc1_soc\": 11, \"bdc1_vbus1\": 6454, \"bdc1_vbus2\": 3238, \"bdc1_ibb\": 0, \"bdc1_illc\": 0, \"bdc1_tempa\": 423, \"bdc1_tempb\": 296, \"bdc1_pdischr\": 70, \"bdc1_pchr\": 0, \"bdc1_edischrtotal\": 2129, \"bdc1_echrtotal\": 3329, \"bdc1_flag\": 1, \"bdc2_sysstatemode\": 37, \"bdc2_faultcode\": 12, \"bdc2_warncode\": 270, \"bdc2_vbat\": 303, \"bdc2_ibat\": 232, \"bdc2_soc\": 19, \"bdc2_vbus1\": 49, \"bdc2_vbus2\": 12, \"bdc2_ibb\": 11, \"bdc2_illc\": 4, \"bdc2_tempa\": 0, \"bdc2_tempb\": 394, \"bdc2_pdischr\": 26214400, \"bdc2_pchr\": 0, \"bdc2_edischrtotal\": 0, \"bdc2_echrtotal\": 0, \"bdc2_flag\": 0, \"bms_status\": 4, \"bms_error\": 0, \"bms_warninfo\": 0, \"bms_soc\": 11, \"bms_batteryvolt\": 4026, \"bms_batterycurr\": 0, \"bms_batterytemp\": 0, \"bms_maxcurr\": 2200, \"bms_deltavolt\": 2200, \"bms_cyclecnt\": 0, \"bms_soh\": 99, \"bms_constantvolt\": 568, \"bms_bms_info\": 464, \"bms_packinfo\": 0, \"bms_usingcap\": 0, \"bms_fw\": 1400, \"bms_mcuversion\": 0, \"bms_commtype\": 1}}"
22:49:50.986 [DEBUG] [ternal.handler.GrowattInverterHandler] - updateInverterValues() channel count 88 reduced by 25 to 63
22:49:51.114 [DEBUG] [ternal.handler.GrowattInverterHandler] - updateInverterValues() channel count 88 reduced by 75 to 13
22:49:57.022 [TRACE] [internal.handler.GrowattBridgeHandler] - handleGrottContent() json:"{\"device\": \"GZL0DA804M\", \"time\": \"2023-12-28T22:44:07\", \"buffered\": \"no\", \"values\": {\"datalogserial\": \"GZL0DA804M\", \"pvserial\": \"KLN0D6L034\", \"voltage_l1\": 2316, \"voltage_l2\": 2317, \"voltage_l3\": 2325, \"Current_l1\": 18, \"Current_l2\": 15, \"Current_l3\": 11, \"act_power_l1\": 3838, \"act_power_l2\": 1667, \"act_power_l3\": 1974, \"app_power_l1\": 4174, \"app_power_l2\": 3364, \"app_power_l3\": 2518, \"react_power_l1\": -1642, \"react_power_l2\": -2922, \"react_power_l3\": -1564, \"powerfactor_l1\": 892, \"powerfactor_l2\": 484, \"powerfactor_l3\": 749, \"pos_rev_act_power\": 7481, \"pos_act_power\": 7481, \"rev_act_power\": 7481, \"app_power\": 10056, \"react_power\": -6129, \"powerfactor\": 720, \"frequency\": 500, \"L1-2_voltage\": 4012, \"L2-3_voltage\": 4020, \"L3-1_voltage\": 4019, \"pos_act_energy\": 9934, \"rev_act_energy\": 1537}}"

If you log out of the shine app, then you need to login again with some credentials. Use the same in OH.

There is no relation between import/export and active/reactive. The former relates to the direction of power flow. The latter refers to Watt resp. VAR …

Thanks!
Active+ Reactive=Apparwnt?
Whats the meaning of posiactivepower and reveractivepower ?

Indeed … but it is a vector sum.

image

I think ‘pos’ means import, ‘rev’ means export, ‘act’ means real power (that you pay for), ‘react’ means blind VAR (that you don’t pay for), and ‘apparent’ is the vector sum above.

Ok. I am trying to do the adaption for meter devices in two phases as follows…

  1. In a first step map the meter data fields as synonyms to existing defined channels for an inverter. This is fairly easy to do. We just need to define the best mapping.
  2. In a second step try to address any remaining meter data fields that cannot be mapped as synonyms above. This is more hard work for me, which I don’t want to do until we have exhausted the possibilities for 1. above

Now it looks like the meter data has the following fields…

  • pos_act_power with value >= 0 indicating import from grid
  • rev_act_power with value >= 0 indicating export to grid
  • act_power_l1 (resp. _l2, _l3) with +/- value indicating import if > 0 and export if < 0

So I think the best way (for step 1.) is to map the meter fields as synonyms to channels as follows…

  • pos_act_power => Import Power
  • rev_act_power => Export Power
  • act_power_l1 (resp. _l2, _l3) => Import Power R/S/T (whereby if the value is <0 it really means Export Power R/S/T)
  • Current_l1 (resp. _l2, _l3) => Inverter Current R/S/T (which may be +/- values)

EDIT: I think there may be a bug either in the meter raw data, or again in Grott … one would not expect to see the same values in all three of these fields (below). It is the wrong time of year so we may have to wait for a sunny day and you are exporting power to the grid. In the meantime I will apply the same logic as for the current elements.

image

This is difficult since the inverter data field has integer values frequency x 100 whereas the meter has frequency x 10 (another example of bad design by Growatt engineers). So for the time being (step 1.) I shall delete this channel from the meter. (You anyway have the correct channel data in the inverter).

Ok. Fixed.

@DirkNeumann the revised jar is HERE

1 Like

Data are similiar due to “Load First” ist perfectly achieving 0W apparent power at the net connector :wink:
I monitored these values a while ago.
A: rev_act_power = Import (active power)
B: pos_act_power = Export (active power)
C; pos_rev_act_power =A + B*-1 (power at net connector point). Negativ => Export, Positiv => Import

ptousertotal (Inverter) = pos_act_power (Smart Meter) = Import from Net
ptogridtotal (Inverter) = rev_act_power (Smart Meter) = Export to Grid

Difference ist “only” that in the Inverter values the internal inverter energy loss is somehow calculated (small offset between both values), while the smart Meter values are “measurement values”.

Summary: I need the smart meter values only for precise monitoring of inverter energy losses :wink:

Okay, now I will try to implement your manual to send commands to the inverter!

@DirkNeumann just for the avoidance of doubt, can you confirm that the channel mapping in the latest Jar is matching what you expect to see? Both for your meter and your inverter?

Hi Andrew,

JAR is installed, matching is OK. Thank you !!

“Minor” Findings:

  1. Smart Meter:
  • “pos_rev_act_power” missing, but matching inverter Values exist.
  1. Inverter:
  • Batterypower (Charging/Discharing Power) missing. (bdc1_pdischr and bdc1_pchr)
  • “pv1-energy-today” missing.
  • “standbyflag” missing
  • “Battery Display” = Status = “0.4” instead of “4”
  • “Battery Temp” = 0
  • “Temp4” = 0
  • “EnergytoLoad” => known Bug (Grott, Growatt)