Use ESP Logging Macros for hoymiles library

This commit is contained in:
Thomas Basler
2025-04-18 20:03:32 +02:00
parent 1c6dffbfce
commit 3eaff7e45c
15 changed files with 128 additions and 99 deletions

View File

@@ -17,6 +17,10 @@
#include "inverters/HM_2CH.h"
#include "inverters/HM_4CH.h"
#include <Arduino.h>
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
HoymilesClass Hoymiles;
@@ -63,7 +67,7 @@ void HoymilesClass::loop()
}
if (iv->getEnablePolling() || iv->getEnableCommands()) {
_messageOutput->printf("Fetch inverter: %s\n", iv->serialString().c_str());
ESP_LOGI(TAG, "Fetch inverter: %s", iv->serialString().c_str());
if (!iv->isReachable()) {
iv->sendChangeChannelRequest();
@@ -80,7 +84,7 @@ void HoymilesClass::loop()
// Fetch limit
if (((millis() - iv->SystemConfigPara()->getLastUpdateRequest() > HOY_SYSTEM_CONFIG_PARA_POLL_INTERVAL)
&& (millis() - iv->SystemConfigPara()->getLastUpdateCommand() > HOY_SYSTEM_CONFIG_PARA_POLL_MIN_DURATION))) {
_messageOutput->printf("Request SystemConfigPara\n");
ESP_LOGI(TAG, "Request SystemConfigPara");
iv->sendSystemConfigParaRequest();
}
@@ -96,13 +100,13 @@ void HoymilesClass::loop()
&& iv->DevInfo()->getLastUpdateSimple() > 0;
if (invalidDevInfo) {
_messageOutput->printf("DevInfo: No Valid Data\n");
ESP_LOGW(TAG, "DevInfo: No Valid Data");
}
if ((iv->DevInfo()->getLastUpdateAll() == 0)
|| (iv->DevInfo()->getLastUpdateSimple() == 0)
|| invalidDevInfo) {
_messageOutput->printf("Request device info\n");
ESP_LOGI(TAG, "Request device info");
iv->sendDevInfoRequest();
}
}
@@ -110,17 +114,17 @@ void HoymilesClass::loop()
// Set limit if required
if (iv->SystemConfigPara()->getLastLimitCommandSuccess() == CMD_NOK) {
_messageOutput->printf("Resend ActivePowerControl\n");
ESP_LOGI(TAG, "Resend ActivePowerControl");
iv->resendActivePowerControlRequest();
}
// Set power status if required
if (iv->PowerCommand()->getLastPowerCommandSuccess() == CMD_NOK) {
_messageOutput->printf("Resend PowerCommand\n");
ESP_LOGI(TAG, "Resend PowerCommand");
iv->resendPowerControlRequest();
}
_messageOutput->printf("Queue size - NRF: %" PRIu32 " CMT: %" PRIu32 "\n", _radioNrf->getQueueSize(), _radioCmt->getQueueSize());
ESP_LOGI(TAG, "Queue size - NRF: %" PRIu32 " CMT: %" PRIu32 "", _radioNrf->getQueueSize(), _radioCmt->getQueueSize());
_lastPoll = millis();
}
@@ -266,13 +270,3 @@ void HoymilesClass::setPollInterval(const uint32_t interval)
{
_pollInterval = interval;
}
void HoymilesClass::setMessageOutput(Print* output)
{
_messageOutput = output;
}
Print* HoymilesClass::getMessageOutput()
{
return _messageOutput;
}

View File

@@ -20,9 +20,6 @@ public:
void initCMT(const int8_t pin_sdio, const int8_t pin_clk, const int8_t pin_cs, const int8_t pin_fcs, const int8_t pin_gpio2, const int8_t pin_gpio3);
void loop();
void setMessageOutput(Print* output);
Print* getMessageOutput();
std::shared_ptr<InverterAbstract> addInverter(const char* name, const uint64_t serial);
std::shared_ptr<InverterAbstract> getInverterByPos(const uint8_t pos);
std::shared_ptr<InverterAbstract> getInverterBySerial(const uint64_t serial);
@@ -47,8 +44,6 @@ private:
uint32_t _pollInterval = 0;
uint32_t _lastPoll = 0;
Print* _messageOutput = &Serial;
};
extern HoymilesClass Hoymiles;

View File

@@ -1,10 +1,14 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2023 Thomas Basler and others
* Copyright (C) 2023-2025 Thomas Basler and others
*/
#include "HoymilesRadio.h"
#include "Hoymiles.h"
#include "crc.h"
#include "Hoymiles.h"
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
serial_u HoymilesRadio::DtuSerial() const
{
@@ -54,18 +58,18 @@ void HoymilesRadio::sendLastPacketAgain()
void HoymilesRadio::handleReceivedPackage()
{
if (_busyFlag && _rxTimeout.occured()) {
Hoymiles.getMessageOutput()->printf("RX Period End\n");
ESP_LOGI(TAG, "RX Period End");
std::shared_ptr<InverterAbstract> inv = Hoymiles.getInverterBySerial(_commandQueue.front().get()->getTargetAddress());
if (nullptr != inv) {
CommandAbstract* cmd = _commandQueue.front().get();
uint8_t verifyResult = inv->verifyAllFragments(*cmd);
if (verifyResult == FRAGMENT_ALL_MISSING_RESEND) {
Hoymiles.getMessageOutput()->printf("Nothing received, resend whole request\n");
ESP_LOGW(TAG, "Nothing received, resend whole request");
sendLastPacketAgain();
} else if (verifyResult == FRAGMENT_ALL_MISSING_TIMEOUT) {
Hoymiles.getMessageOutput()->printf("Nothing received, resend count exeeded\n");
ESP_LOGW(TAG, "Nothing received, resend count exeeded");
// Statistics: Count RX Fail No Answer
if (inv->RadioStats.TxRequestData > 0) {
inv->RadioStats.RxFailNoAnswer++;
@@ -75,7 +79,7 @@ void HoymilesRadio::handleReceivedPackage()
_busyFlag = false;
} else if (verifyResult == FRAGMENT_RETRANSMIT_TIMEOUT) {
Hoymiles.getMessageOutput()->printf("Retransmit timeout\n");
ESP_LOGW(TAG, "Retransmit timeout");
// Statistics: Count RX Fail Partial Answer
if (inv->RadioStats.TxRequestData > 0) {
inv->RadioStats.RxFailPartialAnswer++;
@@ -85,7 +89,7 @@ void HoymilesRadio::handleReceivedPackage()
_busyFlag = false;
} else if (verifyResult == FRAGMENT_HANDLE_ERROR) {
Hoymiles.getMessageOutput()->printf("Packet handling error\n");
ESP_LOGW(TAG, "Packet handling error");
// Statistics: Count RX Fail Corrupt Data
if (inv->RadioStats.TxRequestData > 0) {
inv->RadioStats.RxFailCorruptData++;
@@ -96,7 +100,7 @@ void HoymilesRadio::handleReceivedPackage()
} else if (verifyResult > 0) {
// Perform Retransmit
Hoymiles.getMessageOutput()->printf("Request retransmit: %" PRIu8 "\n", verifyResult);
ESP_LOGI(TAG, "Request retransmit: %" PRIu8 "", verifyResult);
// Statistics: Count TX Re-Request Fragment
inv->RadioStats.TxReRequestFragment++;
@@ -104,7 +108,7 @@ void HoymilesRadio::handleReceivedPackage()
} else {
// Successful received all packages
Hoymiles.getMessageOutput()->printf("Success\n");
ESP_LOGI(TAG, "Success");
// Statistics: Count RX Success
if (inv->RadioStats.TxRequestData > 0) {
inv->RadioStats.RxSuccess++;
@@ -115,7 +119,7 @@ void HoymilesRadio::handleReceivedPackage()
}
} else {
// If inverter was not found, assume the command is invalid
Hoymiles.getMessageOutput()->printf("RX: Invalid inverter found\n");
ESP_LOGW(TAG, "RX: Invalid inverter found");
// Statistics: Count RX Fail Unknown Data
_commandQueue.pop();
_busyFlag = false;
@@ -133,7 +137,7 @@ void HoymilesRadio::handleReceivedPackage()
sendEsbPacket(*cmd);
} else {
Hoymiles.getMessageOutput()->printf("TX: Invalid inverter found\n");
ESP_LOGE(TAG, "TX: Invalid inverter found");
_commandQueue.pop();
}
}

View File

@@ -8,7 +8,12 @@
#include <TimeoutHelper.h>
#ifdef HOY_DEBUG_QUEUE
#define DEBUG_PRINT(fmt, args...) Serial.printf(fmt, ##args)
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
#define DEBUG_PRINT(fmt, args...) ESP_LOGD(TAG, fmt, ##args)
#else
#define DEBUG_PRINT(fmt, args...) /* Don't do anything in release builds */
#endif
@@ -28,8 +33,8 @@ public:
void enqueCommand(std::shared_ptr<CommandAbstract> cmd)
{
DEBUG_PRINT("Queue size before: %ld\n", _commandQueue.size());
DEBUG_PRINT("Handling command %s with type %d\n", cmd.get()->getCommandName().c_str(), static_cast<uint8_t>(cmd.get()->getQueueInsertType()));
DEBUG_PRINT("Queue size before: %ld", _commandQueue.size());
DEBUG_PRINT("Handling command %s with type %d", cmd.get()->getCommandName().c_str(), static_cast<uint8_t>(cmd.get()->getQueueInsertType()));
switch (cmd.get()->getQueueInsertType()) {
case QueueInsertType::RemoveOldest:
_commandQueue.removeDuplicatedEntries(cmd);
@@ -39,7 +44,7 @@ public:
// and replaces the existing one with the new one.
// (The new one will not be pushed at the end of the queue)
if (_commandQueue.countSimilarCommands(cmd) > 0) {
DEBUG_PRINT(" ... existing entry will be replaced\n");
DEBUG_PRINT(" ... existing entry will be replaced");
_commandQueue.replaceEntries(cmd);
return;
}
@@ -48,7 +53,7 @@ public:
// Checks if the queue already contains a command like the new one
// and drops the new one. The new one will not be inserted.
if (_commandQueue.countSimilarCommands(cmd) > 0) {
DEBUG_PRINT(" ... new entry will be dropped\n");
DEBUG_PRINT(" ... new entry will be dropped");
return;
}
break;
@@ -58,10 +63,10 @@ public:
}
// Push the command into the queue if we reach this position of the code
DEBUG_PRINT(" ... new entry will be appended\n");
DEBUG_PRINT(" ... new entry will be appended");
_commandQueue.push(cmd);
DEBUG_PRINT("Queue size after: %ld\n", _commandQueue.size());
DEBUG_PRINT("Queue size after: %ld", _commandQueue.size());
}
template <typename T>

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2023-2024 Thomas Basler and others
* Copyright (C) 2023-2025 Thomas Basler and others
*/
#include "HoymilesRadio_CMT.h"
#include "Hoymiles.h"
@@ -8,6 +8,10 @@
#include "crc.h"
#include <FunctionalInterrupt.h>
#include <frozen/map.h>
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
constexpr CountryFrequencyDefinition_t make_value(FrequencyBand_t Band, uint32_t Freq_Legal_Min, uint32_t Freq_Legal_Max, uint32_t Freq_Default, uint32_t Freq_StartUp)
{
@@ -35,16 +39,16 @@ uint32_t HoymilesRadio_CMT::getFrequencyFromChannel(const uint8_t channel) const
uint8_t HoymilesRadio_CMT::getChannelFromFrequency(const uint32_t frequency) const
{
if ((frequency % getChannelWidth()) != 0) {
Hoymiles.getMessageOutput()->printf("%.3f MHz is not divisible by %" PRIu32 " kHz!\n", frequency / 1000000.0, getChannelWidth());
ESP_LOGE(TAG, "%.3f MHz is not divisible by %" PRIu32 " kHz!", frequency / 1000000.0, getChannelWidth());
return 0xFF; // ERROR
}
if (frequency < getMinFrequency() || frequency > getMaxFrequency()) {
Hoymiles.getMessageOutput()->printf("%.2f MHz is out of Hoymiles/CMT range! (%.2f MHz - %.2f MHz)\n",
ESP_LOGE(TAG, "%.2f MHz is out of Hoymiles/CMT range! (%.2f MHz - %.2f MHz)",
frequency / 1000000.0, getMinFrequency() / 1000000.0, getMaxFrequency() / 1000000.0);
return 0xFF; // ERROR
}
if (frequency < countryDefinition.at(_countryMode).Freq_Legal_Min || frequency > countryDefinition.at(_countryMode).Freq_Legal_Max) {
Hoymiles.getMessageOutput()->printf("!!! caution: %.2f MHz is out of region legal range! (%" PRIu32 " - %" PRIu32 " MHz)\n",
ESP_LOGE(TAG, "!!! caution: %.2f MHz is out of region legal range! (%" PRIu32 " - %" PRIu32 " MHz)",
frequency / 1000000.0,
static_cast<uint32_t>(countryDefinition.at(_countryMode).Freq_Legal_Min / 1e6),
static_cast<uint32_t>(countryDefinition.at(_countryMode).Freq_Legal_Max / 1e6));
@@ -96,10 +100,10 @@ void HoymilesRadio_CMT::init(const int8_t pin_sdio, const int8_t pin_clk, const
cmtSwitchDtuFreq(_inverterTargetFrequency); // start dtu at work freqency, for fast Rx if inverter is already on and frequency switched
if (!_radio->isChipConnected()) {
Hoymiles.getMessageOutput()->printf("CMT2300A: Connection error!!\n");
ESP_LOGE(TAG, "CMT2300A: Connection error!!");
return;
}
Hoymiles.getMessageOutput()->printf("CMT2300A: Connection successful\n");
ESP_LOGI(TAG, "CMT2300A: Connection successful");
if (pin_gpio2 >= 0) {
attachInterrupt(digitalPinToInterrupt(pin_gpio2), std::bind(&HoymilesRadio_CMT::handleInt1, this), RISING);
@@ -127,10 +131,10 @@ void HoymilesRadio_CMT::loop()
}
if (_packetReceived) {
Hoymiles.getMessageOutput()->printf("Interrupt received\n");
ESP_LOGV(TAG, "Interrupt received");
while (_radio->available()) {
if (_rxBuffer.size() > FRAGMENT_BUFFER_SIZE) {
Hoymiles.getMessageOutput()->printf("CMT2300A: Buffer full\n");
ESP_LOGE(TAG, "CMT2300A: Buffer full");
_radio->flush_rx();
continue;
}
@@ -164,17 +168,17 @@ void HoymilesRadio_CMT::loop()
if (nullptr != inv) {
// Save packet in inverter rx buffer
Hoymiles.getMessageOutput()->printf("RX %.2f MHz --> %s | %" PRId8 " dBm\n",
ESP_LOGD(TAG, "RX %.2f MHz --> %s | %" PRId8 " dBm",
getFrequencyFromChannel(f.channel) / 1000000.0, Utils::dumpArray(f.fragment, f.len).c_str(), f.rssi);
inv->addRxFragment(f.fragment, f.len, f.rssi);
} else {
Hoymiles.getMessageOutput()->printf("Inverter Not found!\n");
ESP_LOGE(TAG, "Inverter Not found!");
}
}
} else {
Hoymiles.getMessageOutput()->printf("Frame kaputt\n"); // ;-)
ESP_LOGW(TAG, "Frame kaputt"); // ;-)
}
// Remove paket from buffer even it was corrupted
@@ -192,9 +196,9 @@ void HoymilesRadio_CMT::setPALevel(const int8_t paLevel)
}
if (_radio->setPALevel(paLevel)) {
Hoymiles.getMessageOutput()->printf("CMT TX power set to %" PRId8 " dBm\n", paLevel);
ESP_LOGI(TAG, "CMT TX power set to %" PRId8 " dBm", paLevel);
} else {
Hoymiles.getMessageOutput()->printf("CMT TX power %" PRId8 " dBm is not defined! (min: -10 dBm, max: 20 dBm)\n", paLevel);
ESP_LOGE(TAG, "CMT TX power %" PRId8 " dBm is not defined! (min: -10 dBm, max: 20 dBm)", paLevel);
}
}
@@ -272,11 +276,11 @@ void HoymilesRadio_CMT::sendEsbPacket(CommandAbstract& cmd)
cmtSwitchDtuFreq(getInvBootFrequency());
}
Hoymiles.getMessageOutput()->printf("TX %s %.2f MHz --> %s\n",
ESP_LOGD(TAG, "TX %s %.2f MHz --> %s",
cmd.getCommandName().c_str(), getFrequencyFromChannel(_radio->getChannel()) / 1000000.0, cmd.dumpDataPayload().c_str());
if (!_radio->write(cmd.getDataPayload(), cmd.getDataSize())) {
Hoymiles.getMessageOutput()->printf("TX SPI Timeout\n");
ESP_LOGE(TAG, "TX SPI Timeout");
}
cmtSwitchDtuFreq(_inverterTargetFrequency);
_radio->startListening();

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022 Thomas Basler and others
* Copyright (C) 2022-2025 Thomas Basler and others
*/
#include "HoymilesRadio_NRF.h"
#include "Hoymiles.h"
@@ -8,6 +8,10 @@
#include "commands/RequestFrameCommand.h"
#include <Every.h>
#include <FunctionalInterrupt.h>
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
void HoymilesRadio_NRF::init(SPIClass* initialisedSpiBus, const uint8_t pinCE, const uint8_t pinIRQ)
{
@@ -25,10 +29,10 @@ void HoymilesRadio_NRF::init(SPIClass* initialisedSpiBus, const uint8_t pinCE, c
_radio->setRetries(0, 0);
_radio->maskIRQ(true, true, false); // enable only receiving interrupts
if (!_radio->isChipConnected()) {
Hoymiles.getMessageOutput()->printf("NRF: Connection error!!\n");
ESP_LOGE(TAG, "NRF: Connection error!!");
return;
}
Hoymiles.getMessageOutput()->printf("NRF: Connection successful\n");
ESP_LOGI(TAG, "NRF: Connection successful");
attachInterrupt(digitalPinToInterrupt(pinIRQ), std::bind(&HoymilesRadio_NRF::handleIntr, this), FALLING);
@@ -49,10 +53,10 @@ void HoymilesRadio_NRF::loop()
}
if (_packetReceived) {
Hoymiles.getMessageOutput()->printf("Interrupt received\n");
ESP_LOGV(TAG, "Interrupt received");
while (_radio->available()) {
if (_rxBuffer.size() > FRAGMENT_BUFFER_SIZE) {
Hoymiles.getMessageOutput()->printf("NRF: Buffer full\n");
ESP_LOGE(TAG, "NRF: Buffer full");
_radio->flush_rx();
continue;
}
@@ -76,16 +80,16 @@ void HoymilesRadio_NRF::loop()
if (nullptr != inv) {
// Save packet in inverter rx buffer
Hoymiles.getMessageOutput()->printf("RX Channel: %" PRIu8 " --> %s | %" PRId8 " dBm\n",
ESP_LOGD(TAG, "RX Channel: %" PRIu8 " --> %s | %" PRId8 " dBm",
f.channel, Utils::dumpArray(f.fragment, f.len).c_str(), f.rssi);
inv->addRxFragment(f.fragment, f.len, f.rssi);
} else {
Hoymiles.getMessageOutput()->printf("Inverter Not found!\n");
ESP_LOGE(TAG, "Inverter Not found!");
}
} else {
Hoymiles.getMessageOutput()->printf("Frame kaputt\n");
ESP_LOGW(TAG, "Frame kaputt");
}
// Remove paket from buffer even it was corrupted
@@ -182,7 +186,7 @@ void HoymilesRadio_NRF::sendEsbPacket(CommandAbstract& cmd)
openWritingPipe(s);
_radio->setRetries(3, 15);
Hoymiles.getMessageOutput()->printf("TX %s Channel: %" PRIu8 " --> %s\n",
ESP_LOGD(TAG, "TX %s Channel: %" PRIu8 " --> %s",
cmd.getCommandName().c_str(), _radio->getChannel(), cmd.dumpDataPayload().c_str());
_radio->write(cmd.getDataPayload(), cmd.getDataSize());

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022-2024 Thomas Basler and others
* Copyright (C) 2022-2025 Thomas Basler and others
*/
/*
@@ -19,8 +19,11 @@ Command structure:
ID Target Addr Source Addr Idx DT ? Time Gap Password CRC16 CRC8
*/
#include "RealTimeRunDataCommand.h"
#include "Hoymiles.h"
#include "inverters/InverterAbstract.h"
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
RealTimeRunDataCommand::RealTimeRunDataCommand(InverterAbstract* inv, const uint64_t router_address, const time_t time)
: MultiDataCommand(inv, router_address)
@@ -48,7 +51,7 @@ bool RealTimeRunDataCommand::handleResponse(const fragment_t fragment[], const u
const uint8_t fragmentsSize = getTotalFragmentSize(fragment, max_fragment_id);
const uint8_t expectedSize = _inv->Statistics()->getExpectedByteCount();
if (fragmentsSize < expectedSize) {
Hoymiles.getMessageOutput()->printf("ERROR in %s: Received fragment size: %" PRIu8 ", min expected size: %" PRIu8 "\n",
ESP_LOGE(TAG, "ERROR in %s: Received fragment size: %" PRIu8 ", min expected size: %" PRIu8 "",
getCommandName().c_str(), fragmentsSize, expectedSize);
return false;

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022-2024 Thomas Basler and others
* Copyright (C) 2022-2025 Thomas Basler and others
*/
/*
@@ -19,8 +19,11 @@ Command structure:
ID Target Addr Source Addr Idx DT ? Time Gap Password CRC16 CRC8
*/
#include "SystemConfigParaCommand.h"
#include "Hoymiles.h"
#include "inverters/InverterAbstract.h"
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
SystemConfigParaCommand::SystemConfigParaCommand(InverterAbstract* inv, const uint64_t router_address, const time_t time)
: MultiDataCommand(inv, router_address)
@@ -48,7 +51,7 @@ bool SystemConfigParaCommand::handleResponse(const fragment_t fragment[], const
const uint8_t fragmentsSize = getTotalFragmentSize(fragment, max_fragment_id);
const uint8_t expectedSize = _inv->SystemConfigPara()->getExpectedByteCount();
if (fragmentsSize < expectedSize) {
Hoymiles.getMessageOutput()->printf("ERROR in %s: Received fragment size: %" PRIu8 ", min expected size: %" PRIu8 "\n",
ESP_LOGE(TAG, "ERROR in %s: Received fragment size: %" PRIu8 ", min expected size: %" PRIu8 "",
getCommandName().c_str(), fragmentsSize, expectedSize);
return false;

View File

@@ -1,11 +1,14 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022 Thomas Basler and others
* Copyright (C) 2022-2025 Thomas Basler and others
*/
#include "InverterAbstract.h"
#include "../Hoymiles.h"
#include "crc.h"
#include <cstring>
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
InverterAbstract::InverterAbstract(HoymilesRadio* radio, const uint64_t serial)
{
@@ -195,12 +198,12 @@ void InverterAbstract::addRxFragment(const uint8_t fragment[], const uint8_t len
_lastRssi = rssi;
if (len < 11) {
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) fragment too short\n", __FILE__, __LINE__);
ESP_LOGE(TAG, "(%s, %d) fragment too short", __FILE__, __LINE__);
return;
}
if (len - 11 > MAX_RF_PAYLOAD_SIZE) {
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) fragment too large\n", __FILE__, __LINE__);
ESP_LOGE(TAG, "FATAL: (%s, %d) fragment too large", __FILE__, __LINE__);
return;
}
@@ -210,12 +213,12 @@ void InverterAbstract::addRxFragment(const uint8_t fragment[], const uint8_t len
const uint8_t fragmentId = fragmentCount & 0b01111111; // fragmentId is 1 based
if (fragmentId == 0) {
Hoymiles.getMessageOutput()->printf("ERROR: fragment id zero received and ignored\n");
ESP_LOGE(TAG, "Fragment id zero received and ignored");
return;
}
if (fragmentId >= MAX_RF_FRAGMENT_COUNT) {
Hoymiles.getMessageOutput()->printf("ERROR: fragment id %" PRIu8 " is too large for buffer and ignored\n", fragmentId);
ESP_LOGE(TAG, "Fragment id %" PRIu8 " is too large for buffer and ignored", fragmentId);
return;
}
@@ -239,7 +242,7 @@ uint8_t InverterAbstract::verifyAllFragments(CommandAbstract& cmd)
{
// All missing
if (_rxFragmentLastPacketId == 0) {
Hoymiles.getMessageOutput()->printf("All missing\n");
ESP_LOGW(TAG, "All missing");
if (cmd.getSendCount() <= cmd.getMaxResendCount()) {
return FRAGMENT_ALL_MISSING_RESEND;
} else {
@@ -250,7 +253,7 @@ uint8_t InverterAbstract::verifyAllFragments(CommandAbstract& cmd)
// Last fragment is missing (the one with 0x80)
if (_rxFragmentMaxPacketId == 0) {
Hoymiles.getMessageOutput()->printf("Last missing\n");
ESP_LOGW(TAG, "Last missing");
if (_rxFragmentRetransmitCnt++ < cmd.getMaxRetransmitCount()) {
return _rxFragmentLastPacketId + 1;
} else {
@@ -262,7 +265,7 @@ uint8_t InverterAbstract::verifyAllFragments(CommandAbstract& cmd)
// Middle fragment is missing
for (uint8_t i = 0; i < _rxFragmentMaxPacketId - 1; i++) {
if (!_rxFragmentBuffer[i].wasReceived) {
Hoymiles.getMessageOutput()->printf("Middle missing\n");
ESP_LOGW(TAG, "Middle missing");
if (_rxFragmentRetransmitCnt++ < cmd.getMaxRetransmitCount()) {
return i + 1;
} else {

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022-2024 Thomas Basler and others
* Copyright (C) 2022-2025 Thomas Basler and others
*/
/*
@@ -23,8 +23,11 @@ Data structure:
ID Source Addr Target Addr Idx ? wcode ? Start End ? ? ? ? wcode CRC8
*/
#include "AlarmLogParser.h"
#include "../Hoymiles.h"
#include <cstring>
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
const std::array<const AlarmMessage_t, ALARM_MSG_COUNT> AlarmLogParser::_alarmMessages = { {
{ AlarmMessageType_t::ALL, 1, "Inverter start", "Wechselrichter gestartet", "L'onduleur a démarré" },
@@ -205,7 +208,7 @@ void AlarmLogParser::clearBuffer()
void AlarmLogParser::appendFragment(const uint8_t offset, const uint8_t* payload, const uint8_t len)
{
if (offset + len > ALARM_LOG_PAYLOAD_SIZE) {
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) stats packet too large for buffer (%d > %d)\n", __FILE__, __LINE__, offset + len, ALARM_LOG_PAYLOAD_SIZE);
ESP_LOGE(TAG, "(%s, %d) stats packet too large for buffer (%d > %d)", __FILE__, __LINE__, offset + len, ALARM_LOG_PAYLOAD_SIZE);
return;
}
memcpy(&_payloadAlarmLog[offset], payload, len);

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022 - 2024 Thomas Basler and others
* Copyright (C) 2022 - 2025 Thomas Basler and others
*/
/*
@@ -28,8 +28,12 @@ Data structure (DevInfoSimpleCommand):
ID Source Addr Target Addr Idx FW Version HW Part No. HW Version ? ? ? CRC16 CRC8
*/
#include "DevInfoParser.h"
#include "../Hoymiles.h"
#include <cstring>
#include <ctime>
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
#define ALL 0xff
@@ -103,7 +107,7 @@ void DevInfoParser::clearBufferAll()
void DevInfoParser::appendFragmentAll(const uint8_t offset, const uint8_t* payload, const uint8_t len)
{
if (offset + len > DEV_INFO_SIZE) {
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) dev info all packet too large for buffer\n", __FILE__, __LINE__);
ESP_LOGE(TAG, "(%s, %d) dev info all packet too large for buffer", __FILE__, __LINE__);
return;
}
memcpy(&_payloadDevInfoAll[offset], payload, len);
@@ -119,7 +123,7 @@ void DevInfoParser::clearBufferSimple()
void DevInfoParser::appendFragmentSimple(const uint8_t offset, const uint8_t* payload, const uint8_t len)
{
if (offset + len > DEV_INFO_SIZE) {
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) dev info Simple packet too large for buffer\n", __FILE__, __LINE__);
ESP_LOGE(TAG, "(%s, %d) dev info Simple packet too large for buffer", __FILE__, __LINE__);
return;
}
memcpy(&_payloadDevInfoSimple[offset], payload, len);

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2023 - 2024 Thomas Basler and others
* Copyright (C) 2023 - 2025 Thomas Basler and others
*/
/*
@@ -20,11 +20,14 @@ ID Source Addr Target Addr Idx Profile ID Profile Version Section ID
The number of values depends on the respective section and its version. After the last value of a section follows the next section id.
*/
#include "GridProfileParser.h"
#include "../Hoymiles.h"
#include <cstring>
#include <esp_log.h>
#include <frozen/map.h>
#include <frozen/string.h>
#undef TAG
static const char* TAG = "hoymiles";
const std::array<const ProfileType_t, PROFILE_TYPE_COUNT> GridProfileParser::_profileTypes = { {
{ 0x02, 0x00, "US - NA_IEEE1547_240V" },
{ 0x03, 0x00, "DE - DE_VDE4105_2018" },
@@ -377,7 +380,7 @@ void GridProfileParser::clearBuffer()
void GridProfileParser::appendFragment(const uint8_t offset, const uint8_t* payload, const uint8_t len)
{
if (offset + len > GRID_PROFILE_SIZE) {
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) grid profile packet too large for buffer\n", __FILE__, __LINE__);
ESP_LOGE(TAG, "(%s, %d) grid profile packet too large for buffer", __FILE__, __LINE__);
return;
}
memcpy(&_payloadGridProfile[offset], payload, len);

View File

@@ -1,9 +1,12 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022 - 2023 Thomas Basler and others
* Copyright (C) 2022 - 2025 Thomas Basler and others
*/
#include "StatisticsParser.h"
#include "../Hoymiles.h"
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
static float calcTotalYieldTotal(StatisticsParser* iv, uint8_t arg0);
static float calcTotalYieldDay(StatisticsParser* iv, uint8_t arg0);
@@ -89,7 +92,7 @@ void StatisticsParser::clearBuffer()
void StatisticsParser::appendFragment(const uint8_t offset, const uint8_t* payload, const uint8_t len)
{
if (offset + len > STATISTIC_PACKET_SIZE) {
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) stats packet too large for buffer\n", __FILE__, __LINE__);
ESP_LOGE(TAG, "(%s, %d) stats packet too large for buffer", __FILE__, __LINE__);
return;
}
memcpy(&_payloadStatistic[offset], payload, len);
@@ -109,7 +112,7 @@ void StatisticsParser::endAppendFragment()
// check if current yield day is smaller then last cached yield day
if (getChannelFieldValue(TYPE_DC, c, FLD_YD) < _lastYieldDay[static_cast<uint8_t>(c)]) {
// currently all values are zero --> Add last known values to offset
Hoymiles.getMessageOutput()->printf("Yield Day reset detected!\n");
ESP_LOGI(TAG, "Yield Day reset detected!");
setChannelFieldOffset(TYPE_DC, c, FLD_YD, _lastYieldDay[static_cast<uint8_t>(c)]);

View File

@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2022 - 2024 Thomas Basler and others
* Copyright (C) 2022 - 2025 Thomas Basler and others
*/
/*
@@ -17,8 +17,11 @@ Data structure:
ID Source Addr Target Addr Idx ? Limit percent ? ? ? ? ? CRC16 CRC8
*/
#include "SystemConfigParaParser.h"
#include "../Hoymiles.h"
#include <cstring>
#include <esp_log.h>
#undef TAG
static const char* TAG = "hoymiles";
SystemConfigParaParser::SystemConfigParaParser()
: Parser()
@@ -35,7 +38,7 @@ void SystemConfigParaParser::clearBuffer()
void SystemConfigParaParser::appendFragment(const uint8_t offset, const uint8_t* payload, const uint8_t len)
{
if (offset + len > (SYSTEM_CONFIG_PARA_SIZE)) {
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) stats packet too large for buffer\n", __FILE__, __LINE__);
ESP_LOGE(TAG, "(%s, %d) stats packet too large for buffer", __FILE__, __LINE__);
return;
}
memcpy(&_payload[offset], payload, len);

View File

@@ -4,7 +4,6 @@
*/
#include "InverterSettings.h"
#include "Configuration.h"
#include "MessageOutput.h"
#include "PinMapping.h"
#include "SunPosition.h"
#include <Hoymiles.h>
@@ -28,7 +27,6 @@ void InverterSettingsClass::init(Scheduler& scheduler)
// Initialize inverter communication
ESP_LOGI(TAG, "Initialize Hoymiles interface...");
Hoymiles.setMessageOutput(&MessageOutput);
Hoymiles.init();
if (!PinMapping.isValidNrf24Config() && !PinMapping.isValidCmt2300Config()) {