@@ -14,8 +14,13 @@ const int REG_I_CC = 28;
1414const int REG_T_BAT = 37 ;
1515const int REG_CHARGE_STATE = 50 ;
1616const int REG_POUT = 58 ;
17+ const int REG_V_BAT_MIN = 64 ;
18+ const int REG_V_BAT_MAX = 65 ;
19+ const int REG_V_PV_MAX = 66 ;
1720const int REG_WHC_DAILY = 68 ;
1821const int REG_POUT_MAX_DAILY= 70 ;
22+ const int REG_T_FLOAT = 79 ;
23+ const int REG_T_ABS = 77 ;
1924const int REG_LAST_DYN = 79 ;
2025const int REG_EHW_VERSION = 57549 ;
2126const int REG_ESERIAL = 57536 ;
@@ -25,14 +30,19 @@ static struct _TsmpptDynVals
2530 double m_v_pu; // Voltage scaling
2631 double m_i_pu; // Current scaling
2732 double m_v_bat; // Battery voltage
33+ double m_v_bat_max; // Max battery voltage, daily
34+ double m_v_bat_min; // Min battery voltage, daily
2835 double m_t_bat; // Battery temperature
2936 double m_i_cc; // Charging current
3037 double m_v_pv; // PV array voltage
3138 double m_pout; // Output power
3239 double m_i_pv; // PV array current
3340 double m_p_max; // Max power, daily
3441 double m_whc; // Watt hours, daily
42+ double m_v_pv_max; // Max PV voltage, daily
3543 int m_cs; // Charge state
44+ int m_t_abs; // Time in absorption
45+ int m_t_float; // Time in float
3646} TsmpptDynVals;
3747
3848static struct _TsmpptStatVals
@@ -152,6 +162,14 @@ void Tsmppt::updateValues()
152162 double temp = (double )reg[REG_V_BAT-REG_FIRST_DYN] * TsmpptDynVals.m_v_pu / 32768.0 ;
153163 setBatteryVoltage (temp);
154164
165+ // Max Battery voltage:
166+ temp = (double )reg[REG_V_BAT_MAX-REG_FIRST_DYN] * TsmpptDynVals.m_v_pu / 32768.0 ;
167+ setBatteryVoltageMaxDaily (temp);
168+
169+ // Min Battery voltage:
170+ temp = (double )reg[REG_V_BAT_MIN-REG_FIRST_DYN] * TsmpptDynVals.m_v_pu / 32768.0 ;
171+ setBatteryVoltageMinDaily (temp);
172+
155173 // Battery temperature:
156174 temp = (double )(int16_t )reg[REG_T_BAT-REG_FIRST_DYN];
157175 setBatteryTemperature (temp);
@@ -168,23 +186,29 @@ void Tsmppt::updateValues()
168186 temp = (double )reg[REG_V_PV-REG_FIRST_DYN] * TsmpptDynVals.m_v_pu / 32768.0 ;
169187 setArrayVoltage (temp);
170188
189+ // Max PV array voltage:
190+ temp = (double )reg[REG_V_PV_MAX-REG_FIRST_DYN] * TsmpptDynVals.m_v_pu / 32768.0 ;
191+ setArrayVoltageMaxDaily (temp);
192+
171193 // PV array current:
172194 temp = (double )reg[REG_I_PV-REG_FIRST_DYN] * TsmpptDynVals.m_i_pu / 32768.0 ;
173195 setArrayCurrent (temp);
174196
175-
176-
177-
178197 // Whc daily:
179198 temp = (double )reg[REG_WHC_DAILY-REG_FIRST_DYN];
199+ // CCGX expects kWh:
200+ temp /= 1000.0 ;
180201 setWattHoursDaily (temp);
181202
182203 // Pmax daily:
183204 temp = (double )reg[REG_POUT_MAX_DAILY-REG_FIRST_DYN] * TsmpptDynVals.m_i_pu * TsmpptDynVals.m_v_pu / 131072.0 ;
184- setMaxPowerDaily (temp);
205+ setPowerMaxDaily (temp);
185206
186207 // Charge state:
187208 setChargeState (reg[REG_CHARGE_STATE-REG_FIRST_DYN]);
209+
210+ setTimeInAbsorption (reg[REG_T_ABS-REG_FIRST_DYN]/60 );
211+ setTimeInFloat (reg[REG_T_FLOAT-REG_FIRST_DYN]/60 );
188212}
189213
190214QString Tsmppt::firmwareVersion () const
@@ -215,6 +239,32 @@ void Tsmppt::setBatteryVoltage(double v)
215239 emit batteryVoltageChanged ();
216240}
217241
242+ double Tsmppt::batteryVoltageMaxDaily () const
243+ {
244+ return TsmpptDynVals.m_v_bat_max ;
245+ }
246+
247+ void Tsmppt::setBatteryVoltageMaxDaily (double v)
248+ {
249+ if (TsmpptDynVals.m_v_bat_max == v)
250+ return ;
251+ TsmpptDynVals.m_v_bat_max = v;
252+ emit batteryVoltageMaxDailyChanged ();
253+ }
254+
255+ double Tsmppt::batteryVoltageMinDaily () const
256+ {
257+ return TsmpptDynVals.m_v_bat_min ;
258+ }
259+
260+ void Tsmppt::setBatteryVoltageMinDaily (double v)
261+ {
262+ if (TsmpptDynVals.m_v_bat_min == v)
263+ return ;
264+ TsmpptDynVals.m_v_bat_min = v;
265+ emit batteryVoltageMinDailyChanged ();
266+ }
267+
218268double Tsmppt::batteryTemperature () const
219269{
220270 return TsmpptDynVals.m_t_bat ;
@@ -280,17 +330,30 @@ void Tsmppt::setArrayVoltage(double v)
280330 emit arrayVoltageChanged ();
281331}
282332
283- double Tsmppt::maxPowerDaily () const
333+ double Tsmppt::arrayVoltageMaxDaily () const
334+ {
335+ return TsmpptDynVals.m_v_pv_max ;
336+ }
337+
338+ void Tsmppt::setArrayVoltageMaxDaily (double v)
339+ {
340+ if (TsmpptDynVals.m_v_pv_max == v)
341+ return ;
342+ TsmpptDynVals.m_v_pv_max = v;
343+ emit arrayVoltageMaxDailyChanged ();
344+ }
345+
346+ double Tsmppt::powerMaxDaily () const
284347{
285348 return TsmpptDynVals.m_p_max ;
286349}
287350
288- void Tsmppt::setMaxPowerDaily (double v)
351+ void Tsmppt::setPowerMaxDaily (double v)
289352{
290353 if (TsmpptDynVals.m_p_max == v)
291354 return ;
292355 TsmpptDynVals.m_p_max = v;
293- emit maxPowerDailyChanged ();
356+ emit powerMaxDailyChanged ();
294357}
295358
296359double Tsmppt::wattHoursDaily () const
@@ -332,6 +395,32 @@ void Tsmppt::setChargeState(int v)
332395 emit chargeStateChanged ();
333396}
334397
398+ int Tsmppt::timeInAbsorption () const
399+ {
400+ return TsmpptDynVals.m_t_abs ;
401+ }
402+
403+ void Tsmppt::setTimeInAbsorption (int v)
404+ {
405+ if (TsmpptDynVals.m_t_abs == v)
406+ return ;
407+ TsmpptDynVals.m_t_abs = v;
408+ emit timeInAbsorptionChanged ();
409+ }
410+
411+ int Tsmppt::timeInFloat () const
412+ {
413+ return TsmpptDynVals.m_t_float ;
414+ }
415+
416+ void Tsmppt::setTimeInFloat (int v)
417+ {
418+ if (TsmpptDynVals.m_t_float == v)
419+ return ;
420+ TsmpptDynVals.m_t_float = v;
421+ emit timeInAbsorptionChanged ();
422+ }
423+
335424QString Tsmppt::productName () const
336425{
337426 return QString (" TriStar MPPT 60" );
0 commit comments