From 8f2a2b40b1c4b6ba3dc049dd220d6403fcbea706 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Wed, 24 May 2023 21:55:15 +0200 Subject: [PATCH] Fix: Filter incoming packages from CMT module for the right destination address The CMT module receives every package on it's target frequency. Compared to the NRF module to filtering takes place. Therefor it's required to check if the package destination id is really the id of our dtu --- lib/Hoymiles/src/HoymilesRadio_CMT.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp index b083248..4c3285f 100644 --- a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp @@ -121,17 +121,25 @@ void HoymilesRadio_CMT::loop() if (!_rxBuffer.empty()) { fragment_t f = _rxBuffer.back(); if (checkFragmentCrc(&f)) { - std::shared_ptr inv = Hoymiles.getInverterByFragment(&f); - if (nullptr != inv) { - // Save packet in inverter rx buffer - Hoymiles.getMessageOutput()->printf("RX %.2f MHz --> ", getFrequencyFromChannel(f.channel)); - dumpBuf(f.fragment, f.len, false); - Hoymiles.getMessageOutput()->printf("| %d dBm\r\n", f.rssi); + serial_u dtuId = convertSerialToRadioId(_dtuSerial); - inv->addRxFragment(f.fragment, f.len); - } else { - Hoymiles.getMessageOutput()->println("Inverter Not found!"); + // The CMT RF module does not filter foreign packages by itself. + // Has to be done manually here. + if (memcmp(&f.fragment[5], &dtuId.b[1], 4) == 0) { + + std::shared_ptr inv = Hoymiles.getInverterByFragment(&f); + + if (nullptr != inv) { + // Save packet in inverter rx buffer + Hoymiles.getMessageOutput()->printf("RX %.2f MHz --> ", getFrequencyFromChannel(f.channel)); + dumpBuf(f.fragment, f.len, false); + Hoymiles.getMessageOutput()->printf("| %d dBm\r\n", f.rssi); + + inv->addRxFragment(f.fragment, f.len); + } else { + Hoymiles.getMessageOutput()->println("Inverter Not found!"); + } } } else {