mirror of
https://github.com/HASwitchPlate/openHASP.git
synced 2025-07-24 11:46:34 +00:00
Tighten up mqtt commands
This commit is contained in:
parent
7d4e04560a
commit
d206ba15a4
@ -44,14 +44,6 @@ EthernetClient mqttNetworkClient;
|
||||
#include "user_config_override.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
String mqttGetSubtopic; // MQTT subtopic for incoming commands requesting .val
|
||||
String mqttGetSubtopicJSON; // MQTT object buffer for JSON status when requesting .val
|
||||
String mqttStateTopic; // MQTT topic for outgoing panel interactions
|
||||
String mqttStateJSONTopic; // MQTT topic for outgoing panel interactions in JSON format
|
||||
String mqttCommandTopic; // MQTT topic for incoming panel commands
|
||||
*/
|
||||
|
||||
// String mqttClientId((char *)0); // Auto-generated MQTT ClientID
|
||||
// String mqttNodeTopic((char *)0);
|
||||
// String mqttGroupTopic((char *)0);
|
||||
@ -62,64 +54,58 @@ bool mqttHAautodiscover = true;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// These defaults may be overwritten with values saved by the web interface
|
||||
#ifdef MQTT_HOST
|
||||
char mqttServer[16] = MQTT_HOST;
|
||||
#else
|
||||
char mqttServer[16] = "";
|
||||
#ifndef MQTT_HOST
|
||||
#define MQTT_HOST "";
|
||||
#endif
|
||||
#ifdef MQTT_PORT
|
||||
uint16_t mqttPort = MQTT_PORT;
|
||||
#else
|
||||
uint16_t mqttPort = 1883;
|
||||
|
||||
#ifndef MQTT_PORT
|
||||
#define MQTT_PORT 1883;
|
||||
#endif
|
||||
#ifdef MQTT_USER
|
||||
char mqttUser[23] = MQTT_USER;
|
||||
#else
|
||||
char mqttUser[23] = "";
|
||||
|
||||
#ifndef MQTT_USER
|
||||
#define MQTT_USER "";
|
||||
#endif
|
||||
#ifdef MQTT_PASSW
|
||||
char mqttPassword[32] = MQTT_PASSW;
|
||||
#else
|
||||
char mqttPassword[32] = "";
|
||||
|
||||
#ifndef MQTT_PASSW
|
||||
#define MQTT_PASSW "";
|
||||
#endif
|
||||
#ifdef MQTT_NODENAME
|
||||
char mqttNodeName[16] = MQTT_NODENAME;
|
||||
#else
|
||||
char mqttNodeName[16] = "";
|
||||
#ifndef MQTT_NODENAME
|
||||
#define MQTT_NODENAME "";
|
||||
#endif
|
||||
#ifdef MQTT_GROUPNAME
|
||||
char mqttGroupName[16] = MQTT_GROUPNAME;
|
||||
#else
|
||||
char mqttGroupName[16] = "";
|
||||
#ifndef MQTT_GROUPNAME
|
||||
#define MQTT_GROUPNAME "";
|
||||
#endif
|
||||
|
||||
#ifndef MQTT_PREFIX
|
||||
#define MQTT_PREFIX "hasp"
|
||||
#endif
|
||||
|
||||
char mqttServer[16] = MQTT_HOST;
|
||||
char mqttUser[23] = MQTT_USER;
|
||||
char mqttPassword[32] = MQTT_PASSW;
|
||||
char mqttNodeName[16] = MQTT_NODENAME;
|
||||
char mqttGroupName[16] = MQTT_GROUPNAME;
|
||||
uint16_t mqttPort = MQTT_PORT;
|
||||
PubSubClient mqttClient(mqttNetworkClient);
|
||||
|
||||
static void mqttResult(bool result, const char * topic, const char * payload)
|
||||
{
|
||||
if(result) {
|
||||
Log.notice(TAG_MQTT_PUB, F("%s => %s"), topic, payload);
|
||||
} else {
|
||||
Log.error(TAG_MQTT_PUB, F("Failed : %s => %s"), topic, payload);
|
||||
}
|
||||
}
|
||||
|
||||
static bool mqttPublish(const char * topic, const char * payload, size_t len)
|
||||
static bool mqttPublish(const char * topic, const char * payload, size_t len, bool retain = false)
|
||||
{
|
||||
if(mqttIsConnected()) {
|
||||
return mqttClient.publish(topic, (uint8_t *)payload, len, false);
|
||||
if(mqttClient.publish(topic, (uint8_t *)payload, len, retain)) {
|
||||
Log.notice(TAG_MQTT_PUB, F("%s => %s"), topic, payload);
|
||||
return true;
|
||||
} else {
|
||||
Log.error(TAG_MQTT_PUB, F("Failed : %s => %s"), topic, payload);
|
||||
}
|
||||
} else {
|
||||
Log.error(TAG_MQTT, F("Not connected"));
|
||||
}
|
||||
|
||||
Log.error(TAG_MQTT, F("Not connected"));
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool mqttPublish(const char * topic, const char * payload)
|
||||
static bool mqttPublish(const char * topic, const char * payload, bool retain = false)
|
||||
{
|
||||
return mqttPublish(topic, payload, strlen(payload));
|
||||
return mqttPublish(topic, payload, strlen(payload), retain);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@ -130,12 +116,23 @@ bool IRAM_ATTR mqttIsConnected()
|
||||
return mqttEnabled && mqttClient.connected();
|
||||
}
|
||||
|
||||
void mqtt_send_lwt(bool online)
|
||||
{
|
||||
char tmp_payload[8];
|
||||
char tmp_topic[strlen(mqttNodeTopic) + 4];
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sLWT"), mqttNodeTopic);
|
||||
|
||||
size_t len = snprintf_P(tmp_payload, sizeof(tmp_payload), online ? PSTR("online") : PSTR("offline"));
|
||||
bool res = mqttPublish(tmp_topic, tmp_payload, len, true);
|
||||
// mqttResult(res, tmp_topic, tmp_payload);
|
||||
}
|
||||
|
||||
void IRAM_ATTR mqtt_send_state_str(char * subtopic, char * payload)
|
||||
{
|
||||
char tmp_topic[strlen(mqttNodeTopic) + 20];
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/%s"), mqttNodeTopic, subtopic);
|
||||
bool res = mqttPublish(tmp_topic, payload);
|
||||
mqttResult(res, tmp_topic, payload);
|
||||
// mqttResult(res, tmp_topic, payload);
|
||||
}
|
||||
|
||||
void IRAM_ATTR mqtt_send_state(const __FlashStringHelper * subtopic, const char * payload)
|
||||
@ -143,7 +140,7 @@ void IRAM_ATTR mqtt_send_state(const __FlashStringHelper * subtopic, const char
|
||||
char tmp_topic[strlen(mqttNodeTopic) + 20];
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/%s"), mqttNodeTopic, subtopic);
|
||||
bool res = mqttPublish(tmp_topic, payload);
|
||||
mqttResult(res, tmp_topic, payload);
|
||||
// mqttResult(res, tmp_topic, payload);
|
||||
}
|
||||
|
||||
void IRAM_ATTR mqtt_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const char * attribute, const char * data)
|
||||
@ -155,11 +152,11 @@ void IRAM_ATTR mqtt_send_obj_attribute_str(uint8_t pageid, uint8_t btnid, const
|
||||
// snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/json"), mqttNodeTopic);
|
||||
// unsigned int len =
|
||||
// snprintf_P(payload, sizeof(payload), PSTR("{\"p[%u].b[%u].%s\":\"%s\"}"), pageid, btnid, attribute, data);
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/p%ub%u"), mqttNodeTopic, pageid, btnid);
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sstate/p%u/b%u"), mqttNodeTopic, pageid, btnid);
|
||||
unsigned int len = snprintf_P(payload, sizeof(payload), PSTR("{\"%s\":\"%s\"}"), attribute, data);
|
||||
|
||||
bool res = mqttPublish(tmp_topic, payload, len); //, false);
|
||||
mqttResult(res, tmp_topic, payload);
|
||||
// mqttResult(res, tmp_topic, payload);
|
||||
|
||||
// } else {
|
||||
// return mqtt_log_no_connection();
|
||||
@ -245,7 +242,7 @@ void mqttStart()
|
||||
char mqttClientId[64];
|
||||
char lastWillPayload[8];
|
||||
static uint8_t mqttReconnectCount = 0;
|
||||
bool mqttFirstConnect = true;
|
||||
// bool mqttFirstConnect = true;
|
||||
|
||||
mqttClient.setServer(mqttServer, 1883);
|
||||
// mqttClient.setSocketTimeout(10); //in seconds
|
||||
@ -265,40 +262,39 @@ void mqttStart()
|
||||
|
||||
haspProgressMsg(F("Connecting MQTT..."));
|
||||
haspProgressVal(mqttReconnectCount * 5);
|
||||
if(!mqttClient.connect(mqttClientId, mqttUser, mqttPassword, buffer, 2, false, lastWillPayload, true)) {
|
||||
if(!mqttClient.connect(mqttClientId, mqttUser, mqttPassword, buffer, 0, true, lastWillPayload, true)) {
|
||||
// Retry until we give up and restart after connectTimeout seconds
|
||||
mqttReconnectCount++;
|
||||
|
||||
switch(mqttClient.state()) {
|
||||
case MQTT_CONNECTION_TIMEOUT:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Server didn't respond within the keepalive time"));
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Network connection timeout"));
|
||||
break;
|
||||
case MQTT_CONNECTION_LOST:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Network connection was broken"));
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Network connection lost"));
|
||||
break;
|
||||
case MQTT_CONNECT_FAILED:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Network connection failed"));
|
||||
break;
|
||||
case MQTT_DISCONNECTED:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Client is disconnected cleanly"));
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Disconnected"));
|
||||
break;
|
||||
case MQTT_CONNECTED:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("(Client is connected"));
|
||||
break;
|
||||
case MQTT_CONNECT_BAD_PROTOCOL:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Server doesn't support the requested version of MQTT"));
|
||||
break;
|
||||
case MQTT_CONNECT_BAD_CLIENT_ID:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Server rejected the client identifier"));
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Server rejected the client ID"));
|
||||
break;
|
||||
case MQTT_CONNECT_UNAVAILABLE:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Server was unable to accept the connection"));
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Server unavailable"));
|
||||
break;
|
||||
case MQTT_CONNECT_BAD_CREDENTIALS:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Username or Password rejected"));
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Bad credentials"));
|
||||
break;
|
||||
case MQTT_CONNECT_UNAUTHORIZED:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Client was not authorized to connect"));
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Unauthorized"));
|
||||
break;
|
||||
default:
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("Unknown failure"));
|
||||
@ -314,19 +310,6 @@ void mqttStart()
|
||||
|
||||
Log.trace(TAG_MQTT, F("Connected to broker %s as clientID %s"), mqttServer, mqttClientId);
|
||||
|
||||
/*
|
||||
// MQTT topic string definitions
|
||||
mqttStateTopic = prefix + F("/state");
|
||||
mqttStateJSONTopic = prefix + F("/state/json");
|
||||
mqttCommandTopic = prefix + F("/page");
|
||||
mqttGroupCommandTopic = "hasp/" + mqttGroupName + "/page";
|
||||
|
||||
mqttLightCommandTopic = prefix + F("/light/switch");
|
||||
mqttLightStateTopic = prefix + F("/light/state");
|
||||
mqttLightBrightCommandTopic = prefix + F("/brightness/set");
|
||||
mqttLightBrightStateTopic = prefix + F("/brightness/state");
|
||||
*/
|
||||
|
||||
// Subscribe to our incoming topics
|
||||
mqttSubscribeTo(PSTR("%scommand/#"), mqttGroupTopic);
|
||||
mqttSubscribeTo(PSTR("%scommand/#"), mqttNodeTopic);
|
||||
@ -334,7 +317,7 @@ void mqttStart()
|
||||
mqttSubscribeTo(PSTR("%sconfig/#"), mqttNodeTopic);
|
||||
mqttSubscribeTo(PSTR("%slight/#"), mqttNodeTopic);
|
||||
mqttSubscribeTo(PSTR("%sbrightness/#"), mqttNodeTopic);
|
||||
mqttSubscribeTo(PSTR("%sLWT"), mqttNodeTopic);
|
||||
// mqttSubscribeTo(PSTR("%sLWT"), mqttNodeTopic);
|
||||
mqttSubscribeTo(PSTR("hass/status"), "");
|
||||
|
||||
/* Home Assistant auto-configuration */
|
||||
@ -343,15 +326,9 @@ void mqttStart()
|
||||
// Force any subscribed clients to toggle offline/online when we first connect to
|
||||
// make sure we get a full panel refresh at power on. Sending offline,
|
||||
// "online" will be sent by the mqttStatusTopic subscription action.
|
||||
snprintf_P(buffer, sizeof(buffer), PSTR("%sLWT"), mqttNodeTopic);
|
||||
{
|
||||
snprintf_P(lastWillPayload, sizeof(lastWillPayload), mqttFirstConnect ? PSTR("offline") : PSTR("online"));
|
||||
mqtt_send_lwt(true);
|
||||
|
||||
mqttClient.publish(buffer, lastWillPayload, true);
|
||||
Log.notice(TAG_MQTT, F("%s = %s"), buffer, lastWillPayload);
|
||||
}
|
||||
|
||||
mqttFirstConnect = false;
|
||||
// mqttFirstConnect = false;
|
||||
mqttReconnectCount = 0;
|
||||
|
||||
haspReconnect();
|
||||
@ -398,17 +375,10 @@ String mqttGetNodename()
|
||||
void mqttStop()
|
||||
{
|
||||
if(mqttEnabled && mqttClient.connected()) {
|
||||
char tmp_topic[strlen(mqttNodeTopic) + 8];
|
||||
char tmp_payload[32];
|
||||
Log.notice(TAG_MQTT, F("Disconnecting from broker..."));
|
||||
|
||||
size_t len;
|
||||
snprintf_P(tmp_topic, sizeof(tmp_topic), PSTR("%sLWT"), mqttNodeTopic);
|
||||
len = snprintf_P(tmp_payload, sizeof(tmp_payload), PSTR("offline"));
|
||||
mqttPublish(tmp_topic, tmp_payload, len);
|
||||
|
||||
Log.notice(TAG_MQTT, F("Disconnecting..."));
|
||||
mqtt_send_lwt(false);
|
||||
mqttClient.disconnect();
|
||||
Log.trace(TAG_MQTT, F("Disconnected from broker"));
|
||||
Log.trace(TAG_MQTT, F("Disconnected"));
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user