diff --git a/src/MqttTopics.h b/src/MqttTopics.h index f52dbbd..d1493e3 100644 --- a/src/MqttTopics.h +++ b/src/MqttTopics.h @@ -70,6 +70,8 @@ #define mqtt_topic_info_nuki_hub_ip "/info/nukiHubIp" #define mqtt_topic_reset "/maintenance/reset" +#define mqtt_topic_webserver_state "/maintenance/webserver/state" +#define mqtt_topic_webserver_action "/maintenance/webserver/enable" #define mqtt_topic_uptime "/maintenance/uptime" #define mqtt_topic_wifi_rssi "/maintenance/wifiRssi" #define mqtt_topic_log "/maintenance/log" diff --git a/src/NetworkLock.cpp b/src/NetworkLock.cpp index 95e7397..f68b2bb 100644 --- a/src/NetworkLock.cpp +++ b/src/NetworkLock.cpp @@ -53,6 +53,10 @@ void NetworkLock::initialize() _network->subscribe(_mqttPath, mqtt_topic_reset); _network->initTopic(_mqttPath, mqtt_topic_reset, "0"); + _network->subscribe(_mqttPath, mqtt_topic_webserver_action); + _network->initTopic(_mqttPath, mqtt_topic_webserver_action, "--"); + _network->initTopic(_mqttPath, mqtt_topic_webserver_state, _preferences->getBool(preference_webserver_enabled, true) ? 1 : 0); + _network->initTopic(_mqttPath, mqtt_topic_query_config, "0"); _network->initTopic(_mqttPath, mqtt_topic_query_lockstate, "0"); _network->initTopic(_mqttPath, mqtt_topic_query_battery, "0"); @@ -102,6 +106,32 @@ void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const uns restartEsp(RestartReason::RequestedViaMqtt); } + if(comparePrefixedPath(topic, mqtt_topic_webserver_action)) + { + if(strcmp(value, "") == 0 || + strcmp(value, "--") == 0) return; + + publishString(mqtt_topic_webserver_action, "--"); + + if(strcmp(value, "1") == 0) + { + if(_preferences->getBool(preference_webserver_enabled)) return; + Log->println(F("Webserver enabled, restarting.")); + _preferences->putBool(preference_webserver_enabled, true); + + } + else if (strcmp(value, "0") == 0) + { + if(!_preferences->getBool(preference_webserver_enabled)) return; + Log->println(F("Webserver disabled, restarting.")); + _preferences->putBool(preference_webserver_enabled, false); + } + + _network->clearWifiFallback(); + delay(200); + restartEsp(RestartReason::RequestedViaMqtt); + } + if(comparePrefixedPath(topic, mqtt_topic_lock_action)) { if(strcmp(value, "") == 0 || @@ -199,7 +229,7 @@ void NetworkLock::onMqttDataReceived(const char* topic, byte* payload, const uns if(comparePrefixedPath(topic, mqtt_topic_config_action)) { if(strcmp(value, "") == 0 || strcmp(value, "--") == 0) return; - + if(_configUpdateReceivedCallback != NULL) { _configUpdateReceivedCallback(value); @@ -265,7 +295,7 @@ void NetworkLock::publishKeyTurnerState(const NukiLock::KeyTurnerState& keyTurne } json["trigger"] = str; - + char curTime[20]; sprintf(curTime, "%04d-%02d-%02d %02d:%02d:%02d", keyTurnerState.currentTimeYear, keyTurnerState.currentTimeMonth, keyTurnerState.currentTimeDay, keyTurnerState.currentTimeHour, keyTurnerState.currentTimeMinute, keyTurnerState.currentTimeSecond); json["currentTime"] = curTime; diff --git a/src/PreferencesKeys.h b/src/PreferencesKeys.h index 7f706d8..8ad13be 100644 --- a/src/PreferencesKeys.h +++ b/src/PreferencesKeys.h @@ -13,6 +13,7 @@ #define preference_mqtt_user (char*)"mqttuser" #define preference_mqtt_password (char*)"mqttpass" #define preference_mqtt_log_enabled (char*)"mqttlog" +#define preference_webserver_enabled (char*)"websrvena" #define preference_lock_enabled (char*)"lockena" #define preference_lock_pin_status (char*)"lockpin" #define preference_mqtt_lock_path (char*)"mqttpath" @@ -77,7 +78,7 @@ class DebugPreferences private: std::vector _keys = { - preference_started_before, preference_config_version, preference_device_id_lock, preference_device_id_opener, preference_nuki_id_lock, preference_nuki_id_opener, preference_mqtt_broker, preference_mqtt_broker_port, preference_mqtt_user, preference_mqtt_password, preference_mqtt_log_enabled, preference_check_updates, + preference_started_before, preference_config_version, preference_device_id_lock, preference_device_id_opener, preference_nuki_id_lock, preference_nuki_id_opener, preference_mqtt_broker, preference_mqtt_broker_port, preference_mqtt_user, preference_mqtt_password, preference_mqtt_log_enabled, preference_check_updates, preference_webserver_enabled, preference_lock_enabled, preference_lock_pin_status, preference_mqtt_lock_path, preference_opener_enabled, preference_opener_pin_status, preference_opener_continuous_mode, preference_mqtt_opener_path, preference_lock_max_keypad_code_count, preference_opener_max_keypad_code_count, preference_mqtt_ca, preference_mqtt_crt, preference_mqtt_key, preference_mqtt_hass_discovery, preference_mqtt_hass_cu_url, @@ -104,7 +105,7 @@ private: std::vector _boolPrefs = { preference_started_before, preference_mqtt_log_enabled, preference_check_updates, preference_lock_enabled, preference_opener_enabled, preference_opener_continuous_mode, - preference_restart_on_disconnect, preference_keypad_control_enabled, preference_keypad_info_enabled, + preference_webserver_enabled, preference_restart_on_disconnect, preference_keypad_control_enabled, preference_keypad_info_enabled, preference_timecontrol_control_enabled, preference_timecontrol_info_enabled, preference_register_as_app, preference_ip_dhcp_enabled, preference_publish_authdata, preference_has_mac_saved, preference_publish_debug_info, preference_network_wifi_fallback_disabled }; diff --git a/src/WebCfgServer.cpp b/src/WebCfgServer.cpp index 8d9ad38..fd28b68 100644 --- a/src/WebCfgServer.cpp +++ b/src/WebCfgServer.cpp @@ -1765,8 +1765,12 @@ void WebCfgServer::buildInfoHtml(String &response) response.concat(uxTaskGetStackHighWaterMark(networkTaskHandle)); response.concat(", nuki: "); response.concat(uxTaskGetStackHighWaterMark(nukiTaskHandle)); - response.concat(", pd: "); - response.concat(uxTaskGetStackHighWaterMark(presenceDetectionTaskHandle)); + + if(_preferences->getInt(preference_presence_detection_timeout) >= 0) + { + response.concat(", pd: "); + response.concat(uxTaskGetStackHighWaterMark(presenceDetectionTaskHandle)); + } response.concat("\n"); _gpio->getConfigurationText(response, _gpio->pinConfiguration()); diff --git a/src/main.cpp b/src/main.cpp index e3f158f..87e3ddd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -114,7 +114,11 @@ void setupTasks() xTaskCreatePinnedToCore(networkTask, "ntw", 12288, NULL, 3, &networkTaskHandle, 1); xTaskCreatePinnedToCore(nukiTask, "nuki", 8192, NULL, 2, &nukiTaskHandle, 1); - xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", 1024, NULL, 5, &presenceDetectionTaskHandle, 1); + + if(preferences->getInt(preference_presence_detection_timeout) >= 0) + { + xTaskCreatePinnedToCore(presenceDetectionTask, "prdet", 1024, NULL, 5, &presenceDetectionTaskHandle, 1); + } } void initEthServer(const NetworkDeviceType device) @@ -316,16 +320,22 @@ void setup() nukiOpener->initialize(); } - webCfgServer = new WebCfgServer(nuki, nukiOpener, network, gpio, ethServer, preferences, network->networkDeviceType() == NetworkDeviceType::WiFi); - webCfgServer->initialize(); - - presenceDetection = new PresenceDetection(preferences, bleScanner, network, CharBuffer::get(), CHAR_BUFFER_SIZE); - presenceDetection->initialize(); - + if(preferences->getBool(preference_webserver_enabled, true)) + { + webCfgServer = new WebCfgServer(nuki, nukiOpener, network, gpio, ethServer, preferences, network->networkDeviceType() == NetworkDeviceType::WiFi); + webCfgServer->initialize(); + } + + if(preferences->getInt(preference_presence_detection_timeout) >= 0) + { + presenceDetection = new PresenceDetection(preferences, bleScanner, network, CharBuffer::get(), CHAR_BUFFER_SIZE); + presenceDetection->initialize(); + } + setupTasks(); } void loop() { - delay(60000); + vTaskDelete(NULL); } \ No newline at end of file