From edfe06e31eae286fbb88da69e9b65420cfa8628a Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Fri, 4 Oct 2024 17:36:17 +0200 Subject: [PATCH] Feature: Show RSSI of last received packet in radio stats The value is also published via MQTT --- lib/Hoymiles/src/HoymilesRadio_CMT.cpp | 2 +- lib/Hoymiles/src/HoymilesRadio_NRF.cpp | 2 +- lib/Hoymiles/src/inverters/InverterAbstract.cpp | 9 ++++++++- lib/Hoymiles/src/inverters/InverterAbstract.h | 6 +++++- src/MqttHandleHass.cpp | 1 + src/MqttHandleInverter.cpp | 1 + src/WebApi_ws_live.cpp | 1 + webapp/src/locales/de.json | 5 ++++- webapp/src/locales/en.json | 5 ++++- webapp/src/locales/fr.json | 5 ++++- webapp/src/types/LiveDataStatus.ts | 1 + webapp/src/views/HomeView.vue | 12 ++++++++++++ 12 files changed, 43 insertions(+), 7 deletions(-) diff --git a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp index bbd31f21..f6d19588 100644 --- a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp @@ -169,7 +169,7 @@ void HoymilesRadio_CMT::loop() dumpBuf(f.fragment, f.len, false); Hoymiles.getMessageOutput()->printf("| %d dBm\r\n", f.rssi); - inv->addRxFragment(f.fragment, f.len); + inv->addRxFragment(f.fragment, f.len, f.rssi); } else { Hoymiles.getMessageOutput()->println("Inverter Not found!"); } diff --git a/lib/Hoymiles/src/HoymilesRadio_NRF.cpp b/lib/Hoymiles/src/HoymilesRadio_NRF.cpp index 4bf104ad..bd496afe 100644 --- a/lib/Hoymiles/src/HoymilesRadio_NRF.cpp +++ b/lib/Hoymiles/src/HoymilesRadio_NRF.cpp @@ -80,7 +80,7 @@ void HoymilesRadio_NRF::loop() dumpBuf(f.fragment, f.len, false); Hoymiles.getMessageOutput()->printf("| %d dBm\r\n", f.rssi); - inv->addRxFragment(f.fragment, f.len); + inv->addRxFragment(f.fragment, f.len, f.rssi); } else { Hoymiles.getMessageOutput()->println("Inverter Not found!"); } diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index 3e51bbd7..7fe522f3 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -137,6 +137,11 @@ bool InverterAbstract::getClearEventlogOnMidnight() const return _clearEventlogOnMidnight; } +int8_t InverterAbstract::getLastRssi() const +{ + return _lastRssi; +} + bool InverterAbstract::sendChangeChannelRequest() { return false; @@ -185,8 +190,10 @@ void InverterAbstract::clearRxFragmentBuffer() _rxFragmentRetransmitCnt = 0; } -void InverterAbstract::addRxFragment(const uint8_t fragment[], const uint8_t len) +void InverterAbstract::addRxFragment(const uint8_t fragment[], const uint8_t len, const int8_t rssi) { + _lastRssi = rssi; + if (len < 11) { Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) fragment too short\r\n", __FILE__, __LINE__); return; diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index f139fab3..2f49f912 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -61,8 +61,10 @@ public: void setClearEventlogOnMidnight(const bool enabled); bool getClearEventlogOnMidnight() const; + int8_t getLastRssi() const; + void clearRxFragmentBuffer(); - void addRxFragment(const uint8_t fragment[], const uint8_t len); + void addRxFragment(const uint8_t fragment[], const uint8_t len, const int8_t rssi); uint8_t verifyAllFragments(CommandAbstract& cmd); void performDailyTask(); @@ -131,6 +133,8 @@ private: bool _zeroYieldDayOnMidnight = false; bool _clearEventlogOnMidnight = false; + int8_t _lastRssi = 0; + std::unique_ptr _alarmLogParser; std::unique_ptr _devInfoParser; std::unique_ptr _gridProfileParser; diff --git a/src/MqttHandleHass.cpp b/src/MqttHandleHass.cpp index 7afa87da..6491c9ba 100644 --- a/src/MqttHandleHass.cpp +++ b/src/MqttHandleHass.cpp @@ -97,6 +97,7 @@ void MqttHandleHassClass::publishConfig() publishInverterSensor(inv, "RX Fail Receive Partial", "radio/rx_fail_partial", "", "", DEVICE_CLS_NONE, STATE_CLS_NONE, CATEGORY_DIAGNOSTIC); publishInverterSensor(inv, "RX Fail Receive Corrupt", "radio/rx_fail_corrupt", "", "", DEVICE_CLS_NONE, STATE_CLS_NONE, CATEGORY_DIAGNOSTIC); publishInverterSensor(inv, "TX Re-Request Fragment", "radio/tx_re_request", "", "", DEVICE_CLS_NONE, STATE_CLS_NONE, CATEGORY_DIAGNOSTIC); + publishInverterSensor(inv, "RSSI", "radio/rssi", "dBm", "", DEVICE_CLS_SIGNAL_STRENGTH, STATE_CLS_NONE, CATEGORY_DIAGNOSTIC); // Loop all channels for (auto& t : inv->Statistics()->getChannelTypes()) { diff --git a/src/MqttHandleInverter.cpp b/src/MqttHandleInverter.cpp index 8e720663..6185f193 100644 --- a/src/MqttHandleInverter.cpp +++ b/src/MqttHandleInverter.cpp @@ -50,6 +50,7 @@ void MqttHandleInverterClass::loop() MqttSettings.publish(subtopic + "/radio/rx_fail_nothing", String(inv->RadioStats.RxFailNoAnswer)); MqttSettings.publish(subtopic + "/radio/rx_fail_partial", String(inv->RadioStats.RxFailPartialAnswer)); MqttSettings.publish(subtopic + "/radio/rx_fail_corrupt", String(inv->RadioStats.RxFailCorruptData)); + MqttSettings.publish(subtopic + "/radio/rssi", String(inv->getLastRssi())); if (inv->DevInfo()->getLastUpdate() > 0) { // Bootloader Version diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index 29c204a3..a50a792a 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -153,6 +153,7 @@ void WebApiWsLiveClass::generateInverterCommonJsonResponse(JsonObject& root, std root["radio_stats"]["rx_fail_nothing"] = inv->RadioStats.RxFailNoAnswer; root["radio_stats"]["rx_fail_partial"] = inv->RadioStats.RxFailPartialAnswer; root["radio_stats"]["rx_fail_corrupt"] = inv->RadioStats.RxFailCorruptData; + root["radio_stats"]["rssi"] = inv->getLastRssi(); } void WebApiWsLiveClass::generateInverterChannelJsonResponse(JsonObject& root, std::shared_ptr inv) diff --git a/webapp/src/locales/de.json b/webapp/src/locales/de.json index 995f6ec7..0bc17768 100644 --- a/webapp/src/locales/de.json +++ b/webapp/src/locales/de.json @@ -150,7 +150,10 @@ "RxFailCorrupt": "Empfang Fehler: Beschädigt empfangen", "TxReRequest": "Gesendete Fragment Wiederanforderungen", "StatsReset": "Statistiken zurücksetzen", - "StatsResetting": "Zurücksetzen..." + "StatsResetting": "Zurücksetzen...", + "Rssi": "RSSI des zuletzt empfangenen Paketes", + "RssiHint": "HM-Wechselrichter unterstützen nur RSSI-Werte < -64 dBm und > -64 dBm. In diesem Fall wird -80 dBm und -30 dBm angezeigt.", + "dBm": "{dbm} dBm" }, "eventlog": { "Start": "Beginn", diff --git a/webapp/src/locales/en.json b/webapp/src/locales/en.json index cf3c74f0..f760178f 100644 --- a/webapp/src/locales/en.json +++ b/webapp/src/locales/en.json @@ -150,7 +150,10 @@ "RxFailCorrupt": "RX Fail: Receive Corrupt", "TxReRequest": "TX Re-Request Fragment", "StatsReset": "Reset Statistics", - "StatsResetting": "Resetting..." + "StatsResetting": "Resetting...", + "Rssi": "RSSI of last received packet", + "RssiHint": "HM inverters only support RSSI values < -64 dBm and > -64 dBm. In this case, -80 dbm and -30 dbm is shown.", + "dBm": "{dbm} dBm" }, "eventlog": { "Start": "Start", diff --git a/webapp/src/locales/fr.json b/webapp/src/locales/fr.json index fcb22a19..023fc099 100644 --- a/webapp/src/locales/fr.json +++ b/webapp/src/locales/fr.json @@ -150,7 +150,10 @@ "RxFailCorrupt": "RX Fail: Receive Corrupt", "TxReRequest": "TX Re-Request Fragment", "StatsReset": "Reset Statistics", - "StatsResetting": "Resetting..." + "StatsResetting": "Resetting...", + "Rssi": "RSSI of last received packet", + "RssiHint": "HM inverters only support RSSI values < -64 dBm and > -64 dBm. In this case, -80 dbm and -30 dbm is shown.", + "dBm": "{dbm} dBm" }, "eventlog": { "Start": "Départ", diff --git a/webapp/src/types/LiveDataStatus.ts b/webapp/src/types/LiveDataStatus.ts index db95897c..4f681070 100644 --- a/webapp/src/types/LiveDataStatus.ts +++ b/webapp/src/types/LiveDataStatus.ts @@ -28,6 +28,7 @@ export interface RadioStatistics { rx_fail_nothing: number; rx_fail_partial: number; rx_fail_corrupt: number; + rssi: number; } export interface Inverter { diff --git a/webapp/src/views/HomeView.vue b/webapp/src/views/HomeView.vue index 0aef275a..ef8fa8ef 100644 --- a/webapp/src/views/HomeView.vue +++ b/webapp/src/views/HomeView.vue @@ -291,6 +291,16 @@ {{ $n(inverter.radio_stats.tx_re_request) }} + + + {{ $t('home.Rssi') }} + + + + {{ $t('home.dBm', { dbm: $n(inverter.radio_stats.rssi) }) }} + + +