2022-12-14 22:37:37 +01:00
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright ( C ) 2022 Thomas Basler and others
*/
2022-07-06 19:17:52 +02:00
# include "AlarmLogParser.h"
2022-12-19 20:52:12 +01:00
# include "../Hoymiles.h"
2022-07-06 19:17:52 +02:00
# include <cstring>
void AlarmLogParser : : clearBuffer ( )
{
2022-09-25 16:53:57 +02:00
memset ( _payloadAlarmLog , 0 , ALARM_LOG_PAYLOAD_SIZE ) ;
2022-07-06 19:17:52 +02:00
_alarmLogLength = 0 ;
}
void AlarmLogParser : : appendFragment ( uint8_t offset , uint8_t * payload , uint8_t len )
{
2022-09-25 16:53:57 +02:00
if ( offset + len > ALARM_LOG_PAYLOAD_SIZE ) {
2023-01-04 18:48:33 +01:00
Hoymiles . getMessageOutput ( ) - > printf ( " FATAL: (%s, %d) stats packet too large for buffer (%d > %d) \r \n " , __FILE__ , __LINE__ , offset + len , ALARM_LOG_PAYLOAD_SIZE ) ;
2022-07-14 18:54:53 +02:00
return ;
}
2022-07-06 19:17:52 +02:00
memcpy ( & _payloadAlarmLog [ offset ] , payload , len ) ;
_alarmLogLength + = len ;
}
uint8_t AlarmLogParser : : getEntryCount ( )
{
return ( _alarmLogLength - 2 ) / ALARM_LOG_ENTRY_SIZE ;
}
2022-09-24 10:02:33 +02:00
void AlarmLogParser : : setLastAlarmRequestSuccess ( LastCommandSuccess status )
{
_lastAlarmRequestSuccess = status ;
}
LastCommandSuccess AlarmLogParser : : getLastAlarmRequestSuccess ( )
{
return _lastAlarmRequestSuccess ;
}
2022-07-06 22:17:26 +02:00
void AlarmLogParser : : getLogEntry ( uint8_t entryId , AlarmLogEntry_t * entry )
2022-07-06 19:17:52 +02:00
{
uint8_t entryStartOffset = 2 + entryId * ALARM_LOG_ENTRY_SIZE ;
2022-07-06 22:17:26 +02:00
int timezoneOffset = getTimezoneOffset ( ) ;
2022-07-19 21:17:15 +02:00
uint32_t wcode = ( uint16_t ) _payloadAlarmLog [ entryStartOffset ] < < 8 | _payloadAlarmLog [ entryStartOffset + 1 ] ;
uint32_t startTimeOffset = 0 ;
2022-10-04 23:38:32 +02:00
if ( ( ( wcode > > 13 ) & 0x01 ) = = 1 ) {
2022-07-19 21:17:15 +02:00
startTimeOffset = 12 * 60 * 60 ;
}
uint32_t endTimeOffset = 0 ;
2022-10-04 23:38:32 +02:00
if ( ( ( wcode > > 12 ) & 0x01 ) = = 1 ) {
2022-07-19 21:17:15 +02:00
endTimeOffset = 12 * 60 * 60 ;
}
2022-07-06 19:17:52 +02:00
entry - > MessageId = _payloadAlarmLog [ entryStartOffset + 1 ] ;
2022-07-19 21:17:15 +02:00
entry - > StartTime = ( ( ( uint16_t ) _payloadAlarmLog [ entryStartOffset + 4 ] < < 8 ) | ( ( uint16_t ) _payloadAlarmLog [ entryStartOffset + 5 ] ) ) + startTimeOffset + timezoneOffset ;
2022-07-07 18:57:07 +02:00
entry - > EndTime = ( ( uint16_t ) _payloadAlarmLog [ entryStartOffset + 6 ] < < 8 ) | ( ( uint16_t ) _payloadAlarmLog [ entryStartOffset + 7 ] ) ;
if ( entry - > EndTime > 0 ) {
2022-07-19 21:17:15 +02:00
entry - > EndTime + = ( endTimeOffset + timezoneOffset ) ;
2022-07-07 18:57:07 +02:00
}
2022-07-06 19:17:52 +02:00
switch ( entry - > MessageId ) {
case 1 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Inverter start " ;
2022-07-06 19:17:52 +02:00
break ;
case 2 :
2023-04-04 18:51:18 +02:00
entry - > Message = " DTU command failed " ;
2022-07-06 19:17:52 +02:00
break ;
case 121 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Over temperature protection " ;
2022-07-06 19:17:52 +02:00
break ;
2022-10-02 23:52:35 +02:00
case 124 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Shut down by remote control " ;
2022-10-02 23:52:35 +02:00
break ;
2022-07-06 19:17:52 +02:00
case 125 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid configuration parameter error " ;
2022-07-06 19:17:52 +02:00
break ;
case 126 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Software error code 126 " ;
2022-07-06 19:17:52 +02:00
break ;
case 127 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Firmware error " ;
2022-07-06 19:17:52 +02:00
break ;
case 128 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Software error code 128 " ;
2022-07-06 19:17:52 +02:00
break ;
case 129 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Abnormal bias " ;
2022-07-06 19:17:52 +02:00
break ;
case 130 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Offline " ;
2022-07-06 19:17:52 +02:00
break ;
case 141 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: Grid overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 142 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: 10 min value grid overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 143 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: Grid undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 144 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: Grid overfrequency " ;
2022-07-06 19:17:52 +02:00
break ;
case 145 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: Grid underfrequency " ;
2022-07-06 19:17:52 +02:00
break ;
case 146 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: Rapid grid frequency change rate " ;
2022-07-06 19:17:52 +02:00
break ;
case 147 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: Power grid outage " ;
2022-07-06 19:17:52 +02:00
break ;
case 148 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: Grid disconnection " ;
2022-07-06 19:17:52 +02:00
break ;
case 149 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid: Island detected " ;
2022-07-06 19:17:52 +02:00
break ;
case 205 :
2023-04-04 18:51:18 +02:00
entry - > Message = " MPPT-A: Input overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 206 :
2023-04-04 18:51:18 +02:00
entry - > Message = " MPPT-B: Input overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 207 :
2023-04-04 18:51:18 +02:00
entry - > Message = " MPPT-A: Input undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 208 :
2023-04-04 18:51:18 +02:00
entry - > Message = " MPPT-B: Input undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 209 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-1: No input " ;
2022-07-06 19:17:52 +02:00
break ;
case 210 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-2: No input " ;
2022-07-06 19:17:52 +02:00
break ;
case 211 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-3: No input " ;
2022-07-06 19:17:52 +02:00
break ;
case 212 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-4: No input " ;
2022-07-06 19:17:52 +02:00
break ;
case 213 :
2023-04-04 18:51:18 +02:00
entry - > Message = " MPPT-A: PV-1 & PV-2 abnormal wiring " ;
2022-07-06 19:17:52 +02:00
break ;
case 214 :
2023-04-04 18:51:18 +02:00
entry - > Message = " MPPT-B: PV-3 & PV-4 abnormal wiring " ;
2022-07-06 19:17:52 +02:00
break ;
case 215 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-1: Input overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 216 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-1: Input undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 217 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-2: Input overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 218 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-2: Input undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 219 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-3: Input overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 220 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-3: Input undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 221 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-4: Input overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 222 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV-4: Input undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 301 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 301 " ;
2022-07-06 19:17:52 +02:00
break ;
case 302 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 302 " ;
2022-07-06 19:17:52 +02:00
break ;
case 303 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 303 " ;
2022-07-06 19:17:52 +02:00
break ;
case 304 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 304 " ;
2022-07-06 19:17:52 +02:00
break ;
case 305 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 305 " ;
2022-07-06 19:17:52 +02:00
break ;
case 306 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 306 " ;
2022-07-06 19:17:52 +02:00
break ;
case 307 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 307 " ;
2022-07-06 19:17:52 +02:00
break ;
case 308 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 308 " ;
2022-07-06 19:17:52 +02:00
break ;
case 309 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 309 " ;
2022-07-06 19:17:52 +02:00
break ;
case 310 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 310 " ;
2022-07-06 19:17:52 +02:00
break ;
case 311 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 311 " ;
2022-07-06 19:17:52 +02:00
break ;
case 312 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 312 " ;
2022-07-06 19:17:52 +02:00
break ;
case 313 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 313 " ;
2022-07-06 19:17:52 +02:00
break ;
case 314 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Hardware error code 314 " ;
2022-07-06 19:17:52 +02:00
break ;
case 5041 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Error code-04 Port 1 " ;
2022-07-06 19:17:52 +02:00
break ;
case 5042 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Error code-04 Port 2 " ;
2022-07-06 19:17:52 +02:00
break ;
case 5043 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Error code-04 Port 3 " ;
2022-07-06 19:17:52 +02:00
break ;
case 5044 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Error code-04 Port 4 " ;
2022-07-06 19:17:52 +02:00
break ;
case 5051 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV Input 1 Overvoltage/Undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 5052 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV Input 2 Overvoltage/Undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 5053 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV Input 3 Overvoltage/Undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 5054 :
2023-04-04 18:51:18 +02:00
entry - > Message = " PV Input 4 Overvoltage/Undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 5060 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Abnormal bias " ;
2022-07-06 19:17:52 +02:00
break ;
case 5070 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Over temperature protection " ;
2022-07-06 19:17:52 +02:00
break ;
case 5080 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid Overvoltage/Undervoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 5090 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Grid Overfrequency/Underfrequency " ;
2022-07-06 19:17:52 +02:00
break ;
case 5100 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Island detected " ;
2022-07-06 19:17:52 +02:00
break ;
case 5120 :
2023-04-04 18:51:18 +02:00
entry - > Message = " EEPROM reading and writing error " ;
2022-07-06 19:17:52 +02:00
break ;
case 5150 :
2023-04-04 18:51:18 +02:00
entry - > Message = " 10 min value grid overvoltage " ;
2022-07-06 19:17:52 +02:00
break ;
case 5200 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Firmware error " ;
2022-07-06 19:17:52 +02:00
break ;
case 8310 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Shut down " ;
2022-07-06 19:17:52 +02:00
break ;
case 9000 :
2023-04-04 18:51:18 +02:00
entry - > Message = " Microinverter is suspected of being stolen " ;
2022-07-06 19:17:52 +02:00
break ;
default :
2023-04-04 18:51:18 +02:00
entry - > Message = " Unknown " ;
2022-07-06 19:17:52 +02:00
break ;
}
2022-07-06 22:17:26 +02:00
}
int AlarmLogParser : : getTimezoneOffset ( )
{
// see: https://stackoverflow.com/questions/13804095/get-the-time-zone-gmt-offset-in-c/44063597#44063597
time_t gmt , rawtime = time ( NULL ) ;
2022-07-19 21:17:15 +02:00
struct tm * ptm ;
2022-07-06 22:17:26 +02:00
struct tm gbuf ;
ptm = gmtime_r ( & rawtime , & gbuf ) ;
// Request that mktime() looksup dst in timezone database
ptm - > tm_isdst = - 1 ;
gmt = mktime ( ptm ) ;
2022-09-15 18:48:22 +02:00
return static_cast < int > ( difftime ( rawtime , gmt ) ) ;
2022-07-06 19:17:52 +02:00
}