@ -115,6 +115,7 @@ class Inverter {
RECORDTYPE * record ; // pointer for values
RECORDTYPE * record ; // pointer for values
uint16_t chMaxPwr [ 4 ] ; // maximum power of the modules (Wp)
uint16_t chMaxPwr [ 4 ] ; // maximum power of the modules (Wp)
char chName [ 4 ] [ MAX_NAME_LENGTH ] ; // human readable name for channel
char chName [ 4 ] [ MAX_NAME_LENGTH ] ; // human readable name for channel
String lastAlarmMsg ;
bool initialized ; // needed to check if the inverter was correctly added (ESP32 specific - union types are never null)
bool initialized ; // needed to check if the inverter was correctly added (ESP32 specific - union types are never null)
Inverter ( ) {
Inverter ( ) {
@ -126,6 +127,8 @@ class Inverter {
devControlCmd = 0xff ;
devControlCmd = 0xff ;
initialized = false ;
initialized = false ;
fwVersion = 0 ;
fwVersion = 0 ;
lastAlarmMsg = " nothing " ;
alarmMesIndex = 0 ;
}
}
~ Inverter ( ) {
~ Inverter ( ) {
@ -141,7 +144,8 @@ class Inverter {
void setQueuedCmdFinished ( ) {
void setQueuedCmdFinished ( ) {
if ( ! _commandQueue . empty ( ) ) {
if ( ! _commandQueue . empty ( ) ) {
_commandQueue . pop ( ) ; // Will destroy CommandAbstract Class Object (?)
// Will destroy CommandAbstract Class Object (?)
_commandQueue . pop ( ) ;
}
}
}
}
@ -150,7 +154,14 @@ class Inverter {
if ( _commandQueue . empty ( ) ) {
if ( _commandQueue . empty ( ) ) {
// Fill with default commands
// Fill with default commands
enqueCommand < InfoCommand > ( RealTimeRunData_Debug ) ;
enqueCommand < InfoCommand > ( RealTimeRunData_Debug ) ;
//enqueCommand<InfoCommand>(SystemConfigPara);
if ( fwVersion = = 0 )
{ // info needed maybe after "one nigth" (=> DC>0 to DC=0 and to DC>0) or reboot
enqueCommand < InfoCommand > ( InverterDevInform_All ) ;
}
if ( actPowerLimit = = 0xffff )
{ // info needed maybe after "one nigth" (=> DC>0 to DC=0 and to DC>0) or reboot
enqueCommand < InfoCommand > ( SystemConfigPara ) ;
}
}
}
return _commandQueue . front ( ) . get ( ) - > getCmd ( ) ;
return _commandQueue . front ( ) . get ( ) - > getCmd ( ) ;
}
}
@ -164,8 +175,6 @@ class Inverter {
memset ( name , 0 , MAX_NAME_LENGTH ) ;
memset ( name , 0 , MAX_NAME_LENGTH ) ;
memset ( chName , 0 , MAX_NAME_LENGTH * 4 ) ;
memset ( chName , 0 , MAX_NAME_LENGTH * 4 ) ;
memset ( record , 0 , sizeof ( RECORDTYPE ) * listLen ) ;
memset ( record , 0 , sizeof ( RECORDTYPE ) * listLen ) ;
enqueCommand < InfoCommand > ( InverterDevInform_All ) ;
enqueCommand < InfoCommand > ( SystemConfigPara ) ;
initialized = true ;
initialized = true ;
}
}
@ -206,12 +215,25 @@ class Inverter {
val < < = 8 ;
val < < = 8 ;
val | = buf [ ptr ] ;
val | = buf [ ptr ] ;
} while ( + + ptr ! = end ) ;
} while ( + + ptr ! = end ) ;
if ( ( RECORDTYPE ) ( div ) > 1 ) {
record [ pos ] = ( RECORDTYPE ) ( val ) / ( RECORDTYPE ) ( div ) ;
record [ pos ] = ( RECORDTYPE ) ( val ) / ( RECORDTYPE ) ( div ) ;
}
}
else {
record [ pos ] = ( RECORDTYPE ) ( val ) ;
}
}
if ( cmd = = RealTimeRunData_Debug ) {
if ( cmd = = RealTimeRunData_Debug ) {
// get last alarm message index and save it in the inverter object
// get last alarm message index and save it in the inverter object
if ( getPosByChFld ( 0 , FLD_ALARM_MES_ID ) = = pos ) {
if ( getPosByChFld ( 0 , FLD_ALARM_MES_ID ) = = pos ) {
if ( alarmMesIndex < record [ pos ] ) {
alarmMesIndex = record [ pos ] ;
alarmMesIndex = record [ pos ] ;
//enqueCommand<InfoCommand>(AlarmUpdate); // What is the function of AlarmUpdate?
enqueCommand < InfoCommand > ( AlarmData ) ;
}
else {
alarmMesIndex = record [ pos ] ; // no change
}
}
}
}
}
if ( cmd = = InverterDevInform_All ) {
if ( cmd = = InverterDevInform_All ) {
@ -228,6 +250,11 @@ class Inverter {
DPRINT ( DBG_DEBUG , F ( " Inverter actual power limit: " ) + String ( actPowerLimit ) ) ;
DPRINT ( DBG_DEBUG , F ( " Inverter actual power limit: " ) + String ( actPowerLimit ) ) ;
}
}
}
}
if ( cmd = = AlarmData ) {
if ( getPosByChFld ( 0 , FLD_LAST_ALARM_CODE ) = = pos ) {
lastAlarmMsg = getAlarmStr ( record [ pos ] ) ;
}
}
}
}
void power_on ( ) {
void power_on ( ) {
@ -275,17 +302,16 @@ class Inverter {
return false ;
return false ;
}
}
uint32_t getLastTs ( void ) {
uint32_t getLastTs ( void )
{
DPRINTLN ( DBG_VERBOSE , F ( " hmInverter.h:getLastTs " ) ) ;
DPRINTLN ( DBG_VERBOSE , F ( " hmInverter.h:getLastTs " ) ) ;
return ts ;
return ts ;
}
}
void getAssignment ( ) {
void getAssignment ( )
DPRINTLN ( DBG_DEBUG , F ( " hmInverter.h:getAssignment " ) ) ;
uint8_t cmd = getQueuedCmd ( ) ;
switch ( cmd )
{
{
case RealTimeRunData_Debug :
DPRINTLN ( DBG_DEBUG , F ( " hmInverter.h:getAssignment " ) ) ;
// Default assignment;
if ( INV_TYPE_1CH = = type )
if ( INV_TYPE_1CH = = type )
{
{
listLen = ( uint8_t ) ( HM1CH_LIST_LEN ) ;
listLen = ( uint8_t ) ( HM1CH_LIST_LEN ) ;
@ -310,6 +336,12 @@ class Inverter {
channels = 0 ;
channels = 0 ;
assign = NULL ;
assign = NULL ;
}
}
uint8_t cmd = getQueuedCmd ( ) ;
switch ( cmd )
{
case RealTimeRunData_Debug :
// Do nothing will use default
break ;
break ;
case InverterDevInform_All :
case InverterDevInform_All :
listLen = ( uint8_t ) ( HMINFO_LIST_LEN ) ;
listLen = ( uint8_t ) ( HMINFO_LIST_LEN ) ;
@ -319,10 +351,227 @@ class Inverter {
listLen = ( uint8_t ) ( HMSYSTEM_LIST_LEN ) ;
listLen = ( uint8_t ) ( HMSYSTEM_LIST_LEN ) ;
assign = ( byteAssign_t * ) SystemConfigParaAssignment ;
assign = ( byteAssign_t * ) SystemConfigParaAssignment ;
break ;
break ;
case AlarmData :
listLen = ( uint8_t ) ( HMALARMDATA_LIST_LEN ) ;
assign = ( byteAssign_t * ) AlarmDataAssignment ;
break ;
default :
default :
DPRINTLN ( DBG_INFO , " Parser not implemented " ) ;
DPRINTLN ( DBG_INFO , " Parser not implemented " ) ;
}
}
}
}
String getAlarmStr ( u_int16_t alarmCode )
{
switch ( alarmCode )
{
case 1 :
return String ( F ( " Inverter start " ) ) ;
break ;
case 2 :
return String ( F ( " DTU command failed " ) ) ;
break ;
case 121 :
return String ( F ( " Over temperature protection " ) ) ;
break ;
case 125 :
return String ( F ( " Grid configuration parameter error " ) ) ;
break ;
case 126 :
return String ( F ( " Software error code 126 " ) ) ;
break ;
case 127 :
return String ( F ( " Firmware error " ) ) ;
break ;
case 128 :
return String ( F ( " Software error code 128 " ) ) ;
break ;
case 129 :
return String ( F ( " Software error code 129 " ) ) ;
break ;
case 130 :
return String ( F ( " Offline " ) ) ;
break ;
case 141 :
return String ( F ( " Grid overvoltage " ) ) ;
break ;
case 142 :
return String ( F ( " Average grid overvoltage " ) ) ;
break ;
case 143 :
return String ( F ( " Grid undervoltage " ) ) ;
break ;
case 144 :
return String ( F ( " Grid overfrequency " ) ) ;
break ;
case 145 :
return String ( F ( " Grid underfrequency " ) ) ;
break ;
case 146 :
return String ( F ( " Rapid grid frequency change " ) ) ;
break ;
case 147 :
return String ( F ( " Power grid outage " ) ) ;
break ;
case 148 :
return String ( F ( " Grid disconnection " ) ) ;
break ;
case 149 :
return String ( F ( " Island detected " ) ) ;
break ;
case 205 :
return String ( F ( " Input port 1 & 2 overvoltage " ) ) ;
break ;
case 206 :
return String ( F ( " Input port 3 & 4 overvoltage " ) ) ;
break ;
case 207 :
return String ( F ( " Input port 1 & 2 undervoltage " ) ) ;
break ;
case 208 :
return String ( F ( " Input port 3 & 4 undervoltage " ) ) ;
break ;
case 209 :
return String ( F ( " Port 1 no input " ) ) ;
break ;
case 210 :
return String ( F ( " Port 2 no input " ) ) ;
break ;
case 211 :
return String ( F ( " Port 3 no input " ) ) ;
break ;
case 212 :
return String ( F ( " Port 4 no input " ) ) ;
break ;
case 213 :
return String ( F ( " PV-1 & PV-2 abnormal wiring " ) ) ;
break ;
case 214 :
return String ( F ( " PV-3 & PV-4 abnormal wiring " ) ) ;
break ;
case 215 :
return String ( F ( " PV-1 Input overvoltage " ) ) ;
break ;
case 216 :
return String ( F ( " PV-1 Input undervoltage " ) ) ;
break ;
case 217 :
return String ( F ( " PV-2 Input overvoltage " ) ) ;
break ;
case 218 :
return String ( F ( " PV-2 Input undervoltage " ) ) ;
break ;
case 219 :
return String ( F ( " PV-3 Input overvoltage " ) ) ;
break ;
case 220 :
return String ( F ( " PV-3 Input undervoltage " ) ) ;
break ;
case 221 :
return String ( F ( " PV-4 Input overvoltage " ) ) ;
break ;
case 222 :
return String ( F ( " PV-4 Input undervoltage " ) ) ;
break ;
case 301 :
return String ( F ( " Hardware error code 301 " ) ) ;
break ;
case 302 :
return String ( F ( " Hardware error code 302 " ) ) ;
break ;
case 303 :
return String ( F ( " Hardware error code 303 " ) ) ;
break ;
case 304 :
return String ( F ( " Hardware error code 304 " ) ) ;
break ;
case 305 :
return String ( F ( " Hardware error code 305 " ) ) ;
break ;
case 306 :
return String ( F ( " Hardware error code 306 " ) ) ;
break ;
case 307 :
return String ( F ( " Hardware error code 307 " ) ) ;
break ;
case 308 :
return String ( F ( " Hardware error code 308 " ) ) ;
break ;
case 309 :
return String ( F ( " Hardware error code 309 " ) ) ;
break ;
case 310 :
return String ( F ( " Hardware error code 310 " ) ) ;
break ;
case 311 :
return String ( F ( " Hardware error code 311 " ) ) ;
break ;
case 312 :
return String ( F ( " Hardware error code 312 " ) ) ;
break ;
case 313 :
return String ( F ( " Hardware error code 313 " ) ) ;
break ;
case 314 :
return String ( F ( " Hardware error code 314 " ) ) ;
break ;
case 5041 :
return String ( F ( " Error code-04 Port 1 " ) ) ;
break ;
case 5042 :
return String ( F ( " Error code-04 Port 2 " ) ) ;
break ;
case 5043 :
return String ( F ( " Error code-04 Port 3 " ) ) ;
break ;
case 5044 :
return String ( F ( " Error code-04 Port 4 " ) ) ;
break ;
case 5051 :
return String ( F ( " PV Input 1 Overvoltage/Undervoltage " ) ) ;
break ;
case 5052 :
return String ( F ( " PV Input 2 Overvoltage/Undervoltage " ) ) ;
break ;
case 5053 :
return String ( F ( " PV Input 3 Overvoltage/Undervoltage " ) ) ;
break ;
case 5054 :
return String ( F ( " PV Input 4 Overvoltage/Undervoltage " ) ) ;
break ;
case 5060 :
return String ( F ( " Abnormal bias " ) ) ;
break ;
case 5070 :
return String ( F ( " Over temperature protection " ) ) ;
break ;
case 5080 :
return String ( F ( " Grid Overvoltage/Undervoltage " ) ) ;
break ;
case 5090 :
return String ( F ( " Grid Overfrequency/Underfrequency " ) ) ;
break ;
case 5100 :
return String ( F ( " Island detected " ) ) ;
break ;
case 5120 :
return String ( F ( " EEPROM reading and writing error " ) ) ;
break ;
case 5150 :
return String ( F ( " 10 min value grid overvoltage " ) ) ;
break ;
case 5200 :
return String ( F ( " Firmware error " ) ) ;
break ;
case 8310 :
return String ( F ( " Shut down " ) ) ;
break ;
case 9000 :
return String ( F ( " Microinverter is suspected of being stolen " ) ) ;
break ;
default :
return String ( F ( " Unknown " ) ) ;
break ;
}
}
private :
private :
std : : queue < std : : shared_ptr < CommandAbstract > > _commandQueue ;
std : : queue < std : : shared_ptr < CommandAbstract > > _commandQueue ;