diff --git a/lib/Hoymiles/src/HoymilesRadio_CMT.cpp b/lib/Hoymiles/src/HoymilesRadio_CMT.cpp index bbd31f2..f6d1958 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 4bf104a..bd496af 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 3e51bbd..7fe522f 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 f139fab..2f49f91 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 7afa87d..6491c9b 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 8e72066..6185f19 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 29c204a..a50a792 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 995f6ec..0bc1776 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 cf3c74f..f760178 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 fcb22a1..023fc09 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 db95897..4f68107 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 0aef275..ef8fa8e 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) }) }} + + +