add lwt topic

This commit is contained in:
technyon
2023-03-27 18:46:07 +02:00
parent 44ad2dd320
commit ddf70f5d8a
10 changed files with 51 additions and 5 deletions

View File

@@ -59,4 +59,5 @@
#define mqtt_topic_freeheap "/maintenance/freeHeap" #define mqtt_topic_freeheap "/maintenance/freeHeap"
#define mqtt_topic_restart_reason_fw "/maintenance/restartReasonNukiHub" #define mqtt_topic_restart_reason_fw "/maintenance/restartReasonNukiHub"
#define mqtt_topic_restart_reason_esp "/maintenance/restartReasonNukiEsp" #define mqtt_topic_restart_reason_esp "/maintenance/restartReasonNukiEsp"
#define mqtt_topic_mqtt_connection_state "/maintenance/mqttConnectionState"
#define mqtt_topic_network_device "/maintenance/networkDevice" #define mqtt_topic_network_device "/maintenance/networkDevice"

View File

@@ -1,6 +1,5 @@
#include "Network.h" #include "Network.h"
#include "PreferencesKeys.h" #include "PreferencesKeys.h"
#include "MqttTopics.h"
#include "networkDevices/W5500Device.h" #include "networkDevices/W5500Device.h"
#include "networkDevices/WifiDevice.h" #include "networkDevices/WifiDevice.h"
#include "Logger.h" #include "Logger.h"
@@ -369,19 +368,20 @@ bool Network::reconnect()
Log->println(F("Attempting MQTT connection")); Log->println(F("Attempting MQTT connection"));
_connectReplyReceived = false; _connectReplyReceived = false;
if(strlen(_mqttUser) == 0) if(strlen(_mqttUser) == 0)
{ {
Log->println(F("MQTT: Connecting without credentials")); Log->println(F("MQTT: Connecting without credentials"));
_device->mqttSetServer(_mqttBrokerAddr, port);
_device->mqttConnect();
} }
else else
{ {
Log->print(F("MQTT: Connecting with user: ")); Log->println(_mqttUser); Log->print(F("MQTT: Connecting with user: ")); Log->println(_mqttUser);
_device->mqttSetCredentials(_mqttUser, _mqttPass); _device->mqttSetCredentials(_mqttUser, _mqttPass);
}
_device->setWill(_mqttConnectionStateTopic, 1, true, _lastWillPayload);
_device->mqttSetServer(_mqttBrokerAddr, port); _device->mqttSetServer(_mqttBrokerAddr, port);
_device->mqttConnect(); _device->mqttConnect();
}
unsigned long timeout = millis() + 60000; unsigned long timeout = millis() + 60000;
@@ -416,6 +416,9 @@ bool Network::reconnect()
_device->mqttPublish(it.first.c_str(), MQTT_QOS_LEVEL, true, it.second.c_str()); _device->mqttPublish(it.first.c_str(), MQTT_QOS_LEVEL, true, it.second.c_str());
} }
} }
publishString(_maintenancePathPrefix, _mqttConnectionStateTopic, "online");
_mqttConnectionState = 2; _mqttConnectionState = 2;
for(const auto& callback : _reconnectedCallbacks) for(const auto& callback : _reconnectedCallbacks)
{ {

View File

@@ -6,6 +6,7 @@
#include "networkDevices/NetworkDevice.h" #include "networkDevices/NetworkDevice.h"
#include "MqttReceiver.h" #include "MqttReceiver.h"
#include "networkDevices/IPConfiguration.h" #include "networkDevices/IPConfiguration.h"
#include "MqttTopics.h"
enum class NetworkDeviceType enum class NetworkDeviceType
{ {
@@ -99,6 +100,10 @@ private:
void buildMqttPath(const char* prefix, const char* path, char* outPath); void buildMqttPath(const char* prefix, const char* path, char* outPath);
static Network* _inst; static Network* _inst;
const char* _mqttConnectionStateTopic = mqtt_topic_mqtt_connection_state;
const char* _lastWillPayload = "offline";
Preferences* _preferences; Preferences* _preferences;
IPConfiguration* _ipConfiguration = nullptr; IPConfiguration* _ipConfiguration = nullptr;
String _hostname; String _hostname;

View File

@@ -255,6 +255,18 @@ bool EthLan8720Device::mqttDisonnect(bool force)
} }
} }
void EthLan8720Device::setWill(const char *topic, uint8_t qos, bool retain, const char *payload)
{
if(_useEncryption)
{
_mqttClientSecure->setWill(topic, qos, retain, payload);
}
else
{
_mqttClient->setWill(topic, qos, retain, payload);
}
}
void EthLan8720Device::mqttSetCredentials(const char *username, const char *password) void EthLan8720Device::mqttSetCredentials(const char *username, const char *password)
{ {
if(_useEncryption) if(_useEncryption)
@@ -329,3 +341,4 @@ void EthLan8720Device::disableMqtt()
_mqttEnabled = false; _mqttEnabled = false;
} }

