#include #include #include #include class MQTTHelper { private: String _group = "homedevice"; String _identifier = "garagesensor"; const char* _user = "homedevice"; const char* _password = "WNzAb4VazNFUPlpkn0ED"; WiFiClient _espClient; PubSubClient _mqttClient; String _will_topic; void reconnect(int delayMillis = 5000); bool connect(); void announce(); void callback(char* topic, byte* payload, unsigned int length); public: MQTTHelper() : _espClient(), _mqttClient(_espClient) { auto deviceMac = WiFi.macAddress(); deviceMac.replace(":",""); _identifier = "etxean-"+deviceMac.substring(6); _will_topic = getTopic("online"); _mqttClient.setCallback([this] (char* topic, byte* payload, unsigned int length) { this->callback(topic, payload, length); }); } String getIdentifier() { return _identifier; } String getTopic(String node) { return _group + "/" + _identifier + "/" + node; } void Configure(IPAddress server, uint16 port) { Serial.println("Configuring MQTT connection to: "+server.toString()+":"+String(port)); _mqttClient.setServer(server, port); if (_mqttClient.connected()) { connect(); } } void loop() { static unsigned long lastWill; if (!_mqttClient.connected()) { reconnect(); } _mqttClient.loop(); auto now = millis(); if ((now - lastWill) > 1000) { lastWill = now; _mqttClient.publish(_will_topic.c_str(), "true"); } } template void publish(String sensor, T payload, bool retained = false) { _mqttClient.publish(getTopic(sensor).c_str(), String(payload).c_str(), retained); } }; void MQTTHelper::callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived:"); Serial.print(topic); Serial.print(" = "); for (unsigned int i=0; i