Feature: Show RSSI of last received packet in radio stats

The value is also published via MQTT
This commit is contained in:
Thomas Basler 2024-10-04 17:36:17 +02:00
parent 0c2b6f1a61
commit edfe06e31e
12 changed files with 43 additions and 7 deletions

View File

@ -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!");
}

View File

@ -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!");
}

View File

@ -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;

View File

@ -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> _alarmLogParser;
std::unique_ptr<DevInfoParser> _devInfoParser;
std::unique_ptr<GridProfileParser> _gridProfileParser;

View File

@ -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()) {

View File

@ -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

View File

@ -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<InverterAbstract> inv)

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -28,6 +28,7 @@ export interface RadioStatistics {
rx_fail_nothing: number;
rx_fail_partial: number;
rx_fail_corrupt: number;
rssi: number;
}
export interface Inverter {

View File

@ -291,6 +291,16 @@
<td>{{ $n(inverter.radio_stats.tx_re_request) }}</td>
<td></td>
</tr>
<tr>
<td>
{{ $t('home.Rssi') }}
<BIconInfoCircle v-tooltip :title="$t('home.RssiHint')" />
</td>
<td>
{{ $t('home.dBm', { dbm: $n(inverter.radio_stats.rssi) }) }}
</td>
<td></td>
</tr>
</tbody>
</table>
<button
@ -499,6 +509,7 @@ import {
BIconCheckCircleFill,
BIconCpu,
BIconExclamationCircleFill,
BIconInfoCircle,
BIconJournalText,
BIconOutlet,
BIconPower,
@ -525,6 +536,7 @@ export default defineComponent({
BIconCheckCircleFill,
BIconCpu,
BIconExclamationCircleFill,
BIconInfoCircle,
BIconJournalText,
BIconOutlet,
BIconPower,