|  | @ -171,6 +171,7 @@ bool enableMqtt = true; | 
		
	
		
			
				|  |  |     uint8_t const stillOnlineInterval = 60;                 // Interval 'I'm still alive' is sent via MQTT (in seconds)
 |  |  |     uint8_t const stillOnlineInterval = 60;                 // Interval 'I'm still alive' is sent via MQTT (in seconds)
 | 
		
	
		
			
				|  |  | #endif
 |  |  | #endif
 | 
		
	
		
			
				|  |  | // RFID
 |  |  | // RFID
 | 
		
	
		
			
				|  |  |  |  |  | #define RFID_SCAN_INTERVAL 300                         //in ms
 | 
		
	
		
			
				|  |  | uint8_t const cardIdSize = 4;                           // RFID
 |  |  | uint8_t const cardIdSize = 4;                           // RFID
 | 
		
	
		
			
				|  |  | // Volume
 |  |  | // Volume
 | 
		
	
		
			
				|  |  | uint8_t maxVolume = 21;                                 // Maximum volume that can be adjusted
 |  |  | uint8_t maxVolume = 21;                                 // Maximum volume that can be adjusted
 | 
		
	
	
		
			
				|  | @ -231,6 +232,8 @@ bool accessPointStarted = false; | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | // MQTT-configuration
 |  |  | // MQTT-configuration
 | 
		
	
		
			
				|  |  | char mqtt_server[16] = "192.168.2.43";                  // IP-address of MQTT-server (if not found in NVS this one will be taken)
 |  |  | char mqtt_server[16] = "192.168.2.43";                  // IP-address of MQTT-server (if not found in NVS this one will be taken)
 | 
		
	
		
			
				|  |  |  |  |  | char mqttUser[15] = "mqtt-user";                        // MQTT-user
 | 
		
	
		
			
				|  |  |  |  |  | char mqttPassword[15] = "mqtt-password";                // MQTT-password
 | 
		
	
		
			
				|  |  | #ifdef MQTT_ENABLE
 |  |  | #ifdef MQTT_ENABLE
 | 
		
	
		
			
				|  |  |     #define DEVICE_HOSTNAME "ESP32-Tonuino"                 // Name that that is used for MQTT
 |  |  |     #define DEVICE_HOSTNAME "ESP32-Tonuino"                 // Name that that is used for MQTT
 | 
		
	
		
			
				|  |  |     static const char topicSleepCmnd[] PROGMEM = "Cmnd/Tonuino/Sleep"; |  |  |     static const char topicSleepCmnd[] PROGMEM = "Cmnd/Tonuino/Sleep"; | 
		
	
	
		
			
				|  | @ -571,13 +574,25 @@ void postHeartbeatViaMqtt(void) { | 
		
	
		
			
				|  |  | */ |  |  | */ | 
		
	
		
			
				|  |  | bool reconnect() { |  |  | bool reconnect() { | 
		
	
		
			
				|  |  |   uint8_t maxRetries = 10; |  |  |   uint8_t maxRetries = 10; | 
		
	
		
			
				|  |  |  |  |  |   uint8_t connect = false; | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |   while (!MQTTclient.connected() && mqttFailCount < maxRetries) { |  |  |   while (!MQTTclient.connected() && mqttFailCount < maxRetries) { | 
		
	
		
			
				|  |  |     snprintf(logBuf, sizeof(logBuf) / sizeof(logBuf[0]), "%s %s", (char *) FPSTR(tryConnectMqttS), mqtt_server); |  |  |     snprintf(logBuf, sizeof(logBuf) / sizeof(logBuf[0]), "%s %s", (char *) FPSTR(tryConnectMqttS), mqtt_server); | 
		
	
		
			
				|  |  |     loggerNl(logBuf, LOGLEVEL_NOTICE); |  |  |     loggerNl(logBuf, LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |     // Try to connect to MQTT-server
 |  |  |  | 
		
	
		
			
				|  |  |  |  |  |     // Try to connect to MQTT-server. If username AND password are set, they'll be used
 | 
		
	
		
			
				|  |  |  |  |  |     if (strlen(mqttUser) < 1 || strlen(mqttPassword) < 1) { | 
		
	
		
			
				|  |  |  |  |  |         loggerNl((char *) FPSTR(mqttWithoutPwd), LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  |         if (MQTTclient.connect(DEVICE_HOSTNAME)) { |  |  |         if (MQTTclient.connect(DEVICE_HOSTNAME)) { | 
		
	
		
			
				|  |  |  |  |  |             connect = true; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |     } else { | 
		
	
		
			
				|  |  |  |  |  |         loggerNl((char *) FPSTR(mqttWithPwd), LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  |  |  |  |         if (MQTTclient.connect(DEVICE_HOSTNAME, mqttUser, mqttPassword)) { | 
		
	
		
			
				|  |  |  |  |  |             connect = true; | 
		
	
		
			
				|  |  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  |     if (connect) { | 
		
	
		
			
				|  |  |         loggerNl((char *) FPSTR(mqttOk), LOGLEVEL_NOTICE); |  |  |         loggerNl((char *) FPSTR(mqttOk), LOGLEVEL_NOTICE); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         // Deepsleep-subscription
 |  |  |         // Deepsleep-subscription
 | 
		
	
	
		
			
				|  | @ -1465,7 +1480,7 @@ void rfidScanner(void *parameter) { | 
		
	
		
			
				|  |  |     for (;;) { |  |  |     for (;;) { | 
		
	
		
			
				|  |  |         esp_task_wdt_reset(); |  |  |         esp_task_wdt_reset(); | 
		
	
		
			
				|  |  |         vTaskDelay(10); |  |  |         vTaskDelay(10); | 
		
	
		
			
				|  |  |         if ((millis() - lastRfidCheckTimestamp) >= 300) { |  |  |  | 
		
	
		
			
				|  |  |  |  |  |         if ((millis() - lastRfidCheckTimestamp) >= RFID_SCAN_INTERVAL) { | 
		
	
		
			
				|  |  |             lastRfidCheckTimestamp = millis(); |  |  |             lastRfidCheckTimestamp = millis(); | 
		
	
		
			
				|  |  |             // Reset the loop if no new card is present on the sensor/reader. This saves the entire process when idle.
 |  |  |             // Reset the loop if no new card is present on the sensor/reader. This saves the entire process when idle.
 | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
	
		
			
				|  | @ -2594,6 +2609,10 @@ String templateProcessor(const String& templ) { | 
		
	
		
			
				|  |  |         } else { |  |  |         } else { | 
		
	
		
			
				|  |  |             return String(); |  |  |             return String(); | 
		
	
		
			
				|  |  |         } |  |  |         } | 
		
	
		
			
				|  |  |  |  |  |     } else if (templ == "MQTT_USER") { | 
		
	
		
			
				|  |  |  |  |  |         return prefsSettings.getString("mqttUser", "-1"); | 
		
	
		
			
				|  |  |  |  |  |     } else if (templ == "MQTT_PWD") { | 
		
	
		
			
				|  |  |  |  |  |         return prefsSettings.getString("mqttPassword", "-1"); | 
		
	
		
			
				|  |  |     } else if (templ == "IPv4") { |  |  |     } else if (templ == "IPv4") { | 
		
	
		
			
				|  |  |         myIP = WiFi.localIP(); |  |  |         myIP = WiFi.localIP(); | 
		
	
		
			
				|  |  |         snprintf(logBuf, sizeof(logBuf) / sizeof(logBuf[0]), "%d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]); |  |  |         snprintf(logBuf, sizeof(logBuf) / sizeof(logBuf[0]), "%d.%d.%d.%d", myIP[0], myIP[1], myIP[2], myIP[3]); | 
		
	
	
		
			
				|  | @ -2660,6 +2679,15 @@ bool processJsonRequest(char *_serialJson) { | 
		
	
		
			
				|  |  |         const char *_mqttServer = object["mqtt"]["mqttServer"]; |  |  |         const char *_mqttServer = object["mqtt"]["mqttServer"]; | 
		
	
		
			
				|  |  |         prefsSettings.putUChar("enableMQTT", _mqttEnable); |  |  |         prefsSettings.putUChar("enableMQTT", _mqttEnable); | 
		
	
		
			
				|  |  |         prefsSettings.putString("mqttServer", (String) _mqttServer); |  |  |         prefsSettings.putString("mqttServer", (String) _mqttServer); | 
		
	
		
			
				|  |  |  |  |  |         const char *_mqttUser = doc["mqtt"]["mqttUser"]; | 
		
	
		
			
				|  |  |  |  |  |         const char *_mqttPwd = doc["mqtt"]["mqttPwd"]; | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |         prefsSettings.putUChar("enableMQTT", _mqttEnable); | 
		
	
		
			
				|  |  |  |  |  |         prefsSettings.putUChar("enableMQTT", _mqttEnable); | 
		
	
		
			
				|  |  |  |  |  |         prefsSettings.putString("mqttServer", (String) _mqttServer); | 
		
	
		
			
				|  |  |  |  |  |         prefsSettings.putString("mqttServer", (String) _mqttServer); | 
		
	
		
			
				|  |  |  |  |  |         prefsSettings.putString("mqttUser", (String) _mqttUser); | 
		
	
		
			
				|  |  |  |  |  |         prefsSettings.putString("mqttPassword", (String) _mqttPwd); | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |         if ((prefsSettings.getUChar("enableMQTT", 99) != _mqttEnable) || |  |  |         if ((prefsSettings.getUChar("enableMQTT", 99) != _mqttEnable) || | 
		
	
		
			
				|  |  |             (!String(_mqttServer).equals(prefsSettings.getString("mqttServer", "-1")))) { |  |  |             (!String(_mqttServer).equals(prefsSettings.getString("mqttServer", "-1")))) { | 
		
	
	
		
			
				|  | @ -3082,6 +3110,7 @@ void setup() { | 
		
	
		
			
				|  |  |             loggerNl(logBuf, LOGLEVEL_INFO); |  |  |             loggerNl(logBuf, LOGLEVEL_INFO); | 
		
	
		
			
				|  |  |             break; |  |  |             break; | 
		
	
		
			
				|  |  |     } |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |     // Get MQTT-server from NVS
 |  |  |     // Get MQTT-server from NVS
 | 
		
	
		
			
				|  |  |     String nvsMqttServer = prefsSettings.getString("mqttServer", "-1"); |  |  |     String nvsMqttServer = prefsSettings.getString("mqttServer", "-1"); | 
		
	
		
			
				|  |  |     if (!nvsMqttServer.compareTo("-1")) { |  |  |     if (!nvsMqttServer.compareTo("-1")) { | 
		
	
	
		
			
				|  | @ -3093,6 +3122,27 @@ void setup() { | 
		
	
		
			
				|  |  |         loggerNl(logBuf, LOGLEVEL_INFO); |  |  |         loggerNl(logBuf, LOGLEVEL_INFO); | 
		
	
		
			
				|  |  |     } |  |  |     } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |     // Get MQTT-user from NVS
 | 
		
	
		
			
				|  |  |  |  |  |     String nvsMqttUser = prefsSettings.getString("mqttUser", "-1"); | 
		
	
		
			
				|  |  |  |  |  |     if (!nvsMqttUser.compareTo("-1")) { | 
		
	
		
			
				|  |  |  |  |  |         prefsSettings.putString("mqttUser", (String) mqttUser); | 
		
	
		
			
				|  |  |  |  |  |         loggerNl((char *) FPSTR(wroteMqttUserToNvs), LOGLEVEL_ERROR); | 
		
	
		
			
				|  |  |  |  |  |     } else { | 
		
	
		
			
				|  |  |  |  |  |         strncpy(mqttUser, nvsMqttUser.c_str(), sizeof(mqttUser)/sizeof(mqttUser[0])); | 
		
	
		
			
				|  |  |  |  |  |         snprintf(logBuf, sizeof(logBuf) / sizeof(logBuf[0]), "%s: %s", (char *) FPSTR(loadedMqttUserFromNvs), nvsMqttUser.c_str()); | 
		
	
		
			
				|  |  |  |  |  |         loggerNl(logBuf, LOGLEVEL_INFO); | 
		
	
		
			
				|  |  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |  |     // Get MQTT-password from NVS
 | 
		
	
		
			
				|  |  |  |  |  |     String nvsMqttPassword = prefsSettings.getString("mqttPassword", "-1"); | 
		
	
		
			
				|  |  |  |  |  |     if (!nvsMqttPassword.compareTo("-1")) { | 
		
	
		
			
				|  |  |  |  |  |         prefsSettings.putString("mqttPassword", (String) mqttPassword); | 
		
	
		
			
				|  |  |  |  |  |         loggerNl((char *) FPSTR(wroteMqttPwdToNvs), LOGLEVEL_ERROR); | 
		
	
		
			
				|  |  |  |  |  |     } else { | 
		
	
		
			
				|  |  |  |  |  |         strncpy(mqttPassword, nvsMqttPassword.c_str(), sizeof(mqttPassword)/sizeof(mqttPassword[0])); | 
		
	
		
			
				|  |  |  |  |  |         snprintf(logBuf, sizeof(logBuf) / sizeof(logBuf[0]), "%s: %s", (char *) FPSTR(loadedMqttPwdFromNvs), nvsMqttPassword.c_str()); | 
		
	
		
			
				|  |  |  |  |  |         loggerNl(logBuf, LOGLEVEL_INFO); | 
		
	
		
			
				|  |  |  |  |  |     } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  |     // Create 1000Hz-HW-Timer (currently only used for buttons)
 |  |  |     // Create 1000Hz-HW-Timer (currently only used for buttons)
 | 
		
	
		
			
				|  |  |     timerSemaphore = xSemaphoreCreateBinary(); |  |  |     timerSemaphore = xSemaphoreCreateBinary(); | 
		
	
	
		
			
				|  | 
 |