mqtt status shows queue and reconnects

This commit is contained in:
MichaelDvP
2022-10-03 08:08:51 +02:00
parent c414354708
commit 13f0bc3296
8 changed files with 66 additions and 37 deletions

View File

@@ -5,6 +5,7 @@ import DeviceHubIcon from '@mui/icons-material/DeviceHub';
import RefreshIcon from '@mui/icons-material/Refresh'; import RefreshIcon from '@mui/icons-material/Refresh';
import ReportIcon from '@mui/icons-material/Report'; import ReportIcon from '@mui/icons-material/Report';
import SpeakerNotesOffIcon from '@mui/icons-material/SpeakerNotesOff'; import SpeakerNotesOffIcon from '@mui/icons-material/SpeakerNotesOff';
import AutoAwesomeMotionIcon from '@mui/icons-material/AutoAwesomeMotion';
import { ButtonRow, FormLoader, SectionContent } from '../../components'; import { ButtonRow, FormLoader, SectionContent } from '../../components';
import { MqttStatus, MqttDisconnectReason } from '../../types'; import { MqttStatus, MqttDisconnectReason } from '../../types';
@@ -31,6 +32,12 @@ export const mqttPublishHighlight = ({ mqtt_fails }: MqttStatus, theme: Theme) =
return theme.palette.error.main; return theme.palette.error.main;
}; };
export const mqttQueueHighlight = ({ mqtt_queued }: MqttStatus, theme: Theme) => {
if (mqtt_queued <= 1) return theme.palette.success.main;
return theme.palette.warning.main;
};
const MqttStatusForm: FC = () => { const MqttStatusForm: FC = () => {
const { loadData, data, errorMessage } = useRest<MqttStatus>({ read: MqttApi.readMqttStatus }); const { loadData, data, errorMessage } = useRest<MqttStatus>({ read: MqttApi.readMqttStatus });
@@ -38,14 +45,14 @@ const MqttStatusForm: FC = () => {
const theme = useTheme(); const theme = useTheme();
const mqttStatus = ({ enabled, connected }: MqttStatus) => { const mqttStatus = ({ enabled, connected, connect_count }: MqttStatus) => {
if (!enabled) { if (!enabled) {
return LL.NOT_ENABLED(); return LL.NOT_ENABLED();
} }
if (connected) { if (connected) {
return LL.CONNECTED(); return (LL.CONNECTED() + (connect_count > 1 ? ' (' + connect_count + ')' : ''));
} }
return LL.DISCONNECTED(); return (LL.DISCONNECTED() + (connect_count > 1 ? ' (' + connect_count + ')' : ''));
}; };
const disconnectReason = ({ disconnect_reason }: MqttStatus) => { const disconnectReason = ({ disconnect_reason }: MqttStatus) => {
@@ -77,9 +84,21 @@ const MqttStatusForm: FC = () => {
} }
const renderConnectionStatus = () => { const renderConnectionStatus = () => {
if (data.connected) {
return ( return (
<> <>
{!data.connected && (
<>
<ListItem>
<ListItemAvatar>
<Avatar>
<ReportIcon />
</Avatar>
</ListItemAvatar>
<ListItemText primary={LL.DISCONNECT_REASON()} secondary={disconnectReason(data)} />
</ListItem>
<Divider variant="inset" component="li" />
</>
)}
<ListItem> <ListItem>
<ListItemAvatar> <ListItemAvatar>
<Avatar>#</Avatar> <Avatar>#</Avatar>
@@ -87,26 +106,22 @@ const MqttStatusForm: FC = () => {
<ListItemText primary="Client ID" secondary={data.client_id} /> <ListItemText primary="Client ID" secondary={data.client_id} />
</ListItem> </ListItem>
<Divider variant="inset" component="li" /> <Divider variant="inset" component="li" />
<ListItem>
<ListItemAvatar>
<Avatar sx={{ bgcolor: mqttQueueHighlight(data, theme) }}>
<AutoAwesomeMotionIcon />
</Avatar>
</ListItemAvatar>
<ListItemText primary="MQTT Queue" secondary={data.mqtt_queued} />
</ListItem>
<Divider variant="inset" component="li" />
<ListItem> <ListItem>
<ListItemAvatar> <ListItemAvatar>
<Avatar sx={{ bgcolor: mqttPublishHighlight(data, theme) }}> <Avatar sx={{ bgcolor: mqttPublishHighlight(data, theme) }}>
<SpeakerNotesOffIcon /> <SpeakerNotesOffIcon />
</Avatar> </Avatar>
</ListItemAvatar> </ListItemAvatar>
<ListItemText primary={'MQTT Publish ' + LL.ERRORS()} secondary={data.mqtt_fails} /> <ListItemText primary={'MQTT ' + LL.ERRORS()} secondary={data.mqtt_fails} />
</ListItem>
</>
);
}
return (
<>
<ListItem>
<ListItemAvatar>
<Avatar>
<ReportIcon />
</Avatar>
</ListItemAvatar>
<ListItemText primary={LL.DISCONNECT_REASON()} secondary={disconnectReason(data)} />
</ListItem> </ListItem>
<Divider variant="inset" component="li" /> <Divider variant="inset" component="li" />
</> </>

View File

@@ -15,6 +15,8 @@ export interface MqttStatus {
client_id: string; client_id: string;
disconnect_reason: MqttDisconnectReason; disconnect_reason: MqttDisconnectReason;
mqtt_fails: number; mqtt_fails: number;
mqtt_queued: number;
connect_count: number;
} }
export interface MqttSettings { export interface MqttSettings {

View File

@@ -20,7 +20,9 @@ void MqttStatus::mqttStatus(AsyncWebServerRequest * request) {
root["client_id"] = _mqttSettingsService->getClientId(); root["client_id"] = _mqttSettingsService->getClientId();
root["disconnect_reason"] = (uint8_t)_mqttSettingsService->getDisconnectReason(); root["disconnect_reason"] = (uint8_t)_mqttSettingsService->getDisconnectReason();
root["mqtt_queued"] = emsesp::Mqtt::publish_queued(); // mdvp added
root["mqtt_fails"] = emsesp::Mqtt::publish_fails(); // proddy added root["mqtt_fails"] = emsesp::Mqtt::publish_fails(); // proddy added
root["connect_count"] = emsesp::Mqtt::connect_count(); // mdvp added
response->setLength(); response->setLength();
request->send(response); request->send(response);

View File

@@ -860,7 +860,8 @@ void EMSdevice::generate_values_web(JsonObject & output) {
obj["s"] = Helpers::render_value(s, (float)(-1) * dv.numeric_operator, 0); obj["s"] = Helpers::render_value(s, (float)(-1) * dv.numeric_operator, 0);
} }
int16_t dv_set_min, dv_set_max; int16_t dv_set_min;
uint16_t dv_set_max;
if (dv.get_min_max(dv_set_min, dv_set_max)) { if (dv.get_min_max(dv_set_min, dv_set_max)) {
obj["m"] = Helpers::render_value(s, dv_set_min, 0); obj["m"] = Helpers::render_value(s, dv_set_min, 0);
obj["x"] = Helpers::render_value(s, dv_set_max, 0); obj["x"] = Helpers::render_value(s, dv_set_max, 0);
@@ -1042,7 +1043,7 @@ void EMSdevice::setCustomEntity(const std::string & entity_id) {
auto min = dv.min; auto min = dv.min;
auto max = dv.max; auto max = dv.max;
dv.set_custom_minmax(); dv.set_custom_minmax();
if (dv.short_name == FL_(seltemp)[0] && (min != dv.min || max != dv.max)) { if (Mqtt::ha_enabled() && dv.short_name == FL_(seltemp)[0] && (min != dv.min || max != dv.max)) {
set_climate_minmax(dv.tag, dv.min, dv.max); set_climate_minmax(dv.tag, dv.min, dv.max);
} }
return; return;
@@ -1214,7 +1215,8 @@ bool EMSdevice::get_value_info(JsonObject & output, const char * cmd, const int8
// set the min and max only for commands // set the min and max only for commands
if (dv.has_cmd) { if (dv.has_cmd) {
int16_t dv_set_min, dv_set_max; int16_t dv_set_min;
uint16_t dv_set_max;
if (dv.get_min_max(dv_set_min, dv_set_max)) { if (dv.get_min_max(dv_set_min, dv_set_max)) {
json["min"] = dv_set_min; json["min"] = dv_set_min;
json["max"] = dv_set_max; json["max"] = dv_set_max;

View File

@@ -266,7 +266,7 @@ bool DeviceValue::hasValue() const {
// converts to signed int, which means rounding to an whole integer // converts to signed int, which means rounding to an whole integer
// returns false if there is no min/max needed // returns false if there is no min/max needed
// Types BOOL, ENUM, STRING and CMD are not used // Types BOOL, ENUM, STRING and CMD are not used
bool DeviceValue::get_min_max(int16_t & dv_set_min, int16_t & dv_set_max) { bool DeviceValue::get_min_max(int16_t & dv_set_min, uint16_t & dv_set_max) {
uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (uom == DeviceValueUOM::DEGREES) ? 2 : (uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; uint8_t fahrenheit = !EMSESP::system_.fahrenheit() ? 0 : (uom == DeviceValueUOM::DEGREES) ? 2 : (uom == DeviceValueUOM::DEGREES_R) ? 1 : 0;
// if we have individual limits set already, just do the conversion // if we have individual limits set already, just do the conversion

View File

@@ -177,7 +177,7 @@ class DeviceValue {
uint8_t state); uint8_t state);
bool hasValue() const; bool hasValue() const;
bool get_min_max(int16_t & dv_set_min, int16_t & dv_set_max); bool get_min_max(int16_t & dv_set_min, uint16_t & dv_set_max);
void set_custom_minmax(); void set_custom_minmax();
bool get_custom_min(int16_t & val); bool get_custom_min(int16_t & val);

View File

@@ -918,7 +918,7 @@ void Mqtt::publish_ha_sensor_config(DeviceValue & dv, const std::string & model,
// calculate the min and max // calculate the min and max
int16_t dv_set_min; int16_t dv_set_min;
int16_t dv_set_max; uint16_t dv_set_max;
(void)dv.get_min_max(dv_set_min, dv_set_max); (void)dv.get_min_max(dv_set_min, dv_set_max);
// determine if we're creating the command topics which we use special HA configs // determine if we're creating the command topics which we use special HA configs

View File

@@ -167,6 +167,14 @@ class Mqtt {
return mqtt_publish_fails_; return mqtt_publish_fails_;
} }
static uint32_t publish_queued() {
return mqtt_messages_.size();
}
static uint8_t connect_count() {
return connectcount_;
}
static void reset_mqtt(); static void reset_mqtt();
static bool is_nested() { static bool is_nested() {
@@ -178,7 +186,7 @@ class Mqtt {
} }
static bool publish_single() { static bool publish_single() {
return publish_single_; return mqtt_enabled_ && publish_single_;
} }
static bool publish_single2cmd() { static bool publish_single2cmd() {
@@ -190,7 +198,7 @@ class Mqtt {
} }
static bool ha_enabled() { static bool ha_enabled() {
return ha_enabled_; return mqtt_enabled_ && ha_enabled_;
} }
static void ha_enabled(bool ha_enabled) { static void ha_enabled(bool ha_enabled) {