View File

@@ -53,6 +53,8 @@ public:
bool mqttDisonnect(bool force) override; bool mqttDisonnect(bool force) override;
void setWill(const char *topic, uint8_t qos, bool retain, const char *payload) override;
void mqttSetCredentials(const char *username, const char *password) override; void mqttSetCredentials(const char *username, const char *password) override;
void mqttOnMessage(espMqttClientTypes::OnMessageCallback callback) override; void mqttOnMessage(espMqttClientTypes::OnMessageCallback callback) override;

View File

@@ -40,6 +40,7 @@ public:
virtual void mqttSetServer(const char* host, uint16_t port) = 0; virtual void mqttSetServer(const char* host, uint16_t port) = 0;
virtual bool mqttConnect() = 0; virtual bool mqttConnect() = 0;
virtual bool mqttDisonnect(bool force) = 0; virtual bool mqttDisonnect(bool force) = 0;
virtual void setWill(const char* topic, uint8_t qos, bool retain, const char* payload) = 0;
virtual void mqttSetCredentials(const char* username, const char* password) = 0; virtual void mqttSetCredentials(const char* username, const char* password) = 0;
virtual void mqttOnMessage(espMqttClientTypes::OnMessageCallback callback) = 0; virtual void mqttOnMessage(espMqttClientTypes::OnMessageCallback callback) = 0;
virtual void mqttOnConnect(espMqttClientTypes::OnConnectCallback callback) = 0; virtual void mqttOnConnect(espMqttClientTypes::OnConnectCallback callback) = 0;

View File

@@ -265,6 +265,11 @@ bool W5500Device::mqttDisonnect(bool force)
return _mqttClient.disconnect(force); return _mqttClient.disconnect(force);
} }
void W5500Device::setWill(const char *topic, uint8_t qos, bool retain, const char *payload)
{
_mqttClient.setWill(topic, qos, retain, payload);
}
void W5500Device::mqttSetCredentials(const char *username, const char *password) void W5500Device::mqttSetCredentials(const char *username, const char *password)
{ {
_mqttClient.setCredentials(username, password); _mqttClient.setCredentials(username, password);

View File

@@ -49,6 +49,8 @@ public:
bool mqttDisonnect(bool force) override; bool mqttDisonnect(bool force) override;
void setWill(const char *topic, uint8_t qos, bool retain, const char *payload) override;
void mqttSetCredentials(const char *username, const char *password) override; void mqttSetCredentials(const char *username, const char *password) override;
void mqttOnMessage(espMqttClientTypes::OnMessageCallback callback) override; void mqttOnMessage(espMqttClientTypes::OnMessageCallback callback) override;

View File

@@ -273,6 +273,18 @@ bool WifiDevice::mqttDisonnect(bool force)
} }
} }
void WifiDevice::setWill(const char *topic, uint8_t qos, bool retain, const char *payload)
{
if(_useEncryption)
{
_mqttClientSecure->setWill(topic, qos, retain, payload);
}
else
{
_mqttClient->setWill(topic, qos, retain, payload);
}
}
void WifiDevice::mqttSetCredentials(const char *username, const char *password) void WifiDevice::mqttSetCredentials(const char *username, const char *password)
{ {
if(_useEncryption) if(_useEncryption)

View File

@@ -43,6 +43,8 @@ public:
bool mqttDisonnect(bool force) override; bool mqttDisonnect(bool force) override;
void setWill(const char *topic, uint8_t qos, bool retain, const char *payload) override;
void mqttSetCredentials(const char *username, const char *password) override; void mqttSetCredentials(const char *username, const char *password) override;
void mqttOnMessage(espMqttClientTypes::OnMessageCallback callback) override; void mqttOnMessage(espMqttClientTypes::OnMessageCallback callback) override;