From ab6261da92b801c788287003080497af77e1fb4f Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Mon, 27 Jun 2022 19:26:16 +0200 Subject: [PATCH] Move the whole stats request into the inverter class This enables in future releases so send multiple requests for e.g. MI inverters --- lib/Hoymiles/src/Hoymiles.cpp | 3 +- lib/Hoymiles/src/HoymilesRadio.cpp | 8 ---- lib/Hoymiles/src/HoymilesRadio.h | 2 - lib/Hoymiles/src/inverters/HM_Abstract.cpp | 38 +++++++++++-------- lib/Hoymiles/src/inverters/HM_Abstract.h | 2 +- lib/Hoymiles/src/inverters/InverterAbstract.h | 3 +- 6 files changed, 27 insertions(+), 29 deletions(-) diff --git a/lib/Hoymiles/src/Hoymiles.cpp b/lib/Hoymiles/src/Hoymiles.cpp index f6cdc242..9118fa65 100644 --- a/lib/Hoymiles/src/Hoymiles.cpp +++ b/lib/Hoymiles/src/Hoymiles.cpp @@ -26,8 +26,7 @@ void HoymilesClass::loop() Serial.print(F("Fetch inverter: ")); Serial.println(iv->serial()); - iv->clearRxFragmentBuffer(); - _radio->sendTimePacket(iv); + iv->sendStatsRequest(_radio.get()); } if (++inverterPos >= getNumInverters()) { diff --git a/lib/Hoymiles/src/HoymilesRadio.cpp b/lib/Hoymiles/src/HoymilesRadio.cpp index a4ec9510..f9c7e674 100644 --- a/lib/Hoymiles/src/HoymilesRadio.cpp +++ b/lib/Hoymiles/src/HoymilesRadio.cpp @@ -273,14 +273,6 @@ bool HoymilesRadio::enqueTransaction(inverter_transaction_t* transaction) return false; } -void HoymilesRadio::sendTimePacket(std::shared_ptr iv) -{ - inverter_transaction_t payload; - if (iv->getStatsRequest(&payload)) { - enqueTransaction(&payload); - } -} - void HoymilesRadio::sendRetransmitPacket(uint8_t fragment_id) { sendEsbPacket(_activeSerial, currentTransaction.mainCmd, (uint8_t)(0x80 + fragment_id), 0, 0, 60); diff --git a/lib/Hoymiles/src/HoymilesRadio.h b/lib/Hoymiles/src/HoymilesRadio.h index 724b18ad..30411926 100644 --- a/lib/Hoymiles/src/HoymilesRadio.h +++ b/lib/Hoymiles/src/HoymilesRadio.h @@ -2,7 +2,6 @@ #include "CircularBuffer.h" #include "TimeoutHelper.h" -#include "inverters/InverterAbstract.h" #include "types.h" #include #include @@ -26,7 +25,6 @@ public: bool isIdle(); void sendEsbPacket(serial_u target, uint8_t mainCmd, uint8_t subCmd, uint8_t payload[], uint8_t len, uint32_t timeout, bool resend = false); - void sendTimePacket(std::shared_ptr iv); void sendRetransmitPacket(uint8_t fragment_id); void sendLastPacketAgain(); bool enqueTransaction(inverter_transaction_t* transaction); diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.cpp b/lib/Hoymiles/src/inverters/HM_Abstract.cpp index 84794c51..b8c01aca 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HM_Abstract.cpp @@ -5,28 +5,36 @@ HM_Abstract::HM_Abstract(uint64_t serial) : InverterAbstract(serial) {}; -bool HM_Abstract::getStatsRequest(inverter_transaction_t* payload) +bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio) { time_t now; time(&now); - memset(payload->payload, 0, MAX_RF_PAYLOAD_SIZE); + inverter_transaction_t payload; - payload->target.u64 = serial(); - payload->mainCmd = 0x15; - payload->subCmd = 0x80; - payload->timeout = 200; - payload->len = 16; + memset(payload.payload, 0, MAX_RF_PAYLOAD_SIZE); - payload->payload[0] = 0x0b; - payload->payload[1] = 0x00; + payload.target.u64 = serial(); + payload.mainCmd = 0x15; + payload.subCmd = 0x80; + payload.timeout = 200; + payload.len = 16; - HoymilesRadio::u32CpyLittleEndian(&payload->payload[2], now); // sets the 4 following elements {2, 3, 4, 5} - payload->payload[9] = 0x05; + payload.payload[0] = 0x0b; + payload.payload[1] = 0x00; - uint16_t crc = crc16(&payload->payload[0], 14); - payload->payload[14] = (crc >> 8) & 0xff; - payload->payload[15] = (crc)&0xff; + HoymilesRadio::u32CpyLittleEndian(&payload.payload[2], now); // sets the 4 following elements {2, 3, 4, 5} + payload.payload[9] = 0x05; - return now > 0; + uint16_t crc = crc16(&payload.payload[0], 14); + payload.payload[14] = (crc >> 8) & 0xff; + payload.payload[15] = (crc)&0xff; + + if (now > 0) { + clearRxFragmentBuffer(); + radio->enqueTransaction(&payload); + return true; + } + + return false; } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.h b/lib/Hoymiles/src/inverters/HM_Abstract.h index 9114f379..94e2941a 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.h +++ b/lib/Hoymiles/src/inverters/HM_Abstract.h @@ -5,5 +5,5 @@ class HM_Abstract : public InverterAbstract { public: HM_Abstract(uint64_t serial); - bool getStatsRequest(inverter_transaction_t* payload); + bool sendStatsRequest(HoymilesRadio* radio); }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 8c0034e2..c5250600 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -1,5 +1,6 @@ #pragma once +#include "HoymilesRadio.h" #include "types.h" #include #include @@ -111,7 +112,7 @@ public: const char* getChannelFieldUnit(uint8_t channel, uint8_t fieldId); const char* getChannelFieldName(uint8_t channel, uint8_t fieldId); - virtual bool getStatsRequest(inverter_transaction_t* payload) = 0; + virtual bool sendStatsRequest(HoymilesRadio* radio) = 0; uint32_t getLastStatsUpdate(); private: