Skip to content

Commit f1ba27a

Browse files
committed
Force discovery always and manage discovery config mqtt publishing
1 parent 32d7e13 commit f1ba27a

File tree

2 files changed

+46
-107
lines changed

2 files changed

+46
-107
lines changed

MqttManager/MqttManager.cpp

Lines changed: 35 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,12 @@ MqttManager::MqttManager()
2424
m_checkConnectivityTimer.setup(RT_ON, m_checkConnectivityTimeOffline);
2525
}
2626

27-
void MqttManager::setup(String mqttServer, String mqttPort, String mqttUsername, String mqttPassword, bool mqttDiscoveryEnabled)
27+
void MqttManager::setup(String mqttServer, String mqttPort, String mqttUsername, String mqttPassword)
2828
{
2929
m_mqttServer = mqttServer;
3030
m_mqttPort = atoi(mqttPort.c_str());
3131
m_mqttUsername = mqttUsername;
3232
m_mqttPassword = mqttPassword;
33-
m_mqttDiscoveryEnabled = mqttDiscoveryEnabled;
3433

3534
IPAddress server;
3635
server.fromString(m_mqttServer.c_str());
@@ -57,71 +56,49 @@ void MqttManager::setDeviceData(String deviceName, String hardware, String devic
5756
m_mqttClient.setClientId(m_deviceName.c_str());
5857

5958
m_deviceDataTopic = "/" + m_deviceName;
60-
m_lastWillTopic = m_deviceDataTopic + "/status";
6159

60+
m_deviceStatusSensor = MqttDiscoveryComponent("binary_sensor", m_deviceName + " Status", discovery_prefix);
61+
m_deviceStatusSensor.setConfigurtionVariable("device_class", "connectivity");
62+
this->addDiscoveryComponent(m_deviceStatusSensor);
6263

63-
if (m_mqttDiscoveryEnabled)
64-
{
65-
m_deviceStatusSensor = new MqttDiscoveryComponent("binary_sensor", m_deviceName + " Status", discovery_prefix);
66-
m_deviceStatusSensor->setConfigurtionVariable("device_class", "connectivity");
67-
m_discoveryComponents.push_back(m_deviceStatusSensor);
68-
69-
m_deviceIpSensor = new MqttDiscoveryComponent("sensor", m_deviceName + " IP", discovery_prefix);
70-
m_discoveryComponents.push_back(m_deviceIpSensor);
64+
m_deviceIpSensor = MqttDiscoveryComponent("sensor", m_deviceName + " IP", discovery_prefix);
65+
this->addDiscoveryComponent(m_deviceIpSensor);
7166

72-
m_deviceMacSensor = new MqttDiscoveryComponent("sensor", m_deviceName + " MAC", discovery_prefix);
73-
m_discoveryComponents.push_back(m_deviceMacSensor);
67+
m_deviceMacSensor = MqttDiscoveryComponent("sensor", m_deviceName + " MAC", discovery_prefix);
68+
this->addDiscoveryComponent(m_deviceMacSensor);
7469

75-
m_deviceHardwareSensor = new MqttDiscoveryComponent("sensor", m_deviceName + " Hardware", discovery_prefix);
76-
m_discoveryComponents.push_back(m_deviceHardwareSensor);
70+
m_deviceHardwareSensor = MqttDiscoveryComponent("sensor", m_deviceName + " Hardware", discovery_prefix);
71+
this->addDiscoveryComponent(m_deviceHardwareSensor);
7772

78-
m_deviceFirmwareSensor = new MqttDiscoveryComponent("sensor", m_deviceName + " Firmware", discovery_prefix);
79-
m_discoveryComponents.push_back(m_deviceFirmwareSensor);
73+
m_deviceFirmwareSensor = MqttDiscoveryComponent("sensor", m_deviceName + " Firmware", discovery_prefix);
74+
this->addDiscoveryComponent(m_deviceFirmwareSensor);
8075

81-
m_deviceFirmwareVersionSensor = new MqttDiscoveryComponent("sensor", m_deviceName + " Firmware Version", discovery_prefix);
82-
m_discoveryComponents.push_back(m_deviceFirmwareVersionSensor);
76+
m_deviceFirmwareVersionSensor = MqttDiscoveryComponent("sensor", m_deviceName + " Firmware Version", discovery_prefix);
77+
this->addDiscoveryComponent(m_deviceFirmwareVersionSensor);
8378

84-
this->setLastWillMQTT(m_deviceStatusSensor->getStateTopic(), m_lastWillPayload);
85-
}
86-
else
87-
{
88-
this->setLastWillMQTT(m_lastWillTopic, m_lastWillPayload);
89-
}
79+
this->setLastWillMQTT(m_deviceStatusSensor.getStateTopic(), m_lastWillPayload);
9080
}
9181

9282
void MqttManager::publishDiscoveryInfo()
9383
{
94-
if (m_mqttDiscoveryEnabled)
84+
if (m_discoveryComponents.size() == m_discoveryCounter)
9585
{
96-
for (auto const &component : m_discoveryComponents)
97-
{
98-
this->publishMQTT(component->getConfigTopic(), component->getConfigPayload());
99-
}
86+
m_discoveryCounter = 0;
10087
}
88+
89+
MqttDiscoveryComponent component = m_discoveryComponents[m_discoveryCounter];
90+
this->publishMQTT(component.getConfigTopic(), component.getConfigPayload());
91+
++m_discoveryCounter;
10192
}
10293

10394
void MqttManager::publishDeviceStatusInfo()
10495
{
105-
if (!m_mqttDiscoveryEnabled)
106-
{
107-
this->publishMQTT(m_deviceDataTopic + "/status", "ON");
108-
this->publishMQTT(m_deviceDataTopic + "/ip", m_deviceIP);
109-
this->publishMQTT(m_deviceDataTopic + "/mac", m_deviceMac);
110-
this->publishMQTT(m_deviceDataTopic + "/hardware", m_hardware);
111-
this->publishMQTT(m_deviceDataTopic + "/firmware", m_firmware);
112-
this->publishMQTT(m_deviceDataTopic + "/firmware_version", m_firmwareVersion);
113-
}
114-
else
115-
{
116-
this->publishMQTT(m_deviceStatusSensor->getStateTopic(), "ON");
117-
this->publishMQTT(m_deviceIpSensor->getStateTopic(), m_deviceIP);
118-
this->publishMQTT(m_deviceMacSensor->getStateTopic(), m_deviceMac);
119-
this->publishMQTT(m_deviceHardwareSensor->getStateTopic(), m_hardware);
120-
this->publishMQTT(m_deviceFirmwareSensor->getStateTopic(), m_firmware);
121-
this->publishMQTT(m_deviceFirmwareVersionSensor->getStateTopic(), m_firmwareVersion);
122-
}
123-
124-
this->refreshStatusTopics();
96+
this->publishMQTT(m_deviceStatusSensor.getStateTopic(), "ON");
97+
this->publishMQTT(m_deviceIpSensor.getStateTopic(), m_deviceIP);
98+
this->publishMQTT(m_deviceMacSensor.getStateTopic(), m_deviceMac);
99+
this->publishMQTT(m_deviceHardwareSensor.getStateTopic(), m_hardware);
100+
this->publishMQTT(m_deviceFirmwareSensor.getStateTopic(), m_firmware);
101+
this->publishMQTT(m_deviceFirmwareVersionSensor.getStateTopic(), m_firmwareVersion);
125102
}
126103

127104
void MqttManager::checkConnectivity()
@@ -148,6 +125,7 @@ void MqttManager::checkConnectivity()
148125
else
149126
{
150127
m_connected = true;
128+
this->publishDiscoveryInfo();
151129
}
152130
}
153131

