Feature: Show RSSI of last received packet in radio stats
The value is also published via MQTT
This commit is contained in:
parent
0c2b6f1a61
commit
edfe06e31e
@ -169,7 +169,7 @@ void HoymilesRadio_CMT::loop()
|
|||||||
dumpBuf(f.fragment, f.len, false);
|
dumpBuf(f.fragment, f.len, false);
|
||||||
Hoymiles.getMessageOutput()->printf("| %d dBm\r\n", f.rssi);
|
Hoymiles.getMessageOutput()->printf("| %d dBm\r\n", f.rssi);
|
||||||
|
|
||||||
inv->addRxFragment(f.fragment, f.len);
|
inv->addRxFragment(f.fragment, f.len, f.rssi);
|
||||||
} else {
|
} else {
|
||||||
Hoymiles.getMessageOutput()->println("Inverter Not found!");
|
Hoymiles.getMessageOutput()->println("Inverter Not found!");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -80,7 +80,7 @@ void HoymilesRadio_NRF::loop()
|
|||||||
dumpBuf(f.fragment, f.len, false);
|
dumpBuf(f.fragment, f.len, false);
|
||||||
Hoymiles.getMessageOutput()->printf("| %d dBm\r\n", f.rssi);
|
Hoymiles.getMessageOutput()->printf("| %d dBm\r\n", f.rssi);
|
||||||
|
|
||||||
inv->addRxFragment(f.fragment, f.len);
|
inv->addRxFragment(f.fragment, f.len, f.rssi);
|
||||||
} else {
|
} else {
|
||||||
Hoymiles.getMessageOutput()->println("Inverter Not found!");
|
Hoymiles.getMessageOutput()->println("Inverter Not found!");
|
||||||
}
|
}
|
||||||
|
|||||||
@ -137,6 +137,11 @@ bool InverterAbstract::getClearEventlogOnMidnight() const
|
|||||||
return _clearEventlogOnMidnight;
|
return _clearEventlogOnMidnight;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int8_t InverterAbstract::getLastRssi() const
|
||||||
|
{
|
||||||
|
return _lastRssi;
|
||||||
|
}
|
||||||
|
|
||||||
bool InverterAbstract::sendChangeChannelRequest()
|
bool InverterAbstract::sendChangeChannelRequest()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
@ -185,8 +190,10 @@ void InverterAbstract::clearRxFragmentBuffer()
|
|||||||
_rxFragmentRetransmitCnt = 0;
|
_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) {
|
if (len < 11) {
|
||||||
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) fragment too short\r\n", __FILE__, __LINE__);
|
Hoymiles.getMessageOutput()->printf("FATAL: (%s, %d) fragment too short\r\n", __FILE__, __LINE__);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -61,8 +61,10 @@ public:
|
|||||||
void setClearEventlogOnMidnight(const bool enabled);
|
void setClearEventlogOnMidnight(const bool enabled);
|
||||||
bool getClearEventlogOnMidnight() const;
|
bool getClearEventlogOnMidnight() const;
|
||||||
|
|
||||||
|
int8_t getLastRssi() const;
|
||||||
|
|
||||||
void clearRxFragmentBuffer();
|
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);
|
uint8_t verifyAllFragments(CommandAbstract& cmd);
|
||||||
|
|
||||||
void performDailyTask();
|
void performDailyTask();
|
||||||
@ -131,6 +133,8 @@ private:
|
|||||||
bool _zeroYieldDayOnMidnight = false;
|
bool _zeroYieldDayOnMidnight = false;
|
||||||
bool _clearEventlogOnMidnight = false;
|
bool _clearEventlogOnMidnight = false;
|
||||||
|
|
||||||
|
int8_t _lastRssi = 0;
|
||||||
|
|
||||||
std::unique_ptr<AlarmLogParser> _alarmLogParser;
|
std::unique_ptr<AlarmLogParser> _alarmLogParser;
|
||||||
std::unique_ptr<DevInfoParser> _devInfoParser;
|
std::unique_ptr<DevInfoParser> _devInfoParser;
|
||||||
std::unique_ptr<GridProfileParser> _gridProfileParser;
|
std::unique_ptr<GridProfileParser> _gridProfileParser;
|
||||||
|
|||||||
@ -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 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, "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, "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
|
// Loop all channels
|
||||||
for (auto& t : inv->Statistics()->getChannelTypes()) {
|
for (auto& t : inv->Statistics()->getChannelTypes()) {
|
||||||
|
|||||||
@ -50,6 +50,7 @@ void MqttHandleInverterClass::loop()
|
|||||||
MqttSettings.publish(subtopic + "/radio/rx_fail_nothing", String(inv->RadioStats.RxFailNoAnswer));
|
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_partial", String(inv->RadioStats.RxFailPartialAnswer));
|
||||||
MqttSettings.publish(subtopic + "/radio/rx_fail_corrupt", String(inv->RadioStats.RxFailCorruptData));
|
MqttSettings.publish(subtopic + "/radio/rx_fail_corrupt", String(inv->RadioStats.RxFailCorruptData));
|
||||||
|
MqttSettings.publish(subtopic + "/radio/rssi", String(inv->getLastRssi()));
|
||||||
|
|
||||||
if (inv->DevInfo()->getLastUpdate() > 0) {
|
if (inv->DevInfo()->getLastUpdate() > 0) {
|
||||||
// Bootloader Version
|
// Bootloader Version
|
||||||
|
|||||||
@ -153,6 +153,7 @@ void WebApiWsLiveClass::generateInverterCommonJsonResponse(JsonObject& root, std
|
|||||||
root["radio_stats"]["rx_fail_nothing"] = inv->RadioStats.RxFailNoAnswer;
|
root["radio_stats"]["rx_fail_nothing"] = inv->RadioStats.RxFailNoAnswer;
|
||||||
root["radio_stats"]["rx_fail_partial"] = inv->RadioStats.RxFailPartialAnswer;
|
root["radio_stats"]["rx_fail_partial"] = inv->RadioStats.RxFailPartialAnswer;
|
||||||
root["radio_stats"]["rx_fail_corrupt"] = inv->RadioStats.RxFailCorruptData;
|
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)
|
void WebApiWsLiveClass::generateInverterChannelJsonResponse(JsonObject& root, std::shared_ptr<InverterAbstract> inv)
|
||||||
|
|||||||
@ -150,7 +150,10 @@
|
|||||||
"RxFailCorrupt": "Empfang Fehler: Beschädigt empfangen",
|
"RxFailCorrupt": "Empfang Fehler: Beschädigt empfangen",
|
||||||
"TxReRequest": "Gesendete Fragment Wiederanforderungen",
|
"TxReRequest": "Gesendete Fragment Wiederanforderungen",
|
||||||
"StatsReset": "Statistiken zurücksetzen",
|
"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": {
|
"eventlog": {
|
||||||
"Start": "Beginn",
|
"Start": "Beginn",
|
||||||
|
|||||||
@ -150,7 +150,10 @@
|
|||||||
"RxFailCorrupt": "RX Fail: Receive Corrupt",
|
"RxFailCorrupt": "RX Fail: Receive Corrupt",
|
||||||
"TxReRequest": "TX Re-Request Fragment",
|
"TxReRequest": "TX Re-Request Fragment",
|
||||||
"StatsReset": "Reset Statistics",
|
"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": {
|
"eventlog": {
|
||||||
"Start": "Start",
|
"Start": "Start",
|
||||||
|
|||||||
@ -150,7 +150,10 @@
|
|||||||
"RxFailCorrupt": "RX Fail: Receive Corrupt",
|
"RxFailCorrupt": "RX Fail: Receive Corrupt",
|
||||||
"TxReRequest": "TX Re-Request Fragment",
|
"TxReRequest": "TX Re-Request Fragment",
|
||||||
"StatsReset": "Reset Statistics",
|
"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": {
|
"eventlog": {
|
||||||
"Start": "Départ",
|
"Start": "Départ",
|
||||||
|
|||||||
@ -28,6 +28,7 @@ export interface RadioStatistics {
|
|||||||
rx_fail_nothing: number;
|
rx_fail_nothing: number;
|
||||||
rx_fail_partial: number;
|
rx_fail_partial: number;
|
||||||
rx_fail_corrupt: number;
|
rx_fail_corrupt: number;
|
||||||
|
rssi: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Inverter {
|
export interface Inverter {
|
||||||
|
|||||||
@ -291,6 +291,16 @@
|
|||||||
<td>{{ $n(inverter.radio_stats.tx_re_request) }}</td>
|
<td>{{ $n(inverter.radio_stats.tx_re_request) }}</td>
|
||||||
<td></td>
|
<td></td>
|
||||||
</tr>
|
</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>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<button
|
<button
|
||||||
@ -499,6 +509,7 @@ import {
|
|||||||
BIconCheckCircleFill,
|
BIconCheckCircleFill,
|
||||||
BIconCpu,
|
BIconCpu,
|
||||||
BIconExclamationCircleFill,
|
BIconExclamationCircleFill,
|
||||||
|
BIconInfoCircle,
|
||||||
BIconJournalText,
|
BIconJournalText,
|
||||||
BIconOutlet,
|
BIconOutlet,
|
||||||
BIconPower,
|
BIconPower,
|
||||||
@ -525,6 +536,7 @@ export default defineComponent({
|
|||||||
BIconCheckCircleFill,
|
BIconCheckCircleFill,
|
||||||
BIconCpu,
|
BIconCpu,
|
||||||
BIconExclamationCircleFill,
|
BIconExclamationCircleFill,
|
||||||
|
BIconInfoCircle,
|
||||||
BIconJournalText,
|
BIconJournalText,
|
||||||
BIconOutlet,
|
BIconOutlet,
|
||||||
BIconPower,
|
BIconPower,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user