Fixed queue handling and added event log count
This commit is contained in:
parent
a9879c2f14
commit
56f764d10f
@ -118,6 +118,8 @@ void HoymilesRadio::loop()
|
|||||||
// Currently in idle mode --> send packet if one is in the queue
|
// Currently in idle mode --> send packet if one is in the queue
|
||||||
if (!_txBuffer.empty()) {
|
if (!_txBuffer.empty()) {
|
||||||
inverter_transaction_t* t = _txBuffer.getBack();
|
inverter_transaction_t* t = _txBuffer.getBack();
|
||||||
|
auto inv = Hoymiles.getInverterBySerial(t->target.u64);
|
||||||
|
inv->setLastRequest(t->requestType);
|
||||||
sendEsbPacket(t->target, t->mainCmd, t->subCmd, t->payload, t->len, t->timeout);
|
sendEsbPacket(t->target, t->mainCmd, t->subCmd, t->payload, t->len, t->timeout);
|
||||||
_txBuffer.popBack();
|
_txBuffer.popBack();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,7 @@ public:
|
|||||||
const uint8_t getAssignmentCount();
|
const uint8_t getAssignmentCount();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const byteAssign_t byteAssignment[21] = {
|
const byteAssign_t byteAssignment[22] = {
|
||||||
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
||||||
{ FLD_IDC, UNIT_A, CH1, 4, 2, 100 },
|
{ FLD_IDC, UNIT_A, CH1, 4, 2, 100 },
|
||||||
{ FLD_PDC, UNIT_W, CH1, 6, 2, 10 },
|
{ FLD_PDC, UNIT_W, CH1, 6, 2, 10 },
|
||||||
@ -31,6 +31,7 @@ private:
|
|||||||
{ FLD_PAC, UNIT_W, CH0, 30, 2, 10 },
|
{ FLD_PAC, UNIT_W, CH0, 30, 2, 10 },
|
||||||
{ FLD_F, UNIT_HZ, CH0, 28, 2, 100 },
|
{ FLD_F, UNIT_HZ, CH0, 28, 2, 100 },
|
||||||
{ FLD_T, UNIT_C, CH0, 38, 2, 10 },
|
{ FLD_T, UNIT_C, CH0, 38, 2, 10 },
|
||||||
|
{ FLD_EVT_LOG, UNIT_CNT, CH0, 40, 2, 1},
|
||||||
{ FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC },
|
{ FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC },
|
||||||
{ FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC },
|
{ FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC },
|
||||||
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
|
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
|
||||||
|
|||||||
@ -11,7 +11,7 @@ public:
|
|||||||
const uint8_t getAssignmentCount();
|
const uint8_t getAssignmentCount();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const byteAssign_t byteAssignment[34] = {
|
const byteAssign_t byteAssignment[35] = {
|
||||||
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
{ FLD_UDC, UNIT_V, CH1, 2, 2, 10 },
|
||||||
{ FLD_IDC, UNIT_A, CH1, 4, 2, 100 },
|
{ FLD_IDC, UNIT_A, CH1, 4, 2, 100 },
|
||||||
{ FLD_PDC, UNIT_W, CH1, 8, 2, 10 },
|
{ FLD_PDC, UNIT_W, CH1, 8, 2, 10 },
|
||||||
@ -46,6 +46,7 @@ private:
|
|||||||
{ FLD_F, UNIT_HZ, CH0, 48, 2, 100 },
|
{ FLD_F, UNIT_HZ, CH0, 48, 2, 100 },
|
||||||
{ FLD_PCT, UNIT_PCT, CH0, 56, 2, 10 },
|
{ FLD_PCT, UNIT_PCT, CH0, 56, 2, 10 },
|
||||||
{ FLD_T, UNIT_C, CH0, 58, 2, 10 },
|
{ FLD_T, UNIT_C, CH0, 58, 2, 10 },
|
||||||
|
{ FLD_EVT_LOG, UNIT_CNT, CH0, 60, 2, 1},
|
||||||
{ FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC },
|
{ FLD_YD, UNIT_WH, CH0, CALC_YD_CH0, 0, CMD_CALC },
|
||||||
{ FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC },
|
{ FLD_YT, UNIT_KWH, CH0, CALC_YT_CH0, 0, CMD_CALC },
|
||||||
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
|
{ FLD_PDC, UNIT_W, CH0, CALC_PDC_CH0, 0, CMD_CALC },
|
||||||
|
|||||||
@ -35,8 +35,9 @@ bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio)
|
|||||||
payload.payload[14] = (crc >> 8) & 0xff;
|
payload.payload[14] = (crc >> 8) & 0xff;
|
||||||
payload.payload[15] = (crc)&0xff;
|
payload.payload[15] = (crc)&0xff;
|
||||||
|
|
||||||
|
payload.requestType = RequestType::Stats;
|
||||||
|
|
||||||
clearRxFragmentBuffer();
|
clearRxFragmentBuffer();
|
||||||
radio->enqueTransaction(&payload);
|
radio->enqueTransaction(&payload);
|
||||||
setLastRequest(RequestType::Stats);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -113,8 +113,11 @@ uint8_t InverterAbstract::verifyAllFragments()
|
|||||||
offs += (_rxFragmentBuffer[i].len);
|
offs += (_rxFragmentBuffer[i].len);
|
||||||
}
|
}
|
||||||
_lastStatsUpdate = millis();
|
_lastStatsUpdate = millis();
|
||||||
|
} else {
|
||||||
|
Serial.println("Unkown response received");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setLastRequest(RequestType::None);
|
||||||
return FRAGMENT_OK;
|
return FRAGMENT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -16,9 +16,10 @@ enum {
|
|||||||
UNIT_KWH,
|
UNIT_KWH,
|
||||||
UNIT_HZ,
|
UNIT_HZ,
|
||||||
UNIT_C,
|
UNIT_C,
|
||||||
UNIT_PCT
|
UNIT_PCT,
|
||||||
|
UNIT_CNT
|
||||||
};
|
};
|
||||||
const char* const units[] = { "V", "A", "W", "Wh", "kWh", "Hz", "°C", "%" };
|
const char* const units[] = { "V", "A", "W", "Wh", "kWh", "Hz", "°C", "%", "" };
|
||||||
|
|
||||||
// field types
|
// field types
|
||||||
enum {
|
enum {
|
||||||
@ -34,10 +35,11 @@ enum {
|
|||||||
FLD_T,
|
FLD_T,
|
||||||
FLD_PCT,
|
FLD_PCT,
|
||||||
FLD_EFF,
|
FLD_EFF,
|
||||||
FLD_IRR
|
FLD_IRR,
|
||||||
|
FLD_EVT_LOG
|
||||||
};
|
};
|
||||||
const char* const fields[] = { "Voltage", "Current", "Power", "YieldDay", "YieldTotal",
|
const char* const fields[] = { "Voltage", "Current", "Power", "YieldDay", "YieldTotal",
|
||||||
"Voltage", "Current", "Power", "Frequency", "Temperature", "PowerFactor", "Effiency", "Irradiation" };
|
"Voltage", "Current", "Power", "Frequency", "Temperature", "PowerFactor", "Effiency", "Irradiation", "EventLogCount" };
|
||||||
|
|
||||||
// indices to calculation functions, defined in hmInverter.h
|
// indices to calculation functions, defined in hmInverter.h
|
||||||
enum {
|
enum {
|
||||||
@ -66,10 +68,6 @@ enum {
|
|||||||
FRAGMENT_OK = 0
|
FRAGMENT_OK = 0
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class RequestType {
|
|
||||||
Stats
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t fieldId; // field id
|
uint8_t fieldId; // field id
|
||||||
uint8_t unitId; // uint id
|
uint8_t unitId; // uint id
|
||||||
@ -134,8 +132,9 @@ public:
|
|||||||
virtual bool sendStatsRequest(HoymilesRadio* radio) = 0;
|
virtual bool sendStatsRequest(HoymilesRadio* radio) = 0;
|
||||||
uint32_t getLastStatsUpdate();
|
uint32_t getLastStatsUpdate();
|
||||||
|
|
||||||
protected:
|
|
||||||
void setLastRequest(RequestType request);
|
void setLastRequest(RequestType request);
|
||||||
|
|
||||||
|
protected:
|
||||||
RequestType getLastRequest();
|
RequestType getLastRequest();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -150,5 +149,5 @@ private:
|
|||||||
uint32_t _lastStatsUpdate = 0;
|
uint32_t _lastStatsUpdate = 0;
|
||||||
uint16_t _chanMaxPower[CH4];
|
uint16_t _chanMaxPower[CH4];
|
||||||
|
|
||||||
RequestType _lastRequest;
|
RequestType _lastRequest = RequestType::None;
|
||||||
};
|
};
|
||||||
@ -15,8 +15,14 @@ typedef struct {
|
|||||||
uint8_t len;
|
uint8_t len;
|
||||||
} fragment_t;
|
} fragment_t;
|
||||||
|
|
||||||
|
enum class RequestType {
|
||||||
|
None,
|
||||||
|
Stats
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
serial_u target;
|
serial_u target;
|
||||||
|
RequestType requestType = RequestType::None;
|
||||||
uint8_t mainCmd;
|
uint8_t mainCmd;
|
||||||
uint8_t subCmd;
|
uint8_t subCmd;
|
||||||
uint8_t payload[MAX_RF_PAYLOAD_SIZE];
|
uint8_t payload[MAX_RF_PAYLOAD_SIZE];
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user