@@ -159,30 +137,10 @@ void MqttManager::setDeviceMac()
159137
}
160138
}
161139

162-
void MqttManager::enableDiscovery(bool enable)
163-
{
164-
m_mqttDiscoveryEnabled = enable;
165-
}
166-
167-
void MqttManager::addDiscoveryComponent(MqttDiscoveryComponent * component)
140+
void MqttManager::addDiscoveryComponent(MqttDiscoveryComponent component)
168141
{
169142
m_discoveryComponents.push_back(component);
170-
171-
this->addSubscribeTopic(component->getCommandTopic());
172-
this->addStatusTopic(component->getStateTopic());
173-
}
174-
175-
void MqttManager::addStatusTopic(String statusTopic)
176-
{
177-
if (statusTopic.length() != 0)
178-
{
179-
m_statusTopics[statusTopic] = "";
180-
}
181-
}
182-
183-
void MqttManager::clearStatusTopics()
184-
{
185-
m_statusTopics.clear();
143+
this->addSubscribeTopic(component.getCommandTopic());
186144
}
187145

188146
void MqttManager::addSubscribeTopic(String subscribeTopic)
@@ -195,9 +153,9 @@ void MqttManager::addSubscribeTopic(String subscribeTopic)
195153

196154
void MqttManager::clearSubscribeTopics()
197155
{
198-
for(uint8_t i=0; i < m_subscribeTopics.size(); i++)
156+
for(auto &topic : m_subscribeTopics)
199157
{
200-
m_mqttClient.unsubscribe(m_subscribeTopics[i].c_str());
158+
m_mqttClient.unsubscribe(topic.c_str());
201159
}
202160
m_subscribeTopics.clear();
203161
}
@@ -216,18 +174,11 @@ void MqttManager::stopConnection()
216174

