123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616 |
- #define MQTT_RECONNECT_INTERVAL_3_TRIES 15000
- #define MQTT_RECONNECT_INTERVAL_10_TRIES 60000
- #define MQTT_RECONNECT_INTERVAL_LONG 300000
- bool mqttHeartbeatReceived = false;
- void mqttCallback(char *topic, unsigned char *payload, uint16_t length)
- {
-
-
-
-
-
-
-
-
-
- if (strcmp(topic, mqtt_topic_in_cmd) == 0)
- {
- int len;
- if (length < sizeof(cmdPayload))
- len = length;
- else
- len = sizeof(cmdPayload) - 1;
- for (int i = 0; i < len; i++)
- {
- cmdPayload[i] = (char)payload[i];
- }
- cmdPayload[len] = '\0';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- if (strncmp(cmdPayload, "HEARTBEAT", 9) == 0)
- {
- mqttLastHeartbeat = millis();
- mqttHeartbeatReceived = true;
- mqttConnected = true;
- }
- else
- {
- cmdInQueue = true;
- }
- }
- if (strcmp(topic, mqtt_topic_in_setTemp) == 0)
- {
- int len;
- if (length < sizeof(cmdPayload))
- len = length;
- else
- len = sizeof(cmdPayload) - 1;
- for (int i = 0; i < len; i++)
- {
- cmdPayload[i] = (char)payload[i];
- }
-
- cmdPayload[len] = '\0';
-
-
- char tmpPayload[11];
- strlcpy(tmpPayload, cmdPayload, 10);
- float valueFloat;
- valueFloat = round(atof(tmpPayload) * 2.0) / 2.0;
- setTempTo(valueFloat);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- char buf[50];
- sprintf(buf, "MQTT IN: setTemp to %2.1f", valueFloat);
- sendLog(buf, LOGLEVEL_INFO);
- cmdInQueue = false;
- }
- if (strcmp(topic, mqtt_topic_in_setMode) == 0)
- {
- uint8_t len;
- if (length < sizeof(cmdPayload))
- len = length;
- else
- len = sizeof(cmdPayload) - 1;
- for (int i = 0; i < len; i++)
- {
- cmdPayload[i] = (char)payload[i];
- }
-
- cmdPayload[len] = '\0';
-
-
- char tmpPayload[21];
- strlcpy(tmpPayload, cmdPayload, sizeof(tmpPayload));
- strlwr(tmpPayload);
- unsigned char tmpHeatMode = 100;
- char tmpModename0[15];
- char tmpModename1[15];
- strlcpy(tmpModename0, confAdv.modeName0, sizeof(tmpModename0));
- strlcpy(tmpModename1, confAdv.modeName1, sizeof(tmpModename1));
- strlwr(tmpModename0);
- strlwr(tmpModename1);
- if (strcmp(tmpPayload, tmpModename0) == 0)
- tmpHeatMode = 0;
- else if (strcmp(tmpPayload, tmpModename1) == 0)
- tmpHeatMode = 1;
- else if (strcmp(tmpPayload, "off") == 0)
- tmpHeatMode = 0;
- else if (strcmp(tmpPayload, "aus") == 0)
- tmpHeatMode = 0;
- else if (strcmp(tmpPayload, "on") == 0)
- tmpHeatMode = 1;
- else if (strcmp(tmpPayload, "ein") == 0)
- tmpHeatMode = 1;
- else if (atoi(tmpPayload) == 0)
- tmpHeatMode = 0;
- else if (atoi(tmpPayload) == 1)
- tmpHeatMode = 1;
- if (tmpHeatMode == 0 || tmpHeatMode == 1)
- {
- setHeatingmodeTo(tmpHeatMode);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- char buf[50];
- sprintf(buf, "MQTT IN: setMode to %u", tmpHeatMode);
- sendLog(buf, LOGLEVEL_INFO);
- }
- cmdInQueue = false;
- }
- if (strcmp(topic, mqtt_topic_in_setPreset) == 0)
- {
- char tmpPayload[21];
- char tmpPresetName0[15];
- char tmpPresetName1[15];
- char tmpPresetName2[15];
- uint16_t len;
- unsigned char tmpPreset = 100;
- if (length < sizeof(cmdPayload))
- len = length;
- else
- len = sizeof(cmdPayload) - 1;
- for (unsigned char i = 0; i < len; i++)
- {
- cmdPayload[i] = (char)payload[i];
- }
-
- cmdPayload[len] = '\0';
-
-
- strlcpy(tmpPayload, cmdPayload, sizeof(tmpPayload));
- strlwr(tmpPayload);
- strlcpy(tmpPresetName0, confAdv.psetName0, sizeof(tmpPresetName0));
- strlcpy(tmpPresetName1, confAdv.psetName1, sizeof(tmpPresetName1));
- strlcpy(tmpPresetName2, confAdv.psetName2, sizeof(tmpPresetName2));
- strlwr(tmpPresetName0);
- strlwr(tmpPresetName1);
- strlwr(tmpPresetName2);
- if (strcmp(tmpPayload, tmpPresetName0) == 0)
- tmpPreset = 0;
- else if (strcmp(tmpPayload, tmpPresetName1) == 0)
- tmpPreset = 1;
- else if (strcmp(tmpPayload, tmpPresetName2) == 0)
- tmpPreset = 2;
- else if (strcmp(tmpPayload, "none") == 0)
- tmpPreset = 0;
- else if (strcmp(tmpPayload, "red1") == 0)
- tmpPreset = 1;
- else if (strcmp(tmpPayload, "red2") == 0)
- tmpPreset = 2;
- else if (atoi(tmpPayload) == 0)
- tmpPreset = 0;
- else if (atoi(tmpPayload) == 1)
- tmpPreset = 1;
- else if (atoi(tmpPayload) == 2)
- tmpPreset = 2;
- if (tmpPreset <= 2)
- {
- setPresetTo(tmpPreset);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- char buf[50];
- sprintf(buf, "MQTT IN: setPreset to %s", cmdPayload);
- sendLog(buf, LOGLEVEL_INFO);
- }
- cmdInQueue = false;
- }
- if (strcmp(topic, confAdd.outTemp_topic_in) == 0)
- {
- int len;
- if (length < 6)
- len = length;
- else
- len = 5;
- for (int i = 0; i < len; i++)
- {
- outTemp_newValue[i] = (char)payload[i];
- }
-
- outTemp_newValue[len] = '\0';
- outTemp_parseNewValue = true;
- }
- if (strcmp(topic, confAdd.outHum_topic_in) == 0)
- {
- int len;
- if (length < 4)
- len = length;
- else
- len = 3;
- for (int i = 0; i < len; i++)
- {
- outHum_newValue[i] = (char)payload[i];
- }
-
- outHum_newValue[len] = '\0';
- outHum_parseNewValue = true;
- }
- }
- void mqttPrepareSubscribeTopics()
- {
-
- sprintf(mqtt_topic_in_cmd, "%s/%s", confMqtt.mqtt_topic_in, "cmd");
- sprintf(mqtt_topic_in_setTemp, "%s/%s", mqtt_topic_in_cmd, "setTemp");
- sprintf(mqtt_topic_in_setMode, "%s/%s", mqtt_topic_in_cmd, "setMode");
- sprintf(mqtt_topic_in_setPreset, "%s/%s", mqtt_topic_in_cmd, "setPreset");
- }
- bool mqttReconnect(void)
- {
- mqttclient.disconnect();
- delay(10);
-
-
- String mqttClientId = FIRMWARE_SHORTNAME;
- mqttClientId += "-";
-
- mqttClientId += String(confDevWiFi.deviceName);
-
-
-
-
- boolean connRes;
- mqttReconnectAttempts++;
- char connectMode[20];
- if (strlen(confMqtt.mqtt_user) > 0 && strlen(confMqtt.mqtt_willTopic) == 0)
- {
-
-
-
- strlcpy(connectMode, "Auth, no LWT", sizeof(connectMode));
- connRes = mqttclient.connect(mqttClientId.c_str(), confMqtt.mqtt_user, confMqtt.mqtt_pass);
- }
- else if (strlen(confMqtt.mqtt_user) > 0 && strlen(confMqtt.mqtt_willTopic) > 0)
- {
-
-
-
- strlcpy(connectMode, "Auth and LWT", sizeof(connectMode));
- connRes = mqttclient.connect(mqttClientId.c_str(), confMqtt.mqtt_user, confMqtt.mqtt_pass, confMqtt.mqtt_willTopic, confMqtt.mqtt_willQos, confMqtt.mqtt_willRetain, confMqtt.mqtt_willMsg);
- }
- else if (strlen(confMqtt.mqtt_user) == 0 && strlen(confMqtt.mqtt_willTopic) > 0)
- {
-
-
-
- strlcpy(connectMode, "LWT, no Auth", sizeof(connectMode));
- connRes = mqttclient.connect(mqttClientId.c_str(), confMqtt.mqtt_willTopic, confMqtt.mqtt_willQos, confMqtt.mqtt_willRetain, confMqtt.mqtt_willMsg);
- }
- else
- {
-
-
-
- strlcpy(connectMode, "no Auth, no LWT", sizeof(connectMode));
- connRes = mqttclient.connect(mqttClientId.c_str());
- }
-
-
-
-
-
-
- char logBuf[70];
- sprintf(logBuf, "MQTT: connecting to %s:%u w/ %s, attempt: %u", confMqtt.mqtt_server, confMqtt.mqtt_port, connectMode, mqttReconnectAttempts);
- sendLog(logBuf, LOGLEVEL_INFO);
- if (connRes)
- {
-
-
-
-
-
-
-
-
-
- mqttConnected = true;
- mqttReconnects++;
- mqttOnConnect();
-
-
- sendLog("MQTT: subscribed topics:", LOGLEVEL_INFO);
- if (strlen(mqtt_topic_in_cmd) > 0)
- {
- char mqtt_topic_in_subscribe[52];
- sprintf(mqtt_topic_in_subscribe, "%s/%s", mqtt_topic_in_cmd, "#");
- if (mqttclient.subscribe(mqtt_topic_in_subscribe))
- {
-
-
-
-
- char buf[60];
- sprintf(buf, " %s", mqtt_topic_in_subscribe);
- sendLog(buf, LOGLEVEL_INFO);
- mqttInTopicSubscribed = true;
- }
- }
- if (strlen(confAdd.outTemp_topic_in) > 0)
- {
- if (mqttclient.subscribe(confAdd.outTemp_topic_in))
- {
-
-
-
-
- char buf[60];
- sprintf(buf, " %s", confAdd.outTemp_topic_in);
- sendLog(buf, LOGLEVEL_INFO);
- }
- }
- if (strlen(confAdd.outHum_topic_in) > 0)
- {
- if (mqttclient.subscribe(confAdd.outHum_topic_in))
- {
-
-
-
-
- char buf[60];
- sprintf(buf, " %s", confAdd.outHum_topic_in);
- sendLog(buf, LOGLEVEL_INFO);
- }
- }
- mqttReconnectAttempts = 0;
- return mqttclient.connected();
- }
- else
- {
- int mqttConnRes = mqttclient.state();
- char logBuf[70];
- mqtt_updateCurrentStateName();
- sprintf_P(logBuf, "%s: %s, rc=%d (%s)", PGMStr_MQTT, PGMStr_connectedFailed, mqttConnRes, mqttCurrentStateName);
- sendLog(logBuf, LOGLEVEL_INFO);
- if (mqttReconnectAttempts >= 3 && (mqttConnRes == 4 || mqttConnRes == 5))
- {
-
- mqtt_tempDisabled_credentialError = true;
- if (confLog.logLevelSerial >= LOGLEVEL_VERBOSE)
- {
-
- sendLog(F("MQTT disabled until reboot due to credential error"), LOGLEVEL_ERROR);
- }
- }
- mqttConnected = false;
- mqttOnDisconnect();
- return mqttclient.connected();
- }
- }
- void mqttClientInit()
- {
- if (confMqtt.mqtt_enable)
- {
- mqttclient.setServer(confMqtt.mqtt_server, confMqtt.mqtt_port);
- mqttclient.setCallback(mqttCallback);
- mqttLastReconnectAttempt = 0;
- mqttReconnectAttempts = 0;
- mqtt_tempDisabled_credentialError = false;
- }
- }
- int lastWifiStatus;
- void mqttHandleConnection()
- {
- if (mqttHeartbeatReceived)
- {
- mqttHeartbeatReceived = false;
- sendLog(F("MQTT: received HEARTBEAT - resetting timer..."), LOGLEVEL_VERBOSE);
- }
- int currWifiStatus = WiFi.status();
- if (currWifiStatus != lastWifiStatus)
- {
- lastWifiStatus = currWifiStatus;
-
-
- }
- if (confMqtt.mqtt_enable && !mqtt_tempDisabled_credentialError && currWifiStatus == WL_CONNECTED)
- {
-
- boolean doReconnect = false;
- if (!mqttclient.connected())
- doReconnect = true;
- if (mqttInTopicSubscribed && confMqtt.mqtt_heartbeat_maxage_reconnect > 0)
- {
- if (confMqtt.mqtt_enable_heartbeat && confMqtt.mqtt_heartbeat_maxage_reconnect > 0 && ((millis() - mqttLastHeartbeat) > confMqtt.mqtt_heartbeat_maxage_reconnect))
- {
- doReconnect = true;
- mqttConnected = false;
- mqttLastHeartbeat = millis();
-
- sendLog(F("MQTT: HEARTBEAT overdue. Force-Reconnecting MQTT..."), LOGLEVEL_WARN);
- }
- }
- if (doReconnect)
- {
- unsigned long mqttReconnectAttemptDelay;
- if (mqttReconnectAttempts < 3)
- mqttReconnectAttemptDelay = MQTT_RECONNECT_INTERVAL_3_TRIES;
- else if (mqttReconnectAttempts < 10)
- mqttReconnectAttemptDelay = MQTT_RECONNECT_INTERVAL_10_TRIES;
- else
- mqttReconnectAttemptDelay = MQTT_RECONNECT_INTERVAL_LONG;
- if (confMqtt.mqtt_enable_heartbeat && confMqtt.mqtt_heartbeat_maxage_reboot > 0 && ((millis() - mqttLastHeartbeat) > confMqtt.mqtt_heartbeat_maxage_reboot))
- {
-
-
- sendLog(F("MQTT: HEARTBEAT_MAXAGE_REBOOT overdue. Restarting..."), LOGLEVEL_WARN);
- restart();
- }
- if ((millis() - mqttLastReconnectAttempt) > mqttReconnectAttemptDelay)
- {
- mqttLastReconnectAttempt = millis();
-
-
-
- mqttReconnect();
- }
- mqttclient.loop();
- }
- else
- {
- mqttclient.loop();
- }
- }
- }
- void mqttPublishStatus()
- {
- if (confMqtt.mqtt_enable && mqttclient.state() == 0)
- {
- char outMsg[60];
- sprintf_P(outMsg, "%s: %s: %s:%u, %s: %d", PGMStr_MQTT, PGMStr_connectedTo, confMqtt.mqtt_server, confMqtt.mqtt_port, PGMStr_reconnects, mqttReconnects - 1);
-
- sendLog(outMsg, LOGLEVEL_INFO);
- }
- }
- void mqttOnConnect()
- {
- mqttPublishConnectMsg();
- mqttPublishStatus();
- displayShowMQTTConnected();
- }
- void mqttOnDisconnect()
- {
- displayShowMQTTConnectionError();
- }
- void mqttPublishConnectMsg()
- {
- if (strlen(confMqtt.mqtt_willTopic) > 4)
- {
- if (confMqtt.mqtt_enable && mqttclient.state() == 0)
- {
- mqttclient.publish(confMqtt.mqtt_willTopic, confMqtt.mqtt_connMsg, confMqtt.mqtt_willRetain);
-
- }
- }
- }
- void mqttPublishHeartbeat()
- {
- if (confMqtt.mqtt_enable && confMqtt.mqtt_enable_heartbeat && mqttclient.state() == 0)
- {
- mqttclient.publish(mqtt_topic_in_cmd, "HEARTBEAT", false);
- }
- }
- void mqtt_updateCurrentStateName()
- {
- if (confMqtt.mqtt_enable)
- {
- sprintf_P(mqttCurrentStateName, "%s", PGMStr_MQTTStates[mqttclient.state() + 4]);
- }
- else
- sprintf_P(mqttCurrentStateName, "%s", PGMStr_MQTTState_DIS);
- }
- void mqttResetConnection()
- {
- sendLog(F("MQTT: resetting connection..."));
- if (!confMqtt.mqtt_enable)
- mqttclient.disconnect();
- else
- {
- mqttclient.disconnect();
- mqttPrepareSubscribeTopics();
- mqttClientInit();
- }
- configChangedMqttConnResetRequired = false;
- }
|