217175
void MqttManager::publishMQTT(String topic, String payload)
218176
{
219-
if (m_statusTopics.find(topic) != m_statusTopics.end() && m_statusTopics[topic] != payload)
220-
{
221-
m_statusTopics[topic] = payload;
222-
223-
if (m_connected)
224-
{
225-
this->refreshStatusTopics();
226-
}
227-
}
228-
else if (m_connected)
177+
if (m_connected)
229178
{
230179
m_mqttClient.publish(topic.c_str(), 1, true, payload.c_str());
180+
Serial.println(topic.c_str());
181+
Serial.println(payload.c_str());
231182
}
232183
}
233184

@@ -266,22 +217,13 @@ void MqttManager::loop()
266217
{
267218
if (m_deviceStatusInfoTimer.check())
268219
{
269-
this->publishDiscoveryInfo();
270220
this->publishDeviceStatusInfo();
271221

272222
m_deviceStatusInfoTimer.start(); //restart timer
273223
}
274224
}
275225
}
276226

277-
void MqttManager::refreshStatusTopics()
278-
{
279-
for ( auto const &topic : m_statusTopics)
280-
{
281-
this->publishMQTT(topic.first, topic.second);
282-
}
283-
}
284-
285227
bool MqttManager::connected()
286228
{
287229
return m_connected;

MqttManager/MqttManager.h

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "SimpleTimer.h"
1313
#include "MqttDiscoveryComponent.h"
1414

15+
#include <cstdint>
1516
#include <map>
1617
#include <string>
1718
#include <vector>
@@ -37,21 +38,21 @@ class MqttManager
3738
String m_lastWillPayload;
3839
String m_lastWillTopic;
3940

40-
MqttDiscoveryComponent* m_deviceStatusSensor;
41-
MqttDiscoveryComponent* m_deviceIpSensor;
42-
MqttDiscoveryComponent* m_deviceMacSensor;
43-
MqttDiscoveryComponent* m_deviceHardwareSensor;
44-
MqttDiscoveryComponent* m_deviceFirmwareSensor;
45-
MqttDiscoveryComponent* m_deviceFirmwareVersionSensor;
41+
MqttDiscoveryComponent m_deviceStatusSensor;
42+
MqttDiscoveryComponent m_deviceIpSensor;
43+
MqttDiscoveryComponent m_deviceMacSensor;
44+
MqttDiscoveryComponent m_deviceHardwareSensor;
45+
MqttDiscoveryComponent m_deviceFirmwareSensor;
46+
MqttDiscoveryComponent m_deviceFirmwareVersionSensor;
4647

4748
std::map<String, String> m_statusTopics;
4849
std::vector<String> m_subscribeTopics;
49-
std::vector<MqttDiscoveryComponent*> m_discoveryComponents;
50+
std::vector<MqttDiscoveryComponent> m_discoveryComponents;
5051

5152
AsyncMqttClient m_mqttClient;
5253

5354
bool m_connected;
54-
bool m_mqttDiscoveryEnabled{false};
55+
uint8_t m_discoveryCounter{0};
5556

5657
SimpleTimer m_deviceStatusInfoTimer;
5758
SimpleTimer m_checkConnectivityTimer;
@@ -68,22 +69,18 @@ class MqttManager
6869
public:
6970
MqttManager();
7071

71-
void setup(String mqttServer, String mqttPort, String mqttUsername, String mqttPassword, bool mqttDiscoveryEnabled = false);
72+
void setup(String mqttServer, String mqttPort, String mqttUsername, String mqttPassword);
7273

7374
void setDeviceData(String deviceName, String hardware, String deviceIP, String firmware, String firmwareVersion, String discovery_prefix="homeassistant");
7475
void setCallback(void (*callback)(String , String));
7576

7677
void setDeviceStatusInfoTime(unsigned long deviceStatusInfoTime);
7778

78-
void enableDiscovery(bool enable);
79-
void addDiscoveryComponent(MqttDiscoveryComponent* component);
79+
void addDiscoveryComponent(MqttDiscoveryComponent component);
8080

8181
void addSubscribeTopic(String subscribeTopic);
8282
void clearSubscribeTopics();
8383

84-
void addStatusTopic(String statusTopic);
85-
void clearStatusTopics();
86-
8784
void startConnection();
8885
void stopConnection();
8986

0 commit comments

Comments
 